الاثنين، 4 فبراير 2013

Intro. to Programming - Lesson 4


قلنا قبل كده ان أي حرف بتضغط عليه من الـ Keyboard  بيتحول لـ character  بيتعملها encoding  بـ system 
 معين (هنا شغالين بالـ ASCII ) يعني كل حرف بيتخزن في 8-bit ، مثلاً لو هنخزن حاجة زي دي "ab3" هتتخزن ازاي ؟
هنحوّل كل حرف للـ ASCII  المناظر ليه يعني هيبقى كده
0110 00010110 00100011 00110000 0000


طيب اول 3 - byte  من الشمال عارفينهم ، هم تحويل ab3  للـ ASCII  انما ايه 0000 0000 دي ؟
"ab3" اسمها string بمعنى سلسلة من الحروف ، أي string لازم ينتهى بحاجة اسمها null-terminating character  و دي الـ ASCII بتاعها عبارة عن 0000 0000
طب ليه لازم تنتهي بالحرف ده ؟ الحرف ده بيحدد نهاية الـ String بما انها بتتكون من كذا حرف ، الجهاز هيعرف ازاي انها انتهت ؟ فهو بيعرف عن طريق الـ Null character دي
من هنا هنعرّف حاجة اسمها Array أو مصفوفة : هي عبارة عن مجموعة من العناصر اللي من نفس الـ data type
أبسط مثال على array هو الـ String  و لو طبقنا عليه التعريف فهو مجموعة من العناصر (الحروف) من نفس الـ data type  اللي هو char .

تعريف الـ Array :

زي أي variable مع بعض الاختلافات البسيطة :
type array_name[array_size];
1- Type  : هو نوع العناصر الموجودة جوا الـ Array يعني مثلاً لو هعمل string يبقى العناصر اللي جواها char
2-Array_size : عدد العناصر اللي جوا الـ Array أو حجم الـ Array
مثال :- لو عايز اعمل string و احط جواه "Hello" هعرّفه كده
char str[] = “Hello”;
هنا محطيتش الـ size بتاع الـ Array لأني حطيت العناصر اللي فيها فالـ compiler هيحسبها لوحده
طيب في نفس المثال، لو انا عايز اعمل print للحرف التالت اعمل ايه ؟
عشان توصل لعنصر معيّن في الـ Array بتستخدم [] وجواهم الترتيب بتاع العنصر ده
مثال : انا لسه عندي نفس الـ string
char str[] = “Hello”;
عايز اخد الحرف التاني اللي هو e  و احطه في variable لوحده ، أكيد هيبقى الـ variable ده من النوع char ، فهعمل كده
char chr = str[1];
لاحظ هنا اني عشان اوصل للعنصر التاني خليت الـ Index بتاع الـ Array 1 مش 2 ليه ؟ لأن الترتيب في الـ Array بيبدأ من zero ، فأول عنصر رقمه 0 و التاني 1  والتالت 2 و هكذا.




قلنا قبل كده لما نيجي نعرّف variable مثلاً unsigned short int  و اسمه x و عايزين نديله قيمة = 5 بنعرّفه كده
unsigned short int x = 5;
هنا x ممكن نستخدمها عشان تعبر عن حاجتين : 1- القيمة نفسها (اللي هي 5)
                                                                   2-العنوان اللي متخزن فيه  
اتكلمنا قبل كده عن ازاي نستخدمها للتعبير عن القيمة ، الوقتي هنتكلم عن تعبيرها عن العنوان
كل variable ليه عنوان معين في الـ memory و العنوان ده ملوش علاقة بالقيمة
عشان نتعامل مع العنوان ده بنستخدم حاجة اسمها Pointer  و هو عبارة عن طريقة عشان تفضل متابع العناوين في memory


مثال زي اللي قلناه في الأول "ab3" هيتخزن ازاي في الـ memory
أولاً هيخزن أول حرف في عنوان معين ، بعد كده هيزوّد واحد على العنوان ده و يخزن الحروف اللي بعده لغاية ما يوصل للـ null
و لما يجي يقرا ؟ هيبدأ من عنوان أول حرف ، و بعدين يفضل يزوّد لغاية ما يلاقي الـ null يقف ، يبقى هو ده الـ String بالنسبة له
address
word


01000110 0001 ⇒ ‘a’
01010110 0010 ⇒ ‘b’
01100011 0011 ⇒ ‘3’
01110000 0000 ⇒ null
1000
...…..

