برنامه نویسی C  جلسه هشتم

 
فصل 6

توابع و کلاس حافظه

هدف کلی

آشنایی با توابع، پارامترهای خط فرمان، آرگومانهای argc و argv و حافظه‌های C

هدفهای رفتاری

از دانشجو انتظار مي‌رود پس از مطالعة این فصل،

1. تابع و انواع آن را تعریف کند.

2. مزایای تعریف تابع فرعی را بیان کند.

3. عناصر تشکیل‌دهندة هر تابع را بشناسد.

4. کاربرد دستور return را بیان کند.

5. نحوة فراخوانی تابع را بشناسد.

6. روش انتقال آرایه به تابع را بیان کند.

7. روشهای تعریف پارامتری که اشاره‌گر آرایه دریافت مي‌کند بیان کند.

8. توابع بازگشتی یا خودگردی را بشناسد.

9. پارامترهای خط فرمان را بشناسد.

10. آرگومانهای argc و argv را بشناسد.

11. تفاوت فراخوانی توابع در C و پاسکال را بیان کند.

12. متغیرهای محلی یا خصوصی و متغیرهای عمومی را بشناسد.

13. کلاس حافظه و کاربرد هریک را شرح دهد.

.....


ادامه نوشته

برنامه نویسی C  جلسه هفتم

دستور if و if-else

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

دستور if به ‌صورتهاي if وif-else به كار می‌رود. ساده‌‌ترين شکل دستور if به صورت زير است.

....



ادامه نوشته

برنامه نویسی C  جلسه ششم

فصل 5

دستورهای كنترلي

هدف کلی

آشنایی با مهم‌ترین دستورهای کنترلی در زبان C و کاربرد آنها

هدفهای رفتاری

از دانشجو انتظار مي‌رود پس از خواند این فصل،

1. با کاربرد دستورهای کنترلی آشنا شود.

2. شکل کلی و کاربرد دستور while را بداند.

3. شکل کلی و کاربرد دستور whiledo- را بداند و تفاوت آن را با while بیان کند.

4. شکل کلی و کاربرد دستور for را بداند.

5. شکل کلی و کاربرد دستور عملگر کاما را بداند.

6. شکل کلی و کاربرد دستورهای ‌if و if-else را بداند.

7. شکل کلی و کاربرد دستور switch را بداند.

8. شکل کلی و کاربرد دستور break را بداند.

9. شکل کلی و کاربرد دستور continue را بداند.

10. شکل کلی و کاربرد دستور goto را بداند.

11. شکل کلی و کاربرد تابع exit را بداند.

مقدمه

يکي از امکانات زبانهاي برنامه‌نویسی جدید، استفاده از دستورها و ساختارهاي كنترلي است و در نتيجه ‌اين امكان را فراهم مي‌‌سازند كه قطعه‌ای از برنامه تا موقعي كه شرط ويژه‌اي برقرار است چندين بار اجرا شود.

.......

ادامه نوشته

برنامه نویسی C  جلسه پنجم

عملگرهاي رابطه‌اي (مقايسه‌اي)

 عملگرهاي رابطه‌اي، همان طور كه از نامشان پيداست، رابطة بين دو مقدار را تعيين مي‌كنند. اين عملگرها در جدول 4ـ12 نشان داده شده‌اند.

 

جدول 4ـ12 عملگرهاي رابطه‌اي

نام عملگر

نشانه

شکل

نتيجه

بزرگ‌تر از

> 

a > b

اگر a بزرگ‌تر از b باشد، نتيجه 1 وگرنه 0 است.

كوچك‌تر از

< 

a < b

اگر a كوچك‌تر از b باشد، نتيجه 1 وگرنه 0 است.

مساوي يا بزرگ‌تر از

>=

a >= b

اگر a مساوي يا بزرگ‌تر از b باشد، نتيجه 1 وگرنه 0 است.

مساوي يا كوچك‌تر از

=<

a<=b

اگر a مساوي يا كوچك‌تر از b باشد، نتيجه 1 وگرنه 0 است.

مساوي

= =

a = =b

اگر a مساوي b باشد، نتيجه 1 وگرنه 0 است.

مخالف

!=

a!=b

اگر a مخالف b باشد، نتيجه 1 وگرنه 0 است.

 

ايده و مفهوم اصلي در مورد عملگرهاي رابطه‌اي وابسته به مفهوم مقدار true و false است. در زبان C، true هر مقدار غير از صفر و false مقدار صفر است. عباراتي كه عملگرهاي رابطه‌اي يا منطقي را به كار مي‌برند براي حالت نادرست يا false مقدار صفر و براي حالت درست يا true مقدار يك برمي‌گردانند.

....

ادامه نوشته

برنامه نویسی C جلسه چهارم

فصل 4

 عبارت، دستور، عملگر

هدف کلی

آشنایی با عبارتها، دستورهای ساده و ساخت‌یافته، و عملگرهای مختلف

هدفهای رفتاری

انتظار می‌رود پس از خواندن این فصل دانشجو بتواند،

1. مفهوم عبارت را تعریف کند.

2. عبارتهای محاسباتی، قیاسی، و منطقی را بشناسد.

3. مفهوم دستور را تعریف کند.

4. انواع دستورهای ساده را بشناسد.

5. انواع دستورهای ساخت‌یافته را بشناسد.

6. مفهوم عملگر را تعریف کند.

7. عملگرهای محاسباتی را بشناسد.

8. عملگرهای انتساب را بشناسد.

9. عملگرهای یکانی را بشناسد.

10. چند عملگر تک‌عملوندی را نام ببرد.

11. عملگرهای رابطه‌ای (مقایسه‌ای) را بشناسد.

12. عملگر منطقی را بشناسد.

13. عملگر شرطی را بشناسد.

14. عملگر کاما را بشناسد.

15. عملگرهای حافظه را بشناسد.

عبارت

 در زبان برنامه‌نويسي، عبارت مجموعه‌اي معني‌دار از داده‌ها (مقادير عددي و متغيرها) است كه با استفاده از نشانه‌‌ها يا عملگرهاي محاسباتي، قياسي و منطقي با يكديگر تركيب شده‌اند. در زبان C عبارات را به‌ شکل زير دسته‌بندي می‌کنند.

عبارت محاسباتي

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

1. a * x + b

2. (a + b) / c

در مثال اول مقدار a در مقدار x ضرب و نتيجه با مقدار b جمع مي‌شود.

در مثال دوم ابتدا مقدار b با مقدار a جمع و سپس بر مقدار c تقسيم مي‌شود.

مثال 4ـ1 جدول 4ـ1 نمونه‌‌هايي از عبارات محاسباتي را نشان می‌دهد.

 

جدول 4ـ1 چند عبارت محاسباتی

Image and video hosting by TinyPic

