Dec 062011
 

في هذا الدرس سيتم شرح طريقة استقبال مدخلات من المستخدم ومعالجتها في البرنامج، هذا الدرس قد يتطلب مراجعة الدروس السابقة في قسم دروس C.

في لغة C نستخدم الدالة scanf لإدخال قيمة معينة لمتغير عبر المستخدم، وطريقة استخدامها:

scanf(type, variable);

الشطر الأول type: ويقصد به نوع المتغير سواء كان عددًا صحيح، أو حرف وإلخ..

الشطر الثاني variable: اسم المتغير، لكن مسبوقًا بـ&

مثال:

float a;
scanf("%f", &a);

سيتم تقسيم الدرس قسمين، وثالث متفرع من الثاني لتسهيل تتبع الدرس.

أولًا: الادخال البسيط:

في هذا الشطر سنقوم بتخزين المدخلات في متغيرات بسيطة، مثلا نخزن الرقم 5 في المتغير a و 2 في المتغير b وهكذا، هذا مثال مع الشرح:

#include<stdio.h>
main()
{
    /* *****************************************************
    *  تعريف المتغيرات المستخدمة                           *
    *  number1: لتخزين الرقم الأول                          *
    *  number2: لتخزين الرقم الثاني                        *
    *  sum: لتخزين حاصل جمع الرقم الأول مع الثاني           *
    ****************************************************** */
    int number1, number2, sum;
    // طباعة رسالة لطلب ادخال رقمين
    printf("Enter 2 numbers: ");
    /* ***************************************************************
    *  scanf(): هي  دالة لاستقبال مدخلة من قبل المستخدم               *
    *  %d: هنا تك نوع المتغير، وهنا تم تحديده كعدد صحيح              *
    *  &: يستخدم هذا الرمز قبل اسم المتغير لتتم تخزين البيانات به    *
    **************************************************************** */
    scanf("%d", &number1);
    scanf("%d", &number2);
    // عملية الجمع الاعتيادية
    sum = number1 + number2;
    //طباعة النتائج، لاحظ طريقة الكتابة
    printf("Sum of %d + %d = %d", number1, number2, sum);
}

ثانيا: الادخال إلى مصفوفة:

الجزء 1 من 2: الادخال لمصفوفة مباشرة:

المثال مع الشرح:

#include<stdio.h>
main()
{
    /* *****************************************************
    *  تعريف المتغيرات المستخدمة                           *
    *  numbers: مصفوفة بطول 3، لتخزين الأرقام               *
    *  sum: تخزين حاصل جمع المتغيرات الثلاثة                *
    ****************************************************** */
    int numbers[3], sum;
    // رسالة طلب ادخال 3 أرقام
    printf("Enter 3 numbers: ");
    // الادخال للخانة الأولى من المصفوفة
    scanf("%d", &numbers[0]);
    // الادخال للخانة الثانية من المصفوفة
    scanf("%d", &numbers[1]);
    // الادخال للخانة الثالثة من المصفوفة
    scanf("%d", &numbers[2]);
    // عملية الجمع الاعتيادية
    sum = numbers[0] + numbers[1] + numbers[2];
    printf("Sum of %d + %d + %d = %d", numbers[0], numbers[1], numbers[2], sum);
}

الجزء 2 من 2: استخدام التكرارات في الادخال والجمع:
المثال مع الشرح:

#include<stdio.h>
main()
{
    /* *****************************************************
    *  تعريف المتغيرات المستخدمة                           *
    *  numbers: مصفوفة بطول 5، لتخزين الأرقام               *
    *  sum: تخزين حاصل جمع المتغيرات كافّة                  *
    *  i: الرقم المتزايد للتكرار                           *
    ****************************************************** */
    int numbers[5], sum, i;
    // تحديد القيمة المبدئية لمتغير الجمع لتجنب الأخطاء
    sum = 0;
    // رسالة طلب ادخال 5 أرقام
    printf("Enter 5 numbers: ");
    /* *******************************************************
    *  التكرار الأول، للإدخال                                  *
    *  بدء عملية التكرار، البدء من 0 والتوقف عند 9           *
    *  لاحظ استبدال رقم الفهرس في المصفوفة بالمتغير المتزايد  *
    ******************************************************** */
    for(i=0;i<5;i++)
    {
        scanf("%d", &numbers[i]);
    }
    /* *******************************************************
    *  التكرار الثاني؛ عملية الجمع                           *
    *  لاحظ طريقة كتابة سطر الجماع:                           *
    *  sum += numbers[i];                                    *
    *  ويمكن كتابته بالطريقة الآتية أيضًا:                     *
    *  sum = sum + numbers[i];                               *
    ******************************************************** */
    for(i=0;i<5;i++)
    {
        sum += numbers[i];
    }
    // طباعة النتيجة
    printf("result is %d", sum);
}