Memory


في المثال اللي فات ، قيمة الـ Pointer هتكون عنوان اول character في الـ String  اللي هو 0100 هيقراها الاول ولما يخلص يزيد واحد بقى 0101 يقرا تاني character  و هكذا لغاية ما يوصل للـ Null character

تعريف الـ pointer :-

الـ Pointer زي أي variable ليه نفس طريقة التعريف
type *name = value;
لكن خلي بالك من كذا حاجة

1- type : مش نوع الـ Pointer ، احنا قلنا ان أي Pointer بيكون فيه Address  ، يعني كله نفس النوع ، الـ Type هنا مقصود بيها الـ type بتاع الـ data اللي متخزنة في الـ address اللي متخزن في الـ pointer .

طب ليه محتاج اعرف الـ type بتاع الـ data  ؟ قلنا برضه قبل كده ان كل الداتا الموجودة في الـ RAM عبارة عن موجودة اصفار ووحايد ورا بعض ، طب انا اعرف منين البداية والنهاية بتاعة الـ Variable ده ؟ اعرف هتعامل معاه ازاي ؟ كل ده بيتحدد عن طريق type ، يعني مثلاً لو  الـ Type هو char  فالـ Pointer هيعرف ان الـ Data المتخزنة في الـ  address اللي بيشاور عليه عبارة عن char ، فهيقرا 8 bits  هم دول الداتا اللي عايزهم
2- *  بتتحط قبل اسم الـ Pointer عشان توضح انه Pointer
3-value ده عبارة عن address ، غالباً بيكون Address لـ Variable تاني موجود قبل كده (ممكن يكون Pointer برضه )


مثال: انا الوقتي عملت variable اسمه x  من نوع Int  وحطيت فيه قيمة 5
int x = 5;
عايز اعرف العنوان بتاعه في الـ RAM ، فهعمل Pointer يشاور عليه و اعمل print للعنوان بتاعه طب ازاي ؟
هعرّف Pointer  الـ Type بتاعه نفس الـ Type بتاع x
int *ptr = &x;
& هنا معناها address of بمعنى ان قيمة الـ pointer هتساوي address of x ، يعني الـ Pointer هيكون فيه عنوان الـ x


طيب عايزين نعمل printf للـ address ده ؟ هنكتب جملة printf عادية جدا الفرق بس في placeholder ، الـ pointer ليه placeholder خاص بيه هو %p يعني جملة الـ printf هتبقى كده
printf(“%p”,ptr);
لاحظ تاني ان الـ variable هنا هو ptr بس مش *ptr  
لو حطينا *قبل ptr ده معناه ، هات القيمة اللي موجودة جوه الـAddress اللي متخزن جوا الـ Pointer
يعني في المثال ده *ptr  هتكون قيمته 5 و في الحالة دي هيبقى int عادي و الـ Placeholder هيبقى %d أو %i
printf(“%d”,ptr);  //prints the value stored at the address stored in the pointer (5)


ملاحظة تانية :-
int *ptr = &x;
هي نفسها
int *ptr;
ptr = &x;
و مش نفس
*ptr = 6;



ملاحظة تالتة:-
لو عندك الكود ده
int x = 5;
int *ptr = &x;
*ptr = 8;
في الأول انت عندك variable اسمه x  قيمته =  5 ، و بعدين عملت Pointer  اسمه ptr بيحتوي عنوان الـ x ، لو عملت *ptr = 8 ده معناه انك بتقولي غيّر القيمة اللي موجودة عند العنوان المتخزن في الـ pointer  و خليها = 8 (يعني قيمة الx هتتغير و هتبقى = 8)

Using pointers for storing strings

اتكلمنا عن تخزين الـ String كـ array من الـ characters ، الوقتي هنتكلم عن حالة خاصة في الـ Pointers ، ازاي تستخدمها عشان تخزن string


أولاً هتخلي الـ type بتاع الـ Data اللي متخزنة في الـ address اللي في الـ Pointer عبارة عن char ، بمعنى الـ Pointer هيحتوى على عنوان أول حرف في الـ string  و بعد كده هيفضل يقرا لغاية ما يلاقي null زي ما قلنا قبل كده
char *ptr = “This is a string”;
نفترض اننا عايزين نطبع الـ string ده و الـ Address بتاعه (address بتاع اول حرف فيه ) هنستدعي نفس الvariable  في المرتين لكن الفرق هيكون في الPlaceholder الأول هيكون %s عشان يعرض الـ string ، التاني هيكون %p عشان يعرض الـ Address بالشكل ده
printf(“The string is %s and the address is %p”,ptr,ptr);


