یادگیری برنامهنویسی یک تجربه تجمّعی است. در مسیر یادگیری ساختار زبان برنامهنویسی منتخب باید با مفاهیم عمومی که همه زبانهای برنامهنویسی به خدمت گرفتهاند نیز آشنا شد. درک و یادگیری زبان C ممکن است کار ملالآوری باشد؛ اما چند ایده اساسی وجود دارند که هنگام آغاز این یادگیری بهتر است با آنها آشنا باشید. در این نوشته یک پروژه ساده به عنوان روشی عالی برای یادگیری مفاهیم بنیادی زبان C معرفی شده است. اگر میپرسید باید از کجا شروع کرد، پاسخ ما این است که آغاز هر کاری «سلام» است!
سلام دنیا (!Hello, World)
سرآغاز تقریباً هر دوره یادگیری زبان برنامهنویسی برنامه Hello, World است. در این مسیر ما با برخی جنبههای تمایز C از دیگر زبانهای برنامهنویسی نیز آشنا میشویم. برای آغاز کار یک ویرایشگر متنی یا IDE مورد علاقه خود را باز کنید و کد زیر را در آن وارد کنید:
#include <stdio.h> /* this is a Hello World script in C */ intmain(void) { printf("Hello, World! \n"); return0; } |
این قطعه کوتاه از کد عبارتی را پیش از خاتمه برنامه در کنسول نشان میدهد. آن را جایی که بتوانید به راحتی به خاطر بیاورید با نام hello.c ذخیره کنید. اینک باید آن را کامپایل کرده و فایل خود را بسازید.
اجرای برنامه
برای اجرای اسکریپتهای C معمولاً نیازی به نصب نرمافزارهای اضافی روی رایانه وجود ندارد. کافی است یک پنجره ترمینال (یا در صورتی که از ویندوز استفاده میکنید اعلان فرمان یا CMD) را باز کنید و به دایرکتوری که اسکریپت مورد نظر را در آن ذخیره کردهاید بروید. در هر سیستم روش کامپایل و اجرای فایل متفاوت است:
کاربران ویندوز
شما باید با وارد کردن دستور cl hello.c و زدن دکمه اینتر یک فایل اجرایی بسازید. این دستور باعث میشود فایل hello.exe در همان پوشه ایجاد شود که میتوانید با وارد کردن عبارت hello آن را اجرا کنید.
کاربران لینوکس و مکاواس
دستور gcc -o hello hello.c را وارد کرده و اینتر را بزنید تا یک فایل اجرایی ایجاد شود و سپس با وارد کردن عبارت hello/. آن را اجرا کنید. از هر روش که استفاده کنید در هر حال اجرای این اسکریپت باعث میشود که با تصویری مانند زیر مواجه شوید:
اگر برنامه شما روی ویندوز کار نکرد، اطمینان حاصل کنید که برنامه خط فرمان (CMD) را در حالت مدیریتی اجرا کردهاید. در مورد macOS باید Xcode را از اپاستور نصب کرده و به وسیله آن برنامه خود را کامپایل کنید.
اینک به بررسی خط به خط برنامه میپردازیم تا ببینیم چگونه میتوانیم آن را بهبود ببخشیم.
درک طرز کار درونی زبان برنامهنویسی C
در این بخش به تحلیل کدهای برنامههای C میپردازیم.
پیش پردازشگرها
اسکریپتی که اینک ایجاد کردهایم، با گنجاندن یک کتابخانه آغاز میشود:
خط نخست اسکریپت به نام پیش پردازشگر (preprocessor) نامیده میشود. این بخش پیش از کامپایل شدن باقی کد اجرا میشود. در این حالت به اسکریپت میگوییم که از کتابخانه stdio.h استفاده کند. تعداد بالایی از پیش پردازشگرها برای کارهای مختلف وجود دارند.
Stdio.h وظیفه دریافت ورودی از کاربر برنامه را دارد و اطلاعات را در خروجی برای آنها بازمیگرداند.
*thisisaHello World script inC */ |
خط بعدی یک توضیح است. ممیز و ستاره به کامپایلر میگویند که هر چیزی را که بین این دو قرار دارد نادیده بگیرد. با این که شاید چندان مهم به نظر نرسد؛ اما درج یادداشتهای روشن در مورد کد برای خودتان و افراد دیگری که کد را میخوانند، یک عادت برنامهنویسی بسیار مهم است.
تابع Main
هر برنامه C باید یک تابع Main داشته باشد. Main تابعی است که یک عدد صحیح بازمیگرداند که با int نمایش مییابد. پرانتزهای پس از main به منظور آرگومان استفاده میشوند؛ با این وجود در این مورد این تابع هیچ آرگومانی نمیگیرد و به همین دلیل است که از کلیدواژه void استفاده کردهایم. کدی که قرار است اجرا شود بین دو کروشه نوشته میشود:
{ printf("Hello, World! \n"); return0; } |
درون این تابع باید تابع ()printf را فراخوانی کنید. ()printf نیز همانند main یک تابع است. تنها تفاوت این است که ()printf تابعی در کتابخانه stdio است که در آغاز در کد خود گنجاندهایم. تابع ()printf هر چیزی را که بین پرانتزها و بین گیومه قرار داشته باشد در کنسول نمایش میدهد. n\ یک کاراکتر escape است که کاراکتر «خط جدید» (newline) نامیده میشود و به کامپایلر اعلام میکند که پیش از ادامه کار در کنسول به خط بعدی بروند.
دقت کنید که همه این خطوط با نقطهویرگول پایان مییابند که به کامپایلر اعلام میکند از یک وظیفه به وظیفه دیگر برود. شما باید به این نقطهویرگولها دقت وافری داشته باشید، چون عدم درج هر یک از آنها باعث ایجاد خطایی در برنامه میشود. در نهایت باید گفت که این تابع با مقدار 0 در انتهای برنامه بازگشت مییابد. تابع ()main باید همواره یک عدد صحیح بازگرداند و ;return = 0 به کامپیوتر نشان میدهد که پردازش موفقیتآمیز بوده است.
درک هر مرحله از این اسکریپت نقطه آغازی عالی برای یادگیری ساختار زبان C و طرز کار این زبان محسوب میشود.
ایجاد تابعهای C سفارشی
شما میتوانید تابعهای سفارشی خودتان را در C ایجاد کنید. در این حالت، به جای نمایش دادن پیام Hello World در تابع main، باید یک تابع جدید بنویسیم که این کار را برای ما انجام دهد.
voidprint_for_me() { printf("Hello, World! \n"); } |
در ادامه کد فوق را بیشتر بررسی میکنیم.
- void کلیدواژهای است که نشان میدهد تابع پس از آن هیچ چیزی بازگشت نخواهد داد.
- ()print_for_me نام تابع است و پرانتزهای خالی نشان میدهد که این تابع برای کار به هیچ آرگومان ورودی نیاز ندارد. یک آرگومان به هر بخش از اطلاعات گفته میشود که برای کارکرد صحیح به یک تابع ارسال میشود. در ادامه یک آرگومان اضافه میشود تا خروجی تغییر یابد. دقت کنید که طرز کار این تابع همانند تابع ()main قبلی که از void استفاده میکرد نیست. چون آن تابع نمیتواند آرگومانی بگیرد، در حالی که تابع سفارشی ما میتواند آرگومان بگیرد؛ هر چند فعلاً آرگومانی ندارد.
- این بلوک کد باید برای شما آشنا باشد، چون همان کار نمایش پیام را انجام میدهد که تابع ()main در بخش قبل انجام میداد.
اکنون میتوانیم این تابع را در تابع main خود فراخوانی کنیم.
intmain(void) { print_for_me(); print_for_me(); return0; } |
اینک میتوانید مزیت استفاده از تابع سفارشی خود را ببینید. به جای این که هر بار دستور (“printf(“Hello, World! \n را وارد کنیم میتوانیم این تابع را دو بار فراخوانی کنیم.
این وضعیت شاید در این لحظه دارای اهمیت چندانی به نظر نرسد؛ اما اگر تابع print_for_me شامل کدهای زیادی میبود، توانایی فراخوانی آسان آن باعث صرفهجویی زیادی در زمان ما میشد.
این ایده اصلی برنامهنویسی است که در سراسر آموزش خود با آن مواجه خواهید شد. ما با استفاده از تابعهای سفارشی خودمان میتوانیم به جای نوشتن مداوم و مکرر بخشهای طولانی از کد، صرفهجویی زمانی زیادی ایجاد کنیم.
استفاده از پروتوتایپهای تابع در C
پروتوتایپها یکی از روشهای اصلی تفاوت زبان C از زبانهای دیگر محسوب میشود. یک پروتوتایپ به طور خلاصه مانند یک پیشنمایش از تابعی که بعداً تعریف میشود به حساب میآید. اگر تابع ()print_for_me را پس از تابع main بنویسید ممکن است هنگام کامپایل کردن با هشداری مواجه شوید:
پیام هشدار به ما اعلام میکند که کامپایلر پیش از آن که تابع print_for_me اعلان شود به آن رسیده است و از این رو نمیتواند مطمئن باشد که هنگام اجرای برنامه به درستی کار خواهد کرد یا نه. با این که این کد همچنان کار میکند؛ اما با استفاده از یک پروتوتایپ میتوان از این هشدار به کلی اجتناب کرد:
#include <stdio.h> voidprint_for_me(); intmain(void) { print_for_me(); print_for_me(); return0; } voidprint_for_me() { printf("Hello, World! \n"); } |
با نگاه کردن به برنامه کامل میتوان مشاهده کرد که پروتوتایپ ()print_for_me در ابتدای برنامه وجود دارد؛ اما شامل چیز خاصی نیست. تابع پروتوتایپ به کامپایلر نشان میدهد که تابع چگونه باید باشد و این که آیا نیازمند آرگومان است یا نه.
این بدان معنی است که وقتی آن را در تابع main فراخوانی میکنیم؛ کامپایلر میداند که آیا به صورت مستقیم فراخوانی شده یا نه و آیا میتواند در صورت نیاز اعلام بروز خطا کند یا نه. این وضعیت شاید اینک برای شما عجیب به نظر برسد؛ اما دانستن آن در آینده باعث کمک زیادی به شما میشود.
این برنامه همچنان بدون وجود یک پروتوتایپ کار میکند؛ اما استفاده از آن رویه خوبی است. خروجی همچنان به همان شکل است؛ اما در ادامه سعی میکنیم آن را شخصیتر بکنیم.
ارسال آرگومانها به تابعهای C
در این بخش امکان تعریف کردن ورودی یا همان آرگومان برای تابعهای زبان C را بررسی میکنیم.
تغییر دادن اسکریپت
در این مرحله نهایی از شما نام کاربر پرسیده میشود و ورودی ثبت میگردد. سپس از آن در تابعی که قبلاً ایجاد کردیم استفاده خواهد شد. در زبان C مانند زبانهای دیگر برنامهنویسی کلمهها به عنوان رشته شناسایی نمیشوند؛ بلکه کلمات آرایههای از کاراکترهای منفرد هستند. نماد یک آرایه [] و کلیدواژه مربوطه char است. کار خود را با بهروزرسانی پروتوتایپ در ابتدای کد آغاز میکنیم:
#include <stdio.h> voidprint_for_me(charname[]); |
اینک کامپایلر میداند که تابع بعدی در اسکریپت یک آرایه از کاراکترها به نام name دریافت خواهد کرد. تا به این جا این کاراکترها وجود ندارند. اگر تابع main را برای ایجاد آن بهروزرسانی کنیم، میتوانیم از آن برای ذخیرهسازی ورودی کاربر استفاده کنیم:
intmain(void) { charname[20]; printf("Enter name: "); scanf("%s",name); print_for_me(name); print_for_me("Everyone!"); return0; } |
خط نخست main یک آرایه کاراکتری با 20 فضا و با نام name ایجاد میکند. سپس با استفاده از تابع printf به کاربر اعلان میشود که نام خود را وارد کند. در خط بعدی از یک تابع جدید به نام scanf استفاده شده که کلمهای که کاربر وارد میکند را دریافت میکند. عبارت «s%» مشخص میسازد تابعی که به ذخیرهسازی دادهها میپردازد باید آن را به صورت یک رشته ذخیره کرده و نام آن را name تعیین کند.
اصلاح تابع
اکنون وقتی تابع print_for_me را فراخوانی کنیم، میتوانیم name را درون پرانتزها بگنجانیم. در خط بعدی میبینید که میتوانیم کاراکترهای دیگری را نیز تا زمانی که بین گیومهها قرار دارند به تابع ارسال کنیم. در هر دو مورد آن چه درون پرانتز است به تابع print_for_me ارسال میشود. تابع را اصلاح میکنیم تا از اطلاعات جدیدی که دریافت کردهایم بهره بگیریم:
voidprint_for_me(charname[]) { printf("Hello, "); puts(name); } |
در این جا میبینید که پرانتزها دقیقاً همانند پروتوتایپ که در آغاز اسکریپت دیدیم بهروزرسانی شدهاند. در این بخش همچنان عبارت hello با دستور printf نمایش مییابد. یک تابع جدید در این بخش به نام puts وجود دارد. این تابع نسخه پیشرفتهتری از تابع printf محسوب میشود.
هر چیزی که درون پرانتز قرار گیرد در کنسول نمایش مییابد و یک کاراکتر خط جدید (n\) نیز به طور خودکار اضافه میشود. کد خود را ذخیره و کامپایل کنید. دقت کنید که اگر نمیخواهید برنامههای قبلی بازنویسی شوند، میتوانید نام برنامه را به چیز دیگری تغییر دهید. ما نام آن را hello2 قرار میدهیم:
همان طور که شاهد هستید، برنامه ورودی را میگیرد و از آن در تابع استفاده میکند. پیش از ارسال کردن سلام به همه کس (!everyone) دو خروجی مجزا در همان تابع ارائه میشود.
الفبای برنامهنویسی C
برنامهای که در این نوشته بررسی کردیم یک برنامه بسیار ساده محسوب میشود؛ اما برخی از مفاهیم آن ساده نیستند. کدهای پیشرفتهتر C باید بسیار بهتر نوشته شوند تا از بروز خطا جلوگیری شود. به همین دلیل است که به اعتقاد اکثر افراد، زبان C برای شروع یادگیری برنامهنویسی زبان خوبی محسوب میشود، چون باعث ایجاد عادتهای مناسب برنامهنویسی در برنامهنویسهای تازهکار میشود.
برخی دیگر فکر میکنند که استفاده از ++C ایده بهتری است چون بر مبنای C کار میکند و همزمان کنترل سیستمی سطح پایین آن را نیز حفظ میکند. در هر حال یک نکته محرز است و آن این که زبانهایی مانند پایتون برای تازهکارها بسیار سادهتر هستند. با در نظر گفتن زبان قدیمی مانند C که همچنان مورد استفاده قرار میگیرد، به نظر میرسد که زبان پایتون متعلق به آینده باشد!
اگر این مطلب برایتان مفید بوده است و علاقهمند به یادگیری بیشتر در این زمینه هستید، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامه نویسی C
- مجموعه آموزش های پروژه محور برنامه نویسی
- آشنایی با اجزای سازنده یک برنامه C
- آموزش ساختمان داده ها با C و ++C
- آموزش آرایه ها در زبان برنامه نویسی C
==
«میثم لطفی» دانشآموخته ریاضیات و شیفته فناوری به خصوص در حوزه رایانه است. وی در حال حاضر علاوه بر پیگیری علاقهمندیهایش در رشتههای برنامهنویسی، کپیرایتینگ و محتوای چندرسانهای، در زمینه نگارش مقالاتی با محوریت نرمافزار نیز با مجله فرادرس همکاری دارد.
بر اساس رای 11 نفر
آیا این مطلب برای شما مفید بود؟