عبارات قياسي

 عبارات قياسي تركيبي است از عبارات محاسباتي با استفاده از عملگرهاي قياسي و با رعايت قوانين مربوط به نحوة به كار بردن عملگرها. نتيجة حاصل از اجراي عبارت قياسي هميشه درست يا نادرست است؛ يعني، اگر شرط يا شرطهاي به كار رفته در عبارت قياسي برقرار باشد، نتيجة عبارت مزبور درست است وگرنه نادرست می‌شود، كه در اغلب زبانها (مانند پاسكال) آنها را به ‌ترتيب true يا false نامند. ولي، در زبان C مقدار true برابر يك و مقدار false برابر صفر است. در عبارات قياسي حق تقدم اجرا، اول با عبارات محاسباتي است و سپس عمل مقايسة مورد نظر انجام مي‌گيرد.

مثال 4ـ2 نمونه‌‌هايي از عبارات قياسي در جدول 4ـ2 نشان داده شده است.

 

جدول 4ـ2 چند عبارت قیاسی

معادل در زبان C

عبارت رياضي

 

a >15

a > 15

a+ b - c <= 3.14

a + b - c ≤ 3.14

 

3*a + b != 2

3a + b ≠ 2

 

 

عبارت منطقي

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

مثال 4ـ3 نمونه‌‌هايي از عبارات منطقي در جدول 4ـ3 نشان داده شده است.

 

جدول 4ـ3 چند عبارت منطقی

معادل در زبان C

عبارت رياضي

(a<5) && (a>3) يا (a>3) && (a<5)

5 > a > 3

(a <= 3.14) | | (a>=15)

(a ≤ 3.14)

a ≥ 15

 

 

دستور

 دستور حكمي است كه سبب مي‌شود كامپيوتر عملي انجام دهد. دو گروه دستور داریم: دستورهاي ساده و دستورهاي ساخت‌يافته.

دستورهاي ساده

 دستورهاي ساده دستورهاي غيرشرطي‌اند كه متداول‌ترين آنها عبارت‌اند از:

- جايگزين كردن مقداري معين به يك متغير كه به آن دستور انتساب مي‌گويند.

- خواندن و نوشتن

- فراخواني تابع

- انتقال كنترل به نقطه‌اي از برنامه

 مثال 4ـ4 نمونه‌‌هايي از دستورهای ساده در زير نشان داده شده است.

A = B * C ;

scanf("%d%d ", &a , &b) ;

printf("%d%f",a , b) ;

fact(b) ;

goto a ;

 

دستورهاي ساخت‌يافته

دستورهاي ساخت‌يافته دستورهايي‌اند كه از انواع ساختارهاي الگوريتمي ساخته شده‌اند و متداول‌ترين آنها عبارت‌اند از:

- دستور مركب كه شامل دو يا چند دستور متوالي است و در داخل يك زوج آكولاد محصور است. در زبان C هر دستور ساده به يك سميكولون ختم مي‌شود.

{

  scanf("%d %d" , &a , &b) ;

 s = a * b ;

 p = 2 * (a+b) ;

 printf("%d %d", s , p) ;

}

- دستور حلقة تكرار

for (i =0 ; i<=10 ; i++)

  sum = sum + i ;

- دستور شرطي.

if (a>b)

  c = a + b ;

else

  c = a – b ;

عملگر

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

عملگرهای محاسباتی

 فهرست عملگرهاي محاسباتي در جدول 4ـ4 نشان داده شده است.

 

جدول 4ـ4 عملگرهاي محاسباتي

نام عملگر

نشانه

شکل

نوع عمل

جمع

+

a + b

a جمع با b

تفريق

ـ

a - b

a منهاي b

منهاي يكاني

ـ

-a

منهاي a

جمع يكاني

+

+a

مقدار عملوند a

ضرب

*

a * b

a ضرب در b

تقسيم

/

a / b

a تقسيم بر b

باقيماندة تقسيم

%

a % b

باقيماندة تقسيم a بر b

يك واحد افزايش

++

a++ , ++a

افزايش يك واحد به مقدار a

يك واحد كاهش

--

a-- , --a

كاهش يك واحد از مقدار a

 

چهار عملگر / , * , - , + تقريباً روي همه نوع داده‌هاي استاندارد موجود در زبان C به كار می‌رود. در صورتي که عملگر "/" روي مقادير صحيح يا كاراكتر به كار رود، جزء اعشار حذف مي‌شود. مثلاً مقدار 10/3برابر 3 خواهد بود يعني فقط جزء صحيح آن درنظر گرفته خواهد شد و قسمت اعشار بريده مي‌شود.

عملگر % باقيماندة تقسيم را به دست مي‌آورد و هر دو عملوند آن بايد مقدار صحيح باشد. مثلاً مقدار 10%3 برابر يك خواهد بود. يعني باقيماندة تقسيم 10 بر 3 مساوي يك است.

دو عملگر ++ و -- در ساير زبانهاي برنامه‌نويسي وجود ندارند. عملگر ++ يك واحد به عملوند خود اضافه مي‌كند و عملگر -- يك واحد از عملوند خود كم مي‌كند. هر دو عملگر تك‌عملوندي‌اند. درواقع دو دستور+ +a ;  و  a+ + ;معادل اين دستورند: a = a + 1 ;.همچنين دو دستور – –a ;  و  a– – ;معادل اين دستورند a = a – 1 ; .

توجه داشته باشيد سرعت عمل دو عملگريکاني ++ و -- از سرعت عمل عملگر انتساب (يعني عملگر =) بالاتر است.

مثال 4ـ5 به خروجي قطعه برنامة زير توجه کنيد.

a = 5 ;

printf ("%d %d\n", a , a+ +) ;

printf ("%d", a) ;

خروجی برنامه

5

5

 

6

 

مثال 4ـ6 به خروجي قطعه برنامة زير توجه کنيد.

a = 5 ;

printf ("%d %d\n", a , + +a) ;

printf ("%d", a) ;

خروجي برنامه

6

5

 

6

 

با توجه به دو مثال بالا ملاحظه مي‌‌کنيد که از نظر کاربرد دو دستور + +a ; و a+ + ; با يکديگر تفاوت دارند؛ يعني، در مثال اول با اجراي دستور printf اولي مقدار a (كه مساوي 5 است) چاپ مي‌شود و سپس دوباره همان مقدار a چاپ مي‌گردد و پس از انجام عمل چاپ مقدار آن يك واحد افزايش مي‌يابد. با اجراي دستور printf دوم كنترل به آغاز خط جديد انتقال مي‌يابد، سپس مقدار a كه اكنون برابر 6 است چاپ مي‌شود. در مثال دوم با اجراي دستور printf اولي مقدار a (كه مساوي 5 است) چاپ و سپس دستور + +a اجرا مي‌شود؛ يعني، به a يك واحد افزوده مي‌شود بعد مقدار آن كه برابر 6 شده است چاپ مي‌شود. دستور printf دوم در اينجا نيز مشابه مثال اول عمل مي‌كند. عملكرد دو دستور --a و a-- نيز به همين روش است.

 