الجمعة، 1 فبراير 2013

Intro. to Programming - Lesson 2


Signed and unsigned numbers


Signed number هو الرقم اللي ممكن يكون موجب أو سالب ، لكن unsigned يعني موجب بس

رقم زي 7 مثلاً تمثيله Binary يبقى 111 ، أقل عدد من الـ bits ممكن نخزنه فيها هو 3

لو عايز تخزن رقم 8 اللي هو (1000) مينفعش تمثله في 3 bits ، هتحتاج على الأقل 4 bits عشان تخزنه فيهم
من الكلام ده نستنتج :
عدد ال bits بيحدد اقصى قيمة ممكن تتخزن فيها لما تضيف bit زيادة ، ممكن تخزن ضعف اللي ممكن تخزنه قبل ما تضيفها (مثلاً لو عندك 3 bit اقصى رقم ممكن تخزنه فيها هو 7 لو زوّدت bit بمعنى بقى عندك 4 bit هتلاقي اقصى رقم ممكن تخزنه بقى 8 )

نفترض ان عندنا 4 bits يبقى كل الاحتمالات اللي فيها كالتالي :






في الجدول اللي فات احنا اعتبرنا ان الارقام كلها Unsigned بمعنى ان كلها موجب ، في الحالة دي في 4 bit ممكن نخزن ارقام من 0 لغاية 15





طيب في حالة signed ؟ في طرق كتير لتمثيل الارقام اللي ممكن تكون موجب او سالب هنتكلم عن طريقة اسمها signed magnitude

الطريقة دي بتقول اننا نحجز آخر bit من الشمال و نسميها sign bit بحيث لو قيمة الـ bit دي بـ 0 يبقى الرقم موجب ، و لو قيمتها بـ 1 يبقى الرقم سالب ، فمثلاً لو عندنا 4 bit هنخلي اخر bit للاشارة و يبقى عندنا 3 bit نخزن فيها الارقام نفسها بالمنظر ده


                                         
                                             

هتلاحظ ان الـ range بدل ما كان في حالة الـ unsigned من 0 لـ 15 ، بقى في حالة الـ signed من -7 لـ 7 و ده بسبب اننا خدنا bit للتعبير عن الاشارة ، بمعنى الـ range قل للنص بس بقى ممكن تعد في اتجاهين

ملاحظة تانية هتلاقي عندك الصفر ظهر مرتين مرة صفر و مرة سالب صفر و ده طبعاً كده فيه تضييع لمساحة محتاجين نستغلها . طيب عشان نستغلها ممكن نقول انها بتعبر عن رقم تاني غير سالب صفر

نبص للقيمة كده : 1000 هتلاقي ان اخر بت اللي بتعبر عن الاشارة قيمتها 1 ده معناها ان الرقم سالب

فيبقى احسن لو خلينا القيمة دي تعبر عن رقم سالب

حاجة تانية ان عندك اصغر رقم سالب -7 فيستحسن نخليها تعبر عن الرقم اللي اصغر منه على طول عشان نبقى استفدنا من range كامل فنخليها تعبّر عن -8

معنى كده ان القيمة دي 1000 هنخليها تعبر عن الرقم -8 عشان نستغل المساحة دي و منكررش الصفر مرتين

هتلاحظ من الكلام اللي فات كله ان نفس الرقم ممكن يعبّر عن رقمين مختلفين بيتخلف من signed لـ unsigned

يعني مثلاً القيمة 1101 لو قلت ان ده unsigned يبقى بيعبر عن الرقم 13 و لو قلت انه signed يبقى بيعبّر عن الرقم -5

طيب الجهاز هيترجم القيمة دي على اساس انها 13 ولا -5 ؟

في الحقيقة انت اللي هتقوله ، هتحددله يتعامل معاها ازاي ، فلو قلتله اتعامل مع القيمة دي على انها signed number هيعرف انها -5 لكن لو قلتله انها unsigned هيتعامل معاها على انها 13




Numeric Overflow


تخيل انك عندك 2 bits عشان تخزّن فيهم ارقام

فلما تعد هتعد كده

                                                       

