PDA

نسخه کامل مشاهده نسخه کامل : آموزش c مقدماتی



Nesta
27-04-2005, 00:25
مقدمات زبان C

زبان C در سال 1970 توسط دنيس ريچي طراحي گرديد. اين زبان تكامل يافته زبان BCPL
ميباشد كه طراح آن مارتين ريچاردز است ،و زبان BCPL از زبان B كه طراح آن
كن تامپسون مي باشد ، نتيجه شده است .
زبان C معمولا" يك زبان مياني ناميده مي شود . اين بدان معني نيست كه آموزش
اين زبان مشكل است ، يا قدرت آن از زبان هاي برنامه سازي مثل پاسكال و بيسيك
كمتر است و يا اين كه مشكلاتي مشابه زبان اسمبلي براي برنامه نويس ايجاد مي كند.
علت مياني بودن زبان C اين است كه عناصر زبان هاي سطح بالا را با خصيصه تابعي
زبان اسمبلي درهم آميخته است .براي پي بردن به جايگاه زبان C درمقايسه با ساير
زبان هاي برنامه سازي به جدول (1) مراجعه نماييد .
جدول (1) . سطوح زبان هاي برنامه سازي

زبان 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 به
ندرت استفاده مي شود و نوشتن دستورات برنامه در هر ستوني از خط و در هر جاي
فايل امكان پذير بوده ، مثل زبان فرترن مقيد به ستون هاي خاصي نيستند. استفاده
از زيربرنامه ها و بلاك ها نيز از خصيصه هاي اين نوع زبان ها هستند . ذكر اسامي
چند زبان ساخت يافته و غير ساخت يافته ، در انتخاب زبان برنامه سازي جهت برنامه
نويسي مفيد است . ( جدول (2) ) .
جدول (2) . بعضي از زبانهاي ساخت يافته و غيرساخت يافته

هر برنامه در زبان C داراي خصيصه هايي است كه بعضي از آنها عبارتند از : 1
در زبان C هر دستور برنامه به يك ; ختم مي شود . 2
هر دستور ميتواند درچند خط ادامه داشته و يك خط ممكن است شامل چند دستور
باشد . 3
حداكثر طول يك خط برنامه 254 كاراكتر است . 4
در زبان C برنامه نويس مي تواند در هر نقطه از برنامه ، بااستفاده از علائم {
و }و يك بلاك را مشخص كرده و هر متغيري را كه مي خواهد در آنجا تعريف نمايد .
اين متغيرها فقط در آن بلاك معني خواهند داشت . توجه داريم كه هر بلاك مجموعه اي
از دستورات وابسته به يكديگر خواهد بود :
ؤؤ { |

بلاك | ; مجموعه دستورات } |

