1. التعريفات والحجز
التعريف
الكتابة الخوارزمية | في C |
حرف <اسم_المتغير>[<الطول>] |
char <Variable> [<Length>]; |
أمثلة :
char NASSAB [20]; |
الحجز في الذاكرة
بما أن المتسلسلات الحرفية من النوع char فإن كل عنصر أي كل حرف من حروفها يأخذ ثمنا واحدا في الذاكرة، وبالتالي فإن حجم كل متسلسلة في الذاكرة هو عدد طولها في 1 (1 هو حجم النوع char).
ملاحظات
-
كل متسلسلة منتهية بالرمز '0\'.
-
'0\' يرمز إلى نهايتها (ويعني NUL).
-
كل متسلسلة تحتوي على n حرف فإن العنصر الأخير يأخذه '0\'، وبالتالي يكون عدد حروفها المستعملة هو n-1.
مثال :
char TXT[10] = "BONJOUR !"; |
2. طرق تهيئة المتسلسلات عند التعريف
هذه التعريفات متكافئة :
char JOMLA[] = {'s','a','l','a','m','\0'}; char JOMLA[] = "salam"; |
2.1 تعريفات خاطئة وأخرى صحيحة
2.2. أشكال مختلفة وملاحظات
-
يمكن لكل متسلسلة أن توضع بين الرمزين " "
-
المتسلسلة المنعدمة يعبر عنها كما يلي: ""
-
يمكن استعمال الرموز التالية داخل المتسلسلات ('n\' و 't\' و 'v\' و ' "\ ' و ' '\ ' و ...)
-
مثال : "هذه الجملة n\ مقسمة n\ إلى 3 أسطر."
-
يمكن وضع الرمز' داخل المتسلسلة، مثال : {'L','\'','a','s','t','u','c','e','\0'}
-
يمكن وضع الرمز" داخل المتسلسلة، مثال : "Affichage de\"guillemets\" \n"
-
المتسلسة"salam " "3alaikom" تكافئ "salam 3alaikom"
'x' |
هذا الشكل يمثل حرفا له قيمة ثابتة (الرقم ASCII لـ 'x' هو 120) |
"x" |
هذا الشكل يمثل جملة متكونة من حرفين هما 'x' و '0\' |
'x' |
يحجز في الذاكرة ثمن واحد فقط لأنه حرف واحد. |
"x" |
يحجز في الذاكرة ثمنين لأنه متكون من حرفين. |
"salamo" |
تـحجز في الذاكرة 7 أثمان لأنها متكونة من 6 أحرف بالإضافة إلى الرمز '0\'. |
التمرين 8.1
من أي الكتابات التالية مكتوبة بالشكل الصحيح؟ إن كان هناك خطأ فقم بإصلاحه مع تبيان لكل متسلسلة حرفية عدد الأثمان المطلوبة حفظها في الذاكرة.
a) char a[] = "one\ntwo\nthree\n";
b) char b[12] = "one two three";
c) char c[] = 'abcdefg';
d) char d[10] = 'x';
e) char e[5] = "five";
f) char f[] = "This " "sentence" "is broken";
g) char g[2] = {'a', '\0'};
h) char h[4] = {'a', 'b', 'c'};
i) char i[4] = "'o'";
2.3. الدخول إلى أو استعمال عناصر المتسلسلة
إن استعمال عناصر المتسلسلة شبيه باستعمال عناصر الجدول، ويتم بنفس الطريقة.
مثال : نعتبر التعريف التالي : char txt[16] = "salamo 3alaikom";
txt[0] | يمثل الحرف 's' |
txt[1] | يمثل الحرف 'a' |
txt[2] | يمثل الحرف 'l' |
txt[3] | يمثل الحرف 'a' |
وهكذا | .... |
نريد تغيير الحرف 'o' بالحرف 'i'، يكفي إذن أن نكتب txt[5] = 'i'
فيصبح المتغير txt يساوي "salami 3alaikom"
2.4 جدول ASCII
في الواقع إن الحاسوب لا يعرف أي حرف من الحروف، لا الحروف اللاتينية ولا الحروف أو الأرقام العربية.
يوجد في bios جدول متكون من 256 خانة ، وكل خانة يمكنك وضع أية مصفوفة تمثل الحرف الذي تريده...
المهم : هذا الجدول يحتوي على حروف مهيأة سابقا وهي الحرف اللاتينية والرموز والأرقام العربية، وكل حرف أو رمز أو رقم عربي له رقم يسمى الرقم ASCII، وهي كالتالي:
![]() |
مثال 1 :حدد الرقم ASCII للحرف A
من خلال الجدول نجد انه هو: 41h مثال 2: حدد الرقم ASCII للرقم 1 من خلال الجدول نجد انه هو: 31h مثال 3: حدد الرقم ASCII للحرف a من خلال الجدول نجد انه هو: 61h مثال 4: حدد الرقم ASCII للرمز ! من خلال الجدول نجد انه هو: 21h مثال 5: حدد الرقم ASCII للرمز الفراغ من خلال الجدول نجد انه هو: 20h |
ملاحظات :
20h : هو رقم الفراغ ' '
0dh : هو رقم الرجوع إلى السطر ' n\ '
0ah : هو رقم الرجوع إلىبداية السطر 'r\'
00h : هو رقم المنعدم ' nul '
2.4. أسبقية الحروف
من خلال جدول ASCII نستنتج بأن الحروف والرموز والأرقام هي في الواقع عبارة عن أرقام، ومن خلال هذا نستنج بأن كل واحد منها أكبر من الآخر من حيث الترتيب حسب الرقم ASCII.
ومنه نقول بأنه مثلا:
-
'A' أصغر من 'B' و 'B' أصغر من 'C' وهكذا ...
-
'a' أصغر من 'b' و 'b' أصغر من 'c' وهكذا ...
-
'0' أصغر من '1' و '1' أصغر من '2' وهكذا ...
-
'A' أصغر من 'a' و 'B' أصغر من 'b' وهكذا ...
-
عموما لدينا الترتيب التالي :. . . <0<1<2< ... <9< . . . A<B<C< ... <Z< ...<a<b<c< ... <z< . . .
2.4.1 مقارنة متسلسلتين أو جملتين قاموسيا
أمثلة:
"ABC" قبل "BCD" | 'A'<'B' لأن |
"ABC" قبل "B" | 'A'<'B' لأن |
"Abc" قبل "abc" | 'A'<'a' لأن |
"ab" قبل "abcd" | لأن "" قبل "cd" |
" ab" قبل "ab" | ' '<'a' لأن |
لا تنس أن الفراغ ' ' رقمه ASCII هو 20h أي 32 بالنظام العشري.
مثال :
char C; |
2.4.2 تحويل الحروف اللاتينية الكبيرة إلى الصغيرة والعكس
char C; |
3. التعامل الفعلي مع المتسلسلات الحرفية
تحتوي مكتبات C على مجموعة من الدوال التي تتعامل أو هي متخصصة فقط لمعالجة الجمل والكلمات والحروف، وأهم هذه المكتبات هي كالتالي :
-
<stdio.h>
-
<string>
-
<stdlib>
-
<ctype>
3.1.1 دوال الكتابة أو الإظهار على الشاشة
3.1.1.1 الدالة ()printf
كما هو معتاد الدالة ()printf تقوم بكتابة المعطيات على الشاشة.
ولكتابة جملة على الشاشة نستعمل الرمز s% لتعيين أن المتغير عبارة عن متسلسلة حرفية
مثال :
|
3.1.1.1 الدالة ()puts
بكل اختصار الدالة ()puts تكافئ الدالة printf("%s\n", )
مثال : puts(TXT); تكافئ printf("%s\n",TXT);
أمثلة :
char TEXTE[] = "ligne 1."; |
3.1.2 دوال القراءة من لوحة المفاتيح
3.1.2.1 الدالة ()scanf
كما هو معتاد الدالة ()scanf تقوم بقراءة المعطيات من لوحة المفاتيح.
ولقراءة جملة من لوحة المفاتيح نستعمل الرمز s% لتعيين أن المتغير عبارة عن متسلسلة حرفية.
مثال :
char PLACE[25]; |
كما نلاحظ أن الدالة ()scanf تحتاج إلى عناوين المتغيرات حيث نضيف الرمز & إلى كل متغير، إلا في حالة المتسلسلة فيكفي أن نضع اسم متغير المتسلسلة بدون معقوفتين [ ] لأنه يعبر عن عنونها في الذاكرة.
3.1.2.2 الدالة ()gets
بكل اختصار الدالة ()gets تكافئ الدالة scanf("%s", )
مثال : gets(TXT); تكافئ scanf("%s",TXT);
أمثلة :
int MAXI = 1000; |
التمرين 8.2
أنجز شفرة تمكن من قراءة 5 كلمات من لوحة المفاتيح باستعمال الدالة ()scanf مرة واحدة.
الكلمات الخمس تحفظ في 5 متغيرات :M5 ،....،M1.
أظهرهن على الشاشة بالشكل المعاكس.
مثال :
phrase petite une voici
التمرين 8.3
أنجز شفرة تمكن من قراءة نص كامل (لا يتجاوز 200 حرف) وقم بحفظه في متغير TXT ، وأظهر ما يلي:
أ) طول النص L .
ب) عدد مرات الذي ذكر فيها الحرف 'e' في النص.
ج) أظهر النص مقلوبا بكامله على الشاشة ، دون تغيير محتوى المتغير TXT.
د) من خلال تغييرمحتوى المتغير TXT ، اقلب النص بكامله وأظهره على الشاشة.
مثال :
voici une petite phrase ! !esarhp etitep enu iciov
التمرين 8.4
أنجز شفرة تمكن من قراءة نص كامل (لا يتجاوز 200 حرف) وقم بحفظه في متغير TXT ، ثم احذف كل مثيلات الحرف 'e' مع الاحتفاظ بالحروف الأخرى. التعديلات يجب أن تكون في المتغير TXT نفسه.
مثال :
Cette ligne contient quelques lettres e.Ctt lign contint qulqus lttrs .
3.2. دوال المكتبة <string>
هذه المكتبة لها دور كبير في معالجة المتسلسلات الحرفية.
قبل التطرق إلى بعض دوال هذه المكتبة نشير أن استعمال الحرف:
<j> | يمثل جملة |
<g> | يمثل جملة |
<n> | يمثل عدد |
الدالة |
الوصف |
|
strlen(<j>) |
تمكن من معرفة طول المتسلسلة دون عد الرمز '\0' |
|
strcpy(<j>, <g>) |
نسخ <g> في <j> |
|
strcat(<j>, <g>) |
إضافة <g> في آخر <j> |
|
strcmp(<j>, <g>) |
لمقارنة <j> و <g> قاموسيا حيث تكون النتيجة |
|
سالبة | إذا كانت <j> قبل <g> | |
0 | إذا كانت <j> تساوي <g> | |
موجبة | إذا كانت <j> تلي أو بعد <g> | |
strncpy(<j>, <g>, <n>) |
نسخ <n> حرف من <g> في <j> | |
strncat(<j>, <g>, <n>) |
إضافة <n> حرف من <g> في آخر <j> |
احذر من أن تكتب مثلا في داخل المشروع ما يلي ;A="SALAM 3ALAIKOM"
ويمكن تعويض ذلك بأن نكتب : strcpy(A, "SALAM 3ALAIKOM");
أما إضافة جملة أو جزءا منها في آخر أخرى لا يتم عن طريق العامل + كما في الخوارزم أو اللغة Pascal بل نستعمل إحدى الدالتين ()strcat أو()strncat.
التمرين 8.5
أنجز شفرة تمكن من قراءة اسم ونسب المستعمل وأظهر الطول العام لاسمه الكامل دون عد الفراغ الذي يفصل اسمه عن نسبه.
استخدم الدالة()strlen .
مثال :
First and last name:
Omar benkhatab
Hello Omar benkhatab !
Your name is composed of 13 characters.
التمرين 8.6
أنجز شفرة تمكن من قراءة جملتين (أو كلمتين)CH1 و CH2 ، ثم قارنهما قاموسيا وأظهر النتائج على الشاشة:
مثال:
chaine 1: ABC
chaine 2: abc
"ABC" precede "abc"
التمرين 8.7
أنجز شفرة تمكن من قراءة جملتين (أو كلمتين) CH1 و CH2 ، ثمقم بأخذ المقطع الأول لكل من CH1 و CH2 واجعلهما في متسلسلة حرفية ثالثة CH3.
أظهر النتائج على الشاشة :
أ) استعمل الدوال المخصصة لذلك والمنتمية إلى <string.h>.
ب) استعمل للقراءة والكتابة الدالتين ()gets و ()puts .
التمرين 8.8
"خاص لمن يفهم اللغة الفرنسية"
أنجز شفرة تمكن من قراءة فعل للمجموعة الأولى (يعني منتهي بـ 'er') وأظهر على الشاشة صرف هذا الفعل في الحاضر "présent" .
تأكد من أن الفعل الذي تم إدخاله منتهي بـ 'er' قبل الصرف.
استعمل الدوال ()gets و ()puts و ()strcat و ()strlen.
مثال:
Verbe : fêter
je fête
tu fêtes
il fête
nous fêtons
vous fêtez
ils fêtent
3.3. دوال المكتبة <stdlib>
تحتوي هذه المكتبة على دوال تقوم بتحويل الأعداد إلى متسلسلات وكذلك العكس.
3.3.1 تحويل المتسلسلات إلى أعداد
توجد في C ثلاث دوال أساسية تقوم بهذا التحويل وهي كالتالي :
|
مثال :
|
قوانين التحويل:
-
الفراغات يتم تجاهلها
-
يتوقف التحويل عند أول حرف لا يمكن تحويله كـ z و g و ...
-
بالنسبة لمتسلسلة لا يمكن تحويلها، تكون النتيحة في هذه الحالة هي 0.
3.3.2 تحويل الأعداد إلى متسلسلات
توجد في C ثلاث دوال أساسية تقوم بهذا التحويل وهي كالتالي :
|
حيث :
n_int |
يمثل عدد ذي النوع int يجب تحويله. |
n_long |
يمثل عدد ذي النوع long يجب تحويله. |
n_uns_long |
يمثل عدد ذي النوع unsigned long يجب تحويله. |
b |
هو أساس التحويل (2...36) |
j |
الجملة التي سيتم وضع العدد المحول فيها (طولها القصوي هو 17 حرف) |
التمرين 8.9
لتكن الأوامر التالية :
char STR[200];
puts("Number :");
gets(STR);
printf("Entree = %s \n", STR);
printf("integer = %d \n", atoi(STR));
printf("long = %ld \n", atol(STR));
printf("double = %f \n", atof(STR));
ما هي القيم التي ستظهر على الشاشة إذا تم إدخال ما يلي:
1) 123
2) -123
3) - 123
4) 123.45
5) 12E3
6) 1234f5
7) -1234567
8) 123e-02
9) -0,1234
التمرين 8.10
أنجز شفرة قصيرة باستعمال الدالة ()ltoa تقوم بمعالجة نتائج التمرين 3.3 .
3.4. دوال المكتبة <ctype>
tolower(<c>) | تقوم بتحويل الحرف <c> إلى صغير إذا كان <c> حرفا كبيرا |
toupper(<c>) | تقوم بتحويل الحرف <c> إلى كبير إذا كان <c> حرفا صغيرا |
مثال :
char c='a'; |
c=toupper(c); /*c='A'*/ |
c=tolower(c); /*c='a'*/ |
الدالة |
ترجع قيمة تخالف 0 |
isupper(<c>) |
إذا كان <c> كبيرا ('A'...'Z') |
islower(<c>) |
إذا كان <c> صغيرا ('a'...'z') |
isdigit(<c>) |
إذا كان <c> رقما ('0'...'9') |
isalpha(<c>) |
إذا كان islower(<c>) أو isupper(<c>) |
isalnum(<c>) |
إذا كان isalpha(<c>) أو isdigit(<c>) |
isxdigit(<c>) |
إذا كان <c> إذا كان حرف ينتمي إلى النظام الستعشري |
('0'...'9' أو 'A'...'F' أو 'a'...'f') |
|
isspace(<c>) |
إذا كان <c> فراغا أي (' ', '\t', '\n', '\r', '\f') |
4. جدول المتسلسلات الحرفية
جدول المتسلسلات الحرفية هو في الحقيقة عبارة عن مصفوفة ذات النوع char، بحيث أن كل سطر يمثل متسلسلة.
4.1 التعريفات والتهيئة والحجز
مثال للتعريف : char JOUR[7][9];
مثال للتهيئة :
char JOUR[7][9]= {"lundi", "mardi", "mercredi", |
الحجز في الذاكرة :
من خلال هذا المثال نلاحظ أن الجدول JOUR يحجز 7*9*1 = 63 ثمنا في الذاكرة.
4.2 استعمال أو الدخول إلى عناصر جدول المتسلسلات
نعتبر المثال التالي :
char yawm[7][9]= {"Itnayne", "Tholataa", "Arbe3a", |
ستكون النتيجة على الشاشة كالتالي :
Alyawm howa Jomo3a ! |
مسألة 1: نريد تعويض كلمة "Khamiss" بكلمة "Khamis"
في هذه الحالة نستعمل الدالة strcpy ونكتب إذا : strcpy(yawm[3],"Khamis")
مسألة 2: نريد إظهار الحروف الأولى للأيام فقط.
الحل :
for(I=0; I<7; I++) |
ستكون النتيجة على الشاشة كالتالي :
I T A K J S A |
التمرين 8.11
أنجز شفرة تمكن من قراءة 10 كلمات وأحفظهم جميعا في جدول للمتسلسلات الحرفية. ثم رتبهم قاموسيا باستعمال الدالتين ()strcpy و ()strcmp. أظهر على الشاشة الجدول الذي تم ترتيبه. استعمل طرق الترتيب التي تعجبك (أنظر إلى تمارين الفقرة 8).
التمرين 8.12
أنجز شفرة تمكن من قراءة عدد بين 1 و 7 وأظهر اسم اليوم الذي يوافقه.
|
التمرين 8.13
أنجز شفرة تمكن من قراءة 5 كلمات من لوحة المفاتيح باستعمال الدالة ()scanf مرة واحدة.
الكلمات الخمس تحفظ فيجدول للمتسلسلات الحرفية.
أظهرهن على الشاشة بالشكل المعاكس.
مثال :
voici une petite phrase !
! phrase petite une voici
التمرين 8.14
"خاص لمن يفهم اللغة الفرنسية"
أعد كتابة التمرين 8.8 (الصرف) باستعمال جدولين للمتسلسلات الحرفية.
|
|
استخدم الدوال التالية : ()printf و ()scanf و ()strlen.
تمارين تطبيقية
قم بحل التمارين الآتية بدون استعمال الدوال المخصصة لـ <string.h> أو <stdlib.h> أو <ctype.h>
التمرين 8.15
أنجز شفرة تمكن من قراءة كلمتين من لوحة المفاتيح حيث يتم بعد ذلك تحديد ترتيبهما قاموسيا فبما بينهما فقط.
التمرين 8.16
أنجز شفرة تمكن من قراءة كلمة أو جملة CH من لوحة المفاتيح وقم بتحويل الحروف الصغيرة إلى حروف كبيرة وعكس ذلك.التحويل يكون في CH .أظهر النتائج على الشاشة.
التمرين 8.17
أنجز شفرة تمكن من قراءة كلمة أو جملة من لوحة المفاتيحتحتوي على الأرقام العربية من '0' إلى '9' وربما بعض الرموز والحروف الأخرى، وقم بمناقشة هذه الجملة كأنها عدد صحيح موجب في النظام العشري. ومن أجل التحويل ، استعمل الدوال المنتمية إلى <ctype.h> ، بعد ذلك قم بحفظ النتيجة في متغير ذي النوع long . يجب على التحويل أن يتوقف عندما يصادف أول حرف أو رمز لا يمثل رقما عربيا.
التمرين 8.18
أنجز شفرة تمكن من قراءة كلمة أو جملة من لوحة المفاتيحتحتوي على الأرقام العربية من '0' إلى '9' ومن 'A' إلى 'F' وربما بعض الرموز والحروف الأخرى، وقم بمناقشة هذه الجملة كأنها عدد صحيح موجب في النظام الستعشري. ومن أجل التحويل ، استعمل الدوال المنتمية إلى <ctype.h> ،وعلما أن التحويل يتجاهل كل الرموز والحروف الأخرى غير المنتمية إلى النظام الستعشري، بعد ذلك قم بحفظ النتيجة في متغير ذي النوع long .أظهر النتائج على الشاشة بالشكل العشري و الستعشري.
التمرين 8.19
باستعمال المبدأ المطروح في التمرين 8.17 ، أنجز شفرة تمكن من قراءة كلمة أو جملة من لوحة المفاتيحتحتوي على الأرقام العربية من '0' إلى '9' وربما بعض الرموز والحروف الأخرى، وقم بمناقشة هذه الجملة كأنها عدد حقيقي موجب أو سالب في النظام العشري. بعد ذلك قم بحفظ النتيجة في متغير ذي النوع double .استعمل جملة مناسبة إن كان هناك خطأ .
طريقة :
استعمل متغير سمه SIG لحفظ إشارة القيمة. حول جميع الرموز الرقمية (قبل وبعد النقطة العشرية) إلى قيمة عددية N. عدد أو أحسب الأعشار (يعني المواقع بعد النقطة العشرية) بمساعدة متغير سمه DEC واحسب القيمة الجذرية كما يلي :
( N = N * SIG / pow(10, DEC
أمثلة :
|
التمرين 8.20
باستعمال المبدأ المطروح في التمرين 8.19 ، أنجز شفرة تمكن من قراءة كلمة أو جملة من لوحة المفاتيحتحتوي على الأرقام العربية من '0' إلى '9' وربما بعض الرموز والحروف الأخرى، وقم بمناقشة هذه الجملة كأنها عدد حقيقي موجب أو سالب باستعمال الأس. بعد ذلك قم بحفظ النتيجة في متغير ذي النوع double .استعمل جملة مناسبة إن كان هناك خطأ .
طريقة :
استعمل متغير سمه SIGE لحفظ إشارة الأساس.استعمل متغير آخر سمه EXP لحفظ قيمة الأساس. أحسب قيمة الأساس بمساعدة SIGE و DEC و EXP. أحسببعد ذلك القيمة N بحيث : ( N = N * SIG / pow(10, DEC
أمثلة :
|
التمرين 8.21
أنجز شفرة تمكن منإزالة الجملة OBJ من المتسلسلة الحرفية SUJ .
أمثلة :
|
التمرين 8.22
أنجز شفرة تمكن من تبديل الجملة CH1 بالجملة CH2في المرة الأولى فقط بالمتسلسلة الحرفية SUJ .
أمثلة :
|
التمرين 8.23
أنجز شفرة تمكن من تبديل الجملة CH1 ومثيلاتها بالجملة CH2بالمتسلسلة الحرفية SUJ .
أمثلة :
|
تأليف
المؤلف الأصلي: فرديريك فابر (Frédéric FABER)
البريد الإلكتروني: عنوان البريد الإلكتروني هذا محمي من روبوتات السبام. يجب عليك تفعيل الجافاسكربت لرؤيته.
الموقع الإلكتروني: http://www.ltam.lu/cours-c
ترجمة بتصرف: محمد عبد الرحمان