الاثنين، 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 من الشمال أصفار