ترتيب تقدم اين گروه از عملگرها در جدول 4ـ5 نشان داده شده است.

 

جدول 4ـ5 ترتیب تقدم عملگرها

 -- ++ 

بالاترين تقدم

 ـ

 

* / %

 

- +

 پايين ترين تقدم

 

در مورد عملگرهاي هم‌تقدم ترتيب تقدم از چپ به راست است. درصورت وجود پرانتز، تقدم پرانتز از تقدم همة عملگرها بالاتر است.

مثال 4ـ7‍ با توجه به مقادير داده شده، چند عبارت محاسباتي همراه با مقادير آنها در جدول 4ـ6 نشان داده شده است.

int a = 10 , b = 3 ;

float C = 12.5 , d = 2.0 ;

جدول 4ـ6

مقدار

عبارت محاسباتي

مقدار

عبارت محاسباتي

14.5

C + d

13

a + b

10.5

C - d

7

a - b

25.0

C * d

30

a * b

6.25

C / d

3

a / b

error

C % d

1

a % b

 

مثال 4ـ8 با توجه به اعلان داده شده، چند عبارت محاسباتي همراه با مقادير آنها در جدول 4ـ7 نشان داده شده است.

char c1 = 'A' , c2 = 'E' ;

جدول 4ـ7

مقدار

عبارت محاسباتي

65

c1

134

c1 + c2

139

c1 + c2 + 5

187

5c1 + c2 +

 

در عبارات مورد نظر هر كجا c1 و c2 به كار رفته، به جاي آنها کد اسكي‌ معرف كاراكتر مربوط به آنها به كار برده شده است؛ يعني، در مورد متغير c1 كه معرف كاراكتر A است عدد 65 (کد اسكي‌ حرف A) و در مورد متغير c2 نيز كه معرف كاراكتر E است عدد 69 (کد اسكي‌ حرف E) به كار برده شده است. همچنين ملاحظه مي‌‌کنيد كه عدد 5، با کاراکتر 5 که کد اسكي آن 53 است تفاوت دارد.

 

مثال 4ـ9 با توجه به اعلان داده شده چند عبارت محاسباتي همراه با مقادير آنها در جدول 4ـ8 نشان داده شده است.

int a = 11 , b = -3 ;

جدول 4ـ8

مقدار

عبارت محاسباتي

8

a + b

14

a - b

-33

a * b

-3

a / b

2

a % b

 

در مثال بالا اگر مقدار a برابر -11 و مقدار b برابر 3 باشد، مقدار a / b باز هم برابر -3 مي‌شود، اما مقدار a % b برابر -2 خواهد شد. به طريق مشابه اگر a و b هر دو مقدار منفي (متناظراً -11 و -3) داشتند، مقدار a / b برابر 3 مي‌شد، ولي مقدار a % b باز هم برابر -2 باقي مي‌ماند.

 

عملگرهاي انتساب 

 در زبان C علامت ’=’ به مفهوم مساوي نيست، بلكه عملگر جايگذاري يا عملگر انتساب است. اين عملگر موجب مي‌گردد كه مقدار عملوند سمت راست آن در محل حافظه‌اي كه با عملوند سمت چپ مشخص شده است قرار گيرد. براي مثال دستور K = 123 ; مقدار 123 را به متغير k اختصاص مي‌دهد؛ يعني، آنچه در سمت چپ علامت قرار دارد، نام يك شناسه يا متغير و آنچه در سمت راست آن قرار دارد، مقدار يا value متغير مزبور است. پس دستور بالا به مفهوم k " مساوي 123 " نیست بلکه یعنی "مقدار 123 به k اختصاص داده شود". پس بايد به تمايز بين نام متغير و مقدار متغير توجه كرد.

 حال دستور متعارف K = K+1 ; را درنظر بگيريد. از نظر رياضي اين دستور مفهوم نيست. اما از ديدگاه برنامه‌سازي، دستور مزبور دستور جايگذاري و بدين مفهوم است كه متغيري را كه نام آن K است پيدا كنيد. سپس به مقدار آن يك واحد اضافه کنید و مقدار جديد را به متغيري كه نام آن K است (درواقع به همان متغير) اختصاص دهيد.

به طور كلي در زبان C چندين عملگر مختلف انتساب يا جايگذاري وجود دارد كه همة آنها براي تشكيل يك عبارت انتساب يا عبارت جايگذاري به كار می‌روند و مقدار يك عبارت را به يك شناسه يا متغير اختصاص يا نسبت مي‌دهند. متداول‌ترين عملگر انتساب عملگر ’=’ است. فرم كلي دستور انتساب به صورت زير است.

identifier = expression ;

variable = expression ;

توجه داشته باشيد كه عملگر انتساب، يعني ’=’، كاملاً با عملگر مساوي كه علامت ’= =’ است فرق دارد. عملگر انتساب براي اختصاص و نسبت دادن يك مقدار به يك شناسه يا متغير به كار می‌رود، درحالي كه عملگر تساوي يا برابري، براي تعيين اينكه آيا دو عبارت مقدار يكسان دارند يا نه به كار مي‌رود. پس اين دو عملگر نمي‌توانند به جاي يكديگر به كار روند.

اگر دو عملوند عملگر انتساب از نظر نوع يكسان نباشند، مقدار عبارت يا عملوند طرف راست به طور خودكار به نوع شناسه يا متغير طرف چپ عملگر تغيير مي‌يابد. بنابراين اگر نتيجة عبارت سمت راست عملگر مزبور از نوع float و عملوند سمت چپ آن از نوع int باشد، جزء اعشاري آن حذف خواهد شد.

مثال 4ـ10 با توجه به اعلان داده شده، نمونه‌‌هايي از دستور انتساب در جدول 4ـ9 نشان داده شده است.

int a , b = 5 ;

 

جدول 4ـ9

مقدار

عبارت

مقدار

عبارت

-25

a = -25.9 ;

5

a = 5.56 ;

5

a = 2*b /2 ;

2

a = b/2 ;

4

a = 2*(b/2) ;

120

 ;xa =

-3

-520-aa =

48

;0a =

47

3/’B-Ea =

32

 a =

 

ملاحظه مي‌کنید كه در عبارات بالا در مورد كاراكترها، کد اسكي آنها جايگزين مي‌شود. مثلاً در آخرين عبارت، به جاي E و B به ترتيب مقادير 69 و 66 قرار مي‌گيرد و در نتيجه

69 - 66/3 = 69-22 = 47.

