أخر الاخبار

تعلم لغة سي ببساطة من الأساسيات إلى الاحتراف

تعلم لغة سي ببساطة من الأساسيات إلى الاحتراف

ماهي لغة سي C

تعتبر لغة السي من أقوى اللغات على الإطلاق و طورت عنها العديد من اللغات الحديثة نسبياً مثل #C و جافا و و ++C. و هي لغة high-level ولكنها تحتوى على بعض خصائص الـ low-level لذا يطلق عليها في الغالب middle-level language و سنستعرض. معاً بعض مميزات اللغة التي جعلتها تحظى بذلك الرواج و بتلك القوة الكفاءة. و هذا يرجع إلى أن اللغة low-level مقارنة باللغات الأخرى لما تحتويه من بعض الخصائص التي تتعامل مباشرة مع الهاردوير مثل المؤشرات pointers مما يعني أنها قريبة جداً من لغة الآلة و هذا بدوره. يعني أنها تقوم بتنفيذ البرامج بشكل أسرع وسرعة تنفيذ البرامج تعد عاملاً مهماً في تحديد قوة اللغة.

القوة و على الرغم من صغر لغة السي إلا أنها تستمد قوتها من الـ standard library الخاصة بها و التي تحوى مئات الدوال التي تقوم بعمليات كثيرة. فتغنيك عن كتابة المئات من الأسطر للقيام بعملية معينة فهي تمدك بدالة تقوم بتلك العملية في سطر واحد.

Portability و تعنى أن البرنامج الذي تمت كتابته باللغة يعمل على مختلف أجهزة الحاسب الآلى بداية من الحاسب الشخصى و إنتهاءاً بالحاسبات العملاقة.

المرونة تتميز اللغة بأنها لا تحد المبرمج بحدود صارمة عندما يتعلق الأمر بإستخدام خواص اللغة و هذا يميزها عن العديد من اللغات. فلغة السي بنيت على قاعدة مشهورة تقول بأن (( المبرمج يعلم ما يفعل )) فهناك بعض العمليات تسمح بها اللغة و لا تعتبرها كخطأ و لكن في لغات برمجية أخرى لا يتم السماح بها. فمثلاً يمكنك جمع متغير من النوع char على آخر من النوع int أو float دون أي مشكلة هناك لغات أخرى لا تسمح بذلك و الأمثلة على تلك العمليات. كثيرة و سيتضح لك الكثير منها خلال تعاملك مع اللغة و لكن هذه المرونة قد تتسبب لك في بعض المشاكل. في برامجك - bugs التكامل مع نظام التشغيل Linux و هذا التكامل أضاف إلى اللغة الكثير و خاصة فيما يتعلق بالـ Portability.

عيوب لغة سي 

كأي لغة برمجة لا تخلو لغة السي كذلك من العيوب نستعرض بعضها معاً:

عرضة اكثر للأخطاء البرمجية و هذا يرجع إلى أن المترجم الخاص باللغة لا يكتشف بعض الأخطاء. أثناء عملية الترجمة و التي قد يتم إكتشف مثلها في لغات أخرى فمعظم الأخطاء تظهر في وقت تنفيذ البرنامج و ليس ترجمته. و هذا هو الأثر السلبي للمرونة التي تتميز بها اللغة.

صعوبة فهم الكود فعلى الرغم من صغر لغة السي إلا أنها تحتوى على خصائص عديدة تكتسبها من الـ standard library الخاصة. بها كما ذكرنا من قبل و عند مزج هذه الخصائص معاً في المراحل المتقدمة من إحتراف اللغة تصبح الامور أكثر صعوبة.

صعوبة تعديل الكود في المشاريع الضخمة المطورة بلغة السي يصعب عليك تعديلها مرة أخرى لأن السى لا تدعم بعض الخصائص التي تساعد على تجزئة البرنامج و تنظيمه مثل الـ classes و الـ packages.

أهم المجالات التطبيقية للغة سي

 تطوير نظم التشغيل operating systems و تعد أهم المجالات التطبيقية للغة سي فمعظم نظم التشغيل التي نستخدمها يومياً حتى على هواتفنا المحمولة مطور جزء كبير منها بلغة السي.

الأنظمة المدمجة embedded systems يتم برمجة الأنظمة المدمجة بلغة السي في أغلب الأحيان و هي اللغة الأشهر في هذا المجال.

فبرمجة المتحكمات الدقيقية microcontrollers تتم بلغة السي أو بلغة مكون معظمها من لغة السي فمثلا الأردوينو يستخدم لغة خاصة. به تسمى Arduino C و هي لغة مطورة من السي بشكل أساسي مع لغة أخرى تسمى الـ Processing.

