You are on page 1of 9

‫إختصارات‬

‫‪‬‬ ‫مقدمة ›‬
‫‪‬‬ ‫طريقة جعل البرنامج يستقبل بيانات من المستخدم ›‬
‫‪‬‬ ‫‪ Scanner‬كونستركتورات الكالس ›‬
‫‪‬‬ ‫‪ Scanner‬دوال الكالس ›‬
‫مقدمة‬
‫في الدروس السابقة‪ ,‬كنا نكتب الكود ث ّم نقوم بتجربته فيتنفذ كما هو‪ ,‬بمعنى أننا كنا أصالً نعرف ما سيظهر عند تشغيل الكود ألننا قمنا بإدخال القيم‬
‫البرنامج‬ ‫تشغيل‬ ‫قبل‬ ‫المتغيّرات‬ ‫‪.‬في‬
‫في هذا الدرس ستتعلم كيف تنشئ برنامح يتفاعل مع المستخدم‪ ,‬حيث أنّك عندما تقوم بتشغيله سيطلب من المستخدم إدخال بيانات‪ ,‬و بعد إدخالها‬
‫‪.‬سيقوم البرنامج بمعالجتها و فعل شيء معيّن بها‬
‫هو كالس جاهز في جافا‪ ,‬يستخدم بشكل عام لجعل البرنامج يستقبل بيانات من المستخدم باإلضافة إلى إمكانية تحويل نوع ‪ Scanner‬الكالس‬
‫‪.‬دالّة ‪ 50‬كونستركتورات و أكثر من ‪ 9‬هذه البيانات و التعديل عليها‪ .‬و هو كبير جدا ُ حيث أنه يتألف من‬

‫‪ Scanner‬أنواع البيانات التي يمكن إستقبالها باستخدام الكالس‬

‫أعداد صحيحة‪ ,‬أي أعداد ال تقبل الفاصلة‪ ,‬مثال‪.123 :‬‬ ‫‪‬‬

‫أعداد تقبل الفاصلة العشرية‪ ,‬مثال‪. 10.55 :‬‬ ‫‪‬‬

‫حرف واحد ( سواء حرف‪ ,‬رقم‪ ,‬رمز )‪ ,‬مثال‪ a :‬أو ‪ 3‬أو @‪.‬‬ ‫‪‬‬

‫كلمة واحدة‪ ,‬مثل ‪harmash‬‬ ‫‪‬‬

‫سطر كامل ( أي أكثر من كلمة )‪ ,‬مثال‪harmash.com is amazing site to learn programming :‬‬ ‫‪‬‬

‫صح أو خطأ‪ ,‬أي إجبار المستخدم على إدخال كلمة واحدة و هي إ ّما ‪ true‬و إ ّما ‪.false‬‬ ‫‪‬‬

‫ستتعرف عليها الحقا ً‬


‫ّ‬ ‫‪.‬إذا ً كل نوع بيانات تريد إستقباله في البرنامج له دالة خاصة‬

‫مصطلحات تقنية‬

‫‪.White‬‬ ‫الفارغة ‪Spaces‬‬ ‫المسافات‬ ‫شكل‬ ‫تحديد‬ ‫في‬ ‫الـ ‪ Pattern‬المستخدمة‬ ‫‪ Delimiter‬تعني‬ ‫‪‬‬

‫سترى الحقا ً أنه بإمكانك جعل مترجم جافا يعتبر حرف أو كلمة أو جملة ما تبدو و كأنها مسافة فارغة ‪.White Space‬‬

