بازدید امروز : 0
بازدید دیروز : 2
· مقداردهی اولیه متغیرها
در صورتی که از پیش مقدار شروع متغیر را بدانیم میتوانیم به هنگام تعریف، مقدار اولیه مورد نظر را نیز به آن اختصاص دهیم. برای این کار در تعریف متغیرها، به دنبال نام آن، اپراتور جایگزینی "=" را همراه با مقدار اولیه بکار میبریم. بعنوان مثال هر یک از روشهای زیر متغیرهای :
a , b , c
را توصیف کرده و به ترتیب مقادیر 12 , 13 , -25 را به آنها اختصاص میدهد.
|
روش سوم |
|
روش دوم |
|
روش اول |
|
int a =12 , b =13 , c = -25 ; |
|
int a =12 , b =13 ; |
|
int a =12 ; |
|
|
|
int c = -25 ; |
|
int b =13 ; |
|
|
|
|
|
int c = -25 ; |
اما در دستور زیر فقط به b مقدار اولیه داده شده است :
int a , b = 15 , c ;
در این گونه موارد برای جلوگیری از اشتباه بهتر است متغیرهایی که مقدار اولیه میپذیرند، جدا از سایر متغیرها توصیف گردند، مانند مثال زیر:
int a =12 , b =13 , c =25 ;
int d , e , f ;
مثال - چند نمونه دیگر از مقداردهی اولیه متغیرها در زیر نشان داده شده است :
int sum = 5 ;
char Str = " # " ;
float tmp = 10.2 ;
double p1 = 0.1234E-6 ;
· ثابتهای رشتهای
یک ثابت رشتهای ، شامل دنبالهای از کاراکترها میباشد که در داخل گیومه دوبل قرار داده میشوند. مانند نمونه های زیر:
"university" , "256" , " hello world" , "1380-02-06" , "five$" , "p4"
همچنین باید توجه داشت که " " نیز یک رشته تهی (empty) یا null است.
مثال - ثابت رشتهای زیر شامل سه نشانه مخصوص (special character) است که با escape sequence متناظرشان نشان داده شدهاند:
"\t to continue , press the \"RETURN\" KEY\n"
که در آن نشانهها یا کاراکترهای مخصوص عبارتند از :
horizontal tab \t،
\" گیومه یا quotation mark دوبل که دو بار بکار رفته است ،
\n خط جدید یا new line .
کامپایلر بطور اتوماتیک یک کاراکتر (\0) null در پایان هر ثابت رشتهای قرار میدهد که آخرین کاراکتر در داخل رشته (قبل از بسته شدن گیومه) خواهد بود. این کاراکتر وقتی که رشته نمایش داده شود ، قابل رؤیت نمیباشد . به هرحال میتوان هریک از کاراکترها را در داخل رشته امتحان کرد که آیا کاراکتر null میباشد یا نه ؟ در خیلی موارد مشخص ساختن پایان یک رشته بوسیلة یک کاراکتر مخصوص مانند کاراکتر null نیاز به تعیین حداکثر طول برای رشته را از بین میبرد. بعنوان مثال رشته فوق دارای 38 کاراکتر است که شامل پنج فضای خالی و چهار کاراکتر مخصوص است که با escape sequence معرفی شدهاند و در پایان کاراکتر null میباشد که انتهای رشته را مشخص میسازد .
یک ثابت حرفی مانند ‘A’ با یک ثابت رشتهای تک حرفی متناظر آن مانند "A" همارز نمیباشد. همچنین بهخاطر داشته باشید که در جدول کد اسکی، هر کاراکتر دارای یک مقدار عددی میباشد، ولی یک رشته تک حرفی اینطور نیست. در واقع یک رشته تک حرفی متشکل از دو کاراکتر میباشد که کاراکتر دوم همان کاراکتر null است که پایان رشته را مشخص میسازد.
باز هم توجه داشته باشید که یک رشته n کاراکتری نیاز به آرایه 1+n عنصری خواهد داشت. زیرا یک کاراکتر null نیز بطور اتوماتیک بعنوان کاراکتر پایانی در آن قرار داده خواهد شد. برای مثال اگر رشته:
"COMPUTER"
در یک آرایه یک بعدی کاراکتری به نام book ذخیره گردد، خانه اول آن یعنی :
book[0]
شامل کاراکتر C و خانه آخر یعنی :
book[8]
شامل کاراکتر null خواهد بود که معرف پایان رشته است .
مبحث رشتهها و آرایهها و کاربرد آنها در فصل جداگانهای بطور مشروح مورد بحث قرار خواهد گرفت .
· اپراتور cast
میتوان تبدیل یک نوع به نوع دیگر را بهصورت صریح نیز انجام داد. این کار به کمک اپراتور cast انجام میگیرد. پس ساختار cast نوع دیگر از تبدیل است. برای این کار کافی است نوع جدید داده مورد نظر را در داخل پرانتز مستقیماً جلوی عبارت قرار دهیم. برای مثال :
k = ( float )2 ;
مقدار صحیح 2 را قبل از اختصاصدادن به k به float تبدیل میکند و سپس آن را به k اختصاص میدهد؛ بنابراین اپراتور cast یک اپراتور unary میباشد؛ یعنی فقط یک اپراند دارد.
در موارد متعددی روش casting خیلی مفید است. برای مثال حالت زیر را درنظر بگیرید :
int i =2 , k =3 ;
float h = k / i ;
در اینجا مقدار k / i (یعنی 3 / 2) برابر 1.5 خواهد شد. سپس نتیجه به float یعنی 1.0 تبدیل میشود و به h نسبت داده میشود. حال اگر بخواهیم مقدار 1.5 که نتیجه واقعی عبارت ریاضی 3/2 است به k و i یا هر دوی آنها را بهوسیلة cast به float تبدیل کنیم. مثلاً :
( float ) k / i ;
در اینجا بهطور صریح k به float تبدیل میگردد، پس نتیجه برابر 1.5 خواهد شد. عبارت مزبور را میتوان بصورت :
k / ( float ) i ; یا ( float ) k / ( float ) i ;
نیز نوشت که نتیجه باز هم 1.5 میگردد . یعنی نتیجه سه روش مزبور همارز میباشد.
از مثالهای بالا نتیجه میشود که به کمک casting میتوان در وسط جمله، نوع داده را به نوع دیگری تبدیل کرد. بنابراین اپراتور cast بهعنوان نوع یا type عمل میکند. یعنی type conversion است و فرمت آن به این طریق است که type جدید متغیر یا عبارت مورد نظر جلوی آن متغیر یا عبارت، در داخل پرانتز نوشته شود. برای مثال دستور :
( int )d1+d2
یعنی اول d1 به int تبدیل میشود بعد با d2 جمع میشود . درحالی که دستور :
(int)(d1+d2)
یعنی نتیجه d1+d2 به int تبدیل میشود.
بنابراین فرمت اپراتور cast بصورت زیر است :
(data type) expression
حال برای آنکه نقش اپراتور cast را بهتر متوجه شوید، به نتیجه و عملکرد دو مجموعه دستورات زیر توجه کنید:
|
مثال دوم |
|
مثال اول |
|
short int x ; |
|
float x ; |
|
printf ("%s\n",(char)x) ; |
|
printf ("%d\n",(int)x) ; |
در مثال اول برای متغیر x که از نوع float اعلان شده است، 4 بایت حافظه پیشبینی میشود. ولی درنتیجه اجرای دستور printf سطر دوم، به دلیل دستور (int)x مقدار آن به نوع int تبدیل میگردد و نمایش داده میشود؛ بنابراین اگر برای مثال محتوای حافظه بهصورت :
|
0.25 E+7 |
باشد، مقدار 2500000 نمایش داده خواهد شد.
همینطور در مثال دوم برای متغیر x که از نوع short int اعلان شده است، دو بایت حافظه پیشبینی میشود، ولی درنتیجه اجرای دستور printf سطر دوم، به دلیل (char)x مقدار آن به نوع کاراکتر تبدیل میگردد و محتوای دو بایت حافظه مزبور بهصورت یک رشته دوبایتی نمایش داده میشود و به همین دلیل است که در فرمت چاپ مقدار متغیر مزبور، از فرمت "%s" که برای رشته میباشد، استفاده شده است. حال اگر برای مثال محتوای حافظه مربوط به متغیر x بهصورت :
1 2 3 4
باشد، موقع نوشتن بهصورت رشته :
"1 2 3 4"
چاپ میشود .
در اینجا به اختصار یادآوری میشود که فرمتهای :
"%s", "%c", "%f", "%d"
بترتیب برای متغیرهای از نوع مقادیر صحیح ، اعشار، کاراکتر و رشته بکار برده میشود.
· داده ها از نوع void
داده از نوع void (تهی) در استاندارد ریچی وجود نداشت و بعد به استاندارد ANSI افزوده شده است. از این نوع داده هدف مهمی مورد نظر است. و آن در مورد معرفی توابعی است که مقداری را برنمیگردانند، بلکه فقط عمل خاصی را انجام میدهند.
مثال - تابعی به نام FF1 که دارای دو آرگون x , y است بصورت زیر تعریف شده است :
void FF1( x , y )
int x , y ;
{
--------------
--------------
}
قرار گرفتن voidدر جلوی نام تابع مزبور به این دلیل است که این تابع چیزی را برنمیگرداند .
· پیش پردازنده
پیشپردازنده را میتوان برنامه جداگانهای در نظر گرفت که قبل از کامپایلر واقعی اجرا میگردد. هنگامی که شما یک برنامه را کامپایل میکنید، پیشپردازنده بطور اتوماتیک اجرا میگردد . تمام فرامین پیشپردازنده با علامت "#" شروع میگردند که باید اولین کاراکتر خط باشد. وظیفة اصلی و مهم پیشپردازنده آن است که فایل درخواستی ما را آماده ساخته و وارد برنامه ما کند. برخلاف دستورات C که به سمیکولون ختم میشوند، پایان جملات آن با خط جدید مشخص میگردد .
فرمان #include
فرمان #include موجب میگردد که کامپایلر همزمان با فایلی که ترجمه میکند، یک متن را نیز از فایل دیگر بخواند. این عمل شما را قادر میسازد که بتوانید قبل از شروع ترجمه، محتوای یک فایل را در فایل دیگر بریزید (درج کنید)، ضمن اینکه فایل اولیه تغییر نمییابد. این عمل به ویژه در حالتی که بیش از یک فایل مبنا، اطلاعاتی یکسان را سهیم شوند و بکار ببرند، مفید است. با این کار شما به جای اینکه اطلاعات مشترک دو فایل را بصورت دوبله در هر دو منظور نمایید، آن را فقط در یک فایل قرار میدهید ، سپس هر موقع آن اطلاعات بوسیلة فایل دوم مورد نیاز باشد ، به طریق مذکور آن را برای استفاده فایل دوم نیز آماده میکنید.
تعریف فرمان #include دارای دو فرم زیر است :
|
فرم اول |
|
فرم دوم |
|
# include < filename >
|
|
# include "filename" |
در فرم اول ، پیشپردازنده فقط محل خاصی را که بهوسیلة عامل مشخص شده است، نگاه میکند. این محل جایی است که include file های سیستم، مانند header files برای کتابخانه زمان اجرا یا Runtime Library نگهداری میشوند. اگر فرم دوم بکار برده شود، پیشپردازنده فهرست یا دایرکتوری را که شامل فایل مبنا است، نگاه میکند. اگر فایل include file را در آنجا پیدا نکند، پس از آن مشابه فرم اول، محل خاص مورد نظر را جستجو میکند. اسامی include fileها بر حسب قرارداد، به پسوند "h" ختم میشوند .
حال ببینیم وقتی که پیشپردازنده با فرمان # include<stdio.h> مواجه میشود، چه پیش میآید؟ پیشپردازنده دایرکتوری تعریف شده بهوسیلة سیستم را برای فایلی به نام stdio.h جستجو میکند. سپس فرمان #include را با محتوای فایل، جایگزین میکند.
برای اینکه بدانید فرمان #include چگونه کار میکند، فرض کنید که شما فایلی به نام file1.h دارید که محتوای آن فقط دو دستور زیر است :
int st-no ;
char name ;
سپس در فایل مبنا ، فرمان #include را بصورت زیر بکار میبرید :
#include "file1.h"
main( )
{
-----------
}
حال وقتی که شما برنامه مزبور را ترجمه میکنید، پیشپردازنده به جای فرمان #include محتوای فایل مشخص شده را قرار میدهد. بنابراین فایل مبنا بصورت زیر درمیآید:
int st-no ;
char name ;
main( )
{
------------
}
فرمان #define
همانطور که میتوان با توصیف یا اعلان کردن متغیر، اسمی را به یک محل از حافظه وابسته کرد و به آن محل با آن نام (که همان متغیر مورد نظر است) مراجعه نمود، به همان طریق میتوان اسمی را به یک مقدار ثابت وابسته کرد و آن را با همان اسم که ثابت سمبولیکی نامیده میشود، مشخص نمود و هنگام نیاز، به آن مراجعه کرد. این گونه متغیرها را که معمولاً با حروف برزگ معرفی میشوند، ثابتهای سمبولیکی یا symbolic constants گویند و این عمل با دستور #define انجام میگیرد .
برای مثال با دستور :
# define book 15
میتوان در هر جای برنامه بجای 15 از book استفاده نمود . بنابراین دو دستور زیر همارز میباشد :
k = 12 + 15 ;
k = 12 + book ;
هر دو دستور مقدار (12 +15 = 27 ) 27 را به متغیر k نسبت میدهند .
براساس دستور define مقدارbook در حافظه بصورت مقدار ثابت 15 است که در طول برنامه تغییر نمیکند. انتخاب نام برای مقادیر ثابت دارای چند فایده مهم است :
اول آنکه به بعضی مقادیر ثابت میتوان اسم با معنی اختصاص داد. مثلاً میتوان عدد معروف «پی» را که تا 4 رقم اعشار معادل 3.1415 است، در آغاز بصورت :
#define Pi 3.1415
تعریف کرد و سپس در سرتاسر برنامه، بجای عدد مزبور در تمام محاسبات وابسته به آن Pi را بکار برد .
دوم آنکه اگر مجبور باشیم در یک برنامه یک مقدار ثابت طولانی نامانوس را چندین بار بکار بریم، سادهتر آن خواهد بود که با دستور #define یک نام مناسب برای آن انتخاب کنیم و بجای ثابت مزبور از آن نام استفاده کنیم .
مثلاً اگر مجبور باشیم همان عدد پی را با 6 رقم اعشار در قسمتهای متعددی از برنامه بکار بریم، این عمل هم پردردسر و هم اشتباهزا خواهد بود. لذا بهتر است مثل حالت قبل، یک اسم برای آن انتخاب کنیم .
سوم آنکه اگر طبیعت مقدار ثابت طوری باشد که در زمانهای مختلف تغییر کند. مثل نرخ مالیات، یا اجرت ساعت کار و یا درصدی که بعنوان سود در بانکها به پساندازهای پولی یا سرمایهگذاری تعلق میگیرد که همیشه ثابت نیست و ممکن است برحسب مقررات، قوانین و سایر شرایط، مقدار آن عوض شود. در چنین مواردی باید در سرتاسر برنامه مقدار ثابت موردنظر را عوض کنیم. درحالی که اگر توسط دستور #define اسمی برای آن انتخاب کرده باشیم کافی است فقط در همان یک دستور تغییر مورد نظر را اعمال کنیم. مثلاً اگر براساس قوانین، نرخ جدید مالیات بر درآمد برابر دو درصد باشد ، کافی است به آن قبلاً نام TAX اختصاص داده باشیم و با دستور :
#define TAX 0.02
مقدار جدید را جایگزین قبلی نماییم و دیگر نیازی نیست که در داخل برنامه تغییراتی انجام دهیم. از مثال بالا مشخص میگردد که یک ثابت سمبولیکی، نامی است که جایگزین دنبالهای از کاراکترها میگردد. کاراکترها ممکن است یک ثابت عددی، یک ثابت کاراکتری، و یک ثابت رشتهای باشند. بنابراین یک ثابت سمبولیکی اجازه میدهد که در یک برنامه به جای یک مقدار ثابت (عددی، حرفی یا رشتهای) یک اسم قرار گیرد. وقتی که برنامه ترجمه میگردد، در هر محلی از برنامه که ثابت سمبولیکی قرار گرفته باشد، دنباله کاراکترهای متناظر آن جایگزین میگردد. ثابتهای سمبولیکی معمولاً در آغاز برنامه تعریف میگردند و فرم آن بصورت زیر است :
#define name text
که در آن، name معرف نام سمبولیک است که معمولاً با حروف بزرگ نوشته میشوند؛ text نیز دنبالهای از کاراکترها را که باید به نام سمبولیک اختصاص داده شود، معرفی مینماید. توجه داشته باشید که text به سمیکولون ختم نمیگردد. زیرا تعریف ثابت سمبولیک، یک دستور واقعی C نمیباشد.
مثال - در زیر، نمونههای دیگری از ثابتهای سمبولیکی نشان داده شده است :
#define Temp 524
#define Pi 3.1415
#define true 1
#define false 0
#define Name " payam noor "
#define Byte_Size 8
خصیصه #define که برای تعریف ثابتهای سمبولیک بکار برده میشود، یکی از چندین خصیصهای است که در پیشپردازنده وجود دارد .
فصل اول –کلیات و مفاهیم
· مقدمه
زبان C در اوایل دهه 1970 میلادی توسط دنیس ریچی در لابراتوار کمپانی BELL و بعنوان زبان برنامهنویسی سیستمها طراحی گردید. این زبان از دو زبان پیشین بنامهای BCPL و B منتج شده است که این دو نیز در همین لابراتوار ساخته شده بودند ..زبان C تا سال 1978 منحصر به استفاده در همین لابراتوار بود تا اینکه توسط دو تن بنامهای ریچی و کرنیه نسخه نهایی این زبان منتشر شد . به سرعت کامپایلرها و مفسرهای متعددی از C توسعه یافت لیکن برای جلوگیری از ناسازگاری های ایجاد شده و نیز حفظ قابلیت حمل زبان ، تعاریف متحدالشکلی توسط استاندارد ANSI ارایه گردید . آنچه در این درس ارایه شده بر اساس همین استاندارد میباشد .
بطور کلی ویژگیهای مهم زبان C به اختصار به شرح زیر است :
زبان C ، بطور گسترده ای در دسترس میباشد . کامپایلرهای تجارتی آن برای بیشتر کامپیوترهای شخصی ، مینی کامپیوترها و نیز در mainframe قابل استفاده اند .
C ، زبانی است همه منظوره ، ساختیافته سطح بالا (مانند زبان پاسکال و فرترن ) و انعطافپذیر که برخی از خصوصیات زبانهای سطح پایین را که معمولاً در اسمبلی یا زبان ماشین موجود است ، نیز دارا میباشد . در عین حال C برای کاربردهای ویژه طراحی نشده است و میتوان از آن در همة زمینهها ، بخصوص به لحاظ نزدیکی آن به زبان ماشین در برنامه نویسی سیستم استفاده کرد . بنابراین C بین زبانهای سطح بالا و سطح پایین قرار دارد و در نتیجه اجازه میدهد که برنامه نویس خصوصیات هر دو گروه زبان را بکار برد . از اینرو در بسیاری از کاربردهای مهندسی بطور انحصاری زبان C را بکار میبرند . ( زبانهای سطح بالا ، دستورالعملهایی شبیه زبان انسان و پردازش فکری او دارند ، همچنین یک دستورالعمل زبان سطح بالا معادل چند دستورالعمل به زبان ماشین است .)
برنامههای نوشته شده به زبان C بطور کلی مستقل از ماشین یا نوع کامپیوتر است و تقریباً تحت کنترل هر سیستم عاملی ، اجرا میگردد .
کامپایلرهای C معمولاً فشرده و کم حجم میباشد و برنامههای هدف ایجاد شده بوسیلة آنها در مقایسه با سایر زبانهای برنامهسازی سطح بالا ، خیلی کوچک و کارآمد میباشد . ( کامپایلر یا مفسر ، خود برنامه ای کامپیوتری است که برنامه سطح بالا را بعنوان یک داده ورودی می پذیرد و برنامه ایجاد شده به زبان ماشین را بعنوان خروجی ایجاد می کند .)
برنامههای C در مقایسه با سایر زبانهای برنامهسازی سطح بالا ، بهراحتی قابل انتقال میباشند . دلیل این کار آن است که C خیلی از ویژگیهای وابسته به نوع کامپیوتر را در توابع کتابخانهای خود منظور داشته است . بنابراین هر نسخه از C با مجموعهای از توابع کتابخانهای مخصوص به خود همراه است که براساس خصوصیات و ویژگیهای کامپیوتر میزبان مربوط نوشته شده است . این توابع کتابخانهای تا حدودی استاندارد میباشد و معمولاً هر تابع کتابخانهای در نسخههای متعدد C بشکل یکسان قابل دسترسی میباشد .
C ، روش برنامهسازی ماژولار را پشتیبانی میکند . همچنین از نظر عملگرها نیز یک زبان قوی بوده و شامل اپراتورهای گوناگونی برای دستکاری روی دادهها در سطح bit میباشد .
بطور کلی جامعیت ، عمومیت ، خوانایی ، سادگی ، کارآیی و پیمانه ای بودن که همگی از مشخصات یک برنامه ایده آل است توسط زبان C قابل پیاده سازی میباشد .
ویژگیهای فوق موجب شده زبان C بعنوان یکی از قویترین و محبوبترین زبانهای برنامه سازی دنیا مطرح شود .
· کاراکترها (Characters)
زبان برنامهنویسی C مجموعهای خاص از کاراکترها را شناسایی میکند. این مجموعه که در حکم مصالح اولیه جهت شکل دادن به اجزا اصلی برنامه هستند عبارتند از :
- حروف بزرگ و کوچک : زبان C برخلاف بعضی زبانها مثلاً پاسکال بین حروف بزرگ و کوچک فرق میگذارد . مثلاً FOR با for یکسان نیست .
- ارقام دهدهی : شامل 0 تا 9
- کاراکترهای مخصوص : شامل ^ % $ # @ ! + - = / * ? < > { } [ ] ~
- جای خالی یا Blank
- کاراکترهای فرمتدادن یا Formating Characters ، که عبارتند از :
کاراکتر خط جدید (New Line) یا \n
کاراکتر برگشت به عقب (Back Space) یا \b
کاراکترHorizontal Tab یا \t
کاراکترVertical Tab یا \v
کاراکتر تغذیه فرم (Form Feed) یا \f
کاراکتر ابتدای سطر یا \r
کاراکتر تهی یا \0
و غیره که با کاربرد آنها آشنا خواهید شد .
· متغیرها (Variables)
متغیرها در زبان C شناسههایی هستند که محلهایی از حافظه را به خود اختصاص میدهند. یک متغیر ترکیبی است از ارقام ، حروف و علامت زیرخط )_( . لازم به ذکر است متغیرهایی که با علامت زیر خط شروع می شوند برای متغیرهای داخلی سیستم رزرو شدهاند. طول هر متغیر در ANSI استاندارد تا 31 کاراکتر است ، ولی در بعضی از کامپایلرهای قدیمی زبان محدود به 8 کاراکتر میباشد.
بعضی از شناسههای زبان C کلمات رزرو شده یا کلیدی هستند. یعنی معنی و مفهوم آن از قبل در زبان تعریف و پیشبینی شده است. بنابراین نمیتوانند در برنامه به عنوان شناسههای تعریف شده به وسیله برنامهنویس بکار برده شوند . متداولترین کلمات کلیدی C به شرح زیر است :
|
for |
goto |
else |
if |
char |
float |
int |
main |
|
enum |
register |
return |
signed |
default |
while |
do |
double |
|
sizeof |
static |
struct |
auto |
case |
short |
coutinue |
const |
|
union |
unsigned |
extern |
typedef |
void |
switch |
long |
break |
البته در بعضی از کامپایلرهای زبان C ممکن است کلمات کلیدی دیگری نیز وجود داشته باشد که باید به کتاب راهنمای مربوطه مراجعه شود . توجه داشته باشید که همه کلمات کلیدی با حروف کوچک نوشته میشود پس main کلمه کلیدی است درحالی که Main کلمه کلیدی نمیباشد زیرا حرف اول آن بزرگ است . همینطور void کلمه کلیدی است اما VOID کلمه کلیدی نیست .
· علامت توضیح (Comment)
در زبان C هر عبارتی که بین دو علامت */ و /*قرار گیرد صرفاً بعنوان توضیحات محسوب میگردند . مثلاً اگر بخواهیم در مورد یک دستور توضیح دهیم که چه کاری را انجام میدهد در هر جای برنامه که فضای خالی مجاز باشد میتوان برای توضیح از علامت فوق استفاده کرد. ( در اغلب نسخه ها علامت // هم مجاز است . )
مثال - در برنامه زیر از علامت توضیح استفاده شده است :
#include<stdio.h>
main ( )
{
int j , k ;
for ( j =1 ; j <= 10 ; j+ + ) /* outer loop */
{
printf("%5d ", j ) ;
for ( k=1; k<=10; k+ +) /* inner loop */
printf("%5d", j * k ) ;
printf("\n") ;
}
}
همه برنامههای C شامل یک یا چندین تابع هستند که یکی از آنها تابع اصلی یا main نامیده میشود . هر برنامه فقط یک تابع اصلی دارد و برنامه همیشه با اجرای تابع اصلی آغاز میگردد. تعریف توابع دیگر ممکن است قبل یا بعد از تابع اصلی قرار گیرد . بطور کلی میتوان گفت که هر برنامه به زبان C حداقل دارای اجزای مقدماتی بترتیب زیر است :
· دستورالعملهای اجرایی
در هر برنامه دستورالعملهای اجرایی باید بعد از تعریف متغیرها درج شوند . دستوری قابلیت اجرا دارد که در پایان آن دستور، یک علامت سمی کولون (;) نوشته شود .
برای فهم بهتر این موضوع اولین برنامه را ارائه و سپس به تشریح آن میپردازیم .
مثال - برنامهای بنویسید که مساحت مستطیلی به طول 6 و عرض 3 را محاسبه کرده و چاپ کند.
حل : برنامه مورد نظر بشکل زیر میباشد :
#include<stdio.h>
main( )
{
int length , width , S ;
length = 6 ;
width = 3 ;
S = length * width ;
printf ("area = %d", S) ;
}
پس از اجرای برنامه ، خروجی برنامه بصورت زیر نمایش داده میشود :
area = 18
حال به تشریح برنامه می پردازیم .
خط اول برنامه اعلان میکند که کتابخانه مربوط به توابع ورودی و خروجی برای دستیابی به توابع آن آماده شود. C یکی از زبانهایی است که به لحاظ داشتن توابع توکار (از پیش فرض شده) بسیار غنی میباشد. هر مجموعه توابعی که عملیات ویژهای را انجام میدهد در یک مجموعه تحت عنوان کتابخانه یا library قرار میگیرد . توابعی که عملیات ورودی و خروجی را انجام میدهند در کتابخانهای به نام stdio.h قرار دارند که در آن stdio به معنی standard input output (ورودی و خروجی استاندارد) بوده و h نیز معرف header یا عنوان است. تابع printf نیز یکی از توابع خروجی میباشد .
حال به توضیح #include میپردازیم . برنامههای نوشته شده به زبان C قبل از اینکه بهوسیله کامپایلر ترجمه گردد در اختیار یک برنامه دیگری تحت عنوان پیشپردازنده یا preprocessor قرار میگیرد . یکی از کاربردهای اصلی این برنامه آن است که کتابخانههای مورد نیاز برنامه منبع را یعنی کتابخانههایی را که توابع بکار رفته در برنامه منبع را شامل است برای استفاده آماده مینماید . این کار بوسیله دستور include که در ابتدای آن علامت # و به دنبال آن نام کتابخانه در داخل علامت :
<> یا " "
میآید انجام میگیرد که اولین عبارت در برنامه بالا همین کار را برای ما انجام میدهد .
در خط بعد تابع اصلی تعریف شده است . پنج خط بعدی متن برنامه اصلی را تشکیل میدهند که از پنج دستور ساده تشکیل شده است. پایان هر دستور را سمی کولون (;) مشخص مینماید چون متن برنامه بیش از یک دستور است مجموع آنها بعنوان دستور مرکب یا یک بلاک در داخل یک زوج آکولاد قرارداده میشود. درواقع هر آکولاد چپ برای کامپایلر C به معنی شروع بلاک و هر آکولاد راست معرف پایان آن است . البته در بعضی مواقع برحسب مورد آکولادها را میتوان بصورت تودرتو نیز بکار برد .
اولین دستور در متن برنامه یا همان شروع آکولاد ، توصیف متغیرها است. سه دستور بعدی دستورات محاسباتی و جایگزینی میباشند و در آخر نیز دستور خروجی است که در آن تابع printf برای چاپ فرمت دار میباشد . اولین آرگومان تابع مذکور متن داخل گیومه میباشد که تابع آن را به همان صورت در خروجی چاپ میکند البته در بعضی از قسمتهای متن که شامل علامت % باشد مانند %d به کامپایلر اطلاع میدهد که اولین متغیر بعد از بسته شدن گیومه که در این مثال S است مقادیر صحیح میپذیرد . در اینجا d معرف decimal است و %d فرمت متغیر در خروجی را تعریف میکند. در فصلهای بعدی بطور کامل به بحث فرمت متغیرها خواهیم پرداخت .
مثال - برنامهای بنویسید که طول و عرض مستطیلی را که به ترتیب a و b نامیده میشود از طریق دستگاه ورودی استاندارد خوانده و با فراخواندن تابعی به نام rectangle مساحت آن محاسبه گردیده ، سپس طول ، عرض و مساحت در برنامه یا تابع اصلی روی دستگاه استاندارد خروجی ، نمایش داده شود .
حل : برنامه مورد نظر در زیر نشان داده شده است :
# include <stdio . h>
main ( )
{
int a , b , area ;
int Rectangle (int a , int b) ;
scanf ("%d %d" , &a , &b) ;
area = Rectangle (a , b);
printf ("\n length = %d width = %d area = %d" , a , b , area) ;
}
int Rectangle (int a , int b)
{
int s ;
s = a * b ;
return (s) ;
}
اگر 5 = a و 4 = b باشد ، خروجی برنامه مذکور بصورت زیر خواهد بود :
length = 5 width = 4 area = 20
توضیح - خط اول تا چهارم مانند برنامه قبلی است . در خط پنجم تابع فرعی Rectangle اعلان شده است که مقدار صحیح برمیگرداند و آرگومانهای آن نیز a و b میباشند که مقادیر صحیح هستند . در خط ششم ، تابع ورودی استاندارد scanf بکار رفته است . این تابع که جزء کتابخانه stdio.h است ، اطلاعات را از طریق ورودی استاندارد که صفحه کلید میباشد ، دریافت میکند . فرمت و مکانیسم کار این گونه توابع بعد تشریح خواهد شد . در اینجا یادآور میشویم که فرم کلی تابع مزبور بصورت:
scanf (control string , argl , arg2 , … , argn) ;
است که در آن رشتة کنترلی (control string) که در داخل گیومه (" ")بکار برده میشود ، اطلاعات مورد نیاز دربارة فرمت اقلام دادههای ورودی را شامل است و عناصر :
arg1 , arg2 , ... argn
نیز آرگومانهایی هستند که اقلام داده های ورودی را معرفی مینمایند . در این دستور حرف Ampersand ، یعنی "&" اپراتور یا عملگر آدرس است . پس &a و &b اشارهگر میباشند و معرف آنند که دو مقدار به آدرسهایی از حافظه به نامهای a و b خوانده شود . در رشته کنترلی نیز که در داخل گیومه قرار دارد ، از چپ به راست %d اول معرف فرمت اولین آرگومان یا داده ورودی بعنوان عدد صحیح است و بدنبال آن %d دوم نیز معرف فرمت دومین آرگومان بعنوان عدد صحیح است . درواقع آرگومانها ، معرف اشارهگرهایی هستند که آدرس اقلام دادهها را در داخل حافظه کامپیوتر مشخص میسازند .علامت \n در رشته کنترلی تابع printf ، موجب انتقال به سطر جدید میگردد . بنابراین اطلاعات بعدی در سطر جدید نشان داده خواهد شد .
لیست کل یادداشت های این وبلاگ