اموزش برنامه نویسی به زبانC

مقدمه ای بر زبان C

پس از نوشتن یک الگوریتم باید آن را با استفاده از یک زبان برنامه نویسی تبدیل به یک برنامه قابل اجرا برای کامپیوتر نماییم. این زبانها به سه دسته کلی تقسیم میگردند :

1- زبان ماشین (سطح پایین) : این زبان مستقیما با صفر و یک نوشته می شود و بدون هیچ واسطه ای برروی کامپیوتر قابل اجرا است. طراحان سخت افزار هر کامپیوتر، زبان ماشین خاص خود را برای آن ماشین طراحی می نمایند. به همین دلیل هر برنامه ای که به زبان ماشین نوشته شود، فقط برروی همان ماشین خاص کار می کند، بهمین دلیل برنامه های نوشته شده به زبان ماشین را غیر قابل حمل می نامند. از طرف دیگر یادگیری این زبان بسیار مشکل بوده و برنامه نویسی با آن نیز بسیار سخت است و همچنین احتمال بروز خطا نیز در آن زیاد است.

2- زبان اسمبلی : این زبان شکل ساده تر زبان ماشین است، بدین صورت که برای هر دستورالعمل زبان ماشین، یک اسم نمادین انتخاب شده است (مانند دستور ADD بجای کد دودویی دستورالعمل جمع) که بخاطر سپردن و برنامه نویسی با آنها برای انسانها ساده تر است. اما این برنامه ها برای ماشین قابل فهم نیست و باید قبل از اجرا شدن توسط برنامه مترجمی بنام اسمبلر به زبان ماشین تبدیل شود. توجه کنید که از آنجا که هر دستور زبان اسمبلی معادل یک دستور زبان ماشین است، این زبان نیز وابسته به ماشین می باشد و برنامه های نوشته شده به این زبان فقط برروی همان کامپیوتری که برای آن نوشته شده اند قابل اجرا است. علاوه براین کار با این زبانها هنوز هم نسبتا مشکل بود و فقط متخصصین کامپیوتر قادر به استفاده از آنها بودند.

3- زبانهای سطح بالا : دستورالعملهای این زبانها بسیار نزدیک به زبان انسانها (بطور مشخص زبان انگلیسی) می باشد و بهمین دلیل برنامه نویسی به آنها بسیار ساده تر بوده و می توان الگوریتمها را به راحتی به این زبانها تبدیل کرد. از آنجا که این زبانها به هیچ ماشین خاصی وابسته نیستند، برنامه های نوشته شده با این زبانها (تا حد زیادی) قابل حمل می باشند. مثالهایی از این زبانها عبارتند از :

- بیسیک (Basic): برای کاربردهای آموزشی
- فرترن (Fortran) : برای کاربردهای علمی و مهندسی
- پاسکال (Pascal) : برای کاربردهای آموزشی و علمی

و بالاخره زبان برنامه نویسی C که درمورد آن بیشتر صحبت خواهیم کرد. البته برنامه های نوشته شده به این زبانها ابتدا باید به زبان ماشین ترجمه شوند تا برروی کامپیوتر قابل اجرا باشند. برای ترجمه این زبانها از کامپایلرها و یا مفسرهااستفاده می شود.

مراحل اجرای یک برنامه C