لما وصلت لـ 11 افرض انك عايز تزّود 1 ؟ هتلاقي القيمة اللي بعدها 100 معناه ان محتاجbit كمان مش هتعرف تخزن الرقم كله في 2 bits ؟ طب لو زوّدت و انت في 2 bits ؟ هيخزن أول رقمين ع اليمين بس و اخر bit مش هيقدر يخزنها يعني بعد 11 هترجع لـ 00 تاني ، ده اسمه Numeric overflow

      



                  

بمعنى تاني لو جيت تخزن رقم أكبر من الـ maximum اللي يقدر يخزّنه عدد معين من الـ bits بيحصل الـ numeric overflow

مثال تاني لو عندك رقم 4 و رقم 6 متخزنين في 3 bits و عايز تجمعهم و تخزن الناتج برضه في 3 bits نشوف ايه اللي هيحصل


       




4 ممكن تتخزن في 3 bits و برضه 6 تتخزن في 3bits لما تجمعهم الناتج هيبقى 10 اللي هو بيتمثل 1010 يعني 4 bits فلو عايز تخزنه في 3 bits هياخد اول 3 bits ع اليمين بس ، فهيطلع ناتج الجمع غلط اللي هو 2 مش 10




الارقام الكسرية


في النظام العشري نعرف نمثل الارقام الكسرية 159.5




الجزء اللي قبل العلامة ع الشمال هو الجزء الصحيح ، الجزء اللي على يمين العلامة هو الجزء الكسري

لاحظ ان القيم المكانية للارقام على يمين العلامة هي مقلوب القيمة المكانية للأرقام على شمال العلامة

نفس الكلام في الـ binary

مثلاً رقم زي ده


ده لو هنحوله decimal يبقى كده

1x4 + 1x2 + 1x1 + 1x(1/2) = 7.5

فيه ارقام زي 0.1 متقدرش تجيب قيمة بالظبط ليها لكن ممكن تجيب قيمة تقريبية ليها ، و كل ما زوّدت عدد الـ bits بعد العلامة تزيد الدقة

مثلاً 0.1 ممكن نحوله binary كده






ده هيكون حوالي 0.09 و هي قيمة قريبة من 0.1 ممكن تزود عدد الـ Bits و توصل لقيمة اقرب

تخزين الارقام الكسرية في الكمبيوتر بيخزن الرقم كله على بعضه ، من غير تخزين العلامة ، و بتعرّفه عدد الارقام اللي قبل العلامة و عدد الارقام بعد العلامة




Numeric data types in C



عشان تخزن رقم ، لازم تعرف حاجتين


المساحة اللي هتحتاجها عشان تخزن الرقم


ايه نوع الرقم اللي هتخزنه

هنتكلم الأول عن أنواع الارقام في الـ c






بالنسبة للـ size فيه حاجة اسمها size modifiers وليها نوعين short , long

مثال :


Unsigned short int number = 10;


Unsigned  موجب

Short  هيتخزن في مساحة صغيرة

Int  عدد صحيح

Number  اسم المتغير

10  قيمة المتغير


Char and ASCII


اتكلمنا عن الارقام ، فيه data type تاني بيستخدم عشان يخزن حروف اسمه char

غالباً بيتخزن في 1 byte يعني 8 bit

كل حرف موجود على الـ Keyboard سواء كان رقم أو حرف أو special character الجهاز بيتعامل معاه أولاً على انه character و كل character ليه code معين على حسب نوع الـ encoding المستخدم ، احنا هنا هنتكلم عن ASCII Encoding


بيخزن الحروف و الارقام دي ازاي ؟ كل رقم او حرف بيبقى ليه كود معين من 8 bits

مثلاً الـحروف الـ capital الـ code بتاعها كده





و ال small بتاعتها كده 


لو دققنا في الجدولين هنلاقي شوية ملاحظات :-


1-كل حرف بيتمثل في 8 bits


2-الحروف الـ capital بيكون فيها أول 3 bits من الشمال دايماً 010 بعد كده الـ 5 bits الباقيين بتعبر عن ارقام من 1 لغاية 26


3-الحروف الـ small بيكون فيها اول 3 bits من الشمال دايماً 011 بعد كده الـ 5 bits الباقيين بيعبروا عن الارقام من 1 لغاية 26


4-لو دققنا في اول 3 bits من الشمال في الحروف الـ capital و ال small هنلاقي ان الـ bit رقم 3 بتكون 0 لما يكون الحرف capital و بتكون 1 لما يكون الحرف small