تطوير compilers للغات أخرى و المترجم compiler هو برنامج يترجم الكود إلى لغة الآلة .

تستخدم في قواعد البيانات databases و كذلك تستخدم في تطوير الـ text editors مثل الـ word.

و هنا نكتفي بهذا القدر من التحدث عن مميزات اللغة و تطبيقاتها و أعتقد بأنك تستطيع الآن أن تحدد حاجتك إلى تعلم اللغة من عدمها.

دوال الإدخال و الإخراج 

يمكن حفظ بيانات في متغير معين في الذاكرة بطريقتين الأولى أن يتم إعطاء هذا المتغير قيمة مباشرة عن طريق الـ assignment أو عن طريق إستقبال بيانات من المستخدم و حفظها في هذا المتغير.

و نقوم بهذا عن طريق إستخدام دوال الإدخال و الإخراج و قد تعرضنا لواحدة منها سلفاً و هي دالة printf و قلنا أنها تستخدم لطباعة بيانات معينة للمستخدم. و يوجد الكثير من دوال الإخراج على غرار دالة printf و كل هذه الدوال موجودة في ملف (stdio.h) الذي تعرضنا له سابقاً، و سنستعرض الآن دالة printf و دالة scanf و تستخدم لعملية إدخال بيانات من المستخدم.

نبذة عن كتاب تعلم لغة C

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

الكتاب يركّز بشكل ملحوظ على المواضيع التي تختلف فيها لغة السي عن أغلب اللغات فستجد أن الفصول الأربعة الأخيرة ( المؤشرات و حجز الذاكرة ديناميكياً، الدوال، المتغيرات النصية و التعامل مع الملفات ). تم تركيز الشرح عليهم بشكل ملحوظ.

و الفصول الأولى تم تناولها بأبسط شكل ممكن لسببين:

  1. الأغلبية عندهم علم مسبق بتلك المواضيع فهي مشابهة كثيراً لإستخدامها في اللغات الأخرى.
  2. سيتم توظيف هذه المواضيع في برامجنا في المواضيع المتقدمة.

لذلك لم أجد فائدة كبيرة في إدراج أمثلة كثيرة في المواضيع الأولى. لتحقق الإستفادة القصوى من الكتاب يجب أن تكون قد تعاملت مع لغة برمجة واحدة على الأقل من قبل و لا يستلزم أي معرفة مسبقة بلغة السي.

بعض المفاهيم الأساسية التي تحتاج إلى معرفتها:

المتغيرات (Variables): تستخدم لتخزين البيانات في الذاكرة. يجب تعريف نوع المتغير واسمه قبل استخدامه.

int age;  // تعريف متغير من نوع صحيح لتخزين العمر

الثوابت (Constants): تستخدم لتعريف قيم ثابتة لا يمكن تغييرها أثناء تنفيذ البرنامج.

const double PI = 3.14159;  // تعريف ثابت PI
العمليات الحسابية: يمكنك استخدام العمليات الحسابية الأساسية مثل الجمع (+) والطرح (-) والضرب (*) والقسمة (/) في لغة C.
int sum = 5 + 3;  // جمع الأعداد 5 و 3 وتخزين النتيجة في المتغير sum

البيانات النوعية (Data Types): تحدد نوع البيانات التي يمكن تخزينها في المتغيرات. بعض أمثلة الأنواع الأساسية في لغة C هي int و float و char.

int age = 25;  // متغير من نوع int لتخزين العمر
float salary = 2500.50;  // متغير من نوع float لتخزين الراتب
char grade = 'A';  // متغير من نوع char لتخزين الدرجة

العبارات المشروطة (Conditional Statements): تستخدم لاتخاذ قرارات في البرنامج بناءً على شرط معين. في لغة C، يتم استخدام if و else لهذا الغرض.

int x = 10;

if (x > 5) {
    printf("العدد أكبر من 5");
} else {
    printf("العدد أصغر من أو يساوي 5");
}

هذه بعض المفاهيم الأساسية في لغة C. يمكنك استكشاف المزيد من المفاهيم والميزات المتقدمة مثل الحلقات (Loops) والوظائف (Functions) والمؤشرات (Pointers) بعد تعلم الأساسيات.

ما هي البيانات النوعية الأخرى التي يمكن استخدامها في لغة C؟

بالإضافة إلى الأنواع النوعية التي ذكرتها سابقًا (int و float و char)، لغة C توفر أيضًا العديد من البيانات النوعية الأخرى التي يمكن استخدامها في البرامج. إليك بعض الأمثلة الشائعة:

double: يستخدم لتخزين الأعداد العشرية بدقة أعلى من الـ float.