ؤؤ 5
براي داشتن توضيحات در برنامه كافي است آنها را دربين /*و *و/ قرار داد: *

توضيحات /* C
يك زبان ساخت يافته بلاكي نيست . اين بدان معني است كه تعريف يك زيربرنامه
( در اينجا تابع ) در زيربرنامه ديگر ( همانند پاسكال ) امكان پذير نيست و اين
امر از مساله coupling مي كاهد . C
زبان برنامه نويسي سيستم است . منظور از برنامه هاي سيستم عبارتند از : 1
سيستم عامل (Operating system) 2
مفسر (Interpreter) 3
ويراستار (Editor) 4
اسمبلر (Assrmbler) 5
كامپايلر (Compiler) 6
مديريت بانكهاي اطلاعاتي (Database management)
امروزه C در اكثر امور برنامه نويسي مورد استفاده قرار مي گيرد . زيرا اين
زبان هم داراي خصيصه " قابل حمل بودن " است و هم داراي كارآيي خوبي مي باشد و
سرعت زياد C بر محبوبيت آن افزوده است . مساله قابل حمل بودن ، يك مساله بسيار
مهم است زيرا هم موجب صرفه جويي در وقت شده و هم باعث صرفه جويي در هزينه ها
مي گردد .
زبان C فقط داراي 32 كلمه كليدي است ( جدول (3) ) كه 27 كلمه كليدي آن توسط
ريچي ( طراح زبان ) معرفي شده و 5 كلمه كليدي ديگر توسط موسسه استاندارد سازي
زبان به آن اضافه شده است . اين تعداد در مقايسه با 159 كلمه كليدي كه در زبان
بيسيك وجود دارد قابل توجه است .


| auto | double | int | struct |
| break | else | long | switch |
| case | enum* | register | typedef |
| char | extern | return | union |
| const* | float | short | unsigned |
| continue | for | signed* | void* |
| default | goto | sizeof | volatile* |
| do | if | static | while |


اضافه شدن توسط موسسه استاندارد سازي زبان
جدول (3) . كلمات كليدي زبان C

بعضي از كامپايلرها علاوه بر 32 كلمه كليدي جدول (3) كلمات كليدي ديگري به
زبان اضافه نموده اند . ( جدول (4) ) .

| asm | ess |- ds |- es |
|- ss | cdecl | far | huge |
| intrrupt | near | pascal | |


جدول (4) . كلمات كليدي زبان C كه بعضي از كامپايلرها اضافه كرده اند

كليه كلمات كليدي در زبان C به حروف كوچك نوشته مي شوند . چون در اين زبان
بين حروف كوچك و بزرگ تفاوت است ، به عنوان مثال كلمه else يك كلمه كليدي است

Nesta
27-04-2005, 00:25
انواع داده

همان طور كه قبلا" گفته شد در هر زبان برنامه سازي تعدادي از نوع هاي داده
وجود دارند كه بازه اي را شامل بوده و اعمال خاصي روي آنها انجام پذير است و در C
پنج نوع داده اصلي وجود دارد كه عبارتند از : char، int،، float،، double، و void
. در اين زبان اندازه و محدوده اي كه هر نوع داده اختيار مي كند بستگي به
نوع پردازشگر (Processor) و نحوه پياده سازي كامپايلر دارد. شناسه هايي ( متغير
برچسب ، اسامي توابع و ... ) كه از نوع char باشند براي ذخيره كردن مقاديري كه
توسط كاراكترهاي اسكي تعريف شده اند به كار مي روند. شناسه هايي از نوع int براي
ذخيره كردن مقادير صحيح ، و از نوع floatو doubleو براي ذخيره كردن اطلاعات عددي
اعشاري به كار ميروند كه محدوده آنها توسط تعداد ارقام و دقت آنها مشخص ميشود.
نوع void در مورد توباع به كار مي رود .
نوعهاي داده اصلي ( به جز void ) مي توانند با عباراتي مثل signed، long، unsigned
و shortو تركيب شده و نوع هاي ديگري را به وجود آورند . ( جدول (1) ).

نوع | اندازه تقريبي به بيت | بازه قابل قبول |

char
|
| 8 | 127- تا | 127 unsigned char
|
| 8 | 0 تا | 255 signed char
|
| 8 | 127- تا | 127 int
|
| 16 | 32767- تا | 32767 unsigned int
|
| 16 | 0 تا | 65525 signed int
|
| 16 | 32767- تا | 32767 short int
|
| 16 | 32767- تا | 32767 unsigned
|
| 16 | 0 تا | 65525 | | | short int |
signed
|
| 16 | 32767- تا | 32767 | | | short int |
long int
|
| 32 | َ2147483647- تا | 2147483647 |
float | 32 | 6 رقم دقت | |
double | 64 | 10 رقم دقت | |
long double | 128 | 10 رقم دقت | |
signed | 32 | َ2147483647- تا | 2147483647 | | | long int |
|
| uunsigned long int 32 | 0 تا | 4294967295
ول (1) . نوعهاي تركيبي

Nesta
27-04-2005, 00:26
متغير

متغير، نامي براي يك محل حافظه است كه محتويات آن در طول اجراي برنامه ممكن
است تغيير كند . اسم هر متغير شامل حروف aتا zا، A،تا Zا ، ارقام 0تا 9ا و خط
ربط است . به طوري كه با يكي از حروف و يا خط ربط شروع شده باشند . طول نام هر
متغير بستگي به نوع كامپايلر دارد كه معمولا"از 1ز تا 31 كاراكتر قابل استفاده
است . بعضي از اسامي مجاز و غير مجاز در زير آمده اند :

اسامي مجاز براي متغيرها | اسامي غيرمجاز براي متغيرها |

| 1count | count |
| high! there | test123 |
| grad.1 | high |



تعريف نوع متغير
براي استفاده از متغيرها درC بايد ابتدا آنها را تعريف كنيم . تعريف متغيرها
شامل نامگذاري و تعيين نوع آنها است كه به صورت زير انجام مي شود :
<نوع> <اسامي متغيرها>
يكي از انواع است كه قبلا<نوع>" شامل متغيرهايي <اسامي متغيرها> ذكر كرديم و
است كه مي خواهيم داراي آن نوع باشند . براي تعريف چند متغير در يك دستور بايد
اسامي با كاما از يكديگر جدا گردد : int var1/ var2;

دستور فوق دو متغير به اسامي var2و var1و را از نوع int تعريف مي كند . float flovar1/ flovar2;

دستور فوق ، دو متغير به نام هاي flovar2و flovar1و را از نوع float تعريف
مي كند . double d1;
char ch;

اولين دستور ، d1 را از نوع double و دستور دوم متغير ch را از نوع char
تعريف مي كند .

مقدار دادن به متغيرها
براي مقدار دادن به متغيرها مي توان به دو طريق عمل كرد: 1 به هنگام تعريف
متغير . 2 پس از تعريف متغير . به عنوان مثال : int a=0;
int b/ c/ d/ e=0;
char ch= 'a';
b=0;
c=d=0;

دستور اول ضمن تعريف a از نوع int مقدار آن را برابر با 0 قرار مي دهد .
دستور دوم چهار متغيرb، c،، d،و eو را از نوع int تعريف كرده وفقط مقدار متغير ch
را از نوع كاراكتري تعريف كرده و مقدار آن را برابر با حرف a قرار مي دهد .
دستور چهارم مقدار متغير b را برابر با 0 قرار مي دهد . دستور پنجم مقدار دو
متغير cو dو را برابر صفر قرار مي دهد و اين دستور ، انتساب چندتايي را مشخص
مي كند .
همان طور كه قبلا"گفته شد مقدار متغيرها ممكن است در طول اجراي برنامه تغيير
كند . با استفاده از كلمه كليدي const مي توانيم متغيرهايي را تعريف كنيم كه
مقدار آنها در طول اجراي برنامه ثابت باشد . براي تعريف اين نوع متغيرها بصورت
زير عمل مي شود :
<نوع> <اسامي متغيرها>const
نوع ، يكي از نوع هايي است كه قبلا" ذكر شده و اسامي متغيرها ، مشخص كننده
متغيرهايي است كه بايد به صورت ثابت تعريف شوند : const int a = 10 / b = 20;

دستور فوق دو متغير aو bو را از نوع int تعريف كرده و مقادير آنها را برابر مي دهد . اين مقادير در طول اجراي برنامه قابل تغيير هستند .

Nesta
27-04-2005, 00:27
عملگرها

عملگرها نمادهايي هستند كه براي انجام اعمال خاصي مورداستفاده قرارميگيرند.
عملگرها در زبان C از تنوع زيادي برخوردارند . در C چهار دسته عملگر به نامهاي
( محاسباتي ، رابطه اي ، منطقي و دستكاري بيت ها ) وجود دارند كه آنها را بررسي
مي كنيم .

عملگرهاي محاسباتي
عملگرهاي محاسباتي كه در C مورد استفاده قرار مي گيرند در جدول (1) فهرست
شده اند .

رديف | عملگر | نام | مثال |

1 | - | تفريق و منهاي يكاني | |-xx/x-y

2 | + | جمع | | x+y

3 | * | ضرب | | x*y

4 | / | تقسيم | | x/y

5 | % | باقيمانده تقسيم | | x%y

6 | - - | كاهش يك واحد * | - -xيا xا - |-

7 | ++ + | افزايش يك واحد * | x+ + يا | + +xا

* decrement ** increment

جدول (1) . عملگرهاي محاسباتي

عملگرهاي رديف 1تا 4ا در جدول (1) تقريبا" در همه زبانهاي برنامه سازي وجود
دارند. عملگر % كه در بقيه زبانها با علامت ديگري ( مثلا" در بيسيك به صورت MOD)
وجود دارد باقيمانده تقسيم دو عدد را محاسبه مي كند : x= 13;
y= 5;
z= x%y;

اگر سه دستور فوق را توسط ماشين اجرا كنيم مقدار3 كه باقيمانده تقسيم 13 بر 5
است در z قرار مي گيرد .
عملگر كاهش ، يك واحد از عملوند مربوط كم مي كند . x= 10;
- - x;

دستور x - - از x يك واحد كم مي كند و نتيجه را در x قرار مي دهد كه معادل
دستور 1 + َx = x-1 است .
عملگر افزايش ، يك واحد به عملوند مربوطه اضافه مي كند : x= 40;
++x;

دستور ++x معادل دستور x = + 1 است كه موجب افزودن يك واحد به x مي شود .
عملگرهاي افزايش و كاهش يك واحد را مي توان بعداز عملوند مربوطه نيز به كار
برد مثل : x + + و - - x .
اگر در يك عبارت از عملگرهاي افزايش و كاهش يك واحد ، استفاده كنيم به كار
بردن اين عملگرها در قبل و بعد از عملوند مربوطه ، با يكديگر متفاوت است . بدين
معني كه اگر اين عملگرها قبل از عملوند باشند مقدار فعلي عملوند مورد استفاده
قرار گرفته و سپس عملگرها بر روي آن عمل ميكنند، ولي اگر بعد از عملوند مربوطه
باشند پس از انجام عمل افزايش و كاهش يك واحد به آنها مقادير جديد ، در عبارت
مورد استفاده قرار مي گيرند. استفاده ازعملگرهاي افزايش و كاهش يك واحد ، سرعت
محاسباتي را بالا مي برد .
اگر در يك عبارت از چند عملگر محاسباتي استفاده شود ، مساله تقدم عملگرها
مطرح مي شود . ( جدول (2) ) .

بالاترين تقدم - - | + + |
تفريق يكاني - | | * / % |
|
پايين ترين تقدم - | +

جدول (2) . تقدم عملگرهاي محاسباتي

همان طور كه در جدول (2) مشاهده مي شود ، عملگرهاي افزايش و كاهش يك واحد
داراي بالاترين تقدم و عملگرهاي جمع و تفريق داراي كمترين تقدم هستند و منهاي
يكاني ، داراي دومين تقدم است . عملگرهايي كه در يك سطر آمده اند ، مثل - و +
بدين معني است كه داراي تقدم مكاني نسبت به يكديگر هستند. در اين صورت هر كدام
از غملگرها كه اول ظاهر شود ، زودتر انجام خواهد شد .

عملگرهاي رابطه اي
عملگرهاي رابطه اي براي تشخيص ارتباط بين عملوندها يا مقايسه آنها مورد
استفاده قرار مي گيرند ( جدول (3) ) .

عملگر | نام | مثال |

> | بزرگتر | y >x | >

= >|> بزرگتر مساوي | =y >x | >

< | كوچكتر | y
= <|< كوچكتر مساوي | =y
== | = مساوي بودن | | x=x==y

!= | ! نامساوي | | x=x!=y

جدول (3) . عملگرهاي رابطه اي

نكته قابل ذك درمورد عملگرهاي رابطه اي اين است كه عملگر== براي تشخيص مساوي
بودن دو عبارت مورد استفاده قرار مي گيرد. اين عملگر با عملگر= كه براي انتساب
يك عبارت به يك متغير استفاده مي شود متفاوت است .

عملگرهاي منطقي
عملگرهاي منطقي ( جدول (4) ) بر روي عملوندهاي منطقي عمل ميكنند. عملوندهاي
منطقي داراي دو ارزش درستي و نادرستي هستند .

عملگر | نام | مثال |

&& | & و(AND) z || x

|| | | يا (OR) z || x

! | نقيض (NOT) | !x |

جدول (4) . عملگرهاي منطقي

ارزش نادرستي درزبان C با مقدار صفر و ارزش درستي با مقادير غيراز صفر مشخص
ميشود. عملگر منطقي ! داراي بالاترين تقدم و عملگر || داراي كمترين تقدم در بين
عملگرهاي منطقي هستند . چون عملگرهاي منطقي رابطه نزديكي با عملگرهاي رابطه اي
دارند مي توان تقدم آنها را نسبت به يكديگر بيان كرد ( جدول (5) ) .

بالاترين تقدم | ! | > >= < <= |
| == != |
| && |
|
پايين ترين تقدم | ||

جدول (5) . تقدم عملگرهاي منطقي و رابطه اي

عملگرهاي محاسباتي و رابطه اي با يكديگر تركيب شده و عملگرهاي ديگري را بنام
عملگرهاي محاسباتي رابطه اي ايجاد مي كنند ( جدول (6) ) . تقدم اين عملگرها از
ساير عملگرها پايين تر است .

عملگر | نام | مثال |

+= | + انتساب جمع | x+=y |

= | انتساب تفريق | x-=y |

*= | * انتساب ضرب | x*=y |

/= | / انتساب تقسيم | x/=y |

%= | % انتساب باقيمانده تقسيم | x%=y |

جدول (6) . عملگرهاي محاسباتي و رابطه اي

در جدول (6) ، عبارت x + = y معادل با x = x + y است و عبارت x % = y معادل y
x = x % است كه موجب انتساب باقيمانده تقسيم xبر yربه x مي شود : int a=10;
int b=20;
a+= b;

با اجراي دستورات فوق متغير a برابر30 خواهد بود. زيرا دستور a + = b معادل
دستور a = a + b است .

عملگر دستكاري بيت ها
ازآنجايي كه زبان C طوري طراحي شده است كه بتواند دربسياري ازموارد جايگزين
زبان اسمبلي گردد. بايد قادر باشد كليه اعمال ( يا حداقل بسياري از اعمال ) كه
در زبان اسمبلي قابل انجام هستند را انجام دهد . يكي از اعمالي كه در زبان
اسمبلي براحتي انجام پذير است . انجام اعمالي بر روي بيت هاي يك بايت يا يك
كلمه از حافظه است كه در زبان C براي انجام اين منظور از عملگرهايي استفاده
مي شود كه به عملگرهاي بيتي معروفند ( جدول (7) ) . اين عملگرها انجام اعمال
تست ، مقدار دادن و يا انتقال (shift) بيت ها را در يك بايت يا كلمه حافظه
امكان پذير مي نمايند. عملگرهاي بيتي فقط بر روي متغيرهايي از نوع charيا intا
عمل مي كنند و بر روي متغيرهايي از نوع float، double،، long double،، void، و
يا ساير متغيرها قابل اجرا نيستند . عملگرهاي بيتي &، |،و ~و(AND(، OR،و NOTو)
مشابه عملگرهاي منطقي AND، OR،و NOTو عمل مي كنند با اين تفاوت كه عمل آنها بر
روي يك بيت است . با فرض اين كه pو qو دو بيت مختلف باشند ، نحوه عمل عملگر ^
را در ذيل مشاهده مي نماييد .
p | q | p^q |

0 | 0 | 0 |

1 | 0 | 1 |

1 | 1 | 0 |

عملگرهاي بيتي در جدول (7) مشاهده مي شوند .
عملگر | نوع عمل |
& | AND ( و ) |
| | OR ( يا ) |
^ | XOR ( يا انحصاري ) |
~ | NOT ( نقيض يا متمم يك ) |
>> | انتقال به سمت راست (shift right) |
<< | انتقال به سمت چپ (shift left) |
جدول (7) . عملگرهاي بيتي

همان طور كه مشاهده شد ، نتيجه عملگر بيتي ^ وقتي يك (1) است كه يكي از
عملوندهاي آن صفر و ديگري يك باشد . به عبارت ديگر ، نتيجه عملگر بيتي ^ وقتي
صفر است كه هر دو عملوند آن صفر و يا هر دو يك باشند .
عملگرهاي &، |،و ^و و << ، >> بر روي دو عملوند عمل مي كنند اما عملگرهاي ~
به صورت ذيل به كار مي روند: >> و <<بر روي يك عملوند عمل مي كنند . عملگرهاي
متغير >>تعداد انتقال
متغير <<تعداد انتقال
و <<در روش كلي فوق ، متغير ، يك بايت يا كلمه اي از حافظه است كه عملگرهاي
بايد بر روي آن عمل كنند . تعداد انتقال عددي است كه مشخص مي كند بيت هاي >>"
متغير " بايد چند محل به سمت راست و يا چپ انتقال يابند . همان طور كه قبلا"
براي انتقال به چپ مورداستفاده << براي انتقال به راست و عملگر>>گفته شد عملگر
قرار مي گيرد . هر انتقال به چپ ، معادل با تقسيم كردن مقدار متغير به 2 و هر
انتقال به راست ، معادل ضرب كردن در 2 است .

مثال 1 :
تعداد عددي متغير | x مقدار بيتي متغير | x دستورات زبان | C
| char x; | | |

| x=7 ; | 00000111 | 7 |

| x<<1 ; | 00001110 | 14 |

| x<<3 ; | 01110000 | 112 |

| x<<2 ; | 11000000 | 192 |

| x>>1 ; | 01100000 | 96 |

| x>>2 ; | 00011000 | 24 |

همان طور كه مشاهده مي كنيد پس از اجراي دستور 2<< x< اطلاعات واقعي از بين
مي روند و مساله ضرب در 2 شدن ، در اينجا صدق نمي كند .
عملگر ~ در يك بايت يا كلمه حافظه ( يك متغير ) كليه بيت ها را نقيض ميكند.
يعني بيت صفر را به بيت يك و بيت يك را به بيت صفر تبديل مي نمايد . لذا اگر
اين عملگر دو بار بر روي يك متغير عمل كند وضعيت بيت هاي متغير به حالت اول
برمي گردند .

مثال 2 : x :00101100
~x :11010011
~x :00101100

همان طور كه مشاهده مي شود بيت هاي رديف اول و رديف آخر داراي يك وضعيت
ميباشند ( بيت هاي رديف آخر نتيجه دوبار اجراي عملگر نقيض بر روي متغير است ).
نكته اي كه در مورد عملگرهاي بيتي بايد در نظر داشت اين است كه اين عملگرها
معمولا" در مبدل هاي دستگاهها (device drivers) مورد استفاده قرار مي گيرند .
مثل برنامه هايي كه براي كار با modem و با چاپگر نوشته مي شوند . زيرا در اين
گونه موارد معمولا" تست كردن بيت هاي يك متغير مد نظر خواهد بود .

عملگر ?
عملگر ? با تست يك شرط ، مقداري را به يك متغير نسبت مي دهد . اين عملگر به
صورت زير استفاده مي شود : exp3
:= exp1 ? exp2 متغير exp1
، exp2،و exp3و سه عبارت هستند . نحوه عمل ? به اين صورت است كه : ابتدا
عبارت اول (exp1) ارزيابي مي شود چنانچه اين عبارت داراي ارزش true ( ارزش
درستي ) باشد مقدار exp2 پس از ارزيابي ، در متغير ذكر شده قرار مي گيرد وگرنه
عبارت سوم (exp3) ارزيابي شده و نتيجه آن به متغير ذكر شده منتقل مي شود . x= 10;
y= x>9 ? 100 :200;

نحوه عمل در دو دستور فوق به اين صورت است كه عبارت 9> x> ارزيابي مي شود .
چون اين عبارت يك ارزش منطقي true دارد ( 9> x> است ) لذا عدد 100 در متغير y
قرار مي گيرد .

عملگرهاي &و *و
عملگر & يك عملگر يكاني است كه آدرس عملوند خود را مشخص مي كند و به صورت
زير به كار مي رود : ;
نام عملوند &
مثل : int num;
p= #

با اجراي دستورات فوق آدرس متغير num در متغير p قرار مي گيرد. لذا عملگر &
به معني " آدرس " است . عملگر * همانند عملگر & يك عملگر يكاني است كه محتويات
يك آدرس حافظه را مشخص مي كند و به صورت زير به كار مي رود . ;
نام عملوند *
مثل : p= #
m= *p;

دستور اول ، آدرس متغير num را در p قرار ميدهد و دستور دوم ، محتويات محلي
را كه آدرس آن در p قرار دارد ( محتويات num ) ، را در m قرار ميدهد. بنابراين
مفهوم " * محتويات آدرس " مي باشد . دو دستور فوق معادل دستور m = num; است كه
موجب انتقال محتويات متغير num به متغير m مي شود .

عملگر كاما (/)
عملگر كاما براي انجام چند عمل در يك دستور ، به كار رفته و به صورت زير
استفاده مي شود :
( عبارت 2 و عبارت 1) =) متغير
عملگر كاما موجب مي شود تا " عبارت " 1 ارزيابي شده و سپس نتيجه ارزيابي "
عبارت " 2 با يكديگر ارتباط دارند . x =( y = 3 / y + 5);

ابتدا y باربر با 3 قرار مي گيرد و نتيجه عبارت y + 5 كه برابر 8 است در x
قرار خواهد گرفت .

عملگر sizeof
اين عملگر كه عملگر زمان ترجمه ناميده مي شود، براي محاسبه طول يك نوع و يا
يك متغير به كار رفته و به صورت زير استفاده مي شود . ;
(نوع) sizeof ;
متغير sizeof
اگر بخواهيم با استفاده از اين عملگرها، طول يك نوع مثل int، double و غيره
را محاسبه كنيم بايد آن را در داخل پرانتز قرار دهيم : اما اگر بخواهيم طول يك
متغير را محاسبه كنيم نيازي به استفاده از پرانتز نيست . به عنوان مثال : int a/ b/ c;
a= sizeof( int);
b= sizeof c;

دستور اول سه متغير a، b،ز cز را به صورت int تعريف مي كند . دستور دوم طول
نوع int را محاسبه كرده و در متغير a قرار مي دهد . دستور سوم طول متغير c را
محاسبه كرده و در متغير b قرار مي دهد. اين دستور براي مساله portability زبان C
بسيار مفيد است . بعنوان مثال ممكن است طول نوع int از ماشيني به ماشين ديگر
متفاوت باشد . نكته اي كه در مورد اين عملگر بايد توجه داشت اين است كه معمولا"
روش اول مورد استفاده قرار مي گيرد و روش دوم چندان جالب نيست .

تقدم عملگرها در حالت كلي
وقتي كه در يك عبارت چندين عملگر مورد استفاده قرار مي گيرند تقدم عملگر به
صورت جدول (8) خواهد بود .

بالاترين تقدم () | | ! ~ + + - - * & sizeof |
| * / % |
| + - |
| << >> |
| << = >> = |
| == =! |
| & |
| ^ |
| | |
| && |
| || |
| ? |
| = +=- = *= /= %= |
| / |


جدول (8) . تقدم عملگرها در حالت كلي

اگر در يك عبارت چندين عملگر وجود داشته باشد و درآن از پرانتز نيز استفاده
شود ، تقدم پرانتز از ساير عملگرها بيشتر بوده و عبارت داخل پرانتز زودتر
ارزيابي مي شوند .

مثال 3 : int x=5/ y=10/ k=4;
int s;
s= x*((x+y-)3)/k;

درنتيجه اجراي چند دستور فوق مقداري كه درs قرار مي گيرد برابر با 15 خواهد
بود . سپس عدد 3 از 15 كم مي شود كه 12 حاصل مي گردد و بعداز آن عمل ضرب انجام برابر با 60 ( 5 * 12 ) مي باشد و عملگر تقسيم (/) آخرين

Nesta
27-04-2005, 00:27
تبديل انواع

وقتي كه متغيرهاي با نوع هاي مختلف در يك عبارت با يكديگر تركيب مي شوند
بايد تبديل نوع صورت گيرد . قاعده كلي اين است كه نوع هاي با طول كوچك تر به
نوع هايي با طول بزرگتر تبديل مي شوند . مثلا" اگر دو متغير از نوع كاراكتري و
عددي صحيح با يكديگر تركيب شوند ، نوع كاراكتري به عددي صحيح تبديل مي شود .

مثال 1: char ch;
int i;
float f;
double d;
result =( ch/i )+( f*d( - )f+i)
| | | | | |
int |double | | float
| | | | | |
| | | | | |

ؤؤؤ ؤؤؤ ؤؤؤ | | |
int double float
| | |
| | |
|
ؤؤؤؤؤؤؤؤؤ | |
| |
double |
| |
| |

ؤؤؤؤؤؤؤؤؤؤؤؤؤ |
double

همان طور كه از مثال 1 پيداست ، نوع نتيجه double خواهد بود .
علاوه بر تبديل انواع در عبارات ، در احكام انتساب نيز ممكن است تبديل انواع
صورت گيرد . در تبديل انواع اطلاعاتي از بين مي روند كه بايد در نتيجه حاصل از
احكام انتساب دقت كافي به خرج داد. در ذيل تبديل انواع در احكام انتساب مشاهده
مي شود : int x;
char ch;
float f;
ch= x;
x= f;
f= ch;
f= x;

كليه احكام انتساب فوق قابل انجام بوده و از طرف كامپايلر زبان C هيچ گونه
خطايي گزارش نمي شود . اطلاعاتي كه ممكن است در تبديل انواع از بين بروند . در
جدول (1) آمده است .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
نوع منبع | نوع مقصد | اطلاعاتي كه ممكن است از بين برود |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
| signed char | char اگر مقدار بزرگتر از127 باشد مقصد منفي خواهد شد |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
| short 8 | char بيت با ارزش |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
| int 8 | char بيت با ارزش |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
| long int | char َ24 بيت با ارزش |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
| long int | int َ16 بيت با ارزش |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
| float | int قسمت كسري يا بيشتر و نتيجه حاصل گرد مي شود |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
| double | float قسمت كسري و يا بيشتر و نتيجه حاصل گرد مي شود |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
جدول (1) . تبديل انواع

دو نكته را بايد در مورد تبديل انواع ( جدول (1) ) به خاطر داشته باشيم : 1
بعضي از تبديل انواع در جدول فوق وجود ندارد مثل doubleبه int . در اين
موارد مي توان double را به float تبديل كرده و سپس float را به int تبديل نمود. 2
وقتي نوع بزرگتري به نوع كوچكتري انتساب داده مي شود . قسمتي از اطلاعات
از دست مي روند . همان طور كه مي دانيم ، معمولا" اعداد صحيح (int) در 2 بايت و
اطلاعات از نوع char در يك بابت ذخيره مي شوند :
ؤؤؤؤؤؤؤؤؤؤؤ char
ؤؤؤؤؤؤؤؤؤؤؤ
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ int
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
بايت كم ارزش بايت باارزش
وقتي يك متغير int به يك متغير char انتساب داده مي شود بايت كم ارزش متغير
از نوع int به متغير char منتقل شده ولي با ارزش متغير int در متغير char جايي ميگوييم در انتساب متغيرintبه char ، 8، بيت با ارزش از دست ميرود.

Nesta
27-04-2005, 00:28
ساختمان زبان C و چند تابع ورودي خروجي

همانطور كه قبلا" گفته شد C زبان ساخت يافته است و هر برنامه در اين زبان
شامل يك يا چند تابع است . يكي از اين توابع كه اسم آن ()main است به عنوان
تابع اصلي برنامه و بقيه توابع بعنوان تابع عرضي هستند . اجراي برنامه با تابع
اصلي ، يعني ()main شروع مي شود. در نوشتن برنامه ، بايد تابع اصلي و سپس بقيه
توابع را بنويسيم . تعريف يك تابع در داخل تابع ديگر امكان پذير نيست ولي هر
تابع مي تواند يك يا چند تابع ديگر را فراخواني نمايد .
برخلاف زبانهاي ديگر كه زير روال و توابع دو چيز جداگانه اي هستند در C همگي
تحت عنوان تابع بررسي مي شوند .
كليه متغيرهايي كه در برنامه استفاده مي شوند بايد تعريف شوند و منظور از
تعريف متغير ، نامگذاري و تعيين نوع آن است . متغيرها در C مقدار اوليه ندارند
و تا متغيري مقدار نگيرد قابل استفاده نخواهد بود . شكل (1) ساختمان ساده يك
برنامه به زبان C را نشان مي دهد كه پس از مطالعه مفاهيم ديگري از زبان C ، آن
را تكميل تر خواهيم كرد .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤ | main )(|
| { |
|
تعريف متغيرها | | . |
| . |
| . |
| } |
| f1 )(|
| { |
| . |
| . |
| . |
| } |
| f2 )(|
| { |
| . |
| . |
| . |
| } |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤ
شكل (1) . ساختمان ساده اي از برنامه C

اولين تابع برنامه ، ()main است . ابتدا متغيرهاي مورد استفاده اين تابع
تعريف ، سپس دستورات تابع اصلي با يك { شروع و به } ختم مي شود . بعضي از
دستورات تابع اصلي ممكن است فراخواني توابع ()f1 ، ()f2 وغيره نيز باشند. ()f1
()f2 دو تابع فرعي هستند كه در برنامه وجود دارند همانطوري كه مشاهده مي گردد
تعريف توابع فرعي پس از تابع اصلي صورت مي گيرد. در زبان C فرض ميشود كه نتايج
حاصل از تابع بصورت int است كه اگر غير از اين باشد ، بايد ضمن تعريف متغيرها وع توابع استفاده شده در برنامه به كامپايلر اعلان شود .

Nesta
27-04-2005, 00:29
تابع ()printf

اين تابع براي انتقال اطلاعات از كامپيوتر به صفحه نمايش مورد استفاده قرار
مي گيرد و بصورت زير استفاده مي شود : ;
( عبارت ديگر " / عبارت " 1) printf) "
عبارت " 1 شامل تعدادي كاراكترهاي كنترلي ، كاراكترهاي قالب جهت تعيين شكل
خروجي و رشته هاي ديگري است كه بايد به خروجي منتقل شوند . " عبارت ديگر " شامل
اطلاعاتي هستند كه با فرمت مشخص شده در " عبارت " 1، بايد به خروجي منتقل شوند.
كاراكترهايي كه براي تعيين فرمت خروجي مورد استفاده قرار مي گيرند با كاراكتر %
شروع مي شوند ( جدول 1 ) .

كاراكتر | نوع اطلاعات كه بايد به خروجي منتقل شود |

%C | % يك كاراكتر | |
%d | % اعداد صحيح دهدهي مثبت و منفي | |
%i | % اعداد صحيح دهدهي مثبت و منفي | |
%e | % نمايش علمي عدد همراه با حرف e | |
%E | % نمايش علمي عدد همراه با حرف E | |
%f | % عدد اعشاري مميز شناور | |
%g | % اعداد اعشاري مميز شناور | |
%G | % اعداد اعشاري مميز شناور | |
%O | % اعداد مبناي 8 مثبت | |
%S | % رشته اي از كاراكترها ( عبارت رشته اي ) | |
%U | % اعداد صحيح بدون علامت ( مثبت ) | |
%x | % اعداد مبناي 16 مثبت با حروف كوچك | |
%X | % اعداد مبناي 16 مثبت با حروف بزرگ | |
%p pointer | % ( اشاره گر ) | |
%n | % موجب ميشود تا تعداد كاراكترهايي كه تا قبل | |
| ازاين كاراكتر به خروجي منتقل شده اند شمارش | |
| شده و در پارامتر متناظر با آن قرار گيرد . | |
%% | % علامت % |

جدول (1) . كاراكترهاي فرمت در تابع ()printf

كاراكترهاي كنترلي كه در تابع ()printf بكار ميروند در جدول (2) آمده است .
بعضي از كاراكترهاي كنترلي براي انتقال خروجي به يك محل معين از صفحه نمايش
مورد استفاده قرار مي گيرند .

| كاراكتر عملي كه انجام مي شود |

\f | \ موجب انتقال كنترل به صفحه جديد مي شود | |
\n | \ موجب انتقال كنترل به خط جديد مي شود | |
\t | \ انتقال به 8 محل بعدي صفحه نمايش | |
\" | \ چاپ كوتيشن (") | |
\' | \ چاپ كوتيشن (') | |
\0 NULL | \ رشته تهي | | back slash | \\ |
|
\V | \ انتقال كنترل به 8 سطر بعدي | |
\N | \ ثابت هاي مبناي 8( N( عدد مبناي 8 است ) | |
\xN | \ ثابت هاي مبناي 16( N( عدد مبناي 16 است ) |

جدول (2) . كاراكترهاي كنترلي

چند دستور متوالي كه شامل تابع ()print باشند ، خروجي خود را بر روي يك سطر
منتقل يم كنند . مگر اين كه با پارامتر كنترلي \n كنترل را به سطر بعدي منتقل
كنيم .
مثال 1:

main)(


{


printf(" i like %c "/'c' );


printf("%s"/"very much." );


}



خروجي حاصل از اجراي برنامه فوق بصورت ذيل خواهد بود : i like c very much.

با استفاده از \n مي توانيم خروجي را در چند سطر داشته باشيم . main)(
{
printf("this is second program.\n" );
printf("output is in two line." );
}

خروجي حاصل از اجراي برنامه فوق بصورت ذيل است : this is second program.
output is in two line.


مثال 2: main)(
{
int num ;
printf("the address of num is:" );
printf(" %p"/ &num );
}

در مثال فوق عبارت &num آدرس متغير num را مشخص مي كند كه براي نوشتن آن از
كاراكتر فرمت %p استفاده شده است . نمونه اي از خروجي مثال 2 بصورت زير است . the address of num is : 6A30:OFE4

اگر در تابع ()printf چند كاراكتر فرمت داشته باشيم ، هر كاراكتر با يك عنصر
داده كه بايد به خروجي برود تطبيق داده مي شود : main)(
{
int a=10 ;
float b=20 ;
printf(" a is:%d/b is :%f"/a/b);
}

خروجي حاصل از اجراي برنامه فوق بصورت ذيل است : a is:10/b is:20:000000


مثال 3: main)(
{
unsigned int num ;
num=100 ;
printf("the value of num is:%u"/num);
}

همانطوري كه در مثال 3 مشاهده مي شود ، براي چاپ عدد num كه بصورت عدد صحيح
بدون علامت تعريف شد ، از %u استفاده شده است .
خروجي حاصل از اجراي برنامه مثال 3 به صورت ذيل است : the value of num is:100


مثال 4: main)(
{
double d ;
d=le+007 ;
printf("the value of d is:%e\n"/d);
printf("the value of d is:%E\n"/d);
printf("the value of d is:%g\n"/d);
}

خروجي حاصل از اجراي برنامه مثال 4 بصورت ذيل خواهد بود : the value of d is:1.00000e+07
the value of d is:1.00000E+07
the value of d is:1e+07

همانطور كه مشاهده مي شود براي چاپ اعدادي كه بصورت نماد علمي باشند ميتوان
از كاراكترهاي فرمت % e، % E،و % gو استفاده كرد .

مثال 5: main)(
{
float f=12.50 ;
int t=10 ;
printf("\n f is:%f"/f );
printf(" tenper is:%%%d"/t );
}

خروجي حاصل از اجراي برنامه فوق بصورت زير است : f is:12.500000/tenper is:%10

در مثال 5 براي چاپ علامت % از كاراكتر %% و براي چاپ متغير f از نوع float
مي باشد از %f استفاده شده است .
كاراكتر فرمت %n از ساير كاراكترهاي فرمت متفاوت است . اين كاراكتر بجاي
انتقال مقاديري به خروجي ، موجب مي شود تا تعداد كاركترهايي كه تا قبل از اين
كاراكتر به خروجي منتقل شده اند ، شمارش شده و در پارامتر متناظر با آن قرار
بگيرد .

مثال 6: main)(
{
printf("\neach\tword\tis\n" );
printf("tabbed\tover\tonce" );
}

خروجي از اجراي برنامه فوق بصورت زير خواهد بود : each word is
tabbed over once

كاراكتر كنترلي \b موجب انتقال مكان نما به اندازه يك كاراكتر به عقب ميشود
( بسمت چپ ). كاراكترهاي كنترلي \ "و \و براي چاپ كوتيشن درخروجي مورد استفاده
قرار مي گيرند .

تعيين طول ميدان در تابع ()printf
در حين انتقال اطلاعات توسط تابع ()printf ميتوانيم طول ميدان خروجي را مشخص
كنيم . در اين مورد مي توانيم محل نقطه اعشار و تعداد ارقام اعشار را نيز تعيين
كنيم . تعيين طول ميدان در جدول بندي ها بسيار مفيد است . طول ميدان ، بصورت w.d
است كه در اعداد اعشاري مميز شناور ، w طول ميدان و d تعداد ارقام اعشار را
مشخص مي كند .

مثال 7: main)(
{
printf("\n%8.1f %8.1f %8.1f\n"
/3.0/12.5/523.3 );
printf("\n%8.1f %8.1f %8.1f\n"
/300.0/1200.5/5300.3 );
}

خروجي حاصل از اجراي برنامه فوق بصورت زير است : 3.0 12.5 523.3
300.0 1200.5 5300.3

همانطوركه مشاهده مي گردد طول ميدان برابر با 8 و تعداد ارقام اعشار، برابر
با يك كه در منتهااليه سمت راست ميدان قرار گرفته ، منظور شده است . براي توضيح
بيشتر ، عدد 5300/3 را در حافظه نشان مي دهيم :
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤ | | | 5 | 3 | 0 | 0 | . | 3 |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤ
اگر فرمت w.d كه طول ميدان را مشخص مي كند در مورد رشته ها استفاده گردد ، w
حداقل طول ميدان و d حداكثر كاراكترهاي قابل چاپ را مشخص مي كند .
اگر w.d در مورد اعداد صحيح بكار برده شود ، w مشخص كننده حداقل طول ميدان
و d تعيين كننده حداكثر طول ميدان است .

مثال 8: main)(
{
printf("%7.4f\n"/123.1234567 );
printf("%3.8d\n"/1000 );
printf("%10.16a\n"/"this is a" );
printf(" simple test" );
}

خروجي حاصل از اجراي برنامه فوق بصورت زير است : 123.1235
00001000
this is a simple

در خروجي اول ، تعداد ارقام اعشاري 4 در نظر گرفته شده كه بقيه ارقام حذف
شده اند و ضمنا" عدد حاصل گرد شده است .
در خروجي دوم كه : ميدان 3/8 است عدد صحيح 1000 چاپ شده است .
در خروجي سوم از رشته this is a simple به اندازه 16 كاراكتر چاپ شده است .
در حالت معمولي ، خروجي حاصل در سمت راست ميدان قرار مي گيرد كه مي توان با
قرار دادن علامت منها ( - ) بلافاصله پس از علامت % ، اطلاعات را در سمت چپ ميدان

Nesta
27-04-2005, 00:29
تابع ()scanf

اين تابع براي خواندن اطلاعات از ورودي استاندارد ( صفحه كليد ) بكار رفته و
بصورت زير استفاده مي شود : ;
(آدرس متغيرها ، " كاراكترهاي فرمت ") scanf
كاراكترهاي فرمت ، نوع اطلاعاتي كه بايد خوانده شوند را مشخص مي كند. و آدرس
متغيرها، مشخص كننده محل هايي از حافظه هستند كه اطلاعات ورودي بايد درآن محلها
قرار گيرند. همانطور كه قبلا" ديده ايم آدرس متغيرها را با عملگر & مشخص ميكنيم .
در تابع scanf همانند تابع printf از تعدادي كاراكترهاي فرمت استفاده مي شود .
( جدول 1 ) .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ |
| كاراكتر اطلاعاتي كه خوانده مي شوند |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ |
%c | % يك كاراكتر | |
%d | % يك عدد صحيح دهدهي | |
%i | % يك عدد صحيح دهدهي | |
%e | % عدد اعشاري مميز شناور | |
%f | % عدد اعشاري مميز شناور | |
%g | % عدد اعشاري مميز شناور | |
%o | % عدد مبناي 8 | |
%x | % عدد مبناي 16 | |
%p | % يك اشاره گر | |
%n | % مشخص كننده تعداد كاراكترهايي است كه تا | %%n |
| ورودي خوانده شده اند | |
%u | % عدد صحيح مثبت | |
%s | % رشته ها |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ
جدول (1) . كاراكترهاي فرمت در تابع ()scanf

مثال 1: main)(
{
char ch ;
printf("\n enter a character :");
scanf("%c"/&ch );
printf("\n ch=%c".ch );
}

اجراي فرمان فوق ، ضمن صدور يك پيام ، كاراكتري را از ورودي خوانده در متغير ch
قرار مي دهد . نمونه اي از خروجي را در زير مشاهده مي كنيم : enter a character : s
ch=s


مثال 2: main)(
{
int year ;
printf("enter your age in year:");
scanf("%d"/&year );
printf("\n your age is");
printf(" %d day."/year*365);
}

نمونه اي از خروجي را در زير مشاهده مي كنيم : enter your age in year:19
your age 6935 day.

اين برنامه ، سن شما را از ورودي دريافت كرده و آن را به روز تبديل ميكند و
سپس به خروجي مي برد . لازم به ذكر است كه در مثال 2 تابع ()scanf بر روي خطي
عمل مي كند كه تابع ()printf اولي عمل كرده است . تابع ()printf دومي به علت
وجود \n ، بر روي خط بعدي از صفحه نمايش عمل خواهد كرد . استفاده از ساير
كاراكترهاي قالب در تابع ()scanf همانند تابع ()printf است كه ذكر مثال درمورد
آنها ضروري به نظر نمي رسد .
قالب ديگري كه بايد در مورد آن توضيح داده شود %n است كه مشابه آن را در
تابع ()printf داشته ايم . %n در تابع ()scanf تعداد كاراكترهاي خوانده شده توسط
اين تابع تا %n را به متغيري كه آدرس آن متناظر با %n ذكر شده است منتقل ميكند.
براي خواندن چند متغير از ورودي توسط تابع ()scanf ، اسامي متغيرها را كه
به همراه & ( عملگر آدرس ) ذكر مي شوند با كاما از يكديگر جدا كرده و در حين
ورود اطلاعات مي توانيم آنها را با فاصله (blank) ، كليد enter و يا tab جدا
كنيم .

مثال 3: main)(
{
int a/b/c ;
float ave ;
printf("\n enter three number :");
scanf("%d %d %d"/&a/&b/&c );
ave=(a+b+c)/3 ;
printf("\n average is:%f"/ave );
}

به نتيجه اجراي برنامه و چگونگي ورود سه عدد 20 ، 19 و 18 بعنوان اطلاعات
ووردي توجه كنيد : enter three number :20 19 18
av

Nesta
27-04-2005, 00:30
خواندن يك كاراكتر از ورودي

براي خواندن يك كاراكتر از ورودي ، علاوه بر تابع ()scanf از توابع ديگري نيز
استفاده ميشود كه قبل از بررسي آنها به مثالي از()scanf جهت خواندن يك كاراكتر
توجه كنيد :
مثال 1: main)(
{
char ch ;
printf("enter a character : " );
scanf("%c"/&ch );
printf(" you typed the character");
printf(": %c"/ch );
}

نمونه اي از خروجي حاصل از مثال 1 بصورت زير است : enter a character: j
you typed the character:j


تابع ()getch
اين تابع براي خواندن يك كاراكتر از ورودي بكار مي رود و بصورت زير استفاده
مي شود :
()= getch متغير
پس از آن كه كنترل اجراي برنامه به تابع ()getch رسيد ، برنامه منتظر فشار
دادن كليدي از صفحه كليد مي شود . اگر متغير مورد نظر كاراكتري باشد مقدار
كاراكتري كليد ورود به اين متغير منتقل مي شود و در صورتي كه اين متغير از نوع
عددي باشد ، كد اسكي كليد وارد شده ، در اين متغير قرار مي گيرد .

مثال 2: main)(
{
char ch ;
int x ;
printf("\n enter a character : " );
ch=getch )(;
printf("\n enter this character" );
printf(" second time :" );
ch=getch )(;
printf("\n character is:" );
printf("%c/%c/%d/%d/ch/x/ch/x );
}

فرض كنيد در پاسخ به اجراي اين برنامه كليد s را دوبار در پاسخ به دو تابع
()getch وارد كنيم . در اين صورت خروجي حاصل از اجراي برنامه بصورت زير خواهد
بود : enter a character:
enter this character second time:
character is:s/s/115/115

اگر در مثال 2 به تابع ()printf توجه كنيد ، متغير chو xو را يكبار با فرمت %c
و بار ديگر با فرمت %d نوشته ايم كه در هر دو حالت عدد 115 كه كد اسكي s است
چاپ شده است . وقتي متغير عددي x را با فرمت %d نوشته ايم آنچه كه در آن قرار
گرفته ( كد اسكي كليد s ) نوشته شده است و زماني كه اين متغير را با فرمت %c
نوشته ايم كد اسكي به كاراكتر s تبديل شده و سپس در خروجي چاپ مي شود .

تابع ()getche
اين تابع همانند تابع ()getch براي خواندن يك كاراكتر از ورودي بكار مي رود
و بصورت زير استفاده مي شود :
()= getche متغير
نوع عمل اين تابع مثل ()getch است . با اين تفاوت كه اين تابع پس از اخذ
ورودي ، آن را روي صفحه نمايش چاپ مي كند . حرف e در انتهاي تابع به معني echo
( عكس العمل ) است .

تابع ()getchar
اين تابع همانند توابع ()getch و ()getche براي خواندن يك كاراكتر از ورودي
بكار رفته و بصورت زير استفاده مي شود :
()= getchar متغير
نوع عمل اين تابع همانند دو تابع فوق الذكر است . با اين تفاوت كه در اين
تابع پس از وارد نمودن كليه ( كاراكتر ) مورد نظر ، كليد enter نيز بايد وارد اله در توربو C رعايت مي شود ) .

Nesta
27-04-2005, 00:30
نوشتن يك كاراكتر در خروجي

براي نوشتن يك كاراكتر در خروجي علاوه بر تابع ()printf ، دو تابع ديگر نيز
معمولا" مورد استفاده قرار ميگيرند. قبل از بررسي آنها به مثالي درمورد ()print
كه منجر به چاپ يك كاراكتر در خروجي مي گردد . مي پردازيم . main)(
{
printf("example for character");
printf(": %c"/'a' );
}

خروجي حاصل از اجراي برنامه فوق ، حرف a است . example for character :a


تابع ()putch
اين تابع براي نوشتن يك كاراكتر در صفحه نمايش مورد استفاده قرار گرفته و
بدين صورت استفاده مي شود : ;
( متغير ) putch

مثال 1: main)(
{
char ch ;
printf("\n enter a character: ");
ch=getch )(;
printf("you typed the character:");
putch(ch );
}

خروجي حاصل بصورت زير است : enter a character:
you typed the character : s

براي نوشتن يك كاراكتر توسط تابع ()putch اين تابع را بصورت زير هم مي توان
بكار برد : putch('a');

دستور فوق موجب چاپ كاراكتر a در خروجي مي شود .

تابع ()putchar
اين تابع همانند تابع ()putch براي نوشتن يك كاراكتر در صفحه نمايش به كار
مي رود و بصورت زير استفاده مي شود : ;
( متغير )putchar

مثال 2: #include "stdio.h"
main)(
{
char ch ;
printf("enter a character :" );
ch=getch )(;
printf("\n you typed: " );
putchar(ch );
}

به نمونه اي از خروجي برنامه مثال 2 كه در زير آمده است توجه كنيد : enter a character:
you typed : s
براي نوشتن حرف a در خروجي تابع ()putchar بصورت ;('a')putch بكار مي رود .

Nesta
27-04-2005, 00:31
ساختارهاي تكرار

ساختارهاي تكرار ، تحت شرايط خاصي امكان اجراي مكرر دستور يا مجموعه اي از
دستورات را فراهم ميكنند. اين ساختارها در زبان هاي برنامه سازي مختلف به اشكال
متفاوتي وجود دارند كه ذيلا" انواع مختلف اين ساختارها در زبان C ، مورد بررسي
قرار مي گيرد .

ساختار تكرار for
ساختار for يكي ازامكانات ايجاد حلقه تكرار ميباشد كه بصورتهاي زير استفاده
مي شود :
(َ1) ;دستور(گام حركت ;شرط حلقه ;مقدار اوليه انديس حلقه ) for
(َ2) (گام حركت ;شرط حلقه ;مقدار اوليه انديس حلقه ) for {

مجموعه دستورات }
for(;;( )3)
{

مجموعه دستورات }

نكاتي كه بايد در مورد نحوه كاربرد ساختار تكرار for در نظر داشت عبارتند
از : 1
دستوري كه بعد از ساختار for آمده است مي تواند در خط ديگري تايپ شود . 2
ساختار forبه ; ختم نمي شود . زيرا در غير اين صوتر مجموعه دستوراتي كه
اجراي آنها بايد تكرار شود ، فقط يك بار اجرا خواهند شد . 3
علامت { در نحوه كاربرد دوم و سوم ، مي توانند در همان خطي كه ساختار for
آمده است قرار گيرند . 4
بعد از اولين مقدار انديس حلقه و شرط حلقه ; قرار مي گيرد .
ساختار for در مواردي مفيد است كه تعداد دفعات تكرار مجموعه اي از دستورات
معلوم باشد ، هر حلقه تكرار داراي يك شمارنده است كه تعداد دفعات تكرار اجراي
دستورات داخل حلقه را مشخص مي كند. اين شمارنده ، انديس حلقه نامگذاري مي شود.
انديس حلقه مي تواند مثبت ، منفي ، صحيح و يا اعشاري باشد . مقدار اوليه انديس
حلقه مشخص مي كند كه شمارنده ، از چه مقداري شروع مي شود. شرط حلقه مشخص ميكند
كه مجموعه دستورات داخل حلقه تكرار ، تحت چه شرايطي اجرا مي شوند . گام حركت
مشخص مي كند كه در هر بار اجراي مجموعه دستورات داخل تكرار ، چه مقداري به
شمارنده حلقه اضافه مي شود . گام حركت مي تواند مثبت منفي ، صحيح و يا اعشاري
باشد . بعنوان مثال در دستور : for( i=0;i<5;i++)
printf("\n the value of i is:%d / i);
i
انديس حلقه تكرار است كه مقدار اوليه آن برابر با صفر است . شرط حلقه
تكرار اين است كه i كوچكتر از 5 باشد و گام حركت نيز 1 است كه با i++ مشخص شده
است . خروجي حاصل از اجراي اين دستور بصورت زير است : 0
1
2
3
4

مثال 1: برنامه اي كه تعداد 10 عدد را از ورودي خوانده ، ميانگين آنها را
محاسبه كرده و به خروجي مي برد : main)(
{
int i / sum=0 / num ;
float ave ;
for(i=1 ; i<=10 ; i++)
{
printf("enter number %d: "/i );
scanf("%d"/&num );
sum+=num ;
printf("\n" );
}
ave-sum/10 ;
printf("\n the average is:%f "/ave);
}

خروجي حاصل از اجراي برنامه مثال 1 : enter number 1 : 12
enter number 2 : 13
enter number 3 : 17
enter number 4 : 18
enter number 5 : 16
enter number 6 : 20
enter number 7 : 23
enter number 8 : 28
enter number 9 : 31
enter number 10 : 14

the average is:19.000000


مثال 2: برنامه زير جدول كدهاي اسكي را در خروجي چاپ مي كند : main)(
{
int i ;
for(i=41 ; i<=120 ; i++)
{
printf("%3d=%c\t"/i/i );
if(i%5==0 )printf("\n" );
}
}

برنامه فوق با چند دستور ساده توانسته است جدول زير را در خروجي چاپ كند . 41= )42=* 43=+ 44=/ 45=-
46= .47=/ 48=0 49=1 50=2
51=3 52=4 53=5 54=6 55=7
56=8 57=9 58= :59=; 60=<
61== 62=> 63=? 64=@ 65=A
66=B 67=C 68=D 69=E 70=F
71=G 72=H 73=I 74=J 75=K
76=L 77=M 78=N 79=O 80=P
81=Q 82=R 83=S 84=T 85=U
86=V 87=W 88=X 89=Y 90=Z
91=[ 92=\ 93=] 94=^ 95=_
96=` 97=a 98=b 99=c 100=d
101=e 102=f 103=g 104=h 105=i
106=j 107=k 108=l 109=m 110=n
111=o 112=p 113=q 114=r 115=s
116=t 117=u 118=v 119=w 120=x

اگر بخواهيم اين برنامه را در زبانهاي ديگر بنويسيم ، برنامه طولاني تري به
دست مي آيد .

مثال 3: برنامه اي كه جدول ضرب اعداد از 1 تا 10 را درصفحه نمايش چاپ ميكند. main)(
{
int i/j ;
for(i=1 ; i<=10 ; i++)
{
for(j=1 ; j<=10 ; j++)
printf("%3d "/i*j );
printf("\n" );
}
}

خروجي حاصل از برنامه فوق : 1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100


مثال 4: برنامه اي كه تعداد حروف يك جمله را شمارش مي كند ( انتهاي جمله با
نقطه مشخص شده است ) . در اين برنامه از دستور # include استفاده شده است . #include "stdio.h"
main)(
{
char ch ;
int count ;
for(count=0;(ch=getchar))(!='.'
; count++ );
printf("\n length of statement");
printf(" is:%d"/count );
}

به نمونه اي از خروجي برنامه مثال 4 توجه نماييد : i like C very much.
length of statement is:18

از نحوه كاربرد سوم for براي ساخت حلقه هاي تكرار بينهايت استفاده مي شود .

ساختار تكرار while while
( يكي از ساختارهاي تكرار در زمان C ) در مواقعي مورد استفاده قرار
مي گيرد كه تعداد دفعات تكرار مجموعه دستورات مورد نظر مشخص نباشد .
ساختار while بصورت هاي زير استفاده مي شود : ;
دستور (شرط) while(1(
(شرط) while(2( {

مجموعه اي از دستورات }

وقتي كه كنترل اجراي برنامه به ساختار while رسيد ، شرطي كه در آن ذكر شده
است تست مي شود . اگر اين شرط داراي ارزش منطقي " درست " باشد ، دستور يا
دستورات داخل حلقه تكرار اجرا ميشوند واجراي اين دستورات تا برقراري شرط مذكور
ادامه مي يابد. لذا بايد توجه داشت كه در داخل بدنه حلقه تكرار ، شرط حلقه نقض
شود ، وگرنه دستورات داخل حلقه ، بينهايت بار اجرا خواهند شد .

مثال 5: برنامه اي كه يك جمله رااز ورودي خوانده و تعداد كاراكترهاي آن جمله
را شمارش مي كند ( انتهاي جمله به كليد enter ختم مي شود ) . main)(
{
int count=0 ;
printf("type a statement and ENTER");
printf(" to end.");
while(getche )(!='\r')
count ++ ;
printf("\n length of statement is:");
printf("%d/count );
}


حلقه هاي تكرار بينهايت
با استفاده از ساختارهاي تكرار forو whileو مي توانيم حلقه هاي تكراري درست
كنيم كه جهت ختم آنها بايد از كليد CTL+BREAK استفاده كرد . به اين حلقه هاي
حلقه هاي بينهايت گفته مي شود . براي ساختن حلقه تكرار از while مي توانيم بجاي
شرط از يك (1) به معني ارزش درستي ، استفاده كنيم .

مثال 6: برنامه اي كه تعداد نامحدودي عدد رااز ورودي خوانده و فاكتوريل آنها
را محاسبه مي كند :
جهت ختم اجراي برنامه بايد از CTL+BREAK استفاده نمود . main)(
{
long int answer ;
int number ;
while(1)
{
printf("\n type number: " );
scanf("%d/&number );
answer=1 ;
while(number>1)
answer*=number --;
printf("\n factorial is: " );
printf("%1d\n"/answer );
}
}

به نمونه اي از خروجي برنامه مثال 6 توجه نماييد : type number: 5
factorial is: 120

type number: 4
factorial is: 24
type number: 6
factorial is: 720

type number: ^c

همانطور كه قبلا" گفته شد براي ساختن حلقه تكرار بينهايت از ساختار for كافي
است كه اين ساختار را بصورت (;;)for بكار ببريم ( مثال 7 ) .

مثال 7: مساله محاسبه فاكتوريل ( مثال 6 ) با استفاده از حلقه for : main)(
{
long int answer ;
int number ;
for(;;)
{
printf("\n type number: " );
scanf("%d/&number );
answer=1 ;
while(number>1)
answer*=number --;
printf("\n factorial is: " );
printf("%1d\n"/answer );
}
}


ساختار تكرار do
ساختار تكرار do مشابه ساختار تكرار while است . با اين تفاوت كه در ساختار while
شرط حلقه در ابتداي حلقه تست ميشود ولي در ساختار do شرط حلقه در انتهاي
حلقه تكرار تست خواهد شد. لذا در ساختار do مجموعه دستورات داخل ساختار، حداقل
يكبار انجام مي شوند . اين ساختار بصورت زير استفاده مي شود : do
{
;
مجموعه دستورات ;
(شرط) } wwhile
وقتي كنترل اجراي برنامه به ساختار do رسيد مجموعه دستورات داخل حلقه تكرار
اجرا مي شوند و سپس شرط ذكر شده در اين ساختار تست مي گردد . چنانچه اين شرط
برقرار باشد مجموعه دستورات داخل حلقه تكرار مجددا" اجرا مي شود ، وگرنه كنترل
اجراي برنامه از حلقه تكرار خارج مي گردد .

مثال 8: برنامه اي كه عددي را از ورودي خوانده و سپس آنرا بصورت معكوس در
خروجي چاپ مي كند .
مثلا" عدد 2153 را بصورت 3512 چاپ مي نمايد . main)(
{
int number / digit ;
printf("enter a number: " );
scanf("%d/&number );
do {
digit=number%10 ;
printf("%d/digit );
number/=10 ;
}while(number!=0 );
}

نمونه اي از خروجي حاصل از اجراي برنامه مثال 8 : enter a number:2153
3512

ساخت حلقه هاي تكرار بينهايت با استفاده از ساختار do نيز امكان پذير است . استفاده گردد .

Nesta
27-04-2005, 00:32
ساختارهاي تصميم

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

ساختار تصميم if
ساختار if ( كه ساختار انتقال كنترل شرطي نيز نامگذاري ميشود ) موجب ميگردد
تا تحت شرايطي ، مجموعه اي از دستورات اجرا شده و يااز اجراي اين مجموعه دستورات
صرفنظر گردد . اين ساختار بصورت هاي زير مورد استفاده قرار مي گيرد .
(َ1) ;دستور (شرط) if
(َ2) (شرط) if {

مجموعه دستورات 1 }
else
{

مجموعه دستورات 2 }

در روش (1) ، شرط ذكر شده بررسي مي شود و در صورت برقرار بودن ، دستور بعد
از آن اجرا مي شود و در غير اينصورت كنترل اجراي برنامه به دستور بعد از if
منتقل مي گردد .
در روش (2) ، شرط ذكر شده بررسي مي شود و در صورت برقرار بودن ، مجموعه
دستورات (1) اجرا ميشوند و در غير اينصورت مجموعه دستورات (2) اجرا خواهند شد.
لازم به ذكر است كه وجود else در ساختار if اختياري است . يعني ساختار if را
بصورت زير نيز مي توان بكار برد :
(شرط) if {

مجموعه دستورات }

در روش فوق پس از اين كه كنترل اجراي برنامه به if رسيد شرط مورد نظر بررسي
مي شود . چنانچه اين شرط برقرار باشد ، مجموعه دستورات داخل {و }و ( كه يك بلاك
ناميده مي شود ) اجرا مي گردد وگرنه كنترل اجراي برنامه به اولين دستور بعد از
بلاك if منتقل خواهد شد . استفاده از ساختار if بصورت لانه اي ( تو در تو ) نيز
امكان پذير است كه در اينصورت اولين else به آخرين if بر مي گردد .

مثال 1: برنامه اي كه با خواندن يك جمله از ورودي ، تعداد كاراكترها و كلمات
موجود در جمله را محاسبه مي كند . كلمات با فاصله (blank) از يكديگر جدا شده و
انتهاي جمله به كليد enter ختم مي گردد . main)(
{
int charcount=0 ;
int wordcount=0 ;
char ch ;
printf("type a statement:\n" );
while((ch=getche))(!='\r')
{
charcount ++ ;
if(ch==' ')
wordcount ++ ;
}
printf("\n character count is:");
printf("%d"/charcount );
printf("\n word count is:");
printf("%d"/wordcount );
}

به نمونه اي از خروجي برنامه مثال 1 توجه نماييد : type a statement:
this book is my fifth book.
character count is:27
word count is:6


مثال 2: برنامه اي كه بااستفاده از ساختار تصميم if يك شكل گرافيكي را به كمك
كدهاي اسكي DBو BOو رسم مي كند . main)(
{
int x/y ;
for(y=1 ; y<11 ; y++)
{
for(x=1 ; x<11 ; x++)
{
if(x==y)
printf("\xDB" );
else
if(x==11-y)
printf("\xDB" );
else
printf("\xBO" );
}
printf("\n" );
}
}


مثال 3: برنامه اي كه تعداد كل كاراكترهاي يك جمله و همچنين تعداد ارقام
موجود در آن را شمارش مي كند . main)(
{
int charcnt=0 ;
int wordcnt=0 ;
char ch ;
printf("\n enter a statement: \n" );
while((ch=getche))(!='\r')
{
charcnt++ ;
if(ch>=47 && ch<=58)
digthcnt++ ;
}
printf("\n character count is:" );
printf("%d"/charcnt );
printf("\ndigit count is:");
printf("%d"/digtcnt);
}

به نمونه اي از خروجي برنامه مثال 3 توجه نماييد : type a statement:
my telephone number is 817694.
character count is:31
digit count is:6

نكته اي كه بايد در مورد برنامه مثال 3 توضيح داد اين است كه در دستور if
جهت تشخيص اين كه ، آيا كاراكتر وارد شده ، يكي از ارقام 0تا 9ا است يا خير
از اعداد 47 و 58 استفاده شده است . زيرا كدهاي اسكي ارقام 0تا 9ا در بين اين
دو عدد ( از 48 تا 57 ) مي باشند .

ساختار تصميم else if
تاكنون ساختار if را مطالعه نموديم و مثال هايي را در اين زمينه مشاهده
كرديم . نكته اي بايد به آن توجه داشت اين است كه اگر در ساختارif خواسته باشيم
چندين شرط را مورد بررسي قرار دهيم ، بايد ساختار if را به صورت تودرتو بكار
ببريم كه نه تنها موجب طولاني شدن برنامه مي گردد ، بلكه خوانايي آن را نيز
پايين مي آورد . ساختار else if كه يك ساختار انتقال كنترل شرطي است مي تواند
در اين زمينه به ما كمك كرده تا بتوانيم از افزايش بي رويه طول برنامه جلوگيري
كنيم .
جهت روشن شدن مطلب به دو برنامه بعدي ( مثالهاي 4، 5 ) كه يكي با ساختار if
و ديگري با ساختار else if براي حل يك مساله نوشته شده اند توجه كنيد . اين
برنامه ها دو عدد و يكي از عملگرهاي چهار عمل اصلي را از ورودي خوانده و عملگر
را بر روي دو عدد اجرا مي كنند .

مثال 4: main)(
{
int num1 / num2 ;
char op ;
while(1)
{
printf("type number/operator/");
printf("number \n" );
scanf("%d%c%d"/&num1/&op/&num2);
if(op=='+')
printf("\n sum=%d"/num1+num2);
else
if(op=='-')
printf("\nsubtract=%d"/num1-num2);
else
if(op=='*')
printf("\nmultiple=%d"/num1*num2);
else
if(op=='/')
printf("\ndivition=%d"/num1+num2);
else
printf("\n operator is illegal");
printf("\n\n" );
}
}

به نمونه اي از خروجي برنامه مثال 4 توجه نماييد : type number/operator/number
12 + 23
sum=35

type number/operator/number
2*26
multiple=52

type number/operator/number
4%2
operator is illegal

type number/operator/number

^c


مثال 5: main)(
{
int num1 / num2 ;
char op ;
while(1)
{
printf("type number/operator/");
printf("number \n" );
scanf("%d%c%d"/&num1/&op/&num2);
if(op=='+')
printf("\n sum=%d"/num1+num2);
else if(op=='-')
printf("\n subtract=%d"/num1-num2);
else if(op=='*')
printf("\n multiple=%d"/num1*num2);
else if(op=='/')
printf("\n divition=%d"/num1+num2);
else
printf("\n operator is illegal");
printf("\n\n" );
}
}

همانطوركه ملاحظه ميشود برنامه اي كه با ساختار else if نوشته شده است ( مثال 5
) كوتاهتر بوده و از خوانايي بهتري برخوردار است . لذا توصيه مي شود كه در
اين گونه موارد از else if بجاي ساختار if استفاده گردد .

انتقال كنترل غيرشرطي
ساختارهاي ifو else ifو را تحت عنوان انتقال كنترل شرطي مورد بررسي قرار
داده ايم . چند دستور در زبان C وجود دارند كه بدون تست كردن شرطي سبب انتقال
كنترل برنامه ، از جايي به جايي ديگر مي شوند . نام اين دستور انتقال كنترل
غيرشرطي مي باشد كه در ذيل مورد بررسي قرار مي گيرند .

دستور goto
در زبان C علاوه بر ساختارهاي تصميم ، دستوري بنام goto نيز وجود دارد كه سبب
انتقال كنترل اجراي برنامه ، از نقطه اي به نقطه ديگر مي گردد. اين دستور بصورت
زير بكار مي رود : ;
برچسب دستور goto
برچسب دستور ، همانند يك متغير نامگذاري شده و به دو نقطه (:) ختم مي شود .
پيشنهاد مي گردد حتي الامكان از دستور goto كه معمولا" سبب كاهش ميزان خوانايي
برنامه مي شود ، استفاده نگردد .

مثال 6: برنامه اي كه با استفاده از دستور goto يك حلقه تكرار مي سازد . main)(
{
int x=1 ;
loop1:
x++ ;
if(x<100 )goto loop1 ;
printf("\n the maximum value");
printf(" of x is:%d"/x );
}

خروجي حاصل از اجراي برنامه مثال 6 : the maximum value of x is:100

يكي از خواص gotoدر Cر اين است كه از تابعي به تابع ديگر نمي توان انشعاب
كرد و فقط انتقال كنترل در يك تابع امكان پذير است . يعني برچسب goto بايد در
تابعي باشد كه اين دستور در آن تابع بكار رفته است .

دستور break
اين دستور يكي از دستورات انتقال كنترل غير شرطي است و به صورت زير مورد
استفاده قرار مي گيرد :

دستور break به دو منظور استفاده مي شود : الف ) خاتمه داده به case در
ساختار switch ، ب ) خاتمه دادن به حلقه تكرار ( حلقه هاي تكرار ممكن با for do
يا whileا ساخته شوند ) . پس از اجراي دستور break در داخل ساختارهاي تكرار
كنترل اجراي برنامه به اولين دستور پس از حلقه تكرار منتقل مي شود .

مثال 7: main)(
{
int t ;
for(t=0 ; t<100 ; t++)
{
printf("%3d"/t );
if(t==5)
break ;
}
printf("\nmaximum value of t is:");
printf("%d"/t);
}

خروجي حاصل از اجراي برنامه مثال 7: 0 1 2 3 4 5
maximum value of t is:5

همانطور كه از خروجي برنامه پيداست پس از آن كه مقدار tبه 5 رسيد كنترل
اجراي برناه از حلقه تكرار for خارج شده و با اجراي دستور printfعدد 5د را چاپ
مي كند . نكته اي كه در مورد break بايد توجه داشت اين است كه اگر دو يا چند
حلقه تكرار تودرتو داشته باشيم ، دستور break موجود در داخلي ترين حلقه ، فقط
موجب خروج از همين حلقه تكرار مي شود .

مثال 8: main)(
{
int t ;
for(t=0 ; t<100 ; t++)
{
count=1 ;
printf("\n" );
for(;;)
{
printf("%3d"/count );
count ++ ;
if(count==4 )break ;
}
}
}

خروجي حاصل از اجراي برنامه مثال 8: 1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3

در دو مثال 7و8و دوحلقه تكرار وجوددارد كه حلقه داخلي يك حلقه بينهايت است .
در اين حلقه ر گاه مقدار countبه 4 برسد ، كنترل اجراي برنامه از اين حلقه
خارج مي شود .

دستور continue
دستور continue در يك حلقه تكرار ، موجب انتقال كنترل به ابتداي حلقه تكرار
شده ، بصورت زير استفاده مي شود : continue;

پس از اجراي اين دستور كنترل به ابتداي حلقه برگشته و شرط حلقه تست مي گردد
كه در صورت برقرار بودن شرط ، مجموعه دستورات داخل حلقه تكرار مجددا" اجرا
مي شوند وگرنه كنترل از حلقه تكرار خارج خواهد شد .

مثال 9: برنامه اي كه كاراكتري را از ورودي دريافت كرده و اين كاراكتر و
كاراكتر بعد از آن را به خروجي مي برد . main)(
{
char done=0 / ch ;
while(!done)
{
printf("\n type a character / ");
printf("& for exit :");
ch=getch)(;
printf("\n you typed the");
printf("character: %c"/ch);
if(ch=='&')
{
done=1 ;
continue ;
}
printf("\nthe next character is:");
printf("%c"/ch+1 );
}
}

به نمونه اي از خروجي برنامه مثال 9 توجه نماييد : type a character /& for exit:
you typed the character: a
the next character is:b
type a character /& for exit:
you typed the character: b
the next character is:c
type a character /& for exit:
you typed the character: &


ساختار switch
ساختار switch كه يكي از ساختارهاي جالب جهت بالا بردن توانايي برنامه است
بصورت زير استفاده مي شود :
( عبارت ) switch {

:مقدار case 1
مجموعه دستورات 1 break;

:مقدار case 2
مجموعه دستورات 2 break;
.
.
.
default:

مجموعه دستورات }

نحوه عمل ساختار switch بدين صورت است كه : عبارت ذكر شده در switch ارزيابي
مي شود ، سپس نتيجه ارزيابي از بالا به پايين با مقادير ذكر شده ( مقدار 1
مقدار 2 و ... ) مقايسه مي شود ( ابتدا با " مقدار " 1 مقايسه مي گردد ) اگر
نتيجه ارزيابي بااين مقدار برابر باشد مجموعه دستورات داخل آن case اجرا ميشود
و با دستور break كنترل اجراي برنامه از اين ساختار خارج مي شود . اگر نتيجه
ارزيابي با " مقدار " 1 برابر نباشد ، مقايسه با " مقدار " 2 انجام مي شود و
اين روند تا انتهاي اين ساختار ادامه پيدا مي كند . اگر هيچكدام از مقاديري كه
در case ذكر شده اند با نتيجه ارزيابي " عبارت " برابر نباشند ، مجموعه دستورات
پس از defaule اجرا مي شود . defaule اختياري است و ممكن است در ساختار switch
استفاده نگردد. در اين صورت اگر هيچكدام از مقادير 1، 2 و... با نتيجه ارزيابي "
عبارت " برابر نباشند ، كنترل به بعد از ساختار switch برخواهد گشت .
حداكثر تعداد case كه در يك ساختار switch مي تواند قرار گيرد برابر با 257
است .
نكاتي كه در مورد ساختار switch بايد در نظر داشت عبارتند از : 1
اين ساختار با ساختار if از اين جهت متفاوت است كه در ساختار switch فقط
مساله " مساوي بودن "(equality() مطرح است اما در ساختار if مي توان يك عبارت
منطقي و يا رابطه اي را مورد بررسي قرار داد . 2
دو يا چند case در ساختار switch نمي توانند يك مقدار مساوي را مورد تست
قرار دهند . بعضي در نحوه كاربرد ساختار switch ، مقدار 1 ، مقدار 2 و ...
نمي توانند با يكديگر برابر باشند . 3
اگر ثابت هاي كاراكتري در ساختارswitch بكار گرفته شوند، آنها به مقادير "
صحيح " تبديل مي شوند . 4
اگر در يك case از دستور break استفاده نشود پس از اجراي مجموعه دستورات
مربوط بخ اين case مجموعه دستورات موجود در case بعدي نيز اجرا مي شوند . 5
دو يا چند شرط را مي توان در ساختار switch با يكديگر OR نمود كه براي
اين منظور كافي است چند case را با مقاديري كه مي خواهيم با هم OR شوند پشت سر
هم ذكر كنيم ( مثال 11 ) .

مثال 10: برنامه اي كه دو عدد و يكي از عملگرهاي چهار عمل اصلي را از ورودي
خوانده و عملگر را بر روي دو عدد عمل مي كند . main)(
{
int num1 / num2 ;
char op ;
while(1)
{
printf("type number/operator/");
printf("number \n" );
scanf("%d%c%d"/&num1/&op/&num2);
switch(op)
{
case '+':
printf("\nsum=%d"/num1+num2);
break ;
case '-':
printf("\nsubtract=%d"/num1-num2);
break ;
case '*':
printf("\nmultiple=%d"/num1*num2);
break ;
case '/':
printf("\ndivition=%d"/num1+num2);
break ;
default:
printf("\n operator is illegal");
printf("\n\n" );
}
}

به نمونه اي از خروجي حاصل از اجراي برنامه مثال 10 توجه نماييد : type number/operator/number
12 + 23
sum=35

type number/operator/number
2*26
multiple=52

type number/operator/number
4%2
operator is illegal

type number/operator/number

^c

اگر بجاي علامت *از 'x'ز و يا بجاي '/'از '\'ز استفاده گردد، اين برنامه عمل
نخواهد كرد . اما برنامه ذيل ( مثال 11 ) طوري طراحي شده است كه با استفاده از
امكان تركيب شرطهاي مختلف در ساختار switch ، به اين دو مورد نيز پاسخ دهد .

مثال 11: برنامه اي كه دو عدد و يكي از عملگرهاي چهار عمل اصلي را از ورودي
خوانده و آن عملگر را بر روي آن دو عدد عمل مي كند . main)(
{
int num1 / num2 ;
char op ;
while(1)
{
printf("type number/operator/");
printf("number \n" );
scanf("%d%c%d"/&num1/&op/&num2);
switch(op)
{
case '+':
printf("\nsum=%d"/num1+num2);
break ;
case '-':
printf("\nsubtract=%d"/num1-num2);
break ;
case '*':
case 'x':
printf("\nmultiple=%d"/num1*num2);
break ;
case '/':
case '\\':
printf("\ndivition=%d"/num1+num2);
break ;
default:
printf("\noperator is illegal");
}
printf("\n\n" );
}
}

نمونه اي از خروجي حاصل از اجراي برنامه مثال 11 : type number/operator/number
20 x 4
multiple=80

type number/operator/number
60 \ 3
division=2o

type number/operator/number
4%2
operator is illegal

type number/operator/number
12 + 23
sum=35

type number/operator/number
2*26
multiple=52

type number/operator/number

^c


مثال 12: برنامه اي كه اطلاعات تعدادي از ورودي خوانده و سپس معدل هر دانشجو
را محاسبه مي نمايد. پس از محاسبه معدل ، دانشجويان ممتاز ( معدل بيشتر از 17 )
و دانشجويان مشروط ( معدل كمتر از 12 ) را مشخص و در خروجي چاپ مي كند . main)(
{
int sumgrad/sumunit/number ;
int cours/unit/grad/aver/j/n=0 ;
char name[20] ;
printf("enter number of student:\t");
scanf("%d"/&number);
while(n!=number)
{
n++ ;
sumunit=sumgrad=j=0 ;
printf("\n enter name of student ");
printf("%d:"/n );
scanf("%s"/&name );
printf("\n enter number of cours ");
printf("of this st:.");
scanf("%d"/&cours );
while(j!=cours)
{
printf("\n enter unit of cours");
printf(" %d:"/j+1 );
scanf("%d"/&unit );
printf("\n enter grade of cours");
printf(" %d:"/j+1 );
scanf("%d"/&grad );
sumunit=sumunit+unit ;
sumgrad=sumgrad+grad*unit ;
j++ ;
}
aver=sumgrad/sumunit ;
printf("\n average is:\t" );
printf("%d"/aver );
if(aver<12)
{
printf("\n student is probation");
printf("... ");
}
else if(aver>17)
{
printf("\n student is exelent");
printf("... ");
}
}
}

به نمونه اي ازخروجي مثال 12 كه براي دو نفر ازدانشجويان عمل نموده است توجه
نماييد . enter number of students :2
enter name of student 1: ali
enter number of cours of this st:.2
enter unit of cours 1:2
enter grade of cours 1:19
enter unit of cours 2:3
enter grade of cours 2:20
aver is : 19
studnt is exelent...

enter name of student 2: reza

enter number of cours of this st:.3
enter unit of cours 1:2
enter grade of cours 1:12
enter unit of

Nesta
27-04-2005, 00:33
توابع و كلاسهاي حافظه

در مورد برنامه هاي طولاني و پيچيده كه شامل چندين قسمت منطقي تقريبا" مستقلي
هستند بهتر است براي هر قسمت منطقي ، برنامه اي نوشته و سپس آنها را به يكديگر
متصل (Link) كرد . هر يك از اين قسمتها يك زير برنامه نام دارند . استفاده از
زير برنامه جهت طراحي برنامه ها ، داراي مزاياي زيادي است كه بر اهل كامپيوتر
پوشيده نيست . در زبانهاي برنامه سازي مختلف معمولا"دو نوع زيربرنامه وجود دارند
و عبارتند از : ( الف ) زير برنامه هاي تابع ( ب ) زير برنامه هاي زير روال ، در
زبان C فقط زيربرنامه تابع مورد استفاده قرار ميگيرد. كاري را كه زيربرنامه هاي
زير روال در ساير زبان هاي برنامه سازي انجام مي دهند ، در زبان C توسط زير
برنامه هاي تابع صورت مي گيرد . در اينجا منظور از زير برنامه ، توابع هستند .
توابع در زبان C داراي ساختمان خاصي هستند كه شكل (1) آن را نشان مي دهد .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ |
<نوع تابع > <نام تابع > ( اسامي پارامترها ) | |
تعريف پارامترها | | { |
|
بدنه تابع | | } |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ
شكل (1) . ساختمان توابع

در شكل (1) منظور از نوع تابع ، يكي از انواع معتبر در زبان C است كه نوع
مقدار برگردانده شده توسط تابع را مشخص مي كند . تعيين نوع توابع ، اختياري
است . اگر تابعي تعيين نوع نگردد كامپايلر زبان C فرض مي كند مقداري كه توسط
تابع برگردانده مي شود از نوع " صحيح " است . نام تابع از قانون نامگذاري براي
متغيرهاي تبعيت مي كند . اسامي پارامترها شامل متغيرهايي است كه بايد به تابع
منتقل كردند . اگر تعداد پارامترها بيش از يكي باشد يا كاما از يكديگر جدا
مي شوند . تعريف پارامترها مجموعه دستوراتي است كه نوع پارامترها را تعيين
مي نمايد . تعيين نوع پارامترها در حين تعريف تابع نيز امكان پذير است . بدنه
تابع شامل دستورالعمل هايي است كه عمل تابع را مشخص مي كند .
نكاتي را كه بايد در مورد توابع در نظر داشت عبارتند از : 1
كليه توابع فرعي بعد از تابع اصلي (()main) تعريف مي شوند . 2
اگر نوع تابعي غيراز نوع " صحيح " باشد، نوع آن بايد در تابع فراخواننده
به كامپايلر اعلان شود . 3
براي اجراي تابع بايد آنها را فراخواني نمود ( فراخواني توابع توسط نام
آنها انجام مي شود ) . 4
همانطور كه متغيرهاي قابل استفاده در تابع اصلي بايد در ابتداي اين تابع
تعريف شوند ، متغيرهاي مورد نياز هر تابع فرعي نيز بايد در ابتداي آنها تعريف
كردند . 5
تعريف يك تابع در داخل تابع ديگر امكان پذير نيست . ولي فراخواني سطوح
مختلف توابع ، ممكن است . 6
توابع از نظر تعداد مقاديري كه به تابع فراخواننده برمي گردانند ، به سه
دسته تقسيم مي شوند .
الف ) توابعي كه هيچ مقداري را برنمي گردانند .
ب ) توابعي كه فقط يك مقدار را برمي گردانند .
ج ) توابعي كه چند مقدار را به عنوان نتيجه عمل برمي گردانند . 7
درموقع فراخواني توابع بايد دقت داشت كه تعداد و نوع آرگومانها با تعداد
ونوع پارامترها يكسان باشند. براي پي بردن به تفاوت بين آرگومانها و پارامترها
مي توانند به شكل (2) مراجعه نماييد .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ | main )(|
| { |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | |
آرگومان ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | |
< فراخواني تابع ؤؤؤؤؤؤ;(a/b)out | | |
| } |
| |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | |
پارامتر تابع ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | |
(< تعريف تابع ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤk/i)out | | int k/i; |
| { |
| |
| printf("k=%d/i=%d"/k/i); |
| |
| } |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ
شكل (2) . تفاوت آرگومان و پارامتر

در شكل (2) aو bو را كه در فراخواني تابع out آمده اند ، آرگومان تابع و I و K
را كه در تعريف تابع out آمده اند پارامتر تابع مي گوييم . همانطور كه ملاحظه وانند هم نام نباشند .

Nesta
27-04-2005, 00:34
توابعي كه هيچ مقداري را برنمي گردانند

خوب است قبل از بحث در مورد اينگونه توابع ، مثالي را متذكر شويم .

مثال 1: برنامه اي كه با استفاده از يك تابع ، زماني كه شامل ساعت ، دقيقه
و ثانيه است را از ورودي خوانده و اين زمان را به ثانيه محاسبه مي نمايد : main)(
{
convert )(;
}

convert)(
{
int hours/minutes/second/time ;
printf("enter time to be convertd");
printf("\n hour/minutes/second : ");
scanf("%d%d"/&hours/&minutes);
printf("%d/&second);
time=(60*hours+minutes)*60+second ;
printf("\ntime is: %d second."/time);
}

به نمونه اي از خروجي برنامه مثال 1 توجه نماييد : enter time to be convertd
hour/minutes/secound : 4 8 30

time is: 14910 second.

در مثال 1 از تابعي به نام convert استفاده شده است كه هيچگونه پارامتري
ندارد . متغيرهاي مورد نياز اين تابع ، تعريف شده ، اطلاعات از ورودي خوانده
مي شوند و پس از انجام محاسبات به خروجي منتقل مي گردند . اين تابع هيچ مقداري
را به تابع فراخوانده ( تابع اصلي ) برنمي گرداند . به چنين توابعي توابع از
نوع void گفته مي شود . اگر بخواهيم برنامه مثال 1 را با استفاده از اين تعريف
( تابع از نوع void ) بنويسيم ، مثال (2) حاصل خواهد شد .

مثال 2: برنامه مثال 1 با استفاده از تعريف نوع void : main)(
{
void convert )(;
convert )(;
}

void convert)(
{
int hours/minutes/second/time ;
printf("enter time to be convertd");
printf("\n hour/minutes/second : ");
scanf("%d%d"/&hours/&minutes);
printf("%d/&second);
time=(60*hours+minutes)*60+second ;
printf("\ntime is: %d second."/time);
}

همانطوريكه در مثال 2 مشاهده ميشود بايد درتابع فراخواننده ( در اينجا تابع
اصلي ) نوع تابع convert را كه از نوع void است به كامپايلر اعلان نمود وسپس در
حين تعريف تابع نوع آن مشخص گردد (()void convert) .
در توابعي مانند convert كه هيچگونه پارامتري ندارند ، براي جلوگيري از
هر گونه اشتباه احتمالي در فراخواني اينگونه توابع ( كه ممكن است اشتباها" با
پارامتر فراخواني گردند ) مي توان بجاي پارامتر و آرگومان از كلمه كليدي void
استفاده نمود. با توجه به اين نكته كه اگر اشتباها" توابع فاقد هرگونه پارامتر
( و آرگومان ) با پارامتر فراخواني گردند . كامپايلر C خطايي را اعلام نمي كند.
در اين حالت ذكر كلمه كليدي void بجاي پارامتر و آرگومان تابع مفيد بنظر ميرسد
( مثال 3 ) .

مثال 3: main)(
{
void convert(void );
convert )(;
}

void convert(void)
{
int hours/minutes/second/time ;
printf("enter time to be convertd");
printf("\n hour/minutes/second : ");
scanf("%d%d"/&hours/&minutes);
printf("%d/&second);
time=(60*hours+minutes)*60+second ;
printf("\ntime is: %d second."/ti

Nesta
27-04-2005, 00:34
توابعي كه هيچ مقداري را برنمي گردانند

خوب است قبل از بحث در مورد اينگونه توابع ، مثالي را متذكر شويم .

مثال 1: برنامه اي كه با استفاده از يك تابع ، زماني كه شامل ساعت ، دقيقه
و ثانيه است را از ورودي خوانده و اين زمان را به ثانيه محاسبه مي نمايد : main)(
{
convert )(;
}

convert)(
{
int hours/minutes/second/time ;
printf("enter time to be convertd");
printf("\n hour/minutes/second : ");
scanf("%d%d"/&hours/&minutes);
printf("%d/&second);
time=(60*hours+minutes)*60+second ;
printf("\ntime is: %d second."/time);
}

به نمونه اي از خروجي برنامه مثال 1 توجه نماييد : enter time to be convertd
hour/minutes/secound : 4 8 30

time is: 14910 second.

در مثال 1 از تابعي به نام convert استفاده شده است كه هيچگونه پارامتري
ندارد . متغيرهاي مورد نياز اين تابع ، تعريف شده ، اطلاعات از ورودي خوانده
مي شوند و پس از انجام محاسبات به خروجي منتقل مي گردند . اين تابع هيچ مقداري
را به تابع فراخوانده ( تابع اصلي ) برنمي گرداند . به چنين توابعي توابع از
نوع void گفته مي شود . اگر بخواهيم برنامه مثال 1 را با استفاده از اين تعريف
( تابع از نوع void ) بنويسيم ، مثال (2) حاصل خواهد شد .

مثال 2: برنامه مثال 1 با استفاده از تعريف نوع void : main)(
{
void convert )(;
convert )(;
}

void convert)(
{
int hours/minutes/second/time ;
printf("enter time to be convertd");
printf("\n hour/minutes/second : ");
scanf("%d%d"/&hours/&minutes);
printf("%d/&second);
time=(60*hours+minutes)*60+second ;
printf("\ntime is: %d second."/time);
}

همانطوريكه در مثال 2 مشاهده ميشود بايد درتابع فراخواننده ( در اينجا تابع
اصلي ) نوع تابع convert را كه از نوع void است به كامپايلر اعلان نمود وسپس در
حين تعريف تابع نوع آن مشخص گردد (()void convert) .
در توابعي مانند convert كه هيچگونه پارامتري ندارند ، براي جلوگيري از
هر گونه اشتباه احتمالي در فراخواني اينگونه توابع ( كه ممكن است اشتباها" با
پارامتر فراخواني گردند ) مي توان بجاي پارامتر و آرگومان از كلمه كليدي void
استفاده نمود. با توجه به اين نكته كه اگر اشتباها" توابع فاقد هرگونه پارامتر
( و آرگومان ) با پارامتر فراخواني گردند . كامپايلر C خطايي را اعلام نمي كند.
در اين حالت ذكر كلمه كليدي void بجاي پارامتر و آرگومان تابع مفيد بنظر ميرسد
( مثال 3 ) .

مثال 3: main)(
{
void convert(void );
convert )(;
}

void convert(void)
{
int hours/minutes/second/time ;
printf("enter time to be convertd");
printf("\n hour/minutes/second : ");
scanf("%d%d"/&hours/&minutes);
printf("%d/&second);
time=(60*hours+minutes)*60+second ;
printf("\ntime is: %d second."/ti

Nesta
27-04-2005, 00:38
تعيين نوع تابع

همانطور كه قبلا" گفته شد اگر در حين تعريف تابع از ذكر نوع آن خودداري شود
كامپايلر فرض مي كند مقداري كه توسط اين تابع برگردانده مي شود ( توسط دستور return
) يك مقدار " صحيح " است . به اينگونه توابع ، توابع نوع صحيح گفته
مي شود . اگر بخواهيم توابعي غير از نوع " صحيح " داشته باشيم بايد: الف ) نوع
تابع ار در تابع فراخواننده به كامپايلر اعلان كنيم . ب ) نوع تابع را در حين
تعريف تابع مشخص كنيم ( مثال ) .

مثال : برنامه اي كه شعاع دايره اي را از ورودي خوانده و با محاسبه مساحت آن
را به خروجي مي برد . main)(
{
float area(float );
float radius ;
printf("\n entera radius : " );
scanf("%f"/&radius );
printf("area of circle is:");
printf("%.2f"/area(radius ));
}
float area(float rad)
{
return(3.13*rad*rad );
}

به نمونه اي از خروجي برنامه مثال توجه نماييد : enter radius: 4
area of circle is: 50.08

همانطوري كه در مثال بالا مشاهده مي گردد ، مقداري كه توسط تابع ()area
برگردانده ميشود از نوع اعشاري است ، لذا در اولين دستور تابع ()main نوع تابع
()area را به كامپايلر اعلان كرده و در حين تعريف اين تابع ، نوع آن را نيز مشخص
نموده ايم . در بسياري از گونه هاي زبان C ذكر نوع نتيجه تابع ، در آرگومان آن
الزامي نيست و درمثال بالا اولين دستور تابع ()main را نيز مي توان به صورت زير
نوشت .

Nesta
27-04-2005, 00:39
كلاسهاي حافظه

تاكنون برنامه هايي را نوشته ايم كه در بعضي از آنها از چند تابع نيز استفاده
شده است . در اين برنامه ها متغيرهاي مورد نياز هر تابع را در همان تابع تعريف
كرده ايم . متغيرهايي كه در يك تابع تعريف مي شوند در موقع انتقال كنترل اجراي
برنامه به آن تابع ايجاد شده ( حافظه به آنها تخصيص داده مي شود ) و در موقع
برگشت كنترل اجراي برنامه از آن تابع ، حافظه تخصيص يافته به متغيرهاي آن تابع
از آنها اخذ ميشود و به سيستم عامل برگردانده خواهد شد. يعني اين گونه متغيرها
فقط در همان تابعي كه تعريف يم شوند اعتبار دارند و در تابع ديگر قابل استفاده
نيستند . اين مساله حتي در مورد متغيرهاي همنام نيز صادق است . بدين معني كه
اگر به عنوان مثال متغيري به نام I در تابع اصلي (()main) وجود داشته باشد و
متغيري تحت همين نام در تابع فرعي ديگري كه توسط تابع ()main فراخواني مي شود
تعريف گردد اين دو متغير كاملا" از يكديگر مجزا خواهند بود و در حافظه ، دو محل
جداگانه براي آنها در نظر گرفته مي شود و هرگونه تغيير در يكي از آنها ، در
ديگري تاثيري نخواهد داشت .

مثال 1: برنامه اي كه چگونگي استفاده از متغيرهاي همنام را در توابع مختلف
نشان مي دهد . main)(
{
int i ;
printf("enter the value of i:" );
scanf("%d"/&i );
input )(;
printf("\nvalue of i in main is:");
print("%d"/i );
}

input)(
{
int i ;
printf("enter value of i");
printf("(in function:)");
scanf("%d"/&i );
printf("\nvalue of i in function is:");
printf("%d"/i);
}

به نمونه اي از خروجي حاصل از اجراي برنامه مثال 1 كه درپاسخ به اولين دستور scanf
عدد 10 و در پاسخ به دومين دستورscanf عدد 40 وارد شده است توجه نماييد: enter the value of i:10
enter vale of i(in function:)40
vale of i in function is: 40
value of i in main is : 10

با مطالبي كه تاكنون گفته شد روشن گرديد كه متغيرهايي كه در يك تابع تعريف
ميشوند فقط درهمان تابع قابل استفاده هستند و به محض برگشت كنترل اجراي برنامه
از آن تابع ، اين متغيرها عملا" وجود ندارند. به چنين متغيرهايي كه محدوده حضور
آنها فقط در تابعي است كه در آن تابع تعريف شده اند متغيرهاي محلي گفته مي شود.
همه متغيرها در زبان C داراي چنين خصيصه اي نيستند. بلكه انواع ديگري ازمتغيرها
نيز وجود دارند كه براي معرفي آنها لازم است به تشريح كلاس حافظه بپردازيم .
كلاس حافظه هر متغير دو چيز را براي آن متغير مشخص مي كند : 1
مدت حضور آن در برنامه يا طول عمر (life time) متغير . 2
محدوده حضور آن در برنامه (scope vvisibility) .
يكي از علل مطالعه كلاس هاي حافظه اين است كه با داشتن اطلاعاتي در مورد مدت
حضور متغيرها در برنامه و همچنين محدوده حضور آنها ، مي توانيم برنامه هايي
بنويسيم كه : 1
از حافظه كامپيوتر به نحو خوبي استفاده گردد . 2
سرعت اجراي آنها بالا باشد . 3
برنامه ها كمتر با خطا مواجه شوند و عيب يابي سهل تر گردد .

كلاس هاي حافظه اي كه در زبان C از آنها استفاده مي شود عبارتند از :
1
كلاس حافظه اتوماتيك (automatic) . 2
كلاس حافظه استاتيك (static) . 3
كلاس حافظه ثبات (register) . 4
كلاس حافظه خارجي (extern) .
كلمات كليدي auto، static،، register،و externو بترتيب مشخص كننده كلاس هاي
حافظه اتوماتيك ، استاتيك ، ثبات و خارجي هستند. اين كلمات قبل از كلمات كليدي
تعيين نوع متغير بكار مي روند .
شكل كلي تعيين كلاس هاي حافظه بصورت زير است : ;
<كلاس حافظه > <نوع متغير> <اسامي متغيرها>
بعنوان مثال دستور auto int i/y ; متغيرهاي iو yو را از نوع " صحيح " و با
كلاس حافظه اتوماتيك تعريف مي نمايد .

كلاس حافظه اتوماتيك
متغيرهايي با كلاس حافظه اتوماتيك ، بيشتر ازساير انواع متغيرها مورداستفاده
قرار مي گيرند . متغيرهايي كه تاكنون در برنامه ها استفاده شده اند ، داراي كلاس
حافظه اتوماتيك بوده اند. يعني در زبان C متغيرها در حالت عادي داراي كلاس حافظه
اتوماتيك هستند . متغيرهاي با كلاس حافظه اتوماتيك داراي خصوصيات زير مي باشند: 1
وقتي در يك تابع و يا يك بلاك تعريف مي شوند فقط درآن تابع و يا بلاك قابل
دسترسي اند ( " محلي " آن تابع و يا بلاك محسوب مي شوند ) . 2
در موقع ورود به تابع و يا بلاك به آنها حافظه اختصاص مي يابد . 3
در هنگام خروج از تابع و يا بلاك ، حافظه اختصاص يافته به آنها، پس گرفته
مي شود .

مثال 2: برنامه اي كه تعريف متغيرهاي اتوماتيك در بلاك را نشان مي دهد . main)(
{
int sum=10 ;
{
float sum=3.1416;
printf("\n sum in block is:");
printf(%6.4f\n"/sum );
}
printf("\n sum out of block is:");
printf("%2d\n/sum );
}

نمونه اي از خروجي حاصل از اجراي برنامه مثال 2 در ذيل آمده است : sum in block is:3.1416
sum out of block is:10

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

مثال 3: استفاده از متغيرهاي با كلاس حافظه اتوماتيك كه داراي ارزش اوليه
مي باشند . main)(
{
auto int k ;
void aquare )(;
for(k=1;k<5;k++)
aquare(k);
}

void square(d)
int d;
{
int squared=d^d ;
printf("\n%2d squared is" );
printf(" %3d\n"/d/squared);
}

خروجي حاصل از اجراي برنامه مثال 3 : 1 squared is 1
2 squared is 4
3 squared is 9
4 squared is 16


متغيرهاي عمومي و كلاس حافظه خارجي
همانطور كه قبلا" گفته شد متغيرهاي تعريف شده در يك تابع و يا يك بلاك فقط در
همان تابع و يا بلاك اعتبار دارند . اينگونه متغيرها را متغيرهاي محلي نامگذاري
كرديم . نوع ديگري از متغيرها در زبان C قابل استفاده هستند كه در كليه توابع
موجود در برنامه قابل دسترسي اند. به اين متغيرها، متغيرهاي عمومي گفته ميشود.
متغيرهاي عمومي در خارج از تابع اصلي تعريف مي شوند .

مثال 4: برنامه اي كه نحوه استفاده از متغيرهاي عمومي را نشان مي دهد . اين
برنامه تعداد 5 عدد رااز ورودي خوانده و مجموع مربعات آنهارا محاسبه مي نمايد. int k/sq ;
int sum=0 ;
main)(
{
auto j/i=5 ;
printf("\n enter five number:" );
for(j=0 ;j input )(;
printf("\n sum of square is:%d"/sum);
}

input)(
{
scanf("%d"/&k );
square )(;
sum+=sq ;
}

square)(
{
sq=k*k ;
}

نمونه اي از خروجي حاصل از اجراي برنامه مثال 4 : enter five number: 10 12 4 7 20
sum of square is:709

در مثال 4 متغيرهاي sq، k،و sumو در خارج از تابع ()main تعريف شده اند و در
توابع ()square و ()input بدون تعريف اين متغيرها از آنها استفاده شده است .
اگر توابع تعريف شده در يك برنامه علاوه بر متغيرهاي عمومي از متغيرهاي محلي
نيز استفاده نمايند و يك يا چند متغير محلي توابع ، با يك يا چند متغير عمومي
مراجعه داشته باشد ( مقدار آنرا تغيير دهد و يا مقدار آن متغير را مورداستفاده
قرار دهد ) تاثيري در متغير عمومي همنام با اين متغير محلي نخواهد داشت .

مثال 5: برنامه اي كه توابع موجود در آن علاوه بر استفاده از متغيرهاي عمومي
از متغيرهاي محلي همنام با متغيرهاي عمومي نيز استفاده مي كنند . int count ;
main)(
{
count=100 ;
func1 )(;
}

func1)(
{
int temp ;
temp=count ;
func2 )(;
printf("\n count is:%d"/count );
}

func2)(
{
int count ;
for(count=1/count<6;count++)
printf(" %c "/'*'
}

خروجي حاصل از اجراي برنامه مثال 5 : * * * * *
count is :100

در مثال 5 متغير count كه قبل از تابع ()main تعريف شد، يك متغير عمومي است
و متغير count كه در تابع ()func1 بكار رفته است ، همين متغير ميباشد. در تابع
()func2 متغيري به نام count تعريف شد كه محلي اين تابع مي باشد . لذا در اين
تابع هر مراجعه به متغير count مراجعه به متغيري است كه در اين تابع تعريف شده
است .
درشروع اجراي برنامه براي متغيرهاي عمومي ، حافظه اختصاص مي يابد و درپايان
اجراي برنامه ، اين حافظه از متغيرها اخذ مي گردد. بنابراين اگر تعداد متغيرهاي
عمومي زياد باشد تاثير بسزايي در ميزان حافظه مصرفي دارد . بهر حال در مواقعي
كه توابع موجود در برنامه به متغيرهاي مشتركي نياز داشته باشند ، خوب است از
متغيرهاي عمومي استفاده گردد. ولي بايد توجه داشت متغيرهايي كه بندرت در سراسر
برنامه مورد استفاده قرار مي گيرند ، بصورت متغيرهاي عمومي تعريف نگردند .
اگر برنامه هايي كه به زبان C نوشته مي شود طولاني باشد ، مي توان آن برنامه
را به قسمت هاي منطقي كوچكتري تقسيم كرده ، سپس هر قسمت را در يك فايل قرار
داده و پس از كامپايل كردن آنها به طور مجزا ، همه قسمت ها را با يكديگر اجرا
نمود . به هر يك از اين قسمت هاي مجزا ، يك واحد (unit) گفته مي شود . اگر
متغيرهايي در واحد اصلي تعريف شوند و بخواهيم از آنها در واحدهاي فرعي ديگر
استفاده كنيم ( بدون اين كه در واحدهاي فرعي به آنها حافظه اي اختصاص يابد )
بايد در واحدهاي فرعي توسط كلمه كليدي extern به كامپايلر گفته شود كه اين
متغيرها در جاي ديگري ( در واحد اصلي ) تعريف شده اند. در غير اين صورت استفاده
از متغيرهاي مورد نظر در واحدهاي ديگر ممكن نيست ( جدول 1 ) .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ | file1 file2 |
| int s/y; extern int x/ y; |
| char ch; extern char ch; |
| main )(func 22 )(|
| { { |
| x=y/10; |
| } } |
| func 1 )(func 23 )(|
| { { |
| x=123; y=10; |
| } } |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ
جدول (1) . كاربرد extern در واحدهاي مختلف يك برنامه

در جدول 1 كلمه كليدي extern به كامپايلر مي گويد كه متغيرهاي x، y،و chو
قبلا" در جاي ديگري تعريف شده اند ، لذا در برنامه file2 حافظه جديدي به آنها
اختصاص نمي يابد .
استفاده از كلمه كليدي extern درتوابع موجود در يك فايل نيز امكان پذير است
كه البته نيازي به آن نيست ( كاربرد extern در اين گونه موارد اختياري است ) .

مثال 6: برنامه اي كه كاربرد كلمه كليدي extern را در يك فايل نشان مي دهد . int first/second ;
main)(
{
extern int first/second ;
printf("\n enter two number: " );
scanf("%d%d"/&first/&second );
printf("\nsum is :%d"/first+second);
}

به نمونه اي از خروجي برنامه مثال 6 توجه نماييد : enter two number: 15 30
sum is:45

در برنامه مثال 6 دو متغير firstو secondو در خارج از تابع ()main تعريف
شده اند . دستور extern در تابع ()main به كامپايلر مي گويد كه اين متغيرها در
جاي ديگري ( در خارج از تابع اصلي ) تعريف شده اند . البته همانطور كه گفته شد
توابعي كه در يك فايل وجود دارند مي توانند از متغيرهاي عمومي استفاده كنند و
نياز به معرفي آنها توسط extern نيست .
متغيرهاي عمومي ، داراي كلاس حافظه خارجي (extern) هستند و داراي دو خصيصه
زير مي باشند : 1
طول عمر اين متغيرها ، از بدو اجراي برنامه تا خاتمه اجراي آن است . 2
محدوده حضور آنها در سراسر يك برنامه است .

كلاس حافظه استاتيك
متغيرهايي كه داراي كلاس حافظه استاتيك هستند مي توانند به دو دسته تقسيم
شوند :
الف ) متغيرهاي استاتيك محلي
ب ) متغيرهاي استاتيك عمومي

متغيرهاي استاتيك محلي داراي خواص زير هستند : 1
فقط در همان تابعي كه تعريف شده اند قابل دسترسي اند ( حضور دارند ) . 2
در هنگام خروج از تابع ، مقادير متغيرها آخرين مقداري خواهد بود كه در
تابع به آنها اختصاص يافته است . 3
مي توانند مقدار اوليه بگيرند . 4
اگر متغير استاتيك محلي مقدار اوليه بگيرد ، اين ارزش دهي اوليه ، فقط
يكبار صورت مي گيرد ( اين مطلب را از مورد 2 نيز مي توان نتيجه گرفت ) .

مثال 7: main)(
{
int i ;
void subroutine )(;
for(i=0 ; i<5 ; i++)
subroutine )(;
}

void subroutine)(
{
static int static_var=0 ;
int auto_var=0 ;
printf("\nautomatic=%d/"/auto_var);
printf("static=%d"'static_var );
auto_var ++;
static_var ++ ;
}

خروجي حاصل از اجراي برنامه مثال 7 : automatic=0/static=0
automatic=0/static=1
automatic=0/static=2
automatic=0/static=3
automatic=0/static=4

متغيرهاي استاتيك عمومي فقط در يك فايل ( در يك واحد ) از برنامه ، از جايي
كه تعريف مي شوند به بعد قابل دسترسي اند ( برخلاف متغيرهاي عمومي غير استاتيك
كه در همه واحدهاي يك برنامه قابل دسترسي اند ) . مثال هاي 8و 9و .

مثال 8: static int i/j ;
main)(
{
.
.
.
}

f1)(
{
.
.
.
}

f2)(
{
.
.
.
}

در مثال 8 متغيرهاي xو yو در تابع ()main و كليه توابعي كه بعد از آن تعريف
مي شوند قابل استفاده اند .

مثال 9: main)(
{
.
.
.
}

f1)(
{
.
.
.
}

static x/y ;
f2)(
{
.
.
.
}

f3)(
{
.
.
.
}

در مثال 9 ، متغيرهاي xو yو در توابع ()main و ()f1 قابل دسترسي نيستند ولي
در دو تابع ()f2 و ()f3 و كليه توابعي كه بعداز آن تعريف ميشوند، قابل استفاده
هستند .
استفاده كلاس حافظه استاتيك درپنهان سازي اطلاعات (information hide) ميباشد.

كلاس حافظه ثبات
ذخيره هايي كه داراي كلاس حافظه هستند در صورت امكان در يكي از ثبات هاي CPU
قرار مي گيرند . لذا سرعت انجام عمليات با آنها بسيار بالا است و موجب افزايش
سرعت اجراي برنامه مي شود . كليه متغيرهاي اتوماتيك و آرگومان هاي توابع
مي توانند داراي كلاس حافظه ثبات باشند .
در مورد كلاس حافظه ثبات محدوديتهاي زير را داريم : 1
از آنجايي كه تعداد ثباتهاي CPU محدود است ، تعداد كمي از متغيرها را
مي توان با كلاس حافظه ثبات تعريف كرد . اگر تعداد متغيرهاي با كلاس حافظه ثبات
زياد باشد كامپايلر كلاس حافظه ثبات را از متغيرها حذف مي كند . 2
انواع متغيرهايي كه ميتوانند داراي كلاس حافظه ثبات باشند، دركامپيوترهاي
مختلف متفاوت است و معمولا" نوع هاي int، char،و pointerو مي توانند داراي كلاس
حافظه ثبات باشند . 3
آدرس متغيري كه داراي كلاس حافظه ثبات باشد، عملا" مفهوم نخواهد داشت و يا
به عبارت ديگر، عملگر & را نميتوان براي متغيرهاي با كلاس حافظه ثبات بكار گرفت
( چون اين متغيرها در ثبات CPU قرار دارند ) .

مثال 10: int n/fact=1 ;
main)(
{
printf("\n enter a number(1-9: )");
scanf("%d/&n );
factolial )(;
printf("\nfactolial of number:%d"/n);
printf(" is :%d"/fact );
}

factorial)(
{
register int i ;
for(i=2 ; i<=n ; i++)
fact *=i ;
}
.

Nesta
27-04-2005, 00:40
آرايه ها

آرايه ، اسمي براي چند متغير همنوع است و يا بعبارت ديگر مجموعه اي است از
چند كميت كه داراي يك اسم باشند . به هر يك از اين كميت ها يك عنصر آرايه گفته
مي شود . دسترسي به هر يك از عناصر آرايه توسط نام آرايه و محل قرار گرفتن اين
عنصر در آرايه مشخص مي شود . نامگذاري براي آرايه ها از قانون نامگذاري براي
متغيرها تبعيت مي كند. بعنوان مثال ك مجموعه اي از دانشجويان يك كلاس مي توانند
تشكيل يك آرايه بدهند . اگر نام اين آرايه را Y انتخاب كنيم ، آنگاه (1)Y اولين
عنصر آرايه ، (2)Y دومين عنصر آرايه و بالاخره (n)Y، n امين عنصر آرايه را مشخص
مي كند . به هر يك از اعداد 1، 2، و ... و n كه محل قرار گرفتن يك عنصر را در
آرايه مشخص مي كنند ، انديس آرايه گفته مي شود . انديس آرايه ارتباط بين عناصر
آرايه را مشخص مي كند مثلا"(َ2)Y در آرايه قبل از (3)Y و بعد از (1)Y قرار دارد.
چون دسترسي به عناصر آرايه از طريق انديس امكان پذير است ، آرايه را متغير
انديس دار نيز مي گويند .
آرايه هاي داراي يك انديس را آرايه هاي يك بعدي ، آرايه هاي داراي دو انديس را
آرايه هاي دو بعدي و به طور كلي آرايه هاي داراي n انديس را آرايه هاي n بعدي
مي گويند .
آرايه ها و رشته ها دو قسمت مجزا نيستند زيرا : " رشته آرايه اي از كاراكترها
است " .

آرايه هاي يك بعدي
آرايه يك بعدي كه نام ديگر آن ليست است ، بصورت زير تعريف مي شود : ]
طول آرايه [ <نوع آرايه > <اسم آرايه >
نوع ، يكي از نوع هاي معتبر در زبان C مثل intو floatو است كه مشخص مي كند
هر يك از عناصر آرايه از چه نوعي هستند . طول آرايه ، عددي صحيح است كه تعداد
عناصر آرايه را مشخص مي كند . با استفاده از طول آرايه و نوع آن مي توان مشخص
كرد كه آرايه چند بايت از حافظه را اشغال مي كند :
طول آرايه * ( نوع آرايه ) = sizeof مقدار حافظه مورد نياز آرايه
انديس آرايه ها در زبان C از صفر شروع مي شود . بعنوان مثال اگر آرايه اي به
طول 5 داشته باشيم ، اولين متغير آن داراي انديس صفر و آخرين عنصر داراي انديس 4
خواهد بود .

مثال 1: int temp [5];

دستور فوق آرايه اي بنام temp و به طول 5 را تعريف ميكند كه همه عناصر آن از
نوع int هستند . شكل 1 نشان مي دهد كه چگونه مي توان به هر يك از عناصر آرايه temp
دسترسي پيدا كرد .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ temp | | | | | |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ temp [0] temp [1] temp [2] temp [3] temp [4]


شكل (1) . نحوه دسترسي به عناصر آرايه

نكته اي كه در مورد آرايه ها در زبان C بايد توجه داشت اين است كه در آن bounds checking
وجود ندارد. بعنوان مثال ، اگر آرايه اي بنام x و به طول 10 را
تعريف كرده باشيم ( با توجه به اين كه بزرگترين انديس آن 9 است ) ، مي توانيم
اين آرايه را با انديس هاي بزرگتر از 9 ( بدون اينكه از طرف كامپايلر C جلوي
آن گرفته شود ) مورد استفاده قرار دهيم . در اين مورد دستوراتي مثل y = x[10]
و k = x[n] ازنظر كامپايلر با اشكالي مواجه نخواهد شد. ولي بديهي است كه نتيجه
مطلوبي حاصل نخواهد شد. لذا برنامه نويس بايد مطلب فوق را در نظر داشته باشد تا
در نتيجه اجراي برنامه اشكالي پيش نيايد .

مثال 2: برنامه اي كه با تعريف يك آرايه به طول 10 ، مقدار هر عنصر آن را
برابر با انديس آن قرار داده و سپس با محاسبه مجموع مربعات عناصر آرايه ، آنها
را در خروجي چاپ مي كند . main)(
{
float list[20]/max ;
int i / j ;
for(i=0 ; i<20/i++)
{
printf("\n enter moadel %d :"/i+1);
scanf("%f"/&list[i] );
}
max=list[0] ;
j=1 ;
for(i=1 ;i<20 ; i++)
{
if(list[i]>max)
{
max=list[i] ;
j=i+1 ;
}
}
printf("\nmax=%f/position=%d"/max/j);
}

خروجي حاصل از برنامه مثال 2 : enter moadel 1 :12
enter moadel 2 :12.5
enter moadel 3 :10.75
enter moadel 4 :14
enter moadel 5 :13
enter moadel 6 :16
enter moadel 7 :17.25
enter moadel 8 :18.5
enter moadel 9 :17.5
enter moadel 10 :18.25
enter moadel 11 :19.5
enter moadel 12 :15.75
enter moadel 13 :16.25
enter moadel 14 :17.5
enter moadel 15 :18.5
enter moadel 16 :19.25
enter moadel 17 :20
enter moadel 18 :11.5
enter moadel 19 :10.5
enter moadel 20 :10.75

max=20.000000/position=17


مثال 3: برنامه اي كه با خواندن تعدادي عدد از ورودي ، آنها را در آرايه اي
قرار مي دهد . سپس اين آرايه را به طريق حبابي (bubble sort) مرتب مي كند . main)(
{
counst int k=7 ;
int temp[7]/i/j/item ;
for(i=0 ; i {
printf("\n enter number %d:"/i+1);
scanf("%d"/&temp[i] );
}
printf("\n\t\t the intitial");
printf(" data are: " );
printf("\n\n\t\t" );
for(i=0 ;i printf(" %3d"/temp[i] );
for(i=k-1 ;i>0;i)--
for(j=0;j if(temp[j]>temp[j+1])
{
item=temp[j] ;
temp[j]=temp[j+1];
temp[j+1]=item ;
}

printf("\n\t\t the sorted data");
printf(" are: " );
printf("\n\n\t\t" );
for(i=0 ;i printf(" %3d"/temp[i] );
}

نمونه اي از خروجي برنامه مثال 3 : enter number 1:10
enter number 2:1
enter number 3:20
enter number 4:6
enter number 5:45
enter number 6:34
enter number 7:47
the initial data are:
10 1 20 6 45 34 47
the sorted data are:
1 6 10 20 34 45 47


مثال 4: برنامه اي كه با خواندن تعدادي عدد از ورودي آنها را در يك آرايه
قرار داده ، سپس كليه عناصر آرايه را بر عنصر وسط تقسيم مي كند . اگر عنصر وسط
صفر باشد ، بر عنصر بعد از عنصر وسط و اگر اين عنصر نيز صفر باشد بر عنصر قبل
از عنصر وسط تقسيم مي كند . اگر اين عناصر صفر باشند براي پيدا كردن عنصري غير
صفر و انجام عمل تقسيم به ترتيبي كه در بالا گفته شد عمل مي كند و اگر چنانچه
كليه عناصر آرايه برابر با صفر باشند پيام مناسبي صادر مي شود ( تعداد عناصر
آرايه فرد است ) . main)(
{
int i/j/m/k/sign/y ;
const int n=9 ;
int list[9] ;
printf("\nenter 9 number and press");
printf(" enter\n");
for(i=0;i scanf("%d"/&list[i] );
m=(n+1)/2-1 ;
k=list[m] ;
if(k==0)
{
j=1 ;
sign=1 ;
while(j {
y=0 ;
while(y<2)
{
k=list[m+j*sign] ;
sign=-sign ;
if(k==0)
y++ ;
else
{
action(list/k/n );
break ;
}
}
j++ ;
}
printf("\nall elemens are zero.");
}
else
action(list/k/n );
}

action(int arr[]/int gol/int length)
{
int i ;
printf("\n\t\t the intitial list:");
printf("\n\n\t\t" );
for(i=0 ; i printf(" %3d"/arr[i] );
for(i=0 ; i arr[i]=arr[i]/gol ;
printf("\n\t\t the final list: ");
printf("\n\n\t\t" );
for(i=0 ; i printf(" %3d"/arr[i] );
}

دو نمونه از خروجي برنامه مثال 4 :
( الف ) enter 9 number and press enter.
10 12 14 16 2 18 20 22 24
the initial list:
10 12 14 16 2 18 20 22 24
the final list:
5 6 7 8 1 9 10 11 12


( ب ) enter 9 number and press enter.

0 0 0 0 0 0 0 0 0
all elements are zero.


آرايه هاي چند بعدي
تاكنون نحوه تعريف و استفاده از آرايه هاي يك بعدي را مورد بررسي قرار
داده ايم . اكنون مي خواهيم ببينيم كه " چگونه مي توان آرايه بيش از يك بعدي را
تعريف كرده و به عناصر آن دسترسي پيدا كرد " . در تعريف آرايه دو بعدي بايد 2
انديس و در تعريف آرايه سه بعدي بايد 3 انديس و در تعريف آرايه n بعدي بايد n
انديس را ذكر كرد . بعنوان مثال ، دستور : int table [10] [10];

يك آرايه دو بعدي بنام table را تعريف ميكند كه داراي 10 سطر و 10 ستون است
و نوع عناصر آن int است . دستور : int k[5] [10] [15];

آرايه اي سه بعدي بنام k را تعريف مي كند كه داراي 5 سطر ، 10 ستون و 15
ارتفاع است و نوع عناصر آن int مي باشد .
به دو نكته در مورد آرايه توجه كنيد : 1
عناصر آرايه در محل هاي متوالي حافظه ذخيره مي شوند . 2
عناصر آرايه به صورت سطر ذخيره مي شوند . بعنوان مثال اگر آرايه اي بصورت [4]
table [3] داشته باشيم مشابه شكل (2) در حافظه ذخيره مي شوند .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤ | table [0] [0] |
| table [0] [0] |
| table [0] [1] |
| table [0] [2] |
| table [0] [3] |
| table [1] [0] |
| table [1] [1] |
| table [1] [2] |
| table [1] [3] |
| table [2] [0] |
| table [2] [1] |
| table [2] [2] |
| table [2] [3] |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤ
شكل (2) . نحوه ذخيره شدن آرايه در حافظه

مثال 5: برنامه اي كه با محاسبه جدول ضرب اعداد 1 تا 10، ضمن قرار دادن آنها
در يك آرايه به خروجي نيز منتقل مي كند . main)(
{
int table[10] [10] ;
int i / j ;
for(i=0;i<10 ; i++)
for(i=0;i<10;i++)
table[i][j]=(i+1)*(j+1 );
for(i=0;i<10;i++)
{
for(i=0;i<10;i++)
printf("%4d"/table[i] [j] );
printf("\n" );
}
}

خروجي حاصل از مثال 5 : 1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100


مثال 6: برنامه اي كه دو ماتريس را از ورودي خوانده و با حاصل ضرب آنها ، به
خروجي منتقل مي كند . main)(
{
int mat1[2][3]/mat2[3][4] ;
static int mat3[2][4]={0} ;
int i/j/k/l ;
for(i=0 ; i<2 ; i++)
{
for(i=0 ; i<3 ; i++)
{
printf("\n\tenter");
printf(" mat1[%d][%d] :"/i/j);
scanf("%d"/&mat1[i][j] );
}
for(i=0 ; i<3 ; i++)
{
for(i=0 ; i<4 ; i++)
{
printf("\n\tenter");
printf(" mat2[%d][%d] :"/i/j);
scanf("%d"/&mat2[i][j] );
}
}
for(i=0 ; i<2 ; i++)
{
for(i=0 ; i<4 ; i++)
{
mat3[i][j]=0 ;
for(k=0 ;k<3 ; k++)
mat3[i][j]=mat3[i][j]+mat1[i][k]*
mat2[k][j];
}
}
printf("\nthe product of mat1 & ");
printf("mat2 is: \n\n" );
for(i=0 ;i<2 ;i++)
{
for(i=0 ; i<4 ; i++)
printf("%5d"/mat3[i][j] );
printf("\n\n" );
}
}

نمونه اي از خروجي برنامه مثال 6 : enter mat1[0][0]:1
enter mat1[0][1]:2
enter mat1[0][2]:3
enter mat1[1][0]:5
enter mat1[1][1]:4
enter mat1[1][2]:7
enter mat2[0][0]:8
enter mat2[0][1]:9
enter mat2[0][2]:5
enter mat2[0][3]:8
enter mat2[1][0]:10
enter mat2[1][1]:0
enter mat2[1][2]:12
enter mat2[1][3]:21
enter mat2[2][0]:0
enter mat2[2][1]:5
enter mat2[2][2]:9
enter mat2[2][3]:12

the product of mat1

Nesta
27-04-2005, 00:41
ارزش دهي اوليه به آرايه ها

گاهي ممكن است در هنگام تعريف آرايه ها خواسته باشيم مقاديري را نيز به آنها
نسبت بدهيم . به اين مقادير ارزش هاي اوليه آرايه مي گوييم . بايد توجه داشت
كه فقط آرايه هاي داراي كلاس هاي حافظه staticو externو مي توانند مقادير اوليه
را بپذيرند . براي ارزش دهي اوليه به آرايه ها از روش كلي زير مي توان استفاده
كرد : }
مقادير]={طول بعدnام [..].طول بعد دوم ][طول بعداول [ <كلاس حافظه ><نوع><اسم آرايه >

در روش كلي فوق ، كلاس حافظه ، يكي از كلاس هاي static و يا extern است و
مقادير كه در داخل {} قرار مي گيرند بترتيب به عناصر آرايه نسبت داده مي شوند.
يعني اولين مقدار به اولين عنصر ، دومين مقدار به دومين عنصر و n امين مقدار
به n امين عنصر آرايه نسبت داده مي شوند .
در مورد ارزش دهي اوليه به آرايه ها ، بايد دو نكته زير را در نظر گرفت : 1
اگر طول آرايه مشخص شود و تعداد مقاديري كه به آرايه نسبت داده مي شوند
كمتر از تعداد عناصر آرايه باشند ، بقيه عناصر صفر فرض خواهند شد . 2
اگر طول آرايه مشخص نشود ، به تعداد مقاديري كه به آرايه نسبت داده
مي شوند ، منظور خواهد شد .

مثال 1: نمونه اي از ارزش دهي اوليه به آرايه هاي يك بعدي . main)(
{
int i ;
static int array[5]={10/5/15/20/25};
static int table[]={5/6/8/9/11} ;
static int mix[5]={0} ;
printf("\n\t tehe result of " );
printf("operation is:\n\n\t" );
for(i=0 ; i<4 ; i++)
{
mix[i]=array[i]+table[i] ;
printf("%d\t"/mix[i] );
}
printf("%d\t"/mix[4] );
}

خروجي برنامه مثال 1 : the result of operation is:
15 11 23 29 0

در مثال 1 اولين دستور ، آرايه اي از نوع صحيح با كلاس حافظه static را تعريف
مي كند كه طول آن 5 بوده و مقادير 25 ، 20 ، 15، 5، و 10 را به عناصر آن نسبت
مي دهد . دومين دستور ، آرايه اي بنام table را با طول نامشخص تعريف مي كند و
و پنج مقدار 5، 6،، 8،، 9، و 11 را به آن نسبت مي دهد ، لذا كامپايلر طول اين
را 5 فرض خواهد كرد . سومين دستور آرايه اي بنام mix را با طول 5 تعريف مي كند
و به كليه عناصر آن مقدار صفر را نسبت مي دهد .
براي ارزش دهي اوليه آرايه دو بعدي و يا چند بعدي به دو روش مي توان عمل
كرد . اين دو روش با ذكر مثالي تشريح مي شود .

مثال 2: دستوراتي كه به دو روش ، آرايه دو بعدي را ارزش اوليه مي دهد : static int array[2][3]={1/2/3/4/5/6} ;
static int table[2][3]={3/4} ;
static int mix[2][3]={{1/2/3}/{4/5/6}};

اولين دستور، آرايه دو بعدي به ابعاد 2 x 3 را تعريف كرده و مقادير 1، 2، و 3
به سطر اول و مقادير 4، 5،و 6و به سطر دوم نسبت داده مي شوند . دومين دستور
مثال 2 آرايه اي دو بعدي با ابعاد 2 x 3 را تعريف مي كند و دو مقدار3و 4و را به
آن نسبت مي دهد كه 3 در محل table[1][1]و 4و در محل table[1][2] قرار مي گيرد
و بقيه عناصر آن صفر خواهند بود .
دستور سوم روش ديگري براي دستور اول است .

مثال 3: نمونه اي از ارزش دهي اوليه به آرايه سه بعدي . static intthreed[3][2][4]=
{{{1.2.3.4}/
{5/6/7/8}/}/
{{7/9/3/2}/
{4/6/8/3}/}/
{{7/2/6/3}/

Nesta
27-04-2005, 00:41
رشته ها

رشته ها معمولا" نوعي داده هستند كه در زبانهاي برنامه سازي به اشكال متفاوتي
مورد استفاده قرار گرفته و براي ذخيره كردن و دستكاري متن ها ، ( مثل كلمات
اسامي افراد ، جملات و غيره ) به كار مي روند . اما در زبان C رشته ها نوعي داده
نيستند بلكه به صورت آرايه اي از كاراكترها ( از نوع char ) هستند كه به NULL
( رشته تهي ) كه داراي ارزش عددي صفر است ختم ميشوند. براي نمايش NULL از '\0'
استفاده مي شود . بنابراين طول رشته ها را كه بصورت آرايه تعريف مي شوند ، بايد
به اندازه يك واحد بيش از مقدار لازم در نظر بگيريم . مثلا" اگر بخواهيم رشته اي
را كه طولاني ترين اسم آن داراي 30 حرف باشد ، براي ذخيره كردن اسامي افراد
تعريف كنيم بايد آرايه اي به طول 31 را در نظر بگيريم . كامپايلر زبان C كاراكتر NULL
را به انتهاي رشته ها اضافه مي كند و نيازي نيست كه برنامه نويس آن را در
انتهاي رشته ها قرار دهد .

مثال 1: main)(
{
char fname[21] ;
printf("enter your name: " );
scanf("%d"/fname );
printf("\nyour name is : %s"/fname);
}

نمونه اي از خروجي برنامه مثال 1 : enter your name : ali
your name is : ali

رشته Ali در متغير fname بصورت زير قرار مي گيرد :
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | a | l | i |\0 | | | | | | | | | | | | | | |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17


نكته اي كه در مورد مثال 1 بايد روشن شود اين است كه تاكنون براي خواندن
مقادير متغيرها از ورودي توسط تابع ()scanf ، اسم متغير را با & ذكر مي كرديم .
اما دليلي كه در اين مثال براي خواندن محتويات رشته fnameاز &ز استفاده نشده
اين است كه fname نام يك آرايه است و نام آرايه بعنوان يك آدرس به اولين عنصر

Nesta
27-04-2005, 00:42
توابع ورودي خروجي رشته ها

در زبان C توابع متعددي وجود دارند كه در مورد رشته ها استفاده مي شوند .
اكثر اين توابع براي خواندن رشته ها از صفحه كليد و يا چاپ آنها در صفحه نمايش
بكار مي روند .

تابع ()gets
تابع ()gets براي خواندن رشته هااز صفحه كليد بكارميرود و بصورت زير استفاده
مي شود :
(متغير رشته اي )gets

مثال 1: main)(
{
char fname[21] ;
printf("enter your name: " );
gets(fname );
printf("\nyour name is : %s"/fname);
}

نمونه اي از خروجي برنامه مثال 1 : enter your name : bahrami
your name is : bahrami

شايد اين پرسش مطرح شود " با وجود تابع ()scanf كه مي تواند براي رشته ها و
متغيرهاي عددي استفاده شود چه لزومي دارد از تابع ()gets استفاده گردد " ? در
پاسخ به اين پرسش بايد گفت كه تابع ()scanf رشته ها را پيوسته در نظر مي گيرد .
يعني اگر در بين يك رشته ، از فاصله (blank) و يا tab استفاده شود ، از اين
كاراكترها ( فاصله و يا tab ) به بعد ، بعنوان رشته ديگري منظور ميشوند ( مثال 2
) . براي رفع اين اشكال مي توان از تابع ()gets استفاده نمود .

مثال 2: main)(
{
char name[21] ;
printf("enter your name family:");
scanf("%s"/gets(name );
printf("\n your name is : %s"/name );
}

نمونه اي از خروجي برنامه مثال 2 : enter your name : einollah jafarnezhad
your name is : einollah

همانطوري كه از خروجي برنامه پيداست ، در پاسخ به درخواست برنامه نام و نام
خانوادگي Einollah jafarnezhad را وارد نموده ايم كه چون بين نام و نام خانوادگي
فاصله افتاده است فقط نام (Einollah) در متغير name قرار گرفته و در خروجي چاپ
شده است ولي نام خانوادگي از دست رفته است . اگر بجاي scanf از تابع gets
استفاده شود اين مشكل پيش نخواهد آمد ، زيرا در ()gets فقط كليد enter ، جدا
كننده است .

تابع ()puts
اين تابع براي انتقال يك رشته به خروجي بكار مي رود و بصورت زير استفاده
مي شود .
(عبارت رشته اي )puts
هنگام استفاده از تابع puts، مي توان از يك متغير رشته اي و يا يك رشته ( كه
در داخل نقل قول (") باشد ) بجاي عبارت رشته اي استفاده كرد .

مثال 3: برنامه اي كه دو رشته را از ورودي خوانده و سپس محتويات يك رشته را
به رشته ديگر منتقل مي كند . طول هاي دو رشته ورودي مي توانند با يكديگر برابر
نباشند .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ main)(
{
char s1[81]/ s2[81] ;
int i / j ;
char temp ;
puts("enter string : " );
gets(s1 );
puts("enter string : " );
gets(s2 );
for(i=0 ; s1[i] && s2[i] ; i++)
{
temp=s1[i] ;
s1[i]=s2[i] ;
s2[i]=temp ;
}
if(s1[i])
{
j=i ;
while(s1[i])
s2[i]=s1[i++] ;
s2[i]\'\0' ;
s1[i]\'\0' ;
}
else if( s2[i])
{
j=i ;
while(s2[i])
s1[i]=s2[i++] ;
s2[i]\'\0' ;
s1[i]\'\0' ;
}

puts("new content of s1 is:" );
puts(s1 );
puts("new content of s2 is:" );
puts(s2 );
}

نمونه اي از خروجي برنامه مثال 3 : enter string :
first string
enter string :
second string
new content of s1 is:
second string
new content of s2 is:
first string


مثال 4: برنامه اي كه با خواندن يك رشته و دو كاراكتر از ورودي ، كاراكتر اول
را با كاراكتر دوم در سرتاسر رشته جايگزين مي كند . main)(
{
char string[50] ;
char source_letter/target_letter ;
int i ;
printf("\n enter the string :" );
gets(string );
printf("\n enter source character:" );
source_lette=getche )(;
printf("\n enter target character:" );
target_letter=getche )(;
if(source_letter != target_letter)
for(i=0 ; string[i] ; i++)
if(string[i]==source_letter)
string[i]=target_letter ;
printf("\n result string is:\n");
puts(string );
}

نمونه اي از خروجي برنامه مثال 4 : enter the string : in the name of allah.

enter source character: a
enter target character: A

result string is:in th

Nesta
27-04-2005, 00:42
آرايه اي از رشته ها

گاهي ممكن است ، به عنوان مثال بخواهيم تعدادي از نام افراد را در آرايه اي
نگهداري كنيم : ولي با اطلاعاتي كه تاكنون از رشته ها داريم شايد نتوانيم چنين
كاري را انجام دهيم . براي اين كار بايد آرايه اي از رشته ها داشته باشيم . چون
رشته ها خود ازنوع آرايه هستند بايد آرايه اي ازآرايه ها را تعريف كنيم ( آرايه اي
از آرايه ها همان آرايه دوبعدي است ). براي توضيح بيشتر به مثال 1 توجه نماييد.

مثال : برنامه اي كه با تعريف آرايه اي از رشته ها ، 5 نام را در آن قرار
مي دهد و سپس با خواندن نامي از ورودي آنرا در آرايه جستجو مي كند . main)(
{
int dex/exist ;
int k ;
char name[21] ;
static char list [5][21]=
{ "ali" /
"ahmad" /
"alireza" /
"jalal" /
"mohammad"
} ;
printf("\nenter one name for");
printf(" search:");
gets(name );
for(dex=0 ; dex<5;dex++)
if(strcmp(list[dex]/name)==0)
{
exist=1 ;
break ;
}
if( exist==1)
{
printf("\nname ");
printf("<%s> exist in table."/name);
}
else
{
printf("\nname ");
printf("<%s> not exist. "/name);
}
}

دو نمونه از خروجي برنامه مثال بالا :
( الف ) enter one name for search:reza
name not exist.


( ب ) enter one name for search:ali
name exist in table.
ال بالا از تابع ()strcmp استفاده شده كه كارش مقايسه دو رشته مي باشد.

Nesta
27-04-2005, 00:43
بعضي از توابع رشته اي

بعضي از توابع بر روي رشته ها عمل كرده و دستكاري رشته ها را آسان مي كنند .
كه مي توان از مقايسه رشته ها ، تعيين طول رشته ها، الحاق كردن رشته ها به يكديگر
و ... نام برد .

تابع ()strcpy
تابع ()strcpy براي قرار دادن رشته اي در رشته ديگر مورد استفاده قرار گرفته
و بصورت زير استفاده مي شود : ;
("رشته " و متغير رشته اي )strcpy
اهميت اين تابع وقتي مشخص مي شود كه بدانيم ، مقدار دادن به متغير رشته اي
بطور مستقيم امكان پذير نيست بلكه فقط از طريق اين تابع صورت پذيرد . مثلا" اگر
داشته باشيم : char name[11];

دستور انتساب زير غلط خواهد بود : name="ALI";

با استفاده از تابع ()strcpy عمل فوق را مي توان بصورت زير انجام داد : strcpy(name/"ALI");

اين مساله بدين علت است : " همانطور كه در C نمي توان دو آرايه را با حكم
انتساب (=) به يكديگر نسبت داد ، دو رشته نيز نمي توانند با حكم انتساب ، به
يكديگر نسبت داده شوند .

مثال 1: برنامه اي كه يك رشته و يك عدد( كه بيانگر موقعيتي ازاين رشته است )
را از ورودي خوانده و موجب حذف كاراكتر موجود در آن محل مي شود . main)(
{
char string[81] ;
int position ;
printf("\n type a string: " );
gets(string );
printf("\n enter position for " );
printf("delete character: " );
scanf("%d"/&position );
strcpy(&string[position]/
&string[position+1] );
puts(" the result string is :" );
puts(string );
}

نمونه اي از خروجي برنامه مثال 1: type a string: in thee name of allah.
enter position for delete character:5
the result string is:
in the name of allah.

در مثال 1 متغير position به موقعيتي از رشته اشاره ميكند كه كاراكتر موجود
در آن بايد حذف شود . با استفاده از تابع ()strcpy قسمتي از رشته string را با
شروع از position + 1 ، در همين رشته با شروع از موقعيت position كپي كرده ايم .
اين عمل موجب حذف كاراكتري كه در موقعيت position قرار داشته است مي گردد . با
فرض اين كه رشته ورودي برابر با "cart" و موقعيت كاراكتري كه بايد حذف شود 2
فرض گردد خروجي حاصل از اجراي برنامه مثال 1 بصورت زير خواهد بود : type a string: cart.
enter position for delete character:2
the result string is:cat


تابع ()strcat
اين تابع براي الحاق كردن ( به دنبال هم قرار دادن ) دو رشته استفاده ميشود
و بصورت زير به كار مي رود : strcat(s1/s2)
s1
و s2و دو رشته اي هستند كه بايد با هم الحاق شوند . s2 در انتهاي رشته s1
قرار خواهد گرفت .

مثال 2: main)(
{
char s1[21] / s2[21] ;
puts("enter string : " );
gets(s1 );
puts("enter string : " );
gets(s2 );
strcat(s1/s2 );
puts("result string is: " );
puts(s1 );
}

درپاسخ به درخواست برنامه ، اگر بجاي s1 عبارت good وبجاي s2 عبارت moorning
را وارد كنيم ، خروجي بدين صورت است : enter string :
good

enter string :
moorning.

result string is:
goodmoorning.

براي تمرين ميتوانيد برنامه را طوري تغيير دهيد كه بين دو عبارت ، يك فاصله
(blank) باشد .

تابع ()strlen
تابع ()strlen براي تعيين طول يك رشته مورد استفاده قرار گرفته و بصورت زير
به كار مي رود : strlen(s)
s
رشته اي است كه طول آن بايد تعيين شود .

مثال 3: main)(
{
char name[31] ;
puts(" enter a string: " );
gets(name );
printf("\n string length is:");
printf("%d"/strlen(name ));
}

نمونه اي از خروجي برنامه مثال 3 : enter a string:
the c language is very quick.

string length is:29

روش ديگر براي پيدا كردن طول يك رشته ، استفاده از تابع ()scanf با پارامتر
كنترلي %n است . با استفاده از تابع ()scanf و پارامتر %n ، مثال 3 را مي توان
بصورت زير نوشت : main)(
{
char name[31] ;
int count ;
scanf("%s%n"/name/&count);
printf("\n string length is:");
printf("%d"/count );
}


تابع ()strcmp
تابع ()strcmp براي مقايسه كاراكتري دو رشته مورد استفاده قرار ميگيرد و به
اين صورت بكار مي رود : strcmp(s1/s2)
s2
و s1و دو رشته اي هستند كه بايد با يكديگر مقايسه شوند . اين تابع نتيجه
مقايسه دو رشته را بصورت صفر ، منفي و يا مثبت مشخص مي كند :
نتيجه |(s1/s2()strcmp
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤ s1=s2 | 0

منفي | s2 <َs1
مثبت | s2 >َs1

تابع ()strchr
تابع ()strchr براي جستجوي يك كاراكتر در يك رشته بكار مي رود و محل وجود
اولين وقوع آن را مشخص مي كند. اگر كاراكتر مورد نظر در رشته وجود نداشته باشد
مقداري كه توسط اين تابع برگردانده مي شود برابر با صفر است . اين تابع بصورت
زير استفاده مي شود : strchr(s/ ch)
ch
كاراكتري است كه بايد در رشته s جستجو شود. بعنوان مثال ، بااجراي دستور: if( strchr( "hello"/'e'))printf( "e is in hello");

چون حرف e در عبارت hello وجود دارد پيام مناسبي چاپ مي شود .

تابع ()strstr
تابع ()strstr براي جستجو زير رشته اي در يك رشته مورد استفاده قرار گرفته و
بصورت زير بكار مي رود : strstr(s1/s2)
s2
رشته اي است كه بايد در رشته s1 جستجو شود . اگر s2در s1ر پيدا شود محل
اولين وقوع آن توسط تابع برگردانده مي شود ولي اگر s2در s1ر وجود نداشته باشد
مقدار صفر برگردانده خواهد شد . بعنوان مثال ، با اجراي دستور : if( strstr( "this is"/"hi"))printf( "hi found");

بعلت وجود رشته hi در رشته this is ، پيام مناسبي صادر مي شود .

مثال 4: main)(
{
char s1[80] / s2[80] ;
char ch ;
puts(" enter string : " );
gets(s1 );
puts(" enter string : " );
gets(s2 );
puts("enter character for search");
printf(" in s1: " );
ch=getche )(;
printf("\n length of s1 is:");
printf("%d"/strlen(s1 ));
printf("\n length of s2 is:");
printf("%d" /strlen(s2 ));
if(!strcmp(s1/s2))
printf("\n string are equal. ");
if(strstr(s1/s2))
printf("\n is in . " );
else
printf("\n is not in .");
if(strstr(s1/ch))
printf("\ncharacter<%c>is in.");
else
{
printf("\ncharacter<%c>is");
printf(" not in .");
}
}

نمونه اي از خروجي برنامه مثال 4 : enter string :
this is a sample statement.
enter string :
sample
enter character for search in : m
length of is:28
length of is:6
is in .
character is

Nesta
27-04-2005, 00:44
اشاره گرها

درك صحيح مفهوم اشاره گرها در زبان C بزرگترين موفقيت يك برنامه نويس است .
زيرا استفاده از اشاره گرها ويژگيهاي زير را دارد : 1
عمل تخصيص حافظه پويا امكان پذير است . 2
موجب بهبود كارآيي بسياري از توابع مي شود . 3
كار با رشته ها و آرايه ها را آسانتر مي كند . 4
فراخواني با ارجاع در توابع ، از طريق اشاره گرها امكان پذير است .
كليه متغيرهايي كه در برنامه ها مورداستفاده قرار ميگيرند در حافظه كامپيوتر
ذخيره مي شوند ( محل هايي از حافظه هستند ) . بنابراين هر متغير داراي يك آدرس
منحصر بفردي است كه توسط آن مي توان به متغير دسترسي پيدا كرد. اشاره گرها حاوي
آدرس متغيرهاي حافظه هستند. بعبارت ديگر اگر متغيري آدرس متغير ديگر را در خود
نگهداري كند به متغير اول يك اشاره گر گفته مي شود . بعنوان مثال ، اگر محتويات
متغيري كه در محل 1000 حافظه قرار دارد برابر با 1004 باشد ، اين متغير به محل 1004
حافظه اشاره خواهد كرد ( شكل 1 ) .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
محتويات حافظه | آدرس حافظه
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
ؤؤؤؤؤؤ 1004 | 1000 |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1001 | | |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1002 | | |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1003 | | |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
<ؤؤؤؤ| | 1004
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1005 | |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
شكل (1) . مفهوم اشاره گر

براي تعريف متغيرهاي اشاره گر از روش كلي زير استفاده مي شود :
نام متغير اشاره گر * نوع
نوع ، يكي از انواع معتبر در زبان C است . نوع اشاره گر مشخص مي كند كه اين
اشاره گر بايد به چه نوع داده اي اشاره كند ( سر و كارش با چه نوع داده اي است ).
در زبان C برخلاف زبان هايي مثل PL/I اشاره گرها داراي نوع هستند. لذا دراستفاده
از اشاره گرها بايد دقت كافي بخرج داد تا نتيجه نادرستي از برنامه حاصل نگردد .
بعنوان مثال ، دستور int *p; متغير p را از نوع اشاره گر تعريف مي كند كه فقط
بايد به متغيرهاي از نوع "صحيح " اشاره نمايد. البته اگر اشاره گرp به متغيرهايي
از انواع ديگر اشاره نمايد ، كامپايلر زبان C خطايي را به برنامه نويس اعلام
نمي كند ولي برنامه نويس بايد بداند كه اين امر يقينا" در نتيجه اجراي برنامه
اثر گذاشته و موجب عدم صحت اجراي برنامه گشته و به نتايج حاصل از برنامه
اطميناني نيست . بعنوان مثال در حين اجراي برنامه زير از طرف كامپايلر خطايي
گزارش نخواهد شد ولي مي دانيم كه اين برنامه نتيجه مطلوبي نخواهد داشت . main)(
{
float x/y ;
int *p ;
p=&x ;
y=*p ;
}

در برنامه فوق ، چون p به متغير x اشاره ميكند و p از نوع " صحيح " است ، x
را بصورت عدد " صحيح " در نظر ميگيرد و در دستور بعدي كه محتويات محلي كه p به را به y منتقل مي كند، عمل انتقال به درستي انجام نميشود.

Nesta
27-04-2005, 00:45
عملگرهاي اشاره گر

دو عملگر در مورد اشاره گرها مورد استفاده قرار مي گيرند كه عبارتند از : *
و & . عملگر & يك عملگر يكاني است كه آدرس عملوند خود را مشخص مي كند . بعنوان
مثال دستور m = &name موجب مي شود تا آدرس متغير name در متغير m قرار گيرد .
عملگر * همانند عملگر & يك عملگر يكاني است ، محتويات يك آدرس حافظه را مشخص
مي كند . بعنوان مثال دستور p = m; موجب مي شود تا محتويات محلي كه آدرس آن در m
است به p منتقل گردد . بنابراين مجموعه دستورات (1) و (2) كه در ذيل آمده اند
معادل يكديگرند .
ؤ m= &name;
(َ1) ؤ
ؤ p= *m;
p= nam;( 2)

Nesta
27-04-2005, 00:45
اعمال روي اشاره گرها

اعمالي كه بر روي اشاره گرها فايل انجام است به وسعت اعمالي كه بر روي ساير
متغيرهاي حافظه انجام پذير است ، نيست . اعمالي كه بر روي اشاره گرها انجام
پذيرند عبارتند از : 1
عمل انتساب : همچون ساير انواع متغيرها، ميتوان مقداري را به يك اشاره گر
نسبت داد ( مثال 1 ) . 2
اعمال محاسباتي : دو نوع اعمال محاسباتي مي توان بر روي اشاره گرها انجام
داد كه عبارتند از :
الف ) عمل جمع .
ب ) عمل تفريق .

مثال 1: main)(
{
int x ;
int *p1 / *p2 ;
p1=&x ;
p2=p1 ;
printf("\n the address of x is: ");
printf("%p"/p2 );
}

نمونه اي از خروجي برنامه مثال 1 : the address of x is:692B:0fDC

براي پي بردن به چگونگي عمل جمع و تفريق روي اشاره گرها فرض كنيد كه p
اشاره گري از نوع " صحيح " است و به ملح 2000 حافظه اشاره مي كند . اكنون دستور p + +;
را اجرا كنيم محتويات جديد اشاره گر p ، برابر با 2002 خواهد بود . زيرا
طول نوع " صحيح " برابر با 2 بايت است و با افزايش يك واحد به اشاره گر ، به
اندازه طول نوع اشاره گر به آن افزوده خواهد شد و نه به اندازه يك واحد . اگر
دستور ; - p- را صادر كنيم ، اشاره گر P مجددا" به محل 2000 حافظه اشاره خواهد
كرد . اگر باز هم دستور ; - p- را صادر كنيم اين بار به محل 1988 اشاره خواهد
كرد ( شكل 1 ) . char *ch= 2000;
int *i=2000;


ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch | 2000 | i

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+1 | 2001 |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+2 | 2002 | i+1

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+3 | 2003 |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+4 | 2004 | i+2

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch+5 | 2005 |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
حافظه
شكل (1) . انجام اعمال محاسباتي روي اشاره گر
3
مقايسه اشاره گرها : بااستفاده از عملگرهاي رابطه اي مي توان اشاره گرها را
با يكديگر مقايسه نمود. بعنوان مثال ، اگر pو qو از نوع اشاره گر باشند ، دستور
زير معتبر است : if(p < q )print f("p points to lower memory than q");

مقايسه اشاره گرها معمولا" در مواردي استفاده مي شود كه دو يا چند اشاره گر به اشاره مي كنند .

Nesta
27-04-2005, 00:46
اشاره گر و آرايه

در زبان C بين آرايه ها و اشاره گرها ارتباط نزديكي وجود دارد ( اشاره گرها
حاوي يك آدرس و اسم آرايه نيز يك آدرس است ). اسم آرايه آدرس اوليه عنصر آرايه
را مشخص مي كند . بعبارت ديگر اسم آرايه آدرس اولين محلي را كه عناصر آرايه از
آنجا به بعد در حافظه قرار مي گيرند در خود نگهداري مي كند . بعنوان مثال اگر
آرايه اي بصورت table[8] تعريف كرده باشيم و اولين عنصر آرايه در محل 400 حافظه
قرار داشته باشد و اشاره گري بنام ptr بصورت زير تعريف كرده باشيم ، int * ptr;

دستور ptr = & table[0] آدرس شروع آرايه يعني 400 را در اشاره گر ptr قرار
مي دهد ( اين دستور معادل دستور ptr = table; است ) و دستور t = * ptr محتويات
اولين محل آرايه ( اولين عنصر آرايه ) يعني (table[0]) را در متغيرt قرار داده
دستور * ptr = 0 محتويات اولين محل آرايه table را برابر با صفر قرار مي دهد .
با مطالبي كه تاكنون گفته شد براي دسترسي به عناصر آرايه علاوه بر انديس ، از
اشاره گرها نيز مي توان استفاده كرد :
آدرس آرايه را در اشاره گر ptr قرار مي دهد ptr= table;
به دومين عنصر آرايه اشاره مي كند (table[1]);(َptr+ 1) *
به i+1 امين عنصر آرايه اشاره مي كند ;(ptr+i) *

مثال : برنامه اي كه 5 مقدار را از ورودي خوانده و در آرايه اي قرار مي دهد .
سپس آنها را از آخرين مقدار به اولين مقدار به خروجي منتقل مي كند . main)(
{
int arr[5] /i ;
printf("\n enter five value: " );
for(i=0 ; i<5 ; i++)
scanf("%d"/&arr[i] );
printf("\n the reverse output is: ");
for(i=4 ; i>=0 ; i) --
printf("%4d"/*(arr+i ));
}

نمونه اي از خروجي برنامه مثال بالا : enter five value: 10 20 30 40 50
the reverse output is:50 40 30 20

ali_yousefian19
27-04-2005, 00:54
مرسي كارلوس
هنوز نخوندم . اما مطمنم همين چند روزه بكارم مياد
بازم تشكر

Nesta
27-04-2005, 02:15
سلام
دوسته عزيز من هميشه يه آموزش که ميزرم يه چيزه کامل و به درد بخور ميزرم آخه بعضی از دوستان آموزش ميزارن آدم بدتر اسبنی ميشه که چيزی نفهميد ولی بر عکس بعضی ها هم مثل خودم آموزش ميزارن اين خيلی به درد بخور و کامل هست من ديگه والّا پی دی اف نميکنم آخه قبلاً اين کار را ميکردم هی ميگفتند که ماله ما دانلود نشد يا سايت ----- ميشد يا مشگل داشت ديگه من تصميم گرفتم که همينجا بگزرم که هر کی که خواست خودش پی دی اف کنه

Nesta
28-04-2005, 03:09
سلام
کسانی که به دنبال ياد گرفتن آموزش اين برنامه بودند چرا نميگن آيا اين به دردشن کرد يا نه؟ اصلاً خوبه يا نه

double_n
29-04-2005, 22:59
سلام
کسانی که به دنبال ياد گرفتن آموزش اين برنامه بودند چرا نميگن آيا اين به دردشن کرد يا نه؟ اصلاً خوبه يا نه

دمت گرم نوشته هات خيلي خوب بود . حيف بود كه فروم بيريخت ما اين تو بيافته .... :lol:

Nesta
30-04-2005, 05:08
حيف بود كه فروم بيريخت ما اين تو بيافته ....
سلام
دستت درد نکنه اين يعنی چی؟

double_n
30-04-2005, 12:21
منظورم اين لوگوي بيريخت من . اسم بدم و . . .
هستش كه تو اين صفحه زيباي شما بيافته .....
ضمنا تعداد نظرات مهم نيست . تعداد بازديدكنندگان مهمه ....
پس شما به كارتون ادامه بدين مطمئن باشيد بهترين آموزش رو داريد كامل مي كنيد .......
موفق باشيد .....
ديگه اينجا پيفام نمي گذارم و با PM باهات هستيم .....
با تشكر
كوچكترين عضو گروه NBS :mrgreen:

Nesta
30-04-2005, 23:33
سلام
چون اين يه آموزش برنامه نويسی هست و متاسفانه اينجا زياد طرفدار نداره واسه اين گفته که نکنه بيخد من اين آموزش رو گذشتم

Šepehr
02-05-2005, 08:58
کارلوس جان
عالی بود ، ادامه بده تا آخرش باهات هستیم
خواهشاً این دفعه کاملش رو ، pdf کن من یه جای خوب برا آپلود سراغ دارم، برا من میلیش کن تا آپلودش کنم و لینکشو بزارم اینجا
اینطوری خوندن خیلی سخته. چون پرانتز ها جا به جا شدند ، بلوک بندی مشخص نیست (کنگره ای نیست)و...

double_n
02-05-2005, 20:26
دمت گرم داش كارلوس منظور من اين نبود .
گفتم حيفه كه بجز آموزش - كه انم شما زحمتشو مي كشين - من ايتجا چيزي بنويسم ......
دمت گرم بازم
ادامه بده كه خيلي ايول داري :wink: 8)

Nesta
03-05-2005, 02:07
سلام
از همتون متشکرم به زودی آموزش 200 صفحه اي از delphi براتون ميگزرم نظرتون چيه

double_n
04-05-2005, 12:22
داش كارلوس PDF بذاري خيلي بهتره . ممنون
بازم ادامه بده تا همچنان شاگرد شما باقي بمانيم .
بازم ممنون
:wink:

Nesta
04-05-2005, 16:45
سلام
باشه ولی به صورت پی دی اف فکر نکنم بتونم بگزرم

shahrdartoope
05-05-2005, 01:32
سلام
با اجازه آقا کارلوس من به صورت پی دی اف در آوردم

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

250 کیلوبایت

شهردار

Nesta
05-05-2005, 02:08
سلام
shahrdartoope آقا دستت درد نکنه زحمت کشيدی اميد وارم که به کارت بياد 1 آموزش فتو شاپ هم در قسمت آموزش و مقالات گذشتم به صورت فارسی و پی دی اف اون هم چيزه جالبی هست اونم دانلود کنين متشکر باز

matin20
03-06-2005, 12:50
سلام
يه برنامه سي ++ مي خواستم
مي توني بنويسي
اگه مي توني برام ميل بز
mr_b0631@yahoo.co.uk
برنامه:برنامه بنویسید که یک رشته عددی را به عدد تبدیل کند؟

Nesta
03-06-2005, 16:11
سلام است عزیز همینجا شما بگین لطفا.
که چی‌ باشه من باشه اگه بتونم براتون مینویسم .که همه بتونن استفاده کنن .
متشکر.

kargar
04-06-2005, 00:31
:?: دوست عزيز سلام :?:
برنامه نويسي و آموزش مقدماتي آن را كه شروع كرده ايد بسيار عالي است . ولي من از شما تقاضا دارم كه به من بگوييد چگونه مي توانم نوشته هاي خودم را ( كتابهايم ) به فايل ( پي دي اف ) تبديل كنم تا بتوانم بطور رايگان در اينترنت قرار دهم تا هموطنانم از آنها استفاده نمايند . اين براي من در حال حاضر از هر برنامه ديگري پر اهميت تر است زيرا من تا كنون !6 كتاب نوشته و منتشر كرده ام ولي چون در فرانسه هستم و محيط انتشار محدود است و خواننده ايراني كم ، لذا ميخواهم آنها را به تعداد بيشتري از خوانندگان تقديم كنم ولي طريقه قرار دادن آنها را در انترنت نمي دانم , براي آنكه فهرست كتابهاي من را ملاحظه كنيد به وبلاك
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
مراجعه فرماييد .
با سپاس فراوان : مهندس منوچهر كارگر

Nesta
04-06-2005, 01:05
سلام مهندس خسته نباشید در موردی که فرمودی باید بگم که :
شما هم میتوانید که فایل پی‌ دی اف بسزید هم میتوانید کتاب الکترونیکی‌ درست کنین یا همون ebook
استفاده کنین حالا :1- اگه می‌خواهید پی‌ دی اف بسازید متن رو احتمالا در ورد Word دارید خوب یک برنامه معرفی‌ می‌کنم بهتون که نصب می‌کنین .بد یک پرینتر مجازی درست می‌کنه به نام cutepdf خوب شما وقتی‌ در ورد از منو file روی print برید یک صفحه میاد شما روی cutepdf میگذارید و یک نام براش درست می‌کنید در آن مسیر و فایل پی‌ دی اف شما ساخته می‌شه .که کلشو براتون اپلد می‌کنم بد که فایل setup رو نصب کردین یک فایل convert هم داره که اونم در مسیر برنامه نصب کنین.این تا اینجا از پی‌ دی اف .
ولی‌ اگه می‌خواهید ebook درست کنین با برنامه create ebook یه جستجو کنین در google پیدا می‌کنین
که اونجا متن را وارد می‌کنین و مانند یک سایت exe میتوانید بر روی مطلب لینک بگذارید که مثلا متن فلان که کیلیک بشه بره سر همون مبحث.
من واسه شما اون برنامه رو کامل اپلد می‌کنم که حدود 4 مگا بایت می‌شه.
متشکر.

Nesta
04-06-2005, 03:15
با سلام مهندس ما هر 2 فایل رو اپلد کردم هم ebook هم pdf شما وارد این سایت بشو و روی این 2 تا راست کیلیک کنی‌ و save as target رو بزن.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

kargar
04-06-2005, 16:04
توابعي كه هيچ مقداري را برنمي گردانند

خوب است قبل از بحث در مورد اينگونه توابع ، مثالي را متذكر شويم .

مثال 1: برنامه اي كه با استفاده از يك تابع ، زماني كه شامل ساعت ، دقيقه
و ثانيه است را از ورودي خوانده و اين زمان را به ثانيه محاسبه مي نمايد : main)(
{
convert )(;
}

convert)(
{
int hours/minutes/second/time ;
printf("enter time to be convertd");
printf("\n hour/minutes/second : ");
scanf("%d%d"/&hours/&minutes);
printf("%d/&second);
time=(60*hours+minutes)*60+second ;
printf("\ntime is: %d second."/time);
}

به نمونه اي از خروجي برنامه مثال 1 توجه نماييد : enter time to be convertd
hour/minutes/secound : 4 8 30

time is: 14910 second.

در مثال 1 از تابعي به نام convert استفاده شده است كه هيچگونه پارامتري
ندارد . متغيرهاي مورد نياز اين تابع ، تعريف شده ، اطلاعات از ورودي خوانده
مي شوند و پس از انجام محاسبات به خروجي منتقل مي گردند . اين تابع هيچ مقداري
را به تابع فراخوانده ( تابع اصلي ) برنمي گرداند . به چنين توابعي توابع از
نوع void گفته مي شود . اگر بخواهيم برنامه مثال 1 را با استفاده از اين تعريف
( تابع از نوع void ) بنويسيم ، مثال (2) حاصل خواهد شد .

مثال 2: برنامه مثال 1 با استفاده از تعريف نوع void : main)(
{
void convert )(;
convert )(;
}

void convert)(
{
int hours/minutes/second/time ;
printf("enter time to be convertd");
printf("\n hour/minutes/second : ");
scanf("%d%d"/&hours/&minutes);
printf("%d/&second);
time=(60*hours+minutes)*60+second ;
printf("\ntime is: %d second."/time);
}

همانطوريكه در مثال 2 مشاهده ميشود بايد درتابع فراخواننده ( در اينجا تابع
اصلي ) نوع تابع convert را كه از نوع void است به كامپايلر اعلان نمود وسپس در
حين تعريف تابع نوع آن مشخص گردد (()void convert) .
در توابعي مانند convert كه هيچگونه پارامتري ندارند ، براي جلوگيري از
هر گونه اشتباه احتمالي در فراخواني اينگونه توابع ( كه ممكن است اشتباها" با
پارامتر فراخواني گردند ) مي توان بجاي پارامتر و آرگومان از كلمه كليدي void
استفاده نمود. با توجه به اين نكته كه اگر اشتباها" توابع فاقد هرگونه پارامتر
( و آرگومان ) با پارامتر فراخواني گردند . كامپايلر C خطايي را اعلام نمي كند.
در اين حالت ذكر كلمه كليدي void بجاي پارامتر و آرگومان تابع مفيد بنظر ميرسد
( مثال 3 ) .

مثال 3: main)(
{
void convert(void );
convert )(;
}

void convert(void)
{
int hours/minutes/second/time ;
printf("enter time to be convertd");
printf("\n hour/minutes/second : ");
scanf("%d%d"/&hours/&minutes);
printf("%d/&second);
time=(60*hours+minutes)*60+second ;
printf("\ntime is: %d second."/ti متاسفانه تا كنون پاسخي ديافت نداشته امواينكه نوشته ايد ×× نامه با درخواست من مطابقت دارد صحيح نيست چون هيچكدام با درخواست من مطابقت ندارد و لطفا پاسخ مرا بدهيد با سپاس : مهندس منوچهر كارگر

Nesta
04-06-2005, 17:56
:?: دوست عزيز سلام :?:
برنامه نويسي و آموزش مقدماتي آن را كه شروع كرده ايد بسيار عالي است . ولي من از شما تقاضا دارم كه به من بگوييد چگونه مي توانم نوشته هاي خودم را ( كتابهايم ) به فايل ( پي دي اف ) تبديل كنم تا بتوانم بطور رايگان در اينترنت قرار دهم تا هموطنانم از آنها استفاده نمايند . اين براي من در حال حاضر از هر برنامه ديگري پر اهميت تر است زيرا من تا كنون !6 كتاب نوشته و منتشر كرده ام ولي چون در فرانسه هستم و محيط انتشار محدود است و خواننده ايراني كم ، لذا ميخواهم آنها را به تعداد بيشتري از خوانندگان تقديم كنم ولي طريقه قرار دادن آنها را در انترنت نمي دانم , براي آنكه فهرست كتابهاي من را ملاحظه كنيد به وبلاك
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
مراجعه فرماييد .
با سپاس فراوان : مهندس منوچهر كارگر
سلام آقای کارگر مگه شما اینو نگفت بودین این پاسخ شما هست دیگه این متن شما هست من هم دقیقا به همین پاسخ دادم

emp-ehsan
20-07-2006, 20:20
ببخشيد ولي اين يعني چي؟

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ

Ramin_3711
20-05-2008, 15:21
سلام
من تازه تو این سایت عضو شدم .
دنبال یاد گرفتن زبان c و c++ هستم .
البته یه چیزایی از ویژوال میدونم خواستم راهنماییم کنین .
در ضمن از آموزش c که گذاشته بودین ممنونم خیلی استفاده کردم .
با تشکر

مورچه
23-06-2008, 20:47
نمی تونم بگم چقدر از دیدن این تاپیک خوشحال شدم
واقعا خسته نباشید