برای اجرای یک برنامه C ابتدا باید آن را نوشت. برای اینکار می توان از هر ویرایشگر متنی موجود استفاده کرد و سپس فایل حاصل را با پسوند .C ذخیره نمود (فایلهای C++ با پسوند .CPP ذخیره می گردند). به این فایل، کد مبدا (source code) گفته می شود. مرحله بعدی تبدیل کد مبدا به زبان ماشین است که به آن کد مقصد (object code) گفته می شود. همانطورکه قبلا نیز گفته شد برای اینکار از یک برنامه مترجم بنام کامپایلر استفاده می شود. کامپایلرهای متعددی برای زبان C توسط شرکتهای مختلف و برای سیستم عاملهای مختلف نوشته شده است که می توانید برحسب نیاز از هریک از آنها استفاده نمایید. اما هنوز برنامه برای اجرا آماده نیست. معمولا برنامه نویسان از در برنامه های خود از یک سری از کدهای از پیش آماده شده برای انجام عملیات متداول (مانند محاسبه جذر و یا سینوس) استفاده می کنند که برنامه آنها قبلا نوشته و ترجمه شده است. این برنامه ها یا در قالب کتابخانه های استاندارد توسط شرکتهای ارائه کننده نرم افزار عرضه شده است و یا توسط دیگر همکاران برنامه نویس اصلی نوشته و در اختیار وی قرار داده شده است. در این مرحله باید کد مقصد برنامه اصلی با کدهای مربوط به این برنامه های کمکی پیوند زده شود. برای اینکار نیاز به یک پیوند زننده (Linker) داریم و نتیجه این عمل یک فایل قابل اجرا خواهد بود (در ویندوز این فایل پسوند .EXE خواهد داشت). مرحله بعدی اجرای برنامه و دادن ورودیهای لازم به آن و اخذ خروجیها می باشد. در شکل زیر این مراحل نشان داده شده اند.

مسلما طی مراحل بالا برای اجرای هر برنامه زمانبر می باشد، بهمین دلیل اکثر تولید کنندگان کامپایلرها، محیطهایی را برای برنامه نویسی ارائه کرده اند که کلیه مراحل بالا را بطور اتوماتیک انجام می دهند.

به این محیطها IDE (Integrated Development Environment) یا محیط مجتمع توسعه نرم افزار گفته می شود. این محیطها دارای یک ویرایشگر متن می باشند که معمولا دارای خواص جالبی همچون استفاده از رنگهای مختلف برای نشان دادن اجزای مختلف برنامه مانند کلمات کلیدی، و یا قابلیت تکمیل اتوماتیک قسمتهای مختلف برنامه می باشد. پس از نوشتن برنامه و با انتخاب گزینه ای مانند Run کلیه عملیات فوق بطور اتوماتیک انجام شده و برنامه اجرا می گردد. علاوه براين، اين محيطها معمولا داراي امكانات اشكالزدايي برنامه (Debug) نيز مي باشند كه شامل مواردي همچون اجراي خط به خط برنامه و يا ديدن محتويات متغيرها در زمان اجرا است. چند محيط معروف برنامه نويسي عبارتند از :

Borland C++ 3.1 براي محيط DOS
Borland C++ از نسخه 4 به بالا براي Windows
Microsoft Visual C++ براي محيط Windows
Borland C++ Builder برای محیط Windows

براي شروع ما از محيط Borland C++ 3.1 تحت Dos كه نحوه كار ساده تري نسبت به سايرين دارد استفاده مي كنيم.
پس از نصب اين نرم افزار، برنامه BC.exe را اجرا كنيد تا وارد محيط borland c شويد

همانطور كه مي بينيد، اين محيط از 3 قسمت اصلي تشكيل شده است :

- بخش ويرايش برنامه : بخش آبي رنگ وسط مي باشد كه در حقيقت يك ويرايشگر است كه برنامه در آن تايپ مي شود. همانطور كه مي بينيد در اين ويرايشگر از رنگهاي مختلف براي نشان دادن قسمتهاي مختلف برنامه استفاده مي شود. مثلا براي كلمات كليدي از رنگ سفيد استفاده شده است.

- بخش منوهاي كاري : اين بخش كه در قسمت بالا واقع شده است،- حاوي تعدادي منو (گزينه) براي انجام وظايف مختلف است. خلاصه اين عمليات عبارتند از :
o منوي File : عملياتي مانند باز كردن و يا ذخيره يك برنامه
o منوي Edit : عمليات ويرايش مانند حذف،o كپي و يا چسباندن يك قسمت از برنامه
o منوي Search : جستجوي و يا تعويض يك متن در برنامه
o منوي Run : اجراي برنامه بصورت كامل يا دستور به دستور
o منوي Compile : عمليات مربوط به كامپايل و پيوند برنامه
o منوي Debug : عمليات مربوط به اشكالزدايي مانند ديدن مقادير متغيرها در زمان اجرا
o منوي Project : عمليات مربوط به مديريت برنامه هايي كه شامل چندين فايل مستقل هستند (پروژه)
o منوي Options : عمليات مربوط به تنظيمات سيستم مانند نحوه كامپايل و يا رنگ پيش فرض محيط
o منوي Windows : عمليات مربوط به پنجره هاي باز فعلي (مربوط به چندين برنامه يا نمايش متغيرها و ... )