همچنين در عبارت a = 2 * (b/2) ; از آنجايي که پرانتز تقدم بالاتري دارد، اول مقدار b/2 محاسبه مي‌شود كه نتيجة آن برابر 2 خواهد شد و سپس نتيجة حاصل در 2 ضرب مي‌شود و بنابراين نتيجة نهايي برابر 4 خواهد شد.

 

در زبان C مي‌توان دستورهاي انتساب چندگانه به كار برد مانند a = b = 5 ;. شکل كلي اين گونه دستورهاي انتساب به صورت زير است.

V1 = V2 =... = Vn = expression ;

 در چنين حالتي، تقدم عمل انتساب از راست به چپ است. بنابراين دستور a = b = c = 5 ; معادل
a = (b = (c = 5)) ; است.

در زبان C، مي‌توان عملگر انتساب را با عملگرهاي محاسباتي تركيب كرد و عملگرهاي+ = ، -، = ، *= ، /= ،  %= را به دست آورد که آنها را عملگرهاي محاسباتي انتساب  نامند و در جدول 4ـ10 نشان داده شده‌‌اند.

 

جدول 4ـ10 عملگرهاي محاسباتي انتساب

عملگر

نام عملگر

دستور انتساب

معادل

+ =

انتساب جمع

a += b ;

a = a+b ;

 -=

انتساب تفريق

a -= b ;

a = a-b ;

*=

انتساب ضرب

a *= b ;

a = a*b ;

/=

انتساب تقسيم

a /= b ;

a = a/b ;

%=

انتساب باقيماندة تقسيم

a %b ;

a = a%b ;

 

مثال 4ـ11 اگر متغيرهاي a و b از نوع int باشند و مقدار آنها به ترتيب برابر 10 و 5 باشد، دستور a += b ; معادل دستور a = a + b ; است؛ يعني، a = 15.

 

عملگرهاي يكاني

 زبان C مجموعه‌ای عملگر دارد كه فقط روي يك عملوند عمل مي‌كنند و آنها را عملگرهاي يكاني يا تك‌عملوند ‌نامند. اين عملگرها اغلب در جلوي عملوند خود قرار مي‌گيرند. متداول‌ترين عملگر تك‌عملوندي علامت منفي است كه در جلوي يك مقدار ثابت عددي، يا يك متغير و يا يك عبارت قرار مي‌گيرد.

مثال 4ـ12 در زير نمونه‌‌هايي از عملگر منهاي يکاني نشان داده شده است.

–915 – 3.1415 – 10.25 –2e –4

–sum – (x+y) –3 * (x + y)

اگر جلوي مقادير علامتي قرار نگيرد، علامت آنها مثبت در نظر گرفته مي‌شود، ولي به هرحال مي‌توان جلوي آنها يك علامت "+" قرار داد كه در اين صورت "+" را كه فقط داراي يك عملوند است جمع يكاني نامند.

 

مثال 4ـ13 در زير نمونه‌‌هايي از عملگر جمع يکاني نشان داده شده است.

+915 +3.1415 +10.25 +2e – 4

+sum +(x+y) +3 * (x + y)

اگر عملگر مزبور به كار نمی‌رفت، مقدار اقلام بالا باز هم تغيير پيدا نمي‌كرد و به همين دليل كاربرد اين عملگر متداول نيست.

از عملگرهاي تك‌عملوندي ديگر عملگر "cast" است كه آن را عملگر تبديل نوع نيز گويند و در خودآزمایی 2 فصل 3 بررسي کردیم.

يكي ديگر از عملگرهاي تك‌علموندي عملگر sizeof است كه بزرگي عملوند خود را برحسب بايت برمي‌گرداند. عملوند اين عملگر معمولاً با نوع داده همراه است، مانند

int , unsignded int , long , float , unsigned

 و مشابه آنها، كه در اين صورت عملگر مزبور بزرگي اين نوع ساختمان داده‌هاي استاندارد را برمي‌گرداند، يا اينكه عملوند آن عبارت است كه در اين صورت بزرگي آن عبارت را برحسب بايت برمي‌گرداند. جدول 4ـ11 نحوة كاربرد اين عملگر را نشان مي‌دهد.

 

جدول 4ـ11 کاربرد عملگر sizeof

نام عملگر

نشانه 

شکل

نوع عمل

بزرگي (sizeof)

sizeof

sizeof (t)

sizeof x

بزرگي نوع داده t يا عبارت

x را برحسب بايت برمي‌گرداند.

 

مثال 4ـ14 به دستورهای زير توجه کنید.

k1 = sizeof (char) ;

k2 = sizeof (short) ;

k3 = sizeof (float) ;

k4 = sizeof (int);

k5 = sizeof (int *) ;

k6 = sizeof (double) ;

با اجراي دستورهاي بالا مقادير k3 , k2 , k1 به‌ترتيب برابر 4 , 2 , 1 خواهد بود كه به‌ترتيب معرف طول نوع داده char و short و float است. در مورد k4 نيز اگر نوع int گونه‌اي از زبان C به‌ طول 2 بايت باشد، مقدار k4 برابر 2 خواهد بود و اگر به طول 4 بايت باشد، مقدار آن 4 خواهد بود. k5 نيز بزرگي يك اشاره‌گر به يك داده از نوع integer است كه برحسب ماشين مورد نظر ممكن است 4 بايت و يا عدد ديگري باشد.

 

مثال 4ـ15 درنتيجة اجراي دو دستور زير

float a ;

printf ("%d%d", sizeof a , sizeof (float)) ;

مقادير 44 نمايش داده خواهد شد، كه 4 اول معرف طول متغير a است (كه از نوع float است) و 4 دوم معرف طول نوع داده float است. درضمن ملاحظه مي‌گردد كه اگر عملوند اين عملگر معرف نوع داده مانند int، float باشد، عملوند در داخل پرانتز محصور مي‌گردد و اگر معرف متغير (مانند a در مثال بالا) باشد، نياز نيست كه در درون زوج پرانتز قرار داده شود.

 

يكي ديگر از عملگرهاي متداول تك‌عملوندي عملگر منطقي "!" به مفهوم نقيض است كه در عملگرهاي منطقي توضيح می‌دهیم.

 

 

برنامه نویسی C  جلسه چهارم

تابع scanf()

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

scanf ("control string", arguments list) ;

يا

scanf ("control string", argl , arg2 ,…, arg n) ;

در اينجا نقش رشتة كنترل مشابه تابع printf و شامل اطلاعات قالب‌‌بندي خاص است. مشابه printf اين تابع نيز مي‌تواند هر تعداد آرگومان را دارا باشد، كه در آن اولين آرگومان رشتة فرمت يا رشتة كنترل است. همچنين اين تابع، اغلب همان كد فرمت تابع printf را به كار مي‌برد؛ براي مثال كدهاي فرمت %s, %c , %f , %d که به ترتيب براي خواندن داده‌هايي از نوع مقادير صحيح، اعشاري، كاراكتر و رشته به كار می‌روند. تفاوت مهم بين اين دو تابع آن است كه در جلوي آرگومانها، اپراتور آدرس يعني "&" نيز قرار مي‌گيرد.

