ر
سالة لتنبية مستخدم البرنامج : من عيوب الدالة
scanf أنها لا يمكن استخدامها لطباعة أي نص على الشاشة كما مع دوال الدخل
في لغة مثل البيسك . وهذا معناه ضرورة الاستعانة بدالة الطباعة printf إذا
أردنا أن نطبع علىالشاشة رسالة تنبه المستخدم إلى أن البرنامج ينتظر إدخال
بيان مثل:Please Enter the numberفي المثال التالي نرى صورة محسنة لإدخال
قيمتي متغيرين مع طباعة الرسائل اللازمة لتنبية المستخدم.
CODE |
#include main() { float x,y,z; printf(“Enter the first number : ”); scanf (“%f”,&x); printf(“Enter the second number : ”); scanf (“%f”,&y); z=x+y; printf(“the sum of the numbers you entered is : %.2f\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n”,z);} |
ملاحظة هامة:
لا يوصى باستخدام الدالة scanf لاستقبال الحرفيات من لوحة المفاتيح، حيث
يتطلب الأمر احتياطات كثيرة . ولاستقبال الحرفيات من لوحة المفاتيح توجد
طرق أفضل سيأتي الحديث عنها.
طرق جديدة للتعامل مع الحرفيات:لقد رأينا من قبل كيف يمكننا تخزين الحرفي بالاستعانة بالمؤشرات حيث يشير
المؤشر إلى الرمز الأول من الحرفي المختزن في الذاكرة . هذا من ناحية
بداية الحرفي . أما من ناحية نهاية الحرفي فإن البرنامج من تلقاء نفسه
يضيف إلى مؤخرة الحرفي الرمز الصفري ( NULL character ) وهو الرمز رقم صفر
في جدول الكود آسكي.ويفيد هذا الرمز في تمييز مؤخرة الحرفي و بالتالي في
تحديد طوله لتسهيل التعامل معه قراءة وكتابة ومعالجة بالطرق المختلفة.وفي
الواقع أن هذه الطريقة برغم ما تحتويه من تفصيلات فنية دقيقة لكنها أفضل
من الطرق المستخدمة في اللغات الأخرى التي تتوفر بها المتغيرات
الحرفية ( string variables )، فمع هذه الطريقة في لغة C لا توجد أية قيود
على طول الحرفي المستخدم.وهنا سنتناول طريقة أخرى لتمثيل الحرفيات وهي
مصفوفة الرموز ( character
arrays ) ومن اسم هذه الطريقة يتضح أنه يتم حجز خانات الذاكرة اللازمة للحرفي مقدما.
الأعلان عن مصفوفة الرموز:لننشئ مصفوفة من الرموز فإننا نبدأ بالإعلان عنها في بداية البرنامج .
ويشمل الإعلان اسم المصفوفة وسعتها ( size ) أي الحد الأقصى لعدد الرموز
بها .فمثلا الجملة التالية يتم فيها الإعلان عن مصفوفة رموز بالاسم (
employee_name ):
CODE |
char employee_name[20]; |
في هذا الإعلان يتم حجز عشرين خانة في الذاكرة تتسع كل منها لرمز واحد ، كما تخصص الخانة الأخيرة للرمز الصفري( NULL ).
ولشحن هذه المصفوفة بأحد الحرفيات، فإن دالة خاصة تستخدم لهذا الغرض وهي
الدالة ( strcpy ( a, ) حيث " a " هو اسم مصفوفة الرموز، و "b" هو الحرفي
المراد تخزينه في المصفوفة.
والمثال التالي يوضح الإعلان عن مصفوفة
رموز بالاسم " a" تتسع لعشرين رمزا ثم ننسخ إلى عناصرها الحرفي " Hello
again " وفي النهاية نطبع محتويات المصفوفة باستخدام دالة الطباعةprintf
مع استخدام الفورمات المناسبة للحرفيات s%.
CODE |
#include #include main() { char a[20]; strcpy(a,”Hello again”); printf(“ %s\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n”,a);} |
ومن الملاحظ في هذا البرنامج ظهور توجيه جديد هو :
إن
هذا التوجيه يصبح لازما عند استخدام الدالة strcpy حيث أن الملف "
string.h" هو الملف الذي يحتوي على تعريف الدالة " strcpy " وبقية دوال
الحرفيات، ويطلق على هذا الملف اسم ملف العناوين للحرفيات " string header
file" والآن سنتناول طريقة عمل البرنامج بشىء من التفصيل، ولنبدأ بدالة
الطباعة printf . فعندما تتعامل مع مصفوفة الرموز " a " فغنها تقرأ و
تطبععناصر المصفوفة واحدا بعد الآخر حتى تصادف الرمز الصفري فتتوقف.أما عن
طريقة تخزين الرموز في المصفوفة فهناك نقاط جديرة باهتمامنا .إننا عندما
نعلن عن المصفوفة " 4); font-size: 11px; line-height: 135%;"
align="center" border="0" cellpadding="3" cellspacing="1" width="95%"]
CODE |
a[0], a[1],…………………..,a[19] |
ولا
يشترط عندما نخصص أحد الحرفيات لهذه المصفوفة أن نشغل جميع العناصر (
الخانات) ففي المثال السبق مثلا عدد رموز الحرفي كانت 11 حرفا و استخدم
العنصر الثاني عشر من المصفوفة لتخزين الرمز الصفري.
طرق مختلفة لإدخال الحرفيات:ذكرنا من قبل أنه لا يوصى باستخدام الدالة scanf لإدخال الحرفيات من لوحة
المفاتيح .والآن سنستعرض البدائل المختلفة التي تتيحها اللغة لإدخال
الحرفيات.الدالة gets :يعتبر اسم الدالة اختصارا للعبارة " get string "
وهي تقوم بقراءة الحرفي المدخل من لوحة المفاتيح ، وتضيف إليه الرمز
الصفري ( NULL ) ثم تقوم بتخصيصه للمتغير المطلوب و الذي يستخدم كدليل
للدالة. وصيغة الدالة كالآتي:gets(a);حيث " a " مصفوفة الرموز.والمثال
التالي يوضح استخدام هذه الدالة.
CODE |
#include main() { char employee_name[20]; gets(employee_name); printf(“ Employee: %s\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n”,employee_name); } |
وعندما
يبدأ البرنامج سوف ينتظر منك إدخال الحرفي المطلوب وهو اسم الموظف "
employee name " ثم يخصصه لمصفوفة الرموز المكونة من عشرين عنصرا. وفي
النهاية يطبع البرنامج الاسم على الشاشة كتأكيد لتمام الاستلام و
الحفظ.ويمكننا هنا إدخال الاسم محتويا على مسافات خالية وذلك على العكس من
الدالة scanf التي تعتبر المسافة الخالية مماثلة للضغط على المفتاح
Enter.ولكن هناك قيد على الحرفي المدخل إذ يجب مراعاة ألا يزيد طوله عن
الحجم المحجوز للمصفوفة مع العلم بأن المترجم يستغل خانة من المصفوفة
لتخزين الرمز الصفري. ففي هذا المثال لا يمكن إدخال أكثرمن 19 رمز فقط.
الدالة fgets :تستخدم هذه الدالة لقراءة حرفي من ملف أو جهاز للدخل ( input device ).
ويتم تعريف الملف ( أو جهاز الإدخال ) ضمن صيغة الدالة نفسها كالتالي:
CODE |
fgets( a, n, stdin ); |
حيث
" a " مصفوفة رموزو " n " الحد الأقصى للرموز المدخلة.و " stdin" اسم جهاز
الدخل القياسي ( لوحة المفاتيح )ويمكن بالطبع استبدال جهاز الدخل القياسي
stdin باجهزة أخرى حسب الموقف و لكننا في الوقت الحالي سوف نكتفي بلوحة
المفاتيح كجهاز للدخل .عند استخدام هذه الدالة في إدخال الحرفيات فإنها
تضيف إلى مؤخرة الحرفي كلا من
:1- علامة السطر الجديد
(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n
).
2- الرمز الصفري ( NULL ).ولذلك فإنه مع هذه الدالة لابد وأن نخصص
عنصرين في المصفوفة لهذين الرمزين .والمثال التالي يوضح استخدام هذه الدالة
CODE |
#include main() { char employee_name[20+2]; fgets(employee_name,22,stdin); printf(“ Employee: %s\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\n”,employee_name); } |