الخميس، 26 مارس 2015

التابعان isupper و islower :

التابعان isupper و islower :
لنفـرض أنـك تقـوم بانشـاء برنـامج لتسـجيل أسـماء وتخزينهـا فـي أي قاعـدة
بيانـات ، حينهـا ستضـطر إلـى التعامـل مـع الادخـالات الخاطئـــة (لنفـرض أن
البرنامج باللغـة الانجليزية) ماذا لو قام المسجل أو مسـتخدم البرنـامج بجعـل
أول حرف من اسمـه حرفاً صغيراً أو جعل جميع حروف اسمـه كبيرة ، بالتـالي
فإن عليك فعل واحد من اثنين:
· إنذار المستخدم أنـه أخطأ في الإدخال والطلب منه الإعادة .
· تصحيح أخطاء المستخدم وإكمال البرنامج كأن شيئاً لم يكن.
والخيار الثاني هـو أفضل ، إلا أن في بعض الحالات عليـك التعامـل مـع جميـع
الخيارات وقد يكون في أحد الأنظمة ما يجبرك على القيام بالحل الأول ، ففي
البرمجة لا يمكنك توقع العوائق التي ستقابلها والتي لن تجتازهـا إلا إذا كنـت
عارفاً بأغلب الحلول إن لم يكن كلها.
سنقوم الآن بكتابة مثال يستخدم الحلقة for وستكون هذه الحلقة أبدية ولـن
يخرج منها المستخدم إلا إذا أدخل الحرف @ ، وهـي تقـوم باختبـار كـل حـرف
يدخله المستخدم ، انظر إلى هذا المثال:
CODE
1. #include <iostream>
2. #include <ctype.h>
3. using namespace std;
4.
5. int main()
6. {
7. for(;;){
8. char m='a';
9. cin >> m;
10. if (m=='@') break;
11. else if (isupper(m)) cout << "Big char" ;
12. else if(islower(m)) cout << "Small char";
13. else cout << "TRY AGINE";
14.
15. cout << endl;
16. }
17. return 0;
18. }
· يقوم المستخدم بادخال قيمـة المتغيـر m ثـم تقـوم تفرعـات if باختبـار
هذا المتغير.
· يقوم السطر 10 باختبار ما إذا كان الحرف هـو @ وفي حال كـان هكـذا
فإنه يخرج من الحلقة التكرارية for وبالتالي ينتهي البرنامج .
· السطر 11 يتأكد إن كان الحرف المدخل هـو حرف كبير وفي حـال كـان
كذلك فإنه يخبرك المستخدم بذلك.
· السطر 12 يتأكد إن كان الحرف المـدخل هــو حـرف صـغير وفـي حـال
كان كذلك فإنه يخبر المستخدم ويطبع رسالة .
· بالنسبة إذا كان المدخل هـو حرف آخر غريـب أو رقـم فـإن السـطر 13
يتعامل معـه .
· مع كل إدخال يدخله المستخدم وبعد اختبار البرنامج له ينتقـل الـتحكم
إلى دورة ثانية وإدخال جديد حتى يـدخل المسـتخدم الحـرف @ حينهـا
ينتهي البرنامح.
التابعان toupper و tolower :
ربما يكون من الاجدى لك في المثال السابق أن تقوم بتعـديل البرنامج حتـى
يقوم بتغيير الأحرف من كبير إلى صغير والعكس بالعكس ووسيلتك لهذا هــما
التابعــان toupper الـذي يقـوم بالتحــويل إلـى أحـرف كبيـرة والتـابع tolower
الذي يقوم بالتحويل إلى أحرف صغيرة. سنقوم في هذا المثـال برنـامج يقـوم
بتحويل جميع الأحرف التي يكتبها المستخدم عكسها أي الصغيرة إلـى كبيـرة
والكبيرة إلى صغيرة. وفي حال لم يكــن هــناك أي حـرف فإنـه يطبـع رسـالة
بهذا الشأن. انظر إلى هذا الكـود:
CODE
1. #include <iostream>
2. #include <ctype.h>
3. using namespace std;
4.
5. int main()
6. {
7. for(;;){
8. char m='a';
9. cin >> m;
10.
11. if (m=='@') break;
12. else if (isupper(m)) {
13. cout << "Big char\n" << "small char:\t";
14. m=tolower(m); cout << m;
15. }
16. else if(islower(m)) {
17. cout << "Small char\n" << "big char:\t";
18. m=toupper(m); cout << m;
19. }
20. else cout << "TRY AGINE";
21.
22. cout << endl;
23. }
24. return 0;
25. }
التابع ( )strcat :
يتبع هذا التابع إلـى المكتبـة cstring ويأخـذ كبـارامترات لـه ، وسـيطين اثنـين
الأول هـو السلسلة التي تـود إكمالها والثانية هـو السلسـلة التـي تــود أخـذ
حروفها وإلحاقها بالسلسلة الأولى. أي أن هذا التـابع يقـوم بـدمج سلسـلتين
في سلسلة واحدة.
انظر إلى هذا الكـود الذي يقوم بدمج السلسة الأولى فـي السلسـة الثانيـة،
ولاحظ أنه لا يحدث أي شيء للسلسة الثانية المدموجـة.
CODE
1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4.
5. int main()
6. {
7. char word1[25]="Java and ";
8. char word2[10]="C++";
9.
10. strcat(word1,word2);
11. cout << "word1:\t" << word1 << endl;
12. cout << "word2:\t" << word2 << endl;
13. return 0;
14. }
ناتج هذا الكـود سيكون كما يلي:
word1: Java and C++
word2: C++
والسبب في دمج السلسة الثانية في السلسلة الأولى هـو السطر 10 حيث
التابع strcat ، لاحظ أيضاً أنـه يدمج الوسيط الثاني في الوسـيط الأول ولـيس
العـكس.
وهـناك أيضـاً ملاحظـة مهـمــة لا يسـتطيع هـذا التـابع تجـاوز مشـكلة الكتابـة
خارج حدود المصفوفة.
بعض دوال الإدخال والإخراج في لغـة السي القديمـة:
هـناك أيضاً بعض التوابع التي كانت في لغـة السي وبالتحــديد فـي المكتبـة
stdio ، وهاهي الآن في المكتبة iostream .
التابعان putchar و getchar :
يقوم التابع putchar بعرض حرف وحيد فقط على الشاشـة ، وهـو يأخذ حرف
وحيد فقط لا غير ، أي أنـه لا يأخذ حرفان أو ثلاثة بل حرف واحد فقط.
انظر إلى هذا المثال الكـودي:
CODE
1. #include <iostream>
2. using namespace std;
3.
4. int main()
5. {
6. putchar('a');
7. putchar('\n');
8. return 0;
9. }
أما بالنسبة للتـابع getchar فهــو مفيـد لإدخـال حـرف وحيـد فقـط للمتغيـرات
الحرفية أو السلسلة (ولكن بحلقة for ) وإستخدامـه أسهل كثيراً مـن الكـائن
cin . انظر إلى المثال التالي:
CODE
1. #include <iostream>
2. using namespace std;
3.
4. int main()
5. {
6. char x;
7. x=getchar();
8. putchar(x);
9. putchar('\n');
10. return 0;
11. }
انظر إلى كيفية استخدام التابع getchar في السطر 7 .
لاحظ أيضاً هـنا أن التـابع getchar لـن يعــمل حتـى تضغــط علـى زر الإدخـال
. Enter
التابع ( )getch :
يتبع هذا التابع المكتبة h.conio ، لـذلك احـرص علـى تضـمينها فـي برنامجـك
قبل استخدام هذا التابع.
يقوم هذا التابع بأخذ محرف واحد وتخـزينـه في متغير ولا يقوم بإظهـاره علـى
الشاشـة أي حينما تضغـط على أي حرف فإن هذا المتغير لـن يقـوم بإرسـال
الحرف الذي أدخلته من لوحة المفاتيح إلى الشاشـة.
انظر إلى هذا المثال الكـودي:
CODE
1. #include <iostream>
2. #include <conio.h>
3. using namespace std;
4.
5. int main()
6. {
7. char x;
8. x=getch();
9. return 0;
10. }
سينتهي هذا البرنامج فوراً حينما تضغـط على أي زر في لوحـة المفاتيح دون
أن يظهر أي شيء على الشاشـة.
مثال عـملي:
سنقوم الآن بكتابة مثال مسل قليلاً.
لنفرض أننا نطــور برنامجـاً شخصـياً لا يريـد صاحبــه أن يعـرف أحـد محتوياتـه
حينها لا بد أن يكون البرنامج معداً بكلمة سر ، وهذا ما سنقوم بـه الآن.
دعـنا نفكر في كيفية تنفيذ هذا البرنامج قليلاً.
يقـوم المستخــدم بإدخـال حـرف ولا يظهـر علـى الشاشـــة بـل يظهـر حــرف
النجمـة * ، ثم يقارن البرنامج بين كلمـة السر المدخلة وكلمة السر المخـزنـة
وحينما تكونان متساويتـان يسمح البرنامج لك بالدخـول وحينما تكون خاظئــة
يطلب البرنامج منك الإعادة وإدخال كلمة السر من جـديد.
الآن سنستخدم حلقة for الأبديـة بالإضافـة إلى التوابع السابقـة التي تعرفنا
عليها قبل قليل.
CODE
1. #include <iostream>
2. #include <conio.h>
3. using namespace std;
4.
5. int main()
6. {
7. int sure=0;
8. char x[]="book";
9. char pass[4];
10. for(;;){
11. for(int i=0;i<4;i++){
12. pass[i]=getch();
13. putchar('*');
14. }
15. for (i=0;i<4;i++){
16. if (pass[i]==x[i]) sure++;
17. else break;
18. }
19. if (sure == 4){
20. cout << "\n Password Correct"<< endl;
21. break;
22. }
23. cout << endl;
24. cout << "False....Try Againe" << endl;
25. }
26. return 0;
27. }
· لقــد قمنــا أولاً بتعريــف وإعــلان ثــلاث متغيــرات المتغيــر الأول هـــو
سلسلة كلمة السر المخـزنـة والمتغير الثـاني هــو سلسـلة كلمـة
السـر المدخلـة أمـا المتغيـر الثالـث فهــو الـذي يتأكـد أن الكلمتـين
متساويتــان وبالتـالي يسـمح بالدخــول إلـى النظــام أو البرنـامج أو
يطلب من المستخدم إعادة الإدخال.
· يدخل البرنامج في السطر 10 في حلقة التكرار for الأبدية.
· يدخل في السطر 11 فـي حلقـة for مختصــة بإدخـال كلمـة السـر
انظر إلى كيفية الإدخال وإلى ما يظهر في الشاشة.
· في الأسطر من 15 – 18 يقوم البرنامج بالتأكد من تساوي كلمتـي
السر ، حيث يقارن بين كل حرف وحرف على حـدة وفي حال كانـت
إحدى المقارنات خاطئة يخرج من حلقة for يقوم البرنامج في حـال
كانت المقارنـة صحيحـة بزيادة متغير التأكد sure زيادة واحدة.
· إذا كانت المدخلات صحيحـة فإن المتغير sure سيصـبح يسـاوي 4 ،
وبالتالي يقارن السطر 19 ويتأكد مـن ذلـك وفـي حـال كـان ، يطبـع
رسالة ترحيبية ثم يخرج من حلقة for الأبدية .
· أما إن لم تكن المدخلات صحيحـة فيعـود البرنـامج إلـى التكـرار مـن
جـديد ويطلب منك إعادة إ
دخال الكلمة.

ليست هناك تعليقات:

إرسال تعليق