Numbers as characters in ASCII


قلنا قبل كده انك لما تضغط على اي حاجة على keyboard بيتعامل معاها على انها char ، نفس الحكاية مع الارقام

مثال:




ملاحظات :-

1-كل الارقام (الممثلة كـ Characters ) اول 4 bits ع الشمال بيكونوا دايماً 0011 و بعد كده الـ 4 bits اللي بعدهم بتكون قيمة الرقم الحقيقة من 0000 لغاية 1001


2-قيمة الـ char number مش هي نفسها قيمة الرقم الحقيقة يعني مثلاً

‘6’ لا تساوي 6


لأن ‘6’ بتكون 0011 0110 في حين ان 6 بتكون 0000 0110

يعني لو عايز تحول من ‘6’ لـ 6 لازم تخلي اول 4-bits من الشمال أصفار















الخميس، 31 يناير 2013

Intro. to Programming - Lesson 3



Intro. to Programming - Lesson 3



Installing Cygwin & Notepad++
اتكلمنا قبل كده عن الحاجات اللي هنحتاجها عشان نبدأ نكتب و نشغل برنامج بالـ c  وقلنا اننا هنحتاج حاجتين اساسيتين :
1-text editor  : عشان اكتب فيه الكود
2- compiler  : اللي هترجم بيه الكود ده للـ binary
احنا هنستخدم في الكورس الـ notepad++  كـ text editor  وهنستخدم gcc  الموجود ضمن Cygwin  كـ compiler

خطوات التنزيل:
أولأ هننزل 3 حاجات Cygwin installer  ، Cygwin offline version  ، notepad++ installer

أول حاجة هنسطبها هي Cygwin  فهنشغل Cygwin installer  اللي هو اسمه setup



























بعد ما خلصنا تسطيب Cygwin  عايزين نقدر نستدعي gcc  من اي مكان جوا windows  عشان كده هنضيف الـ path بتاعه في environment variables  بتاعة ويندوز بالطريقة دي










نجرب بقى نعمل call  لـ gcc  من command line  هندخل على run  و نكتب cmd







و بعدين نكتب gcc-3  هتظهر الرسالة دي اللي بتدل انه قدر يستدعيه بس هو محتاج اسم ملف عشان يعمله compile  

كده عندنا كل حاجة جاهزة عشان نبدأ نكتب و نـ compiled  برامج الـ c


Program flow

احنا قلنا قبل كده ان اي تعامل بينك و بين الكمبيوتر في الـ real time  بيكون دايماً مع الـ RAM  ، بمعنى ان اي data  بتكتبها مثلاً بتتخزن على طول في RAM  بعد كده ممكن تتنقل في اي storage  تانية زي الـ hard disk.
البرنامج لما تيجي تعمله run  برضه زي أي data  ، بيتنقل كله في الميموري.
بفرض ان عندك برنامج فيه 6 أوامر ، لما تيجي تعمله run  بيتنقل في الـ memory  بداية من عنوان معين بيديهوله الـ Operating System  بيكون فيه أول أمر في البرنامج ، و بيكون فيه pointer  بيشاور على الأمر اللي هيتنفذ. في الأول الـ pointer  هيشاور على أول أمر ينفذه و بعدين ينزل على اللي بعده و ينفذه و هكذا لغاية ما يخلص البرنامج.

لاحظ إن الامر اللي بيتنفذ مش بيتمسح من الـ memory  ، بيفضل موجود بس الـ Pointer  مبقاش بيشاور عليه .
طيب افرض ان الأمر رقم 3 ده كان عبارة عن استدعاء لبرنامج تاني ، بمعنى ان الامر رقم 3 ده بيقول "روح للبرنامج اللي اسمه P2 " مثلاً ، في الحالة دي ايه اللي هيحصل ؟
أولاً البرنامج لما يجي يتنفذ هيتنقل في الـ memory  عادي خالص ، هيبدأ بتنفيذ أول أمر ، و بعدين التاني و بعدين الامر التالت هيجي ينفذه يلاقيه بيقول روح للبرنامج p2  ، البرنامج p2  ده هيكون موجود في ال RAM  برضه زي أي برنامج وبادئ عند عنوان معين ، هيروح الـ Pointer  للعنوان ده و يبدأ ينفذ p2  أمر أمر ، و لما يخلص يرجع تاني للبرنامج الأساسي يكمل تنفيذ الأوامر اللي ناقصة ، فهينفذ الأمر الرابع و الخامس و السادس.
البرنامج الصغير الفرعي ده اللي هو P2  ليه اسماء كتير ، فيه لغات بتسميه Function  أو subroutine  أو method ، المهم انه مجموعة من الأوامر مع بعض بيتم استدعائها من البرنامج الأساسي.