double pi = 3.14159;

long: يستخدم لتخزين الأعداد الصحيحة الكبيرة.

long population = 1000000000;
short: يستخدم لتخزين الأعداد الصحيحة الصغيرة.
short temperature = -10;

unsigned: يستخدم لتخزين الأعداد الصحيحة غير السالبة (إيجابية أو صفر).

unsigned int count = 100;

_Bool: يستخدم لتخزين القيم البولية (صحيحة أو خاطئة).

_Bool isTrue = 1;

هذه بعض الأنواع النوعية الأساسية في لغة C. وبالإضافة إلى ذلك، يمكنك أيضًا تعريف أنواع مخصصة خاصة بك باستخدام التعليمة typedef.

هل يمكنني استخدام أكثر من نوع بيانات في نفس المتغير في لغة C؟

في لغة C، لا يمكن استخدام أكثر من نوع بيانات في نفس المتغير. يجب تحديد نوع المتغير عند تعريفه ولا يمكن تغييره فيما بعد. على سبيل المثال، إذا كنت ترغب في تخزين قيمة عددية ونصية في نفس المتغير، يجب عليك استخدام نوع بيانات يمكنه تخزين كلا النوعين، مثل نوع الحرف (char) أو نوع السلسلة النصية (string).

مثال باستخدام نوع الحرف (char):

char myVariable = 'A';  // تخزين حرف 'A' في المتغير

مثال باستخدام نوع السلسلة النصية (string):

char myString[] = "Hello, World!";  // تخزين السلسلة النصية "Hello, World!" في المتغير

يمكنك استخدام المؤشرات (pointers) في لغة C للتعامل مع بيانات متعددة الأنواع، ولكن هذا يتطلب مفاهيم وتقنيات متقدمة.

هل يمكنني استخدام المؤشرات لتخزين قيم متعددة الأنواع في نفس المتغير؟

نعم، يمكن استخدام المؤشرات (pointers) في لغة C لتخزين عناوين الذاكرة، وبالتالي يمكنك استخدامها للتعامل مع قيم متعددة الأنواع في نفس المتغير، ولكن هذا يتطلب بعض المفاهيم والتقنيات المتقدمة.

يمكنك تعريف مؤشر لأي نوع بيانات في لغة C باستخدام العامل "*" قبل اسم المتغير. على سبيل المثال، إذا كنت ترغب في استخدام مؤشر لتخزين قيم متعددة الأنواع، يمكنك تعريف مؤشر من نوع "void"، وهو نوع مؤشر عام قادر على التعامل مع أي نوع بيانات آخر.

void *myPointer;  // تعريف مؤشر من نوع void

عند استخدام مؤشر من نوع "void"، ستحتاج إلى استخدام التحويلات النوعية (type casting) لتحويل قيم المؤشر إلى أنواع بيانات محددة عند الوصول إليها وتعديلها.

int myInt = 10;
float myFloat = 3.14;
char myChar = 'A';

void *myPointer;

myPointer = &myInt;  // تخزين عنوان المتغير myInt في المؤشر
printf("%d\n", *((int *)myPointer));  // طباعة قيمة المتغير المشير إليه بواسطة المؤشر

myPointer = &myFloat;  // تخزين عنوان المتغير myFloat في المؤشر
printf("%f\n", *((float *)myPointer));  // طباعة قيمة المتغير المشير إليه بواسطة المؤشر

myPointer = &myChar;  // تخزين عنوان المتغير myChar في المؤشر
printf("%c\n", *((char *)myPointer));  // طباعة قيمة المتغير المشير إليه بواسطة المؤشر

يرجى ملاحظة أن استخدام المؤشرات بشكل صحيح يتطلب فهمًا عميقًا للغة C والتعامل الصحيح مع الذاكرة. يجب أن تتأكد من استخدام المؤشرات بحذر لتجنب الأخطاء والثغرات الأمنية.

هل يمكنني استخدام المؤشرات لتعامل مع قيم متعددة الأنواع في نفس الوقت؟

نعم، يمكنك استخدام المؤشرات للتعامل مع قيم متعددة الأنواع في نفس الوقت باستخدام مفهوم المؤشرات المشتقة (void pointers) والتحويلات النوعية (type casting). المؤشرات المشتقة هي مؤشرات يمكنها التعامل مع عناوين الذاكرة لأي نوع بيانات، بما في ذلك القيم المتعددة الأنواع.

لتعريف مؤشر مشتق (void pointer)، يمكنك استخدام النوع "void" كنوع المؤشر. وعند الوصول إلى القيمة المشير إليها بواسطة المؤشر، يجب استخدام التحويل النوعي لتحويل المؤشر إلى نوع بيانات مناسب.