يتضح بعد الدرس أن الاختلاف بين Java و C بسيط وليس هناك صعوبة لمن يتقن أحدهما في تعلم الأخرى 🙂

Nov 242011
 

ربما لم أضع الدروس بالترتيب الصحيح، إذ انه من المفترض أن يكون هذا الدرس من أوائل الدروس. يفترض الآن أن هناك العديد من الأمثلة في الدروس السابقة للعمليات.
هناك العديد من العمليات والتعابير في لغات البرمجة، وفي العادة تستخدم في العمليات الرياضية وفي الأوامر الشرطية. والجدول الآتي يوضح بعض هذه العمليات:

العملية الشرح مثال
+ تستخدم لعمليات الجمع 1+ 2
++ أضف 1 i++
تستخدم لعمليات الطرح 1 – 2
اطرح 1 i–
* تستخدم لعمليات الضرب 1 * 2
/ تستخدم لعمليات القِسمة 1 / 2
% تستخدم لعرض الباقي من عملية القسمة 1 % 2
التعابير
== للتساوي a == b
=! لا يساوي a != b
< و > تستخدم لعمليات المقارنة، أكبر أو أصغر من a > b
=< أو => أكبر أو يساوي / أصغر أو يساوي a >= b
|| أو“or” – أي يتحقق
أحد الشروط
a == b || c == d
&& و “and” – يجب أن
تتحقق كل الشروط
a == b && c == d

العمليات ليست معقدة وتم شرحها في دروس سابقة ومن الأمثلة السابقة:

sum = a + b;

هي عملية جمع، حاصل ناتج جمع المتغير a مع b، أو للطرح:

sub = a - b;

حاصل طرح a من b وهكذا ..

سيتم شرح الأوامر الشرطية في درس لاحق بإذن الله 🙂

Nov 162011
 

بما أن اوامر التكرار تشبه بعضها بعضًا بشكل كبير، في هذا الدرس سيتم شرحها لـ3 لغات برمجية مختلفة. للدروس السابقة يمكنك العودة للأقسام من القائمة الجانبية.

هناك عِدة أهداف من أوامر التكرار أهمها هو تجنب تكرار الشفرة لذات الغرض أكثر من مرة، لنتفرض أنك ترغب بعمل برنامج لحساب حاصل جمع 10 ارقام، بالتالي سيكون عليك تكرار الشفرات 10 مرات لكل رقم على حدى، لكن يمكن اختصار السطور باستخدام أوامر التكرار.

في Java, C و PHP، هناك 3 انواع من أوامر التكرار وهي:

  1. while
  2. do-while
  3. for

وتستخدم بالطريقة الآتية:

1. while

أولًا: تحديد متغير بقيمة أولية ولنفترض أنه i والقيمة الأولية هي 1.

ثانيًا: كتابة الكلمة المفتاحية while وبين قوسين كتابة “expression” أو تعبير رياضي من خلاله تحدد القيمة النهائية للتكرار، لنتفرض أننا نريد إيقاف التكرار عندما تبلغ قيمة i الرقم 10 مثلًا، فيمكن كتابة التعبير (i < 11) – اي المتغير أصغر من 11 أو (i <= 10) – أي المتغير اصغر أو يساوي 10.

ثالثًا: داخل كتلة التكرار “أي بين { و }” تضع ذات المتغير بشكل متزايد؛ مثلًا: i++ أو i= i+1 أو يمكن بطرق أخرى. عدم وضع التزايد قد يسبب حمل زائد على الذاكرة بالتالي إيقاف عمل البرنامج، وذلك يعتمد على المترجم.