Include statements
بفرض انك عايز تكتب كود معين يعمل وظيفة معينة في البرنامج بتاعك و مش عارف تكتب الكود ده و سألت حد فاداك ملف فيه الكود و قالك حطه copy & paste  في البرنامج بتاعك
افرض ان الكود ده كان كبير مثلاً 200 سطر ، و البرنامج بتاعك برضه كان كبير ، يا ترى منظر الكود هيكون ايه ؟
افرض انك عايز تستخدم الكود ده في أكتر من برنامج ، تخيل لو في كل برنامج قعدت تعمل copy & paste  للكود هيكون برامجك شكلها ايه ؟
عشان كده كل لغات البرمجة بتدعم حاجة اسمها include  بمعنى انك ممكن تستخدم الكود الموجود في ملف معين و تستدعي الـ functions  الموجودة فيه من غير ما تعمل copy & paste  للملف ده في البرنامج بتاعك بس بتكتب جملة في البرنامج تشاور بيها على الملف ده
كل لغة ليها طريقة معينة في كتابة جملة الـ include  مثلاً في الـ c   بتكون بالشكل ده
#include filename
جملة include  مهمة برضه لما تيجي تستخدم libraries  خارجية مش موجودة في اللغة ، مثلاً لو عايز تعمل image processing  في البرنامج بتاعك اكيد هتضطر تدوّر على external library  تساعدك في الموضوع ده و تنزلها و تعملها include  و بعدين تقرا الـ documentation  بتاعها عشان تستخدمها في البرنامج بتاعك

Arguments and Return values
بفرض انك عندك دالة اسمها print  ، و انت عايز تطبع جملة معينة زي “Hello”  مثلاً ، هل يكفي انك تستدعي الدالة print  بس ؟ طب كده هي هتطبع ايه ؟ لازم تزوّدها بمعلومات إضافية عشان تنفذ الوظيفة اللي انت عايزها فهنا مثلاً لازم تستدعي الدالة و تبعتلها الـdata  للي عايز تطبعها (اسمها arguments  أو parameters )
Function: print
Arguments: “Hello”
مثال تاني : لو عايز تستدعي دالة ترسم مربعات اسمها drawSquare  مينفعش بس تكتب drawSquare  لأ لازم تحددلها مجموعة من الحاجات (arguments ) عشان ترسم المربع اللي عايزه ، زي مثلاً طول الضلع ، اللون اللي هترسم بيه ، لون الخلفية ، المكان اللي هترسم فيه و هكذا كل الحاجات دي اسمها parameters  أو arguments

Return value  هي القيمة اللي هترجع بيها الدالة للبرنامج الاساسي اللي استدعاها ( أو الـ operating system  لو الدالة دي دالة الـ main ). أي function  ليها return value  لما تخلص تنفيذ هترجع بالقيمة دي للبرنامج اللي استدعاها و ممكن تستخدم القيمة دي في البرنامج. مثال: لو عندك برنامج بيستدعي في سطر من سطوره دالة بتجمع رقمين ، بيكون الـ return type  بتاعها قيمة رقمية ، و القيمة اللي بترجع بيها هي حاصل جمع الرقمين ، و الـ arguments  بتوع الدالة دي هم الرقمين.

ايه المطلوب عشان اتعلم اي لغة برمجة :
1-      تعلم قواعد اللغة دي ، او grammar  اللي هتكتب بيه اوامر اللغة ، اسمه syntax
2-      تتعلم الدوال الاساسية اللي موجودة في اللغة
3-      تتعلم ازاي تستخدم external libraries  اللي فيها دوال متقدمة عشان تقدر تعمل حاجة مفيدة بالبرنامج بتاعك

كتابة أول برنامج بالسي :
الوقتي هنكتب اول برنامج بالشكل ده

نفهم بقى ايه الكلام ده.
أول حاجة انت بتفكر في الوظيفة اللي عايز البرنامج يعملها ، فاحنا عايزين نعمل برنامج يطبع كلمة hello ، فعشان نكتب البرنامج بنعمل دالة اسمها main  دي الدالة الأساسية في البرنامج اللي هي أول حاجة هتشتغل لما البرنامج يشتغل ، أي برنامج لازم يكون فيه دالة main  و بتتكب في الـ c  بالشكل ده