خطاهای برنامه نویسی

بنظر می رسد خطاها جزء جداناپذیر برنامه ها هستند. بندرت می توان برنامه ای نوشت که در همان بار اول بدرستی و بدون هیچگونه خطایی اجرا شود. اما خطاها از لحاظ تاثیری که بر اجرای برنامه ها می گذارند، متفاوتند. گروهی ممکن است باعث شوند که از همان ابتدا برنامه اصلا کامپایل نشود و گروه دیگر ممکن است پس از گذشت مدتها و در اثر دادن یک ورودی خاص به برنامه، باعث یک خروجی نامناسب و یا یک رفتار دور از انتظار (مانند قفل شدن برنامه) شوند. بطور کلی خطاها به دو دسته تقسیم می شوند:

خطاهای نحوی (خطاهای زمان کامپایل): این خطاها در اثر رعایت نکردن قواعد دستورات زبان C و یا تایپ اشتباه یک دستور بوجود می آیند و در همان ابتدا توسط کامپایلر به برنامه نویس اعلام می گردد. برنامه نویس باید این خطا را رفع کرده و سپس برنامه را مجددا کامپایل نماید. لذا معمولا این قبیل خطاها خطر کمتری را در بردارند.

خطاهای منطقی (خطاهای زمان اجرا): این دسته خطاها در اثر اشتباه برنامه نویس در طراحی الگوریتم درست برای برنامه و یا گاهی در اثر درنظر نگرفتن بعضی شرایط خاص در برنامه ایجاد می شوند. متاسفانه این دسته خطاها در زمان کامپایل اعلام نمی شوند و در زمان اجرای برنامه خود را نشان می دهند. بنابراین، این خود برنامه نویس است که پس از نوشتن برنامه باید آن را تست کرده و خطاهای منطقی آن را پیدا کرده و رفع نماید. متاسفانه ممکن است یک برنامه نویس خطای منطقی برنامه خود را تشخیص ندهد و این خطا پس از مدتها و تحت یک شرایط خاص توسط کاربر برنامه کشف شود. بهمین دلیل این دسته از خطاها خطرناکتر هستند. خود این خطاها به دو دسته تقسیم می گردند:

a. خطاهای مهلک: در این دسته خطاها کامپیوتر بلافاصله اجرای برنامه را متوقف کرده و خطا را به کاربر گزارش می کند. مثال معروف این خطاها،b. خطای تقسیم بر صفر می باشد.

c. خطاهای غیرمهلک: در این دسته خطا،d. اجرای برنامه ادامه می یابد ولی برنامه نتایج اشتباه تولید می نماید. بعنوان مثال ممکن است دراثر وجود یک خطای منطقی در یک برنامه حقوق و دستمزد،e. حقوق کارمندان اشتباه محاسبه شود و تا مدتها نیز کسی متوجه این خطا نشود!

با توجه به آنچه گفته شد، در می یابیم که رفع اشکال برنامه ها بخصوص خطاهای منطقی از مهمترین و مشکلترین وظایف یک برنامه نویس بوده و گاهی حتی سخت تر از خود برنامه نویسی است! بهمین دلیل است که بسیاری از شرکتها(همانند مایکروسافت) ابتدا نسخه اولیه نرم افزار خود را در اختیار کاربران قرار می دهند تا اشکالات آن گزارش شده و رفع گردد. بسیار مهم است که در ابتدا سعی کنید برنامه ای بنویسید که حداقل خطاها را داشته باشد، در گام دوم با آزمایش دقیق برنامه خود هرگونه خطای احتمالی را پیدا کنید و در گام سوم بتوانید دلیل بروز خطا را پیدا کرده و آنرا رفع نمایید. هر سه عمل فوق کار سختی بوده و نیاز به تجربه و مهارت دارد.

آخرین نکته اینکه در اصطلاح برنامه نویسی به هر گونه خطا، bug و به رفع خطا debug گفته می شود.

مقدمات زبان C



