التابعان 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 لـن يعــمل حتـى تضغــط علـى زر الإدخـال
لنفـرض أنـك تقـوم بانشـاء برنـامج لتسـجيل أسـماء وتخزينهـا فـي أي قاعـدة
بيانـات ، حينهـا ستضـطر إلـى التعامـل مـع الادخـالات الخاطئـــة (لنفـرض أن
البرنامج باللغـة الانجليزية) ماذا لو قام المسجل أو مسـتخدم البرنـامج بجعـل
أول حرف من اسمـه حرفاً صغيراً أو جعل جميع حروف اسمـه كبيرة ، بالتـالي
فإن عليك فعل واحد من اثنين:
· إنذار المستخدم أنـه أخطأ في الإدخال والطلب منه الإعادة .
· تصحيح أخطاء المستخدم وإكمال البرنامج كأن شيئاً لم يكن.
والخيار الثاني هـو أفضل ، إلا أن في بعض الحالات عليـك التعامـل مـع جميـع
الخيارات وقد يكون في أحد الأنظمة ما يجبرك على القيام بالحل الأول ، ففي
البرمجة لا يمكنك توقع العوائق التي ستقابلها والتي لن تجتازهـا إلا إذا كنـت
عارفاً بأغلب الحلول إن لم يكن كلها.
سنقوم الآن بكتابة مثال يستخدم الحلقة 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 لـن يعــمل حتـى تضغــط علـى زر الإدخـال