البته اگر بخواهيد مقداري را براي متغير رشته‌اي بخوانيد، نيازي به اپراتور "&" نخواهد بود زيرا رشته‌ها در زبان ِC به صورت آرايه‌اي از نوع كاراكتر معرفي مي‌گردند و نام آرايه نيز معرف آدرس آرايه (يعني آدرس اولين عنصر آن) است.

 مثال 3ـ8 برنامة زير نحوة کاربرد عملگر & را در تابع scanf نشان مي‌دهد.

#include

main ()

  {

 int x ;

 char name[6] ;

 scanf("%d" , &x) ;

 scanf("%s", name) ;

 printf("%d %s", x , name) ;

  }

دستور scanf اول سيستم را هدايت مي‌كند كه داده ورودي را به صورت عدد صحيح از طريق ترمينال دريافت كند و اين مقدار را در متغير x ذخيره کند. دستور scanf دوم به دليل استفاده از آرايه، بدون عملگر & به کار می‌رود و اگر در اين برنامه براي متغير name رشتة "book" را وارد كرده باشيم، خروجي آن كلمة book خواهد بود.

 

جدول 3ـ3 فرامين يا کاراکترهاي فرمت براي داده‌هاي ورودي را كه کاراکترهاي تبديل نيز ناميده مي‌شوند نشان می‌دهد.

جدول 3ـ3 كاراكترهاي فرمت در تابع scanf ()

شـــرح

كد فرمت

داده ورودي به صورت تك‌كاراكتر تعبير مي‌شود.

%c

داده ورودي به صورت عدد صحيح علامت‌دار (در مبناي 10) تعبير مي‌شود.

%d

داده ورودي به صورت عدد صحيح علامت‌دار تعبير مي‌شود.

%i

داده ورودي به صورت عدد صحيح بدون علامت دهدهي تعبير مي‌شود.

%u

داده ورودي به صورت عدد صحيح اعشاري با مميز شناور (floating_point) تعبير مي‌شود.

%f , %e, %g

داده ورودي به صورت عدد صحيح كوتاه (short integer) تعبير مي‌شود.

%h

داده به صورت رشته تعبير مي‌شود. ورودي با يك كاراكتر non_white_space آغاز مي‌گردد و با اولين كاراكتر white_space خاتمه مي‌پذيرد (به پايان رشته به طور خودكار كاراكتر "\0" افزوده خواهد شد).

%s

داده ورودي به صورت عدد صحيح در مبناي 8 تعبير مي‌شود.

%0

داده ورودي به صورت عدد صحيح در مبناي 16 تعبير مي‌شود.

%x , %X

داده ورودي اشاره‌گر تعبير مي‌شود.

%p

 مثال 3ـ9 برنامة‌ زير يك خط متن حداكثر به طول 79 كاراكتر را مي‌خواند و آن را به همان صورت چاپ مي‌كند.

#include