زبان C در سال 1970 توسط دنيس ريچي طراحي گرديد. اين زبان تكامل يافته زبان BCPL ميباشد كه طراح آن مارتين ريچاردز است ،و زبان BCPL از زبان B كه طراح آن كن تامپسون مي باشد ، نتيجه شده است .

زبان C معمولا" يك زبان مياني ناميده مي شود . اين بدان معني نيست كه آموزش اين زبان مشكل است ، يا قدرت آن از زبان هاي برنامه سازي مثل پاسكال و بيسيك كمتر است و يا اين كه مشكلاتي مشابه زبان اسمبلي براي برنامه نويس ايجاد مي كند.

علت مياني بودن زبان C اين است كه عناصر زبان هاي سطح بالا را با خصيصه تابعي زبان اسمبلي درهم آميخته است . زبان C همانند ساير زبانهاي مياني با مفاهيم بيت ، بايت و آدرس كه از عناصر ابتدايي ماشين هستند سر و كار دارد . يعني در اين زبان مي توان محتويات بيت ها و بايت ها را نيز تغيير داد .

برنامه هاي نوشته شده به زبان C براحتي از ماشيني به ماشين ديگر قابل انتقال مي باشند . مثلا" برنامه نوشته شده براي كامپيوتر APPL در كامپيوترهاي IBM قابل اجرا است . اين خصيصه را قابل حمل بودن (Portability) زبان مي گويند .

كليه زبان هاي برنامه سازي سطح بالا و مياني داراي نوعهاي داده (data types) هستند . هر نوع داده ، مجموعه اي از مقادير را مشخص مي كند كه اعمال خاصي روي آنها قابل انجام است . نوع داده اي كه در اكثر زبانها وجود دارد عبارتند از : اعداد صحيح ، كاراكتري و اعداد اعشاري . C داراي 5 نوع داده اصلي است كه در آن تقريبا" تبديل هر نوع داده به نوع ديگر امكان پذير است . مثلا" در يك عبارت مي توان نوع كاراكتري را با نوع عددي صحيح و يا اعشاري تركيب كرد .
زبان C خطاي زمان اجرا مثل boundray checking را چك نمي كند . منظور از boundray checking اين است كه در آرايه ها ***** از حدود مشخص شده ، به راحتي امكان پذير بوده و از نظر كامپايلر با خطايي مواجه نميشود. اين مساله برميگردد به اين كه در زبان C آرايه يك اشاره گر (pointer) است . در اين راستا ، نوع پارامترها و آرگومان هاي توابع نيز در گونه هاي قديمي C با يكديگر مطابقت نشده و از نظر كامپايلر با خطا مواجه نمي شد ولي در گونه هاي جديد C با معرفي الگوي تابع (Function prototype) اين مشكل رفع شده است . C
همانند زبان هاي ALGOL، PASCAL، و... يك زبان ساخت يافته است . يك زبان برنامه سازي ساخت يافته امكانات زيادي ، از جمله استفاده از چند ساختار حلقه سازي مثل while، do-while،و forو را فراهم مي كند . در اين گونه زبان ها از goto به ندرت استفاده مي شود و نوشتن دستورات برنامه در هر ستوني از خط و در هر جاي فايل امكان پذير بوده ، مثل زبان فرترن مقيد به ستون هاي خاصي نيستند. استفاده از زيربرنامه ها و بلاك ها نيز از خصيصه هاي اين نوع زبان ها هستند . ذكر اسامي چند زبان ساخت يافته و غير ساخت يافته ، در انتخاب زبان برنامه سازي جهت برنامه نويسي مفيد است .
يك برنامه نمونه

در اين قسمت براي آشنايي اوليه با زبان C يك برنامه نمونه آورده شده است كه بدون هيچ تغييري در محيط BorlandCPP قابل اجرا است.