إليك مثال يوضح كيفية استخدام المؤشرات المشتقة للتعامل مع قيم متعددة الأنواع في نفس الوقت:

void *myPointer;  // تعريف مؤشر مشتق

int myInt = 10;
float myFloat = 3.14;
char myChar = 'A';

myPointer = &myInt;  // تخزين عنوان المتغير myInt في المؤشر
printf("%d\n", *((int *)myPointer));  // طباعة قيمة المتغير المشير إليه بواسطة المؤشر

myPointer = &myFloat;  // تخزين عنوان المتغير myFloat في المؤشر
printf("%f\n", *((float *)myPointer));  // طباعة قيمة المتغير المشير إليه بواسطة المؤشر

myPointer = &myChar;  // تخزين عنوان المتغير myChar في المؤشر
printf("%c\n", *((char *)myPointer));  // طباعة قيمة المتغير المشير إليه بواسطة المؤشر

في هذا المثال، يتم استخدام المؤشر المشتق void *myPointer لتخزين عناوين المتغيرات myInt و myFloat و myChar. ثم يتم استخدام التحويلات النوعية (int *) و (float *) و (char *) عند الوصول إلى القيم المشير إليها بواسطة المؤشر.

مع ذلك، يجب أن تكون حذرًا عند استخدام المؤشرات المشتقة، حيث أنها تتطلب مزيدًا من التحقق من الأنواع والتحويلات النوعية الصحيحة. قد يكون من الأفضل استخدام هياكل البيانات المخصصة للتعامل مع قيم متعددة الأنواع بشكل أكثر تنظيمًا وسهولة.

كيفية عرض فصول كتاب لغة C

  • يبدأ كل فصل بعرض "ما يجب أن تكون قد تعلمته في نهاية هذا الفصل".
  • ثم يتم تناول نظرة عامة عن الخاصية التي سيتم دراستها في هذا الفصل و إيضاح مجموعة من المفاهيم التي تساعدك في فهم هذه الخاصية و الهدف من وراء دراستها ... إلخ.
  • ثم يتم شرح هذه الخاصية و التوضيح بمجموعة من الأمثلة المتنوعة.
  • ثم يتم تناول شرح برنامج تطبيقي في أغلب المواضيع, نقوم فيه بتعلم كيفية توظيف الخاصية التي تم دراستها في هذا الفصل في برامجنا الخاصة.

تمارين وتحديات في لغة سي

 من أهم عوامل النجاح في إتقان أي لغة برمجة هو التدريب العملي المستمر على كتابة البرامج المختلفة لذا سيكون كل موضوع في هذا الكتاب. مصحوباً في نهايته بمجموعة جيدة من التمارين متدرجة الصعوبة التي يجب أن تقوم بتنفيذها بنفسك.

1 ) اكتب برنامجاً يستقبل من المستخدم راتبه الإسبوعي بالجنيه السوداني وكذلك عدد ساعات عمله اليومية كقيم من النوع float ثم يقوم البرنامج بطباعة متوسط الأجر الذي يتقاضاه للساعة الواحدة على هيئة جنيهات و قروش.

 2 ) إذا كان لديك نوعين من المنتجات الأول من فئة 3 جنيهات ، والثاني من فئة 5 جنيهات, اكتب برنامجاً . يستقبل من المستخدم عدد القطع المراد شرائها من كل نوع ثم يقوم البرنامج بطباعة الحساب الإجمالي.

 3 ) اكتب برنامجاً لحساب الوقت المستغرق في تهذيب النبات بحديقة المنزل, اطلب من المستخدم أبعاد المنزل علماً بأن المنزل على شكل مستطيل. و كذلك نصف قطر الحديقة التي تحوى المنزل علماً بأنها على شكل دائرة علماً بأن المتر المربع الواحد يستغرق دقيقتان, كم دقيقة تلزم لتهذيب حديقة المنزل؟.

Saja Alsadig
بواسطة : Saja Alsadig
من السودان مبرمجة مواقع ويب و تطبيقات أندرويد اتقن لغات "html, css, php, js" بالإضافة للتعامل مع اندرويد ستوديو و بناء التطبيقات, مهتمة بمجال التقنية منذ الصغر و كان لدي شقف كبير للدخول بالجامعه بقسم البرمجة و دخلته في عام 2013 و تعلمت كل شيئ ضمن الجامعة و خارجها من التعليم الذاتي و اتمنى أن أكون عند حسن ظن الجميع و إيصال الأمانة لكم.
تعليقات




    حجم الخط
    +
    16
    -
    تباعد السطور
    +
    2
    -