main () /* read a line of text */

  {

 char line[80] ;

 int count , k ;

 /* read in the line */

 for (k=0 ; line[k]=getchar ()!=’\n’ ; + +k)

 count = k ;

 for (k=0 ; k

 putchar(line[k]) ;

  }

در حلقة for، شمارندة k از صفر شروع مي‌شود و مقدار آن در هر تكرار يك واحد افزايش مي‌يابد و در هر تكرار يك كاراكتر با تابع getchar از طريق ورودي استاندارد دريافت مي‌شود و به line[k] نسبت داده مي‌شود و وقتي كه كاراكتر خط جديد (يعني \n) وارد شد، عمل ورود كاراكترهاي رشته خاتمه مي‌يابد كه در اين لحظه مقدار k برابر تعداد كاراكترهاي واقعي رشته خواهد بود. سپس در حلقة بعدي محتواي آراية line[ ] كه دربردارندة رشتة دريافت شده است چاپ مي‌گردد (دو تابع getchar و putchar دوباره بررسي خواهد شد). راه ديگر براي ورود رشته‌ها به حافظة كامپيوتر استفاده از تابع gets است كه در مبحث رشته‌ها بحث می‌کنیم.

براي خواندن رشته‌هايي كه در آنها فضاي خالي (space يا blank) وجود داشته باشد، مي‌توان به طريقي از تابع scanf نيز استفاده کرد. براي اين كار مي‌توان به جاي كاراكتر تبديل نوع s در رشتة كنترلي، دنباله‌اي از كاراكترها را در داخل كروشه به صورت [...] قرار داد كه در اين صورت رشتة مورد نظر هريك از كاراكترهاي موجود در داخل كروشه ازجمله blank را شامل می‌شود.

با چنين روشي وقتي كه برنامه اجرا مي‌گردد، تا زماني كه كاراكترهاي متوالي خوانده شده از طريق دستگاه ورودي با يكي از كاراكترهاي موجود در درون كروشه‌ها يكسان باشد، عمل خواندن رشته‌ها ادامه مي‌يابد. فضاي خالي نيز در داخل رشته‌ها منظور می‌شود. به محض اينكه كاراكتري خوانده شود كه در داخل كروشه‌ها وجود نداشته باشد، عمل خواندن خاتمه مي‌پذيرد. درضمن يك كاراكتر null به طور خودکار به پايان رشته افزوده می‌شود.

 

 مثال 3ـ10 برنامة زير كاربرد تابع scanf را براي خواندن رشته‌هايي كه شامل حروف بزرگ و فضاي خالي است‌ نشان مي‌دهد. طول اين رشته با درنظر گرفتن كاراكتر پايان رشته 80 كاراكتر خواهد بود.

#include

main ()

 {

 char line[80] ;

..........

 scanf("%[ ABCDEFGHIJKLMNOPQRSTUVWXYZ ]", line) ;

..........

  }

حال اگر از طريق ورودي، رشتة COMPUTER SCIENCE وارد شود، وقتي كه برنامه اجرا مي‌گردد، تمامي رشتة‌ مزبور به آراية line نسبت داده مي‌شود. به هرحال اگر يكي از حروف رشتة مزبور به حرف كوچك تايپ شود، ورود رشته در همان كاراكتر خاتمه مي‌پذيرد. مثلاً اگر در مثال بالا p به‌صورت كوچك تايپ شود، فقط سه حرف com به آراية line نسبت داده مي‌شود و عمل خواندن در حرف چهارم (حرف p) خاتمه خواهد يافت.

راه ديگر آن است كه به جاي اينكه كاراكترهاي مجاز در رشتة مورد نظر را در داخل كروشه ذكر كنيم، فقط كاراكترهايي را كه مجاز نيستيم در رشته‌ها به كار ببريم مشخص می‌کنيم. براي اين كار كافي است كاراكترهاي مورد نظر را به دنبال نماد "^" كه circumflex ناميده مي‌شود، در داخل كروشه قرار دهيم. يعني در اينجا نقش كاراكترهاي كروشه‌اي عكس حالت قبلي است و وجود هركدام از آنها در داخل يك رشته موجب قطع ورود بقية كاراكترهاي رشته مي‌گردد و عمل خواندن رشته خاتمه مي‌پذيرد.

اگر كاراكتر داخل كروشه‌ها كه بعد از "^" مي‌آيد، فقط كاراكتر خط جديد "\n" باشد، رشته‌اي كه از طريق دستگاه ورودي استاندارد وارد مي‌شود هر كاراكتر اسكي به جز كاراكتر خط جديد را شامل می‌شود. بنابراين، كاربر مي‌تواند هرچه خواست به‌عنوان كاراكترهاي رشته وارد كند و در پايان كليد Enter را فشار دهد. اين كليد كاراكتر خط جديد را صادر مي‌كند و درنتيجه پايان رشته را اعلام خواهد كرد.

 

 مثال 3ـ11 فرض كنيد كه يك برنامة C شامل دستورهاي زير است.

#include

main ()

  {

 char line[80] ;

..........

..........

 scanf("%[^\n]", line) ;

..........

..........

  }

وقتي كه تابع scanf در برنامة بالا اجرا مي‌گردد، رشته‌اي به طول نامشخص (ولي حداكثر 79 كاراكتر) از طريق دستگاه ورودي استاندارد وارد مي‌گردد و به line نسبت داده مي‌شود. هيچ گونه محدوديتي در مورد كاراكترهاي تشكيل‌دهندة رشته وجود نخواهد داشت، فقط بايد در يك خط بگنجد. براي مثال رشتة زير از طريق صفحه‌‌كليد وارد و به line نسبت داده می‌شود.

WE LEARN MATHEMATICS.


تابع getchar()

براي خواندن يك كاراكتر از دستگاه ورودي، مي‌توان علاوه بر تابع scanf از تابع getchar نیز استفاده کرد. تابع مزبور كه جزء كتابخانة I/O زبان استاندارد C است، كاراكتری از دستگاه ورودي استاندارد که معمولاً صفحه‌‌كليد است مي‌خواند. اين تابع آرگومان ندارد و به طور متعارف در يك دستور انتساب يا جايگذاري به كار می‌رود و كاراكتر دريافتي از ورودي را به متغيري كه در سمت چپ دستور جايگذاري مورد نظر است اختصاص مي‌دهد. شکل كلي آن به صورت زير است.

character variable = getchar() ;

= getchar() ; متغير كاراكتري

كه در آن متغير كاراكتري نام متغيري از نوع كاراكتر است كه بايد از قبل توصيف شده باشد.

مثال 3ـ12 به دستورهاي زير توجه کنيد.

char ch ;

ch = getchar() ;

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

اگر هنگام خواندن كاراكتر با تابع getchar، شرايط پايان فايل پيش‌ آيد مقدار سمبوليكي EOF به طور خودكار برگشت داده می‌شود (اين مقدار در داخل فايل stdio.h اختصاص می‌یابد. به طور متعارف مقدار 1- به EOF اختصاص داده مي‌شود، اگرچه ممكن است اين مقدار از کامپایلری به کامپایلر ديگر فرق كند). ظاهر شدن EOF به‌اين طريق، راه ساده‌اي براي تشخيص پايان فايل در هنگام اجراي آن است ( در اين مورد، در مبحث فايلها بيشتر بحث خواهیم کرد. لذا به هيچ وجه نگران آن نباشيد). مي‌توان تابع getchar را نيز براي خواندن رشتة چند كاراكتري به صورت حلقة تكرار به كار برد كه در هر تكرار یک كاراكتر را بخواند.


 

تابع putchar()

اين تابع براي شمارش يك كاراكتر روي خروجي استاندارد كه معمولاً صفحه نمايش است به كار می‌رود و نقش آن مشابه تابع getchar اما در جهت عكس است. طبيعي است كاراكتري كه انتقال مي‌يابد به صورت ثابت كاراكتر يا متغيری از نوع كاراكتر که آرگومان تابع مزبور است به كار می‌رود. شکل كلي اين تابع به صورت زير است.

putchar (character variable) ;

 ; (متغير كاراكتري) putchar

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

مثال 3ـ13 برنامة‌ زير به تدريج در هر بار يك كاراكتر مي‌خواند و سپس آن را در خروجي چاپ مي‌كند.

#include

main ()

  {

  char ch ;

 while (1)

 {

  ch = getchar() ;

 putchar(ch) ;

  }

  }

در اين برنامه ch كاراكتر اعلان شده است. هر بار كه يك كاراكتر از طريق دستگاه ورودي استاندارد خوانده مي‌شود، به همان طريق به خروجي انتقال مي‌يابد. اما به لحاظ اينكه عبارت مربوط به while، يعني مقدار داخل پرانتز بعد از while، برابر "1" و هميشه غيرصفر است، براساس قوانين زبان C، اين عبارت هميشه درست يا true است. بنابراين ساختار while(1) حلقه‌ای بي‌‌نهايت است و تنها راه متوقف ساختن برنامه وقفه‌ای است كه‌ با کليدهاي control-c عملي خواهد شد.

راه ديگر براي نوشتن برنامة بالا به صورت زير است.

#include

main ()

  {

  int ch ;

 while ((ch=getchar()) != EOF)

 putchar(ch) ;

  }

این برنامه تركيب دو عمل در يك دستور را در حلقه نشان مي‌دهد. گفتیم EOF در برنامة بالا علامت سمبوليك پايان فايل است. آنچه در واقعيت نشانة پايان فايل را نشان می‌دهد تابع سيستم است. براي اين كار اغلب عدد 1- به كار می‌رود، ولي سيستمهاي مختلف ممکن است مقادير متفاوتي داشته باشند. با گنجانيدن فايل stdio.h و به كار بردن ثابت سمبوليكي EOF، برنامه را قابل حمل يا قابل اجرا ساخته‌ايم. يعني، فايل مبنا روي سيستمهاي مختلف بدون تغيير اجرا می‌شود.

ملاحظه مي‌كنيد كه در روش اخير، متغير ch به جاي char به صورت int معرفي شده است. هرچه براي نشان دادن پايان فايل به كار می‌رود، نمي‌تواند مقداري باشد كه يك كاراكتر را معرفي نمايد. حال چون C به‌صورت int معرفي شده است، مي‌تواند مقادير تمام كاراكترهاي ممكن و همين طور مقدار ويژة EOF را نگهداري کند.

 همان طور كه گفتیم، هر دو تابع getchar و putchar در فايل stdio.h تعريف شده‌اند و ممكن است در بعضي سيستمها در فايلهاي ديگري نيز مانند فايل conio.h تعريف شده باشند.


مثال 3ـ14 برنامة زير يك خط متن را از ورودي با حروف كوچك دريافت و آن را به حروف بزرگ تبديل مي‌كند.

#include

main ()

  {

  char line[80] ;

 int count , k ;

 /* read in the line */

 for (k=0 ; (line[k]=getchar())!=’\n’ ; + + k) ;

 count = k ;

 /* write out the line in upper-case */

 for(k=0 ; k

 putchar(toupper(line[k])) ;

  }

در برنامة بالا از حلقة for و تابع کتابخانه‌اي toupper استفاده شده است. نقش اين تابع آن است كه حروف كوچك را به بزرگ تبديل مي‌كند. بنابراين اگر حروف ورودي هنگام تايپ حروف بزرگ يا ارقام و مشابه آن باشند، به شکل اولية خود نمايش داده خواهند شد. براي مثال اگر ورودي به صورت Advanced programming باشد، خروجي به صورت ADVANCED PROGRAMMING خواهد بود.


مثال 3ـ15 برنامة زير يك خط از متن را مي‌خواند و در آن هر كاراكتر را (به غير از كاراكتر فضاي خالي يا space) به كاراكتر بعدي تبديل مي‌كند و نمايش مي‌دهد (درواقع متن را به ‌شکلی به صورت رمز در مي‌آورد و نمايش مي‌دهد).

#include

#define space ’ ’

main ()

  {

  char ch ;

 ch = getchar () ; /* read a character from i/o */

 while(ch!=’\n’) /*while not end of line */

 {

 if (ch= =space) /* leave the space */

 putchar(ch) ; /* character unchanged */

 else

 putchar(ch+1) ; /* change other characters */

 ch = getchar() ; /* get next character */

 }

  }

برای مثال اگر computer science2 ورودي باشد، خروجي dpnqvufs tdjfodf3 خواهد بود.

با تركيب دو دستور خواندن و تست كردن پايان متن در يك عبارت، برنامة مزبور را مي‌توان به صورت ساده‌ و فشرده‌تر زير نوشت.

#include

#define space ’ ’

main ()

  {

  char ch ;

 while ((ch=getchar()) != ’\n’)

 {

  if (ch = = space) /* leave the space */

 putchar(ch) ; /* character unchanged */

 else

 putchar(ch+1) ; /* change other characters */

  }

  }

که در اين برنامه دستور while ((ch=getchar()) != ’\n’) تركيب دو عمل در يك دستور را نشان مي‌دهد كه روشی متداول در زبان C است. اين دو عمل آن است كه اول به كمك تابع getchar مقداري به ch نسبت داده مي‌شود و سپس مقدار ch با كاراكتر خط جديد مقايسه می‌شود. وجود پرانتز دور عبارت ch = getchar() آن را اپراند چپ اپراتور != مي‌سازد. اگر آن را حذف كنيم نتيجة مطلوب به دست نمي‌آيد زيرا اپراتور != نسبت به اپراتور = تقدم بالاتري دارد. بنابراين اگر دستور مزبور را به صورت while (ch = getchar()!= ’\n’) بنويسيم، اول عبارت ’\ngetchar()!= ارزيابي مي‌شود كه عبارتی رابطه‌اي است (بنابراين كاراكتر خط جديد برنمي‌گرداند، بلكه يك مقدار برمي‌گرداند) كه ارزش آن يك يا صفر (درست يا نادرست يعني true يا false) خواهد بود. سپس اين مقدار به ch نسبت داده مي‌شود كه هدف مورد نظر ما را از دستور مزبور تأمين نمي‌كند.


مثال 3ـ16 برنامة‌ زير كاراكترها را از طريق ورودي صفحه‌‌كليد دريافت مي‌كند و آنها را به صفحة نمايش مي‌فرستد. اين برنامه با دريافت كاراكتر $ از ورودي خاتمه مي‌پذيرد.

#include

main ()

  {

  char ch ;

 while ((ch=getchar()) != ’$’)

 putchar(ch) ;

  }

در اين برنامه نيز از ترکيب دو دستور در يک دستور در درون حلقة while استفاده شده است.

 

در زبان C علاوه بر تابع getchar دو تابع getch و getche نيز براي خواندن يك كاراكتر از ورودي به كار مي‌رود که در ادامه بررسي می‌کنیم.

تابع getche()

 اگر بخواهيم كاراكتري به كمك تابع scanf يا تابع getchar خوانده شود، بايد پس از تايپ كاراكتر مورد نظر، كليد Enter را نيز استفاده کنیم. يعني، درواقع دو تابع مزبور تا موقعي كه كليد برگشت (كه به آن carriage return يا به اختصار CR گویند) فشرده نشود ورودي را در بافر نگه مي‌دارند. پس از زدن كليد برگشت، دادة تايپ شده در اختيار برنامه قرار مي‌گيرد. حسن اين روش آن است كه اگر كليدي را اشتباه وارد كرده باشيم، مي‌توانيم آن را با backspace تصحيح كنيم. يعني، قبلي را پاك كنيم و دوباره كاراكتر صحيح مورد نظر را تايپ كنيم. عيب اين كار آن است كه ‌اين عمل در محيط محاوره‌اي امروز وقت‌گير و دردسرزاست. ازاين رو تابع getche به‌وجود آمد كه در آن ديگر نيازي به تحرير كليد برگشت يا CR نيست. اشكال اين تابع آن است كه اگر كاراكتر اشتباه تحرير شود امكان تصحيح وجود ندارد. همچنين كاراكتر تحرير شده، روي صفحة تصوير نمايش داده مي‌شود كه‌اين عمل echoing ناميده مي‌شود. در واقع حرف e در آخر نام تابع getche به مفهوم echo (عكس‌العمل) است.

تابع getch()

 اين تابع همانند تابع getche است با اين تفاوت كه كاراكتر تحرير شده در صفحة تصوير ظاهر نمي‌گردد. در مورد هريك از اين سه تابع وقتي كه كنترل اجراي برنامه به ‌اين توابع مي‌رسد، برنامه منتظر فشردن كليدي در صفحه‌‌كليد مي‌شود. اگر متغير مورد نظر از نوع كاراكتري باشد، يعني در برنامه با فرمت %c توصيف شده باشد، مقدار كاراكتري كليد فشرده شده به‌اين متغير نسبت داده مي‌شود و درصورتي كه‌اين متغير از نوع عددي باشد کد اسكي‌ كاراكتر مربوط به كليد فشرده شده در اين متغير قرار مي‌گيرد.

توابع puts() و  gets()

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

تابع gets() يك رشته از كاراكترها را كه از طريق صفحه‌‌كليد وارد مي‌شود، مي‌خواند و آنها را در آدرسي قرار مي‌دهد كه با آرگومانهاي آن تعيين شده است و اشاره‌گری كاراكتری است. كاراكترهاي رشتة مورد نظر را تايپ مي‌كنيد و در پايان، كليد Enter را می‌زنید. با اين عمل به طور خودكار كاراكتر null يا ’\0’ نيز در پايان رشته قرار می‌گیرد. در اينجا اگر كاراكتری اشتباه تايپ شود، مي‌توان آن را قبل از فشردن كليد Enter با استفاده از كليد backspace تصحيح كرد. در واقع در اينجا نيز كاراكترهاي تايپ شده در بافر مي‌ماند و تا موقعي كه كليد برگشت فشرده نشده است در اختيار برنامه قرار نمي‌گيرد.

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

مثال 3ـ17 برنامة زير رشته‌اي را از طريق صفحه‌‌كليد مي‌خواند و در آراية line قرار مي‌دهد. سپس آن را روي خروجي نمايش مي‌دهد.

#include

main()

  {

  char line[80] ;

 gets(line) ;

 puts(line) ;

  }

فراخواني تابع puts در مقايسه با فراخواني printf داراي overhead كمتري است و درنتيجه سريع‌تر از آن عمل مي‌كند زيرا تابع puts فقط يك رشته از كاراكتر را به خروجي می‌فرستد و نمي‌تواند مشابه printf تبديل فرمت انجام دهد. همچنين نمي‌تواند مقادير عددي را به عنوان خروجي داشته باشد. بنابراين چون puts فضاي كمتري مي‌گيرد و سريع‌تر از printf اجرا مي‌گردد، هنگامي كه در برنامه‌سازي حالت خيلي بهينه مورد نظر باشد، از اين تابع استفاده مي‌شود.


 

خودآزمایی 3

1. برنامه‌اي بنويسيد كه با استفاده از تابع printf و تابع puts رشتة زير را در دو خط جداگانه چاپ کند.

"Payam noor university"

2. برنامه‌اي بنويسيد كه كاراكتري از ورودي بخواند و کاراکتر بعدي آن را در خروجي چاپ ‌كند.

3. برنامه‌اي بنويسيد كه عدد صحيح m1 وعدد اعشاري m2، اطلاعات كاراكتري و آدرس متغير m3 را در خروجي چاپ ‌كند.

4. خروجي برنامة زير چيست ؟

# include < stdio. h>

main ()

 {

 double x ;

x = 2e + 004 ;

printf ("\n x1 = %e" , x) ;

printf ("\n x2 = %E" , x) ;

printf ("\n x3 = %g" , x) ;

 }

5. خروجي برنامة زير چيست ؟

# include < stdio. h>

main ()

 {

 float x = 123.456 ;

 printf ("%f %.3f %7.2f" , x , x , x) ;

 }

6. برنامه‌اي بنويسيد كه سه عدد صحيح را از ورودي بخواند و ميانگين آنها را چاپ کند.

7. برنامه‌اي بنويسيدكه دو متغير صحيح را از ورودي بخواند و محتويات آنها را بدون استفاده از متغير كمكي عوض کند و نتيجه را در خروجي نمايش دهد.

8. برنامه‌اي بنويسيد كه سن شما را برحسب روز از ورودي بخواند و مشخص ‌كند كه چند سال، چند ماه، چند هفته و چند روز دارید.

برنامه نویسی C  جلسه سوم

فصل 3

توابع ورودي و خروجي

هدف کلی

آشنایی با هشت تابع ورودی و خروجی زبان C

هدفهای رفتاری

انتظار می‌رود پس از مطالعة این فصل دانشجو:

1. با کاربرد و ویژگیهای تابع خروجی printf() آشنا شود.

2. فرامین فرمت را در تابع آرگومان‌دار ‌printf() بشناسد.

3. با کاربرد و ویژگیهای تابع ورودی scanf() آشنا شود.

4. تفاوت و تشابه توابع printf() و scanf() را بداند.

5. با کاربرد و ویژگیهای تابع ورودی getchar() آشنا شود.

6. با کاربرد و ویژگیهای تابع خروجی putchar() آشنا شود.

7. با کاربرد و ویژگیهای تابع ورودی getche() آشنا شود.

....

ادامه نوشته

برنامه نویسی C  جلسه دوم

فصل 2

 انواع داده‌ها

هدف کلی

آشنایی با انواع داده‌های زبان برنامه‌نویسی C و کاربردها و شیوه‌های معرفی آنها

هدفهای رفتاری

از دانشجو انتظار می‌رود پس از خواندن این فصل:

1. انواع داده‌های زبان C را نام برد.

2. مقادیر متغیر و ثابت داده‌ها را بشناسد.

3. انواع مقادیر ثابت را نام برد و تشریح کند.

4. داده‌های اسکالر و مجموعه‌ای را بشناسد.

5. چگونگی اعلان متغیرها در زبان C را بداند.

6. ویژگیهای داده‌های صحیح و شیوه‌های معرفی آنها را بداند.

7. ویژگیهای مقادیر ثابت صحیح بر مبنای 8، 10 و 16 و چگونگی معرفی آنها را بداند.

8. در داده‌های‌اعشاری، روشهای‌نوشتن‌ثابتهای‌با ممیزشناور را شرح‌دهدوکاربرد هریک‌را بداند.

9. در داده‌های کاراکتری کد اسکی و ebedic را تعریف کند.

10. تفاوت بین عدد و کاراکتر را در زبان C بداند.

11. طریقة شناساندن ثابتهای حرفی به مفسر را بداند.

12. طریقة شناسایی حروف کوچک و بزرگ را در کد اسکی بداند.

13. رشته یا ثابت رشته‌ای و طریقة معرفی آن را به مفسر بداند.

14. تفاوت ثابت حرفی و ثابت رشته‌ای تک‌حرفی را بداند.

15. مقداردهی اولیة متغیرها را بداند.

16. وظیفة‌ عملگر cast را شرح دهد.

17. داده‌های تهی و void را بشناسد.

18. پیش‌پردازنده و شیوة معرفی آن را بشناسد.

19. وظیفة فرمان #include و چگونگی تعریف آن را بداند.

20. وظیفة‌ فرمان #define و فواید آن را بداند.

....


ادامه نوشته

برنامه نویسی C جلسه اول

فصل 1

کليات و مفاهيم

هدف کلی

آشنایی با مفاهیم اولیه و ویژگیهای کلی زبانC

هدفهای رفتاری

پس از مطالعة این فصل انتظار می‌رود دانشجو بتواند:

1. تاریخچة پیدایش زبان C را بگوید.

2. ویژگیهای اصلی این زبان را شرح دهد.

3. کاراکترهای این زبان را تشخیص دهد.

4. ویژگی شناسه‌های C را بیان کند.

5. متغیرها را شناسایی کند.

6. قسمتهای مختلف برنامة نوشته شده به این زبان را شرح دهد.

....

ادامه نوشته