// This Program Computes the Area of a Circle
#include
void main() {
int radius ;
float area;
printf("please enter radius : ");
scanf("%d",&radius);
area = 2 * 3.14 * radius;
printf("Area is %f",area);
{
please enter radius : 10
Area is 62.8

درمورد برنامه فوق به نکات زیر توجه کنید :

- خط اول یک توضیح درمورد برنامه است. در زبان C برای توضیحات یک خطی از علامت // استفاده می گردد. اما چنانچه توضیحات بیش از یک خط بود،- آن را با علامت /* شروع کرده و با */ پایان دهید. کامپایلر از این توضیحات صرفنظر خواهد کرد. این توضیحات باعث می شوند که برنامه شما خواناتر شده و دیگران بهتر آن را درک کنند.

- هر دستوری که با علامت # شروع شود،- یک دستور C نیست،- بلکه جزو دستورات پیش پردازنده محسوب می گردد. دستورات پیش پردازنده،- دستوراتی هستند که توسط کامپایلر قبل از شروع به کامپایل انجام می شوند. بعنوان مثال دستور #include باعث می شود که تعاریف اولیه مربوط به توابعی (زیربرنامه هایی) که قصد استفاده از آنها را داریم به برنامه اضافه شود. در مثال بالا برای استفاده از توابع printf و scanf که در کتابخانه استاندارد C تعریف شده اند،- فایل سرآمد stdio.h را که این توابع در آن تعریف شده اند را استفاده کرده ایم.

- هر برنامه C باید دارای تابعی به نام main باشد که اجرای برنامه از آن شروع می شود و در حقیقت همان برنامه اصلی است. البته می توان هر تعداد دیگری تابع (زیربرنامه) نیز تعریف کرد،- اما وجود تابع main الزامی است. دقت کنید که گرچه این تابع پارامتر ورودی ندارد،- اما از پرانتز باز و بسته تنها استفاده شده است.

- در زبان C هر بلوک برنامه با علامت { آغاز شده و با } پایان می یابد. این دو معادل دستورات begin و end در زبانهای دیگر ازجمله پاسکال می باشند که برای سادگی زبان انتخاب شده اند.

- دو خط بعدی به تعریف متغیرهای radius و area می پردازد. در زبان C قبل از استفاده از هر متغیری باید آن را اعلان نمایید. اعلان متغیر شامل نام و نوع متغیر است. در مثال فوق،- متغیر radius از نوع عدد صحیح(integer) و متغیر area از نوع عدد اعشاری (float) تعریف شده اند.

- توابع printf و scanf جزو کتابخانه استاندارد C محسوب می گردند و به ترتیب برای چاپ اطلاعات در خروجی استاندارد (نمایشگر) و دریافت اطلاعات از ورودی استاندارد (صفحه کلید) استفاده می شوند. برای چاپ رشته مورد نظر باید آنها را در داخل علامت " قرار داد. درمورد این توابع بعداد توضیح خواهیم داد.

- دقت کنید که در پایان هر دستورالعمل از علامت ; استفاده شده است. در مجموع C یک زبان قالب آزاد است و شما می توانید دستورات را به هر نحوی که دوست دارید قرار دهید (مثلا چند دستور در یک خط از برنامه). تنها چیزی که نشاندهنده پایان یک دستور است،- علامت ; است(و نه انتهای خط).

- از آنجا که C یک زبان قالب آزاد است،- می توان با استفاده از مکان نوشتن دستورات شکل بهتری به برنامه داد. بعنوان مثال دقت کنید که پس از شروع تابع main،- دستورات حدود 3 کاراکتر جلوتر نوشته شده اند. به این نحوه نوشتن دستورات دندانه گذاری می گویند. بطور کلی هربار که بلوک جدیدی آغاز می شود،- باید آن را کمی جلوتر برد. این مسئله باعث جدا شدن بلوکها از یکدیگر و خوانایی بهتر برنامه می شود.

- در پایان برنامه و در داخل مستطیل خاکستری،- یک نمونه از اجرای برنامه که شامل یک ورودی و خروجی نمونه است،- آورده شده است.

مثال 2 این مثال را به نام یک فایل مثلا test2.cpp در کامپیوترتان ذخیره کرده و آن را اجرا کنید:
کد:
[HTML]
#include < stdio.h >
void main() {
int a ,b ;
a = 5 ;
b = a + 1;
printf(“a=%d and b=%d \n”,a,b);
b = a + b;
printf(“a=%d and b=%d \n”,a,b);
printf("\n \n")
printf("This is test.\n")
}

اگر این مثال را اجرا کنید نتیجه حاصل باید به صورت زیر باشد:

کد:a=5 b=6
a=5 b=11


This is test[/HTML]
.