2. do-while

أولًا: تحديد متغير بقيمة أولية ولنفترض أنه i والقيمة الأولية هي 1.

ثانيًا: كتابة الكلمة المفتاحية do ويتلوها قوسي الكتلة “أي { و }”.

ثالثًا: داخل كتلة التكرار “أي بين { و }” تضع ذات المتغير بشكل متزايد؛ مثلًا: i++ أو i= i+1 أو يمكن بطرق أخرى. عدم وضع التزايد قد يسبب حمل زائد على الذاكرة بالتالي إيقاف عمل البرنامج، وذلك يعتمد على المترجم.

رابعًا: كتابة الكلمة المفتاحية while وبين قوسين كتابة “expression” أو تعبير رياضي من خلاله تحدد القيمة النهائية للتكرار، لنتفرض أننا نريد إيقاف التكرار عندما تبلغ قيمة i الرقم 10 مثلًا، فيمكن كتابة التعبير (i < 11) – اي المتغير أصغر من 11 أو (i <= 10) – أي المتغير اصغر أو يساوي 10.

3. for

تلخص كافة الخطوات في while في سطر واحد ليكون كالتالي:

كلمة for المفتاحية وبين القوسين بالترتيب: نكتب قيمة المتغير الأولية ونضع “؛” (فاصلة منقوطة) وبعدها التعبير الرياضي (مثلا i<=10) ونضع “؛” وأخيرًا نضع امر التزايد ليكون مثلًا i++

 

الآن سأقوم بوضع الأمثلة لتصل المعلومة بشكل أفضل، أولًا: Java:

class testloop
{
public static void main(String[]args)
{
int i;

//type 1
i=1;
System.out.print("Type 1 (while): \n");
while(i <= 10)
{
System.out.print(i + "\n");
i++;
}

//type 2
i=1;
System.out.print("\nType 2 (do-while): \n");
do
{
System.out.print(i + "\n");
i++;
}
while(i <= 10);

//type 3
System.out.print("\nType 3 (for): \n");
for(i=1;i<=10;i++)
{
System.out.print(i + "\n");
}
}
}

ثانيًا: C:

#include <stdio.h>
main()
{
int i;

//type 1
i=1;
printf("Type 1 (while): \n");
while(i<=10)
{
printf("%d \n", i);
i++;
}

//type 2
i=1;
printf("\nType 2 (do-while): \n");
do
{
printf("%d \n", i);
i++;
}
while(i<=10);

//type 3
printf("\nType 3 (for): \n");
for(i=1;i<=10;i++)
{
printf("%d \n", i);
}

}

ثالثًا: PHP:

<?PHP
// Type 1
$i=1;
echo "type 1 (while):<br />\n";
while($i <= 10)
{
echo $i."<br />";
$i++;
}

// Type 2
$i=1;
echo "type 2 (do-while):<br />\n";
do
{
echo $i."<br />";
$i++;
}
while($i <= 10);

// Type 3
echo "type 3 (for):<br />\n";
for($i=1;$i<=10;$i++)
{
echo $i."<br />";
}
?>

هل توافقني على أنها متشابهة جدًا ؟ 😀

Oct 262011
 

في درس سابق للغة C، تم وضع مقدمة حولها وبعض من الأساسيات في كتابة شفرة C، وفي هذا الدرس، سيتم طرح الأمثلة على المتغيرات والمصفوفات. المثال التالي كنوع من التذكير للدرس السابق:

#include<stdio.h>
main()
{
    printf("Welcome to C Language, enjoy browsing http://www.alrashdi.co/blog \n");
}

ربما تكون هناك اضافة وهي “\n” ويقصد بها كتابة سطر جديد .. يمكنك التجربة عبر تكرارها بين الكلمات لترى النتيجة 🙂

مثلما شُرح سلفًا، هناك أنواع مختلفة من المتغيرات وهي char, int, float وغيرها وكل نوع يتقبل نوع معين من البيانات وللتوضيح:
char: للمدخلات الحرفية
int: عدد صحيح
float: عدد غير صحيح (رقم بفواصل مثلًا؛ لا أذكر المسمى نسبةً لعدم توافقي مع الرياضيات 😀 )