زي اي دالة عادية لما نيجي نكتبها بتتكب بالصورة دي
Return_type function_name(arguments) {

Return return_value;
}
هنا الـreturn_type  بتاع الfunction  من نوع int  بمعنى ان القيمة اللي هترجع بيها الدالة للبرنامج اللي استدعاها (هنا الـ operating system ) هتكون integer  و لازم تكون return_value  في آخر سطر من الدالة من نفس النوع المتعّرف فوق
بعد return type  بنكتب اسم الدالة (هنا اسمها main ) و بعدين بين قوسين بنكتب الـ arguments  هنا مفيش arguments  فبنكتب void  (بمعنى nothing )
و بعدين نكتب محتوى الدالة بين قوسين { }

طيب الوقتي نشوف الوظيفة اللي عايزين نعملها ، عايز نكتب كود يطبع كلمة hello
عارفين ان الدالة اللي بتستخدم عشان الطباعة في ال c  اسمها printf  و بتاخد argument  بالشكل ده

بس الدالة printf  الـ compiler  هيعرفها منين ، بمعنى اصح هيستدعيها منين ؟ عشان نستخدم الدالة دي لازم نعمل include  لملف stdio.h  أو standard input/output  فبنضيف جملة Include  للملف ده في اول سطر خالص  بالمنظر ده

كده خلاص الكود جاهز ، نعمل save  للملف ده باسم prog1.c  مثلاً و بعدين نروح نعمل compile
نروح على command line  و ندخل على الـ directory  اللي موجود فيه  مثلاً عندي موجود في
E:\c_programming
فهنكتب في command line
E:
Cd c_programming
Gcc-3 prog1.c
a


ملحوظة: gcc  لما يعمل compile  لأي source  بيسمي الملف الـ binary  أو الـ executable  a.exe  عشان كده لما نيجي نشغله نكتب a  
بيظهر كلمة Hello  بتتطبع على شاشة الـ command line  زي ما احنا شايفنين

المتغيرات Variables  :
المتغيرات حاجة اساسية في أي لغة برمجة ، وزي ما هو باين من اسمها هي عبارة عن قيم ممكن تغيّرها أكتر من مرة خلال البرنامج.
عشان تخزن أي data  في البرنامج لازم تستخدم variables  بتديها اسم بعد كده تستخدم الاسم ده في تغيير قيمتها او قراءة قيمتها او عمل عمليات عليها
طب ازاي بنكتب الـ variable  ؟ عشان تكتب variable  بيكون بالطريقة دي
Variable_type variable_name= value;
أول حاجة variable_type  هو نوع الـ data  اللي هتتخزن في المتغير ده و في انواع كتير زي ما قلنا قبل كده زي int , unsigned int , float, char  
تاني حاجة variable_name  اي اسم تختاره للـ variable  
بعد كده ممكن تديله قيمة مبدئية أو لأ
مثلاً :
Unsigned short int x = 4;
هنا variable type  هو unsigned short int
Variable name  هو x
Value  هي 4

Printf & placeholders  :
احنا اتكلمنا قبل كده عن printf  و ازاي تستخدمها في طباعة text  مثلاً ، طب لو عايز تحط مع الـ text  ناتج جمع رقمين مثلاً او طرح او اي قيمة تانية بتعمل كده ازاي ؟ بتحط في المكان اللي عايز تحط فيه القيمة دي في الطباعة حاجة اسمها placholder  يعني معناه بتقول لدالة printf  انك هتحط متغير من نوع معين في المكان ده و بعد لما تخلص الـ text  تكتب ,  و بعدين اسم الـ Variable
مثال:

هنا انت عامل 3 متغيرات x = 5  و y= 6  و z  هو مجموع x + y
و عامل جملة printf  تطبع الجملة دي
The sum of (x) and (y) is: (z)
و عشان التلات متغيرات من النوع Int بتستخدم Placeholder  عبارة عن %d  
هيكون ناتج التنفيذ كده

طيب كل نوع متغير ليه placeholder  مختلف في الـ c  ودي امثلة عليها 

Data type
Placeholder
Int / signed int
%d , %i
Unsigned int
%u
Single character
%c
String of characters
%s