‫بدون ‪.)GUI‬‬ ‫أي‬ ‫مستخدم (‬ ‫واجهة‬ ‫بدون‬ ‫يعمل‬ ‫الذي‬ ‫البرنامج‬ ‫‪ Console‬تعني‬ ‫‪Application‬‬ ‫‪‬‬

‫إذا ً جميع البرامج التي فعلناها في الدروس السابقة تس ّمى ‪ّ .Console Application‬‬
‫ألن النتيجة التي كنا نراها عند تشغيل البرنامج‪ ,‬كانت‬

‫تظهر في ما يس ّمى ‪.Console‬‬

‫طريقة جعل البرنامج يستقبل بيانات من المستخدم‬


‫‪:‬خطوات أساسيّة ثالث في لغة جافا لكي تجعل البرنامج يستقبل معلومات من المستخدم عليك إتباع‬
‫‪ .1‬إستدعاء الكالس ‪ Scanner‬الّذي يحتوي على دوال إدخال المعلومات من المستخدمين‪.‬‬
‫ّ‬
‫‪ .2‬إنشاء كائن من هذا الكالس ألنّك ال تستطيع إستخدام دوال الكالس ‪ّ Scanner‬إال من خالل الكائن الذي يشير إليه‪.‬‬
‫‪ .3‬إستدعاء إحدى دوال إدخال المعلومات من هذا الكائن‪.‬‬

‫‪.‬تطلب فيه من المستخدم إدخال بيانات من لوحة المفاتيح ) ‪ Console Application‬إذا ً ستحتاج إلى األوامر التالية في ك ّل برنامج ( يعتبر‬
‫مثال‬
‫‪ .1‬إستدعاء الكالس ‪ Scanner‬حتى نستطيع إنشاء كائن منه‪.‬‬
‫‪import‬‬ ‫;‪java.util.Scanner‬‬

‫‪ .2‬إنشاء كائن من الكالس ‪ ,Scanner‬هنا قمنا بتسميته ‪.input‬‬


‫= ‪Scanner input‬‬ ‫‪new‬‬ ‫;) ‪Scanner(System. in‬‬

‫‪ .3‬إستدعاء إحدى دوال إدخال البيانات من خالل كائن الـ ‪ Scanner‬الذي يفترض أنك قمت بإنشائه سابقاً‪.‬‬
‫هنا قمنا بإستدعاء الدالة )(‪ nextInt‬من هذا الكائن و التي تعني أنّه عند تشغيل البرنامج و عندما يأتي لتنفيذ هذا الكود‪ ,‬سيقوم بإنتظار‬
‫المستخدم إلدخال عدد صحيح من لوحة المفاتيح‪ ,‬بعدها سيتم تخزين ما أدخله المستخدم في المتغيّر ‪.a‬‬
‫‪int‬‬ ‫;)(‪a = input.nextInt‬‬

‫إنتبه‬
‫ن عدم حدوث أي أخطاء )(‪ close‬بواسطة الدالّة ‪ Scanner‬و ال تنسى ايضا ً إغالق كائن الـ ‪ try,‬دائما ً ضع دوال إستقبال البيانات بداخل الجملة‬
‫‪.‬من شأنها تعليق البرنامج‬

‫أمثلة مه ّمة‬

‫هنا قمنا بإنشاء برنامج يطلب من المستخدم إدخال إسمه و عمره و مهنته‪ ( .‬مثال )‪.‬‬ ‫‪‬‬

‫هنا قمنا بإنشاء برنامج يطلب من المستخدم إدخال عالماته المدرسيّة و ّ‬


‫يخزنها في مصفوفة‪ ( .‬مثال )‪.‬‬ ‫‪‬‬

‫ملف ثم يتم عرضها من هذا الملف من جديد‪ ( .‬مثال )‪.‬‬


‫هنا قمنا بإنشاء برنامج يطلب من المستخدم إدخال معلومات‪ ,‬بعد إدخالها يت ّم تخزينها في ّ‬ ‫‪‬‬

‫‪ Scanner‬كونستركتورات الكالس‬
‫‪ Scanner.‬الموجودين في الكالس ‪ constructors‬الجدول التالي يحتوي على جميع الـ‬

‫الكونستركتور مع تعريفه‬
‫)‪Scanner(File Source‬يستخدم هذا الكونستركتور لقراءة البيانات من ملف معيّن‪.‬‬ ‫‪1‬‬

‫)‪Scanner(File Source, String charsetName‬يستخدم هذا الكونستركتور لقراءة البيانات من ملف معيّن‪ ,‬مع تحديد‬
‫‪2‬‬
‫الترميز المستخدم عند قراءتهم‪.‬‬

‫)‪Scanner(InputStream source‬يستخدم هذا الكونستركتور لقراءة البيانات من كائن نوعه ‪.InputStream‬‬ ‫‪3‬‬

‫)‪Scanner(InputStream source, String charsetName‬يستخدم هذا الكونستركتور لقراءة البيانات من كائن‬


‫‪4‬‬
‫نوعه ‪ InputStream‬مع تحديد الترميز المستخدم عند قراءتهم‪.‬‬

‫)‪Scanner(Path source‬يستخدم هذا الكونستركتور لقراءة البيانات من الملف الذي يشير له كائن الـ ‪.Path‬‬ ‫‪5‬‬

‫)‪Scanner(Path source, String charsetName‬يستخدم هذا الكونستركتور لقراءة البيانات من الملف الذي يشير له كائن‬
‫‪6‬‬
‫الـ ‪ Path‬مع تحديد الترميز المستخدم عند قراءتهم‪.‬‬

‫)‪Scanner(Readable Source‬يستخدم هذا الكونستركتور لقراءة البيانات من كائن نوعه ‪.Readable‬‬ ‫‪7‬‬

‫)‪Scanner(ReadableByteChannel source‬يستخدم هذا الكونستركتور لقراءة البيانات من كائن‬


‫‪8‬‬
‫نوعه ‪.ReadableByteChannel‬‬

‫)‪Scanner(ReadableByteChannel source, String charsetName‬يستخدم هذا الكونستركتور لقراءة البيانات‬


‫‪9‬‬
‫من كائن نوعه ‪ ReadableByteChannel‬مع تحديد الترميز المستخدم عند قراءتهم‪.‬‬
‫‪ (Keyboard).‬لقراءة البيانات التي يدخلها المستخدم من لوحة المفاتيح ‪ System.in‬الحقا ً سنستخدم ثابت جاهز في جافا إسمه‬
‫‪.‬يستخدم لجعل البرنامج يستقبل بيانات المستخدم من لوحة المفاتيح وقت التشغيل ‪ InputStream‬عبارة عن ‪ System.in‬الـ‬

‫‪ Scanner‬دوال الكالس‬
‫‪ Scanner‬في أغلب األمثلة الموضوعة في الجدول التالي سنستخدم كونستركتور الكالس مالحظة‬ ‫الذي‬
‫‪.‬بدل إدخالها بواسطة دوال اإلدخال‪ .‬و النتيجة هي نفسها ‪ Scanner‬حتى ندخل بيانات مباشرة ً في كائن الـ ‪ Argument‬كـ ‪ String‬يأخذ‬
‫‪.‬حتى يكون التركيز فقط على الدّوال التي نريدك أن تر ّكز عليها ) ‪ ( try, catch, finally‬كما أننا لن نقوم باستخدام الجمل‬
‫الكالس‬ ‫مع‬ ‫التعامل‬ ‫‪ Scanner,‬عند‬ ‫بكلمة‬ ‫تبدأ‬ ‫دالّة‬ ‫اإلدخال ‪ next‬ك ّل‬ ‫دوال‬ ‫من‬ ‫دالّة‬ ‫‪.‬تعتبر‬
‫‪..‬إلخ )(‪: next() - nextLine() - nextInt() - nextFloat‬أمثلة‬

‫‪ Scanner.‬الجدول التالي يحتوي على دوال اإلدخال الموجودة في الكالس‬

‫الدالة مع تعريفها‬

‫)(‪String next‬ترجع الكلمة التالية التي تم إدخالها في كائن الـ ‪.Scanner‬‬


‫‪1‬‬
‫و تستخدم ايضا ً إلستقبال كلمة واحدة من المستخدم‪ ( .‬مثال )‬

‫)‪String next(Pattern pattern‬ترجع الكلمة التالية التي ت ّم إدخالها في كائن الـ ‪ Scanner‬في حال كانت تتطابق مع كائن‬

‫نمرره لها كـ ‪.Argument‬‬


‫الـ ‪ Pattern‬الذي ّ‬ ‫‪2‬‬

‫و تستخدم ايضا ً إلستقبال كلمة واحدة من المستخدم‪ ( .‬مثال )‬

‫)‪String next(String pattern‬ترجع الكلمة التالية التي ت ّم إدخالها في كائن الـ ‪ Scanner‬في حال كانت تتطابق مع‬

‫نمرره لها كـ ‪ Argument‬و الذي يمثّل ‪.Pattern‬‬


‫الـ ‪ String‬الذي ّ‬ ‫‪3‬‬

‫و تستخدم ايضا ً إلستقبال كلمة واحدة من المستخدم‪ ( .‬مثال )‬

‫)(‪String nextLine‬ترجع السطر التالي الذي تم إدخاله في كائن الـ ‪.Scanner‬‬


‫‪4‬‬
‫و تستخدم ايضا ً إلستقبال سطر كامل من المعلومات من المستخدم‪ ( .‬مثال )‬

‫)(‪boolean nextBoolean‬ترجع الكلمة التالية التي تم إدخالها في كائن الـ ‪ Scanner‬في حال كانت هذه الكلمة تعتبر من‬

‫النوع ‪ ,boolean‬أي في حال كانت هذه الكلمة ‪ true‬أو ‪ false‬ستقوم بإرجاعها‪.‬‬ ‫‪5‬‬

‫و تستخدم ايضا ً إلستقبال قيمة نوعها ‪ boolean‬من المستخدم‪ ( .‬مثال )‬


‫)(‪byte nextByte‬ترجع الكلمة التالية التي تم إدخالها في كائن الـ ‪ Scanner‬في حال كانت هذه الكلمة تعتبر من النوع ‪.byte‬‬
‫‪6‬‬
‫و تستخدم ايضا ً إلستقبال قيمة نوعها ‪ byte‬من المستخدم‪ ( .‬مثال )‬

‫)‪byte nextByte(int radix‬ترجع الكلمة التالية التي تم إدخالها في كائن الـ ‪ Scanner‬في حال كانت هذه الكلمة تعتبر من‬

‫نمرره لها كـ ‪.Argument‬‬


‫النوع ‪ byte‬و كانت تتطابق مع الـ ‪radix‬الذي ّ‬ ‫‪7‬‬

‫و تستخدم ايضا ً إلستقبال قيمة نوعها ‪ byte‬من المستخدم‪ ( .‬مثال )‬

‫)(‪double nextDouble‬ترجع الكلمة التالية التي تم إدخالها في كائن الـ ‪ Scanner‬في حال كانت هذه الكلمة تعتبر من‬

‫النوع ‪.double‬‬ ‫‪8‬‬

‫و تستخدم ايضا ً إلستقبال قيمة نوعها ‪ double‬من المستخدم‪ ( .‬مثال )‬

‫)(‪float nextFloat‬تبحث في البيانات التالية التي تم إدخالها في كائن الـ ‪ ,Scanner‬و في حال كان يمكن معالجة هذه البيانات‬

‫كـ ‪.float‬‬ ‫‪9‬‬

‫و تستخدم ايضا ً إلستقبال قيمة نوعها ‪ float‬من المستخدم‪ ( .‬مثال )‬

‫)(‪int nextInt‬ترجع الكلمة التالية التي تم إدخالها في كائن الـ ‪ Scanner‬في حال كانت هذه الكلمة تعتبر من النوع ‪.int‬‬
‫‪10‬‬
‫و تستخدم ايضا ً إلستقبال قيمة نوعها ‪ int‬من المستخدم‪ ( .‬مثال )‬

‫)‪int nextInt(int radix‬ترجع الكلمة التالية التي تم إدخالها في كائن الـ ‪ Scanner‬في حال كانت هذه الكلمة تعتبر من‬

‫نمرره لها كـ ‪.Argument‬‬


‫النوع ‪ int‬و كانت تتطابق مع الـ ‪ radix‬الذي ّ‬ ‫‪11‬‬

‫و تستخدم ايضا ً إلستقبال قيمة نوعها ‪ int‬من المستخدم‪ ( .‬مثال )‬

‫)(‪long nextLong‬ترجع الكلمة التالية التي تم إدخالها في كائن الـ ‪ Scanner‬في حال كانت هذه الكلمة تعتبر من النوع ‪.long‬‬
‫‪12‬‬
‫و تستخدم ايضا ً إلستقبال قيمة نوعها ‪ long‬من المستخدم‪ ( .‬مثال )‬
‫)‪long nextLong(int radix‬ترجع الكلمة التالية التي تم إدخالها في كائن الـ ‪ Scanner‬في حال كانت هذه الكلمة تعتبر من‬

‫نمرره لها كـ ‪.Argument‬‬


‫النوع ‪ long‬و كانت تتطابق مع الـ ‪radix‬الذي ّ‬ ‫‪13‬‬

‫و تستخدم ايضا ً إلستقبال قيمة نوعها ‪ long‬من المستخدم‪ ( .‬مثال )‬

‫)(‪short nextShort‬ترجع الكلمة التالية التي تم إدخالها في كائن الـ ‪ Scanner‬في حال كانت هذه الكلمة تعتبر من‬

‫النوع ‪.short‬‬ ‫‪14‬‬

‫و تستخدم ايضا ً إلستقبال قيمة نوعها ‪ short‬من المستخدم‪ ( .‬مثال )‬

‫)‪short nextShort(int radix‬ترجع الكلمة التالية التي تم إدخالها في كائن الـ ‪ Scanner‬في حال كانت هذه الكلمة تعتبر من‬

‫نمرره لها كـ ‪.Argument‬‬


‫النوع ‪ short‬و كانت تتطابق مع الـ ‪radix‬الذي ّ‬ ‫‪15‬‬

‫و تستخدم ايضا ً إلستقبال قيمة نوعها ‪ short‬من المستخدم‪ ( .‬مثال )‬

‫‪ Scanner.‬الجدول التالي يحتوي على دوال البحث الموجودة في الكالس‬

‫الدالة مع تعريفها‬

‫)‪String findInLine(Pattern pattern‬تبحث في الـ ‪ Scanner‬الذي قام باستدعائها عن أول مكان يتطابق مع‬
‫‪1‬‬
‫نمررها لها كـ ‪ Argument‬و ترجعه‪ ( .‬مثال )‬
‫الـ ‪ Pattern‬التي ّ‬

‫)‪String findInLine(String pattern‬تبحث في الـ ‪ Scanner‬الذي قام باستدعائها عن أول مكان يتطابق مع‬
‫‪2‬‬
‫الـ ‪( String‬التي تمثّل ‪ )Pattern‬التي ّ‬
‫نمررها لها كـ ‪ Argument‬و ترجعه‪ ( .‬مثال )‬

‫)‪String findWithinHorizon(Pattern pattern, int horizon‬تبحث في الـ ‪ Scanner‬الذي قام باستدعائها‬


‫‪3‬‬
‫عن أول مكان يتطابق مع الـ ‪ ,Pattern‬و تتوقف في البحث قبل الـ ‪ index‬الذي نضعه في الباراميتر الثاني‪ ( .‬مثال )‬

‫)‪String findWithinHorizon(String pattern, int horizon‬تبحث في الـ ‪ Scanner‬الذي قام باستدعائها عن‬ ‫‪4‬‬
‫أول مكان يتطابق مع الـ ‪( String‬الذي يمثّل ‪ ,)Pattern‬و تتوقف في البحث قبل الـ ‪index‬الذي نضعه في الباراميتر الثاني‪ ( .‬مثال )‬

‫)(‪MatchResult match‬ترجع كائن نوعه ‪ MatchResult‬يمث ّل نتيجة آخر عمليّة بحث تم إجرائها على كائن‬

‫صل‪.‬‬
‫الـ ‪ Scanner‬مع شرح مف ّ‬ ‫‪5‬‬

‫و ترجع ‪ null‬في حال عدم حدوث أي إستثناء بسبب كائن الـ ‪ ( .Scanner‬مثال )‬

‫‪ Scanner.‬الجدول التالي يحتوي على دوال التشييك الموجودة في الكالس‬

‫الدالة مع تعريفها‬

‫)(‪boolean hasNext‬ترجع ‪ true‬في حال كان ال يزال يمكن استدعاء دالة من دوال اإلدخال الموجودة كائن‬
‫‪1‬‬
‫الـ ‪ ( .Scanner‬مثال )‬

‫)‪boolean hasNext(Pattern pattern‬ترجع ‪ true‬في حال ت ّم إيجاد قيمة الـ ‪ Pattern‬التي نضعها لها‬
‫‪2‬‬
‫كـ ‪ Argument‬في كائن الـ ‪ ( .Scanner‬مثال )‬

‫)‪boolean hasNext(String pattern‬ترجع ‪ true‬في حال ت ّم إيجاد قيمة الـ ‪ String‬التي نضعها لها‬
‫‪3‬‬
‫كـ ‪ Argument‬و التي تمث ّل ‪ Pattern‬معيّنة في كائن الـ ‪ ( .Scanner‬مثال )‬

‫)(‪boolean hasNextInt‬ترجع ‪ true‬في حال كانت البيانات التالية التي تم إدخالها في كائن الـ ‪ Scanner‬يمكن التعامل معها‬
‫‪4‬‬
‫كـ ‪ ( .int‬مثال )‬

‫)‪boolean hasNextInt(int radix‬ترجع ‪ true‬في حال كانت البيانات التالية التي تم إدخالها في كائن الـ ‪ Scanner‬يمكن‬
‫‪5‬‬
‫نمرره لها كـ ‪ ( .Argument‬مثال )‬
‫التعامل معها كـ ‪ int‬و تتطابق مع الـ ‪ radix‬الذي ّ‬

‫)(‪boolean hasNextLine‬ترجع ‪ true‬في حال كان النصّ المدخل في كائن الـ ‪ Scanner‬يتألف من أكثر من‬ ‫‪6‬‬
‫سطر‪ ( .‬مثال )‬

‫‪ Scanner.‬الجدول التالي يحتوي على دوال المعالجة الموجودة في الكالس‬

‫الدالة مع تعريفها‬

‫)(‪void close‬تغلق الـ ‪ ,Scanner‬أي تمنع إدخال أي بيانات جديدة في البرنامج عن طريق كائن الـ ‪ ( .Scanner‬مثال )‬ ‫‪1‬‬

‫)(‪Pattern delimiter‬ترجع الـ ‪ Pattern‬الذي يستخدمه كائن الـ ‪ Scanner‬في تحديد شكل المسافات الفارغة‪ ( .‬مثال )‬ ‫‪2‬‬

‫)(‪Locale locale‬ترجع كائن نوعه ‪ Locale‬يمثل نوع الترميز الذي يستخدمه كائن الـ ‪ Scanner‬عند قراءة و تخزين‬
‫‪3‬‬
‫البيانات‪ ( .‬مثال )‬

‫)(‪int radix‬ترجع الـ ‪ radix‬اإلفتراضية لكائن الـ ‪ ( .Scanner‬مثال )‬ ‫‪4‬‬

‫)(‪Scanner reset‬ترجع الخصائص اإلفتراضيّة لكائن الـ ‪ ( .Scanner‬مثال )‬ ‫‪5‬‬

‫)‪Scanner skip(Pattern pattern‬تتخطى النص التالي في كائن الـ ‪ Scanner‬في حال كان يتطابق مع كائن‬
‫‪6‬‬
‫الـ ‪ Pattern‬مع تجاهل الـ ‪ ( .delimiters‬مثال )‬

‫)‪Scanner skip(String pattern‬تتخطى النص التالي في كائن الـ ‪ Scanner‬في حال كان يتطابق مع الـ ‪ String‬الذي‬
‫‪7‬‬
‫نمرره لها كـ ‪ Argument‬و الذي يمثّل ‪ Pattern‬مع تجاهل الـ ‪ ( .delimiters‬مثال )‬
‫ّ‬
‫)(‪String toString‬ترجع ‪ String‬تمثّل كافة معلومات كائن الـ ‪ ( .Scanner‬مثال )‬ ‫‪8‬‬

‫)‪Scanner useDelimiter(Pattern pattern‬تستخدم لجعل حرف أو كلمة أو جملة تبدو كمسافة فارغة في كائن‬
‫‪9‬‬
‫الـ ‪ ( .Scanner‬مثال )‬

‫)‪Scanner useDelimiter(String pattern‬تستخدم لجعل حرف أو كلمة أو جملة تبدو كمسافة فارغة في كائن‬
‫‪10‬‬
‫الـ ‪ ( .Scanner‬مثال )‬

‫)‪Scanner useLocale(Locale locale‬تستخدم لتحديد الترميز الذي سيستخدمه كائن الـ ‪ Scanner‬عند قراءة و تخزين‬
‫‪11‬‬
‫البيانات‪ ( .‬مثال )‬

‫)‪Scanner useRadix(int radix‬تستخدم لتحديد الـ ‪ radix‬الذي سيستخدمه كائن الـ ‪ Scanner‬عند قراءة‬

You might also like

  • Adv 11
    Adv 11
    Document18 pages
    Adv 11
    hisham
    No ratings yet
  • Adv 12
    Adv 12
    Document5 pages
    Adv 12
    hisham
    No ratings yet
  • Adv 10
    Adv 10
    Document9 pages
    Adv 10
    hisham
    No ratings yet
  • Adv 8
    Adv 8
    Document39 pages
    Adv 8
    hisham
    No ratings yet
  • Adv 9
    Adv 9
    Document11 pages
    Adv 9
    hisham
    No ratings yet
  • Adv 8
    Adv 8
    Document39 pages
    Adv 8
    hisham
    No ratings yet
  • Adv 7
    Adv 7
    Document6 pages
    Adv 7
    hisham
    No ratings yet
  • Adv 4
    Adv 4
    Document23 pages
    Adv 4
    hisham
    No ratings yet
  • Adv 2
    Adv 2
    Document55 pages
    Adv 2
    hisham
    No ratings yet
  • Adv 6
    Adv 6
    Document4 pages
    Adv 6
    hisham
    No ratings yet
  • Adv 5
    Adv 5
    Document22 pages
    Adv 5
    hisham
    No ratings yet
  • Adv 3
    Adv 3
    Document42 pages
    Adv 3
    hisham
    No ratings yet