وسنقوم بعمل برنامج مبسط لعمل عملية جمع حسابية، المتغير a للرقم الأول وهو 19، والمتغير b للرقم الثاني وهو 21 وأخيرًا متغير أخير ليخزن ناتج عملية الجمع وليكن sum؛ وبما أن كافة الاعداد صحيحة سيكون النوع هو int لكافة المتغيرات..

الطريقة الأولى لتعريف المتغيرات دون ادخال القيم هي:

#include<stdio.h>
main()
{
int a,b, sum;
}

والطريقة الثانية:

#include<stdio.h>
main()
{
int a;
int b;
int sum;
}

أيضًا يمكن ادخال قيمة المتغيرات في ذات التعريف، ليكون كالتالي بالنسبة للطريقة الأولى:

#include<stdio.h>
main()
{
int a=19,b=21, sum;
}

أو التالي للطريقة الثانية:

#include<stdio.h>
main()
{
int a=19;
int b=21;
int sum;
}

ولإتمام عملية الجمع:

#include<stdio.h>
main()
{
int a=19,b=21, sum;
sum = a+b;
printf("Welcome to C Language, enjoy browsing http://www.alrashdi.co/blog \n");
printf("result of %d + %d = %d", a, b, sum);
}

لاحظ أننا قمنا بتخزين العملية الحسابية في المتغير sum، ثم عرضنا الناتج، ولإزالة الغموض عن سطر طباعة النتائج:

printf("result of %d + %d = %d", a, b, sum);

لاحظ تكرار “%d” ثلاث مرات، ومثلما ذُكر في الدرس السابق، %d ترافق النوع int، فبالتالي هي تعني 3 متغيرات من نوع int. بعد كتابة الرسالة، قمنا بتحديد قيم %d بالترتيب في بقية السطر خارج علامات الاقتباس وفصلنا بينهم بالفاصلة..

يمكن تطبيق الدرس لمختلف الانواع الاخرى بنفس الطريقة او بطرق مشابه حسب النوع المحدد، الآن لنبدأ القسم الثاني من الدرس وهو المصفوفات. المصفوفات عبارة عن عدة قيّم مخزنة في ذات المتغير، لكن مفهرسة بترتيب معيّن، للتوضيح، الجدول الآتي يوضح المتغير numbers وهو عبارة عن مصفوفة تحتوي على أرقام عشوائية:

0 1 2 3 4 5 6 7 8 9
100 101 102 103 104 105 106 107 108 109

نلاحظ من الجدول السابق:

  1. المتغير numbers يحتوي 10 قيم مختلفة
  2. الفهرسة أو index تبدأ من الصفر، أي أن آخر فهرس يكون (طول المصفوفة – 1) وهكذا ..

المثال الآيتي يوضح كيفية تعريف المصفوفة:

#include<stdio.h>
main()
{
int numbers[10];
}

لقد تم التعريف، لكن لم ندخل القيم, ولادخال القيم:

#include<stdio.h>
main()
{
int numbers[10]={100, 101, 102, 103, 104, 105, 106, 107, 108, 109};
}

أو الطريقة الآتية:

#include<stdio.h>
main()
{
int numbers[10];
numbers[0]=100;
numbers[1]=101;
numbers[2]=102;
numbers[3]=103;
numbers[4]=104;
numbers[5]=105;
numbers[6]=106;
numbers[7]=107;
numbers[8]=108;
numbers[9]=109;
}

ولطباعة محتوى المصفوفة، نكتب اسم المتغير ورقم الفهرسة أو index، مثال:

#include<stdio.h>
main()
{
int numbers[10]={100, 101, 102, 103, 104, 105, 106, 107, 108, 109};
printf("%d is in index 5", numbers[5]);
}

 تعدد المصفوفات:

الجدول الآتي يوضح طريقة تخزين البيانات في المصفوفة المتعددة الاتجاه:

0 1 2 3 4
0 100 101 102 103 104
1 110 111 112 113 114

الجدول يوضح أن طول المصفوفة هو 5 × 2، وطريقة التعريف:

#include<stdio.h>
main()
{
int numbers[5][2];
}
وطريقة الادخال البيانات الأولى:
#include<stdio.h>
main()
{
int numbers[5][2]= {
{100, 101, 102, 103, 104},
{110, 111, 112, 113, 114}
};
}

أو الطريقة الآتية:

#include<stdio.h>
main()
{
int numbers[5][2];
numbers[0][0]=100;
numbers[1][0]=101;
numbers[2][0]=102;
numbers[3][0]=103;
numbers[4][0]=104;
numbers[0][1]=110;
numbers[1][1]=111;
numbers[2][1]=112;
numbers[3][1]=113;
numbers[4][1]=114;
}

وطريقة العرض:

#include<stdio.h>
main()
{
int numbers[5][2]= {
{100, 101, 102, 103, 104},
{110, 111, 112, 113, 114}
};
printf("%d is in index [1][0]", numbers[1][0]);
}

في العادة “التكرار” أو “loop” يرافق المصفوفات، وهو يسهل عملية تخزين البيانات، خاصة المدخلة مِن قبل المستخدم، وسيم شرح الطريقة في درس لاحق بإذن الله .. 🙂

Feb 232010
 

يفترض أن يكون هذا الدرس تابعًا للدرس الأول، لكن قمت بفصله لتسهيل تتبع الدروس بالتدريج 🙂

هناك ثوابت أو قواعد في البرمجيات بشكل عام، عبرها يعرف المترجم (compiler) كيفية عمل البرنامج، لكن قبل ذلك ما هو المترجم (Compiler) ؟

باختصار يقوم المترجم بتحويل لغة البرمجة المفهومة من قبل البشر إلى لغة الحاسب الآلي وهي لغة التجميع (0|1)

في حالتنا يقوم المترجم بتحويل C إلى لغة الحاسب الآلي (binary) لتكون كالتالي 01010101110011 وهكذا

نعود لمحور الدرس، الأساسيات في كتابة الشفرة، في العادة يستند المبرمج لمكتبة مبرمجة مسبقة ليستخدم الدوال منها (حسب المنهج الحالي) لذلك أول سطر في البرنامج يكون طلب استدعاء ملف المكتبة، مثال:

include <stdio.h>

في السطر السابق قمنا باستدعاء ملف المكتب وبملاحظة أن امتداد الملف .h ويقصد به header

الدروس التالية ستعتمد على مكتبة stdio.h باعتبار انها المستخدمة في الدروس في الكتاب

إذًا عرفنا الآن أنه الأسطر الأولى نقوم بكتابة أوامر استدعاء ملفات المكتبات الجاهزة، الآن ننتقل لأمور أخرى.

لتكن قاعدة لديك أنه كلما تقوم بفتح قوس يجب إغلاقه، مثلا:

main () {

}

في حالة عدم إغلاقك لأحد الأقواس سواءً القوس العادي “(” أو القوس المعكوف “{” سيظهر لك خطأ فور تشغيل البرنامج.

شيء آخر مهم، يجب إخبار البرنامج بإنه انتهينا من سطر معين ويجب الانتقال للآخر بوضع فاصلة منقوطة “;” بدون الفاصلة المنقوطة مهما نزلت من الأسطر أو تركت المسافات سيتم احتساب التالي كملحق للسطر السابق، مثال:

main () {
printf (" TEST C ");
}

لاحظ وجود “;” نهاية سطر أمر الكتابة، وأيضًا لاحظ بأن كافة الأقواس مغلقة.

بالنسبة لإغلاق الأقواس تذكر إغلاق علامات الإقتباس أيضًا 🙂

في C نحتاج لتعريف قيم المتغيرات، مثلا المتغير a ستكون قيمته رقمية وبالتحديد رقم صحيح (أي بلا كسور)، أو المتغير b ستكون قيمته رقمية لكن مع كسور أو فواصل عشرية. وهنا أهم أنواع المتغيرات التي سنستخدمها:

Char => c%
int => %d
float => %f

سنتعرف أكثر على كيفية تخصيص نوع المتغير مع الأمثلة في درس لاحق بإذن الله، في نهاية هذا الدرس أقدم لكم رابط لتنزيل أحد محررات لغة C المجانية، محرر Code::Blocks ، و هذا رابط مباشر للتنزيل