بسم الله الرّحمن الرّحيم

Preview:

DESCRIPTION

بسم الله الرّحمن الرّحيم. WWW.OUGHIYANOOS.PERSIANBLOG.IR توسط: دانشگاه:. برنامه سازی پیشرفته ( C ). طرح درس:. درس 4 واحدی جهت دانشگاه پیام نور 40 ساعت (20 جلسه 2 ساعته در سایت یا (1+1) ساعته در کلاس و سایت. - PowerPoint PPT Presentation

Citation preview

حيم حمن الّر� بسم الله الّر�

WWW.OUGHIYANOOS.PERSIANBLOG.IRتوسط:

:دانشگاه

(Cبّرنامه سازی پیشّرفته )

: درس طّرح

واحدی جهت دانشگاه پیام نور4درس 40( ساعته در سایت یا 2 جلسه 20 ساعت

( ساعته در کالس و سایت.1+1) توصیه می شود که کالس در سایت کامپیوتر بر

گزار شود, در غیر این صورت پیشنهاد می شود قسمت اول هر جلسه در کالس و قسمت دوم در سایت, جهت تمرین عملی مطالب تدریس شده,

برگزار شود.

درس جایگاه

های رشته دروس ترین اصلی از یکی درس این. باشد می کامپیوتر علوم و کامپیوتر مهندسی

های رشته دروس از بسیاری نیاز پیش درس اینباشد می مذکور

دانشجویان مهارتهای ترین اصلی از یکی که آنجا از , این باشد می نویسی برنامه مذکور های رشته. باشد می مناسب تمرین و دقت شایسته درس

مطالب فهّرست

کامپيوتر نويسي برنامه از منظور نويسي برنامه مختصر تاريخچه برنامه يک نوشتن مراحل زبان در ها برنامه کلی Cقالب نویسی برنامه خطاهای انواع

مطالب فهّرست

, دستور متن کنترلی printfنمایش کاراکترهای و عملگرها و متغیرها مفهوم با آشنایی متغيرها مقدار چاپ ورودي scanf, getche, getch: دستورات خروجي بندي فرمت انواع تبديل عملگرها تقدم

مطالب فهّرست

دستورات در میدان طول scanf, printfتعینن یکدیگر به ای داده انواع تبدیل عملگرهای-- ,++: شرطی if, if-else, switch-case دستورات دستورbreak : ها while, for, do-while حلقه تودرتو های حلقه

مطالب فهّرست

) , تعریف ) طرز مفهوم توابع - ای کتابخانه توابع کاربر توابع سراسری و محلی متغیرهای بازگشتی توابع برنامه خوانایی ها آرایه دستورdefine چندبعدی های آرایه ها رشته

بّرنامه نويسي

يک برنامه در واقع مجموعه اي از دستورات استکه در حافظه ذخيره مي شود و سپس کامپيوتر

آنها را اجرا مي کند.

چگونگي شکل گيّري بّرنامه نويسي

در کامپيوترهاي اوليه براي انجام يک دستور خاص)مثال به دستگاه داده مي 2جمع( ورودي ها به فرم مبناي

مشاهده مي 2شد و سپس خروجي به صورت مبناي شد و بعد از آن دستورات بعدي انجام مي شد.

با استفاده ساختار فون نيومن کامپيوترهايي توليدشدند که قادر بودند دستورات را در حافظه ذخيره کنند

و سپس آنها به طور خودکار و متواليا اجرا شوند. به يک مجموعه دستورات که توسط کامپيوتر اجرا مي

شود برنامه گفته مي شود.

زبان ماشين و اسمبلي

چون برنامه هاي اوليه به صورت کدهاي دودوئي که مستقيما قابلفهم به زبان ماشين بود نوشته مي شدند به اين برنامه ها برنامه ها

( گفته مي شد و به machine language programبه زبان ماشين )هر دستور، يک دستور زبان ماشين گفته مي شد.

مشکل نوشتن برنامه به زبان ماشين سختي نوشتن و ناخوانايي آنبود.

براي رفع اين مشکل زبانهاي اسمبلي شکل گرفت. در اين زبان هابراي هر دستور زبان ماشين يک عبارت تعريف شده است. مثال براي

. در اين حالت برنامه ADD A,B عبارت B و Aجمع دو خانه حافظه ، با اين عبارات برنامه خود را 1 و0نويس به جاي نوشتن يک سري

مي نوشت. برنامه اي که برنامه اسمبلي نوشته شده توسط کاربر را به زبان

ماشين تبديل مي کند اسمبلر خوانده مي شود.

زبان هاي سطح باال

با وجود آنکه زبان هاي اسمبلي کار برنامه نويسي را آسانمي کرد اما باز برنامه ها طوالني و معموال ناخوانا بودند.

براي رفع اين مشکل زبان هاي سطح باال بوجود آمدند. دراين زبان ها هر چند دستور زبان ماشين به يک عبارت با

معنا که به زبان معمولي نزديک بود تبديل مي شود.(دو برنامه کامپايلرcompiler و )linker روي هم کار تبديل

برنامه سطح باال به زبان ماشين را انجام مي دهند.

مّراحل ايجاد يک بّرنامه

و اجراlink، کامپيايل، مراحل ايجاد برنامه سطح باال: نوشتن متن برنامه

مي گوييم.Build اصطالحا link و compileبه مجموع دو عمل

Build=compile+link Builder=compiler+linker

متنcompiler برنامه

فايلobject

Linkerفايل

executable

(اجّرايي)

اجّرا توسط سيستم عامل

تاريخچه زبان هاي بّرنامه نويسي

توسط 1946اولين زبان برنامه نويسي در Plankalkül آمدو

اولين زبان سطح باالFORTRAN I 1954 بود که در بوجود آمد.

:به مرور زمان برنامه نويسي ساده تر و پيشرفته تر شدزبان هاي مجهز به امکانات گرافيکي :زبان هاي ويژوال : امکان –

1960نوشتن برنامه بدون تايپ دستورات: دهه (1970)دهه Simulaزبان هاي شيء گرا : – )java )1995انجام کارهاي شبکه اي و اينترنتي: –

Cزبان

موضوع درس آشنايي با زبان سطح بااليC است.

توسط دنيس 1972اين زبان در سال توسط ( بوجود آمد که بر Dennis Ritchieريچي )

شکل گرفته بود. Bاساس زبان ديگري به نام B توسط Ken Thompson بوجود 1969در

آمد.

Rithchie (1972) و Thompsonتصويّري از

نکته

در يک زبان عادي براي بيان يک مفهوم مي توان ازعبارات مختلفي استفاده کرد :

علي به خانه رفت. –علي خانه رفت. –علي رفت خانه.–رفت علي خانه.–

در يک زبان برنامه نويسي نياز دستورات نياز به بيان دقيقدارند و بايد طبق ساختار مشخصي که در زبان مشخص شده استفاده شوند تا کامپايلر قادر به درک آنها باشد.

Cبّرنامه نويسي به زبان

Cساده تّرين بّرنامه به زبان

void main) ({}

نکات: بايد وجود داشته باشد.Cخط اول در هر برنامه 1. : شروع برنامه}2.} : خاتمه برنامه3.دستورات برنامه در داخل }{ نوشته مي شوند.4.

و compile، link نوشتن، نمايش مّراحل سه گانهاجّرا

نوشتن1..2Compile.3Linkاجراء 4.

IDE

زمانبر بودن مشکل: ارائه نرم افزارهايي که امکان ويرايش، رفع مشکل: و اجرا را در يک محيط فراهم مي linkکامپايل،

کنند.IDE: Integrated Development Environment

و....Borland C، Visual Cمانند: اجراي برنامه درVisual C

1- نکات

فاصله گذاري( حساس بودن به حالت حّروفcase

sensitivity)

2نکات-

error: به خطاهاي بّرنامه نويسي error.مي گويند :انواع خطاها در بّرنامه نويسي

خطاهاي زمانcompile(compile errors) :.مانع کامپايل صحيح بّرنامه مي شوند

خطاهاي زمانlink (Link errors) : بّراي کامپايل مزاحمتي ايجاد نمي کنند اما مانعLink بّرنامه

مي شوند. ( :خطاهاي زمان اجّراRun time errors:)

کامپايل وLink با موفقيت انجام مي شود ولي اجّراي بّرنامه . دچار اشکال مي شود

error

.حسن سيب را خورد.هسن سيب را خورد

متناظّر با خطاي کامپايل.را حسن خورد سيب

متناظّر با خطايLink

.سيب حسن را خوردمتناظّر با خطاي زمان اجّرا

( نمايش متن بّر روي 2مثال مانيتور

را در مانيتور Helloبّرنامه اي بنويسيد که پيغام نشان دهد.

#include <stdio.h>

void main()

{

printf(“Hello”);

}

قرار مي گيرد.o چاپ مي شود و مکان نما بعد از حرف Helloپيغام

نکات

•Stdio.h نمونه اي از يک header file است. فايل هاي header جزئيات غيّر مّرتبط با کاربّر را از ديد او مخفي مي کند و موجب مي شود بّرنامه اي خالصه تّر و خواناتّر داشته باشيم.

( يا preprocessor directive يک راهنماي پيش پّردازش ) ….include# دستور • قبل از شّروع Compiler( خوانده مي شود. compiler directiveراهنماي کامپايلّر )

کامپايل محتويات اين فايل را به بّرنامه اضافه مي کند و سپس کامپايل آغاز مي گّردد.

در انتهاي هّر دستور زبانC داخل main قّرار داده مي شود.; عالمت

نکات )ادامه(

Printf)“Hello welcome”(; خروجي ؟؟

فاصله ها هم نمايش داده مي شوند.–

:مي خواهيم خروجي ما به صورت زير باشدHello

Welcome

#include <stdio.h>Void main( ){ Printf(“HelloWelcome”); }

#include <stdio.h>Void main( ){

Printf(“Hello\nWelcome”); }

خطا

\t

#include <stdio.h>Void main( ){

Printf(“Hello\tWelcome”);

}

tabيک حّرکت به اندازه

\n و\t اصطالحا کاراکتّرهاي کنتّرلي ناميده مي شوند. کاراکتّرهاي کنتّرلي در printf عينا چاپ نمي شوند بلکه اثّراتي ديگّر از خود بّروز مي دهند.

خالصه مطالب قبل

تعريف و تاريخچه مختصري از کامپيوتر مقدمه اي بر مفهوم برنامه نويسي و چگونگي شکل گيري

آن نوشتن چند برنامه ساده به زبانC کاراکترهاي کنترلي : مانند\n و \t

void main(){}

ساده تّرين بّرنامه

#include <stdio.h>void main(){ printf("Hello");

} چاپ متن روي مانيتور

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

مثال

را محاسبه کند.2+2برنامه اي بنويسيد که حاصل void main) (

{ int x;

x=2+2;}

1نکات-

int x; هنگام اجراي اين دستور:–

بايتي حافظه به برنامه اختصاص داده مي شود. 4 يک مکان اين مکان راx.مي نامد ( به برنامه اجازه مي دهد که يک عدد صحيحinteger در )x.بريزد

گفته مي شود. (intصحيح )( از نوع Variableمتغير ) ، يک xاصطالحا به – مي گوييم.تعريف متغيربه دستور باال دستور ––x .نام متغير مي باشد نام متغير–

ترکيبي از حروفa تا z و A تا Z و 9 تا 0 ، ارقام _( Undeline .مي باشد ) .نبايد با يک رقم شروع شود

a، asd، ali، A09 ، _Aمثال : اسامي مجاز: 9a، A-s اسامي غير مجاز:

x

2نکات-

X=2+2 ; جمع مي شود.2 با 2ابتدا –

به عالمت + اصطالحا يکoperator )ميگوييم. )عملگّر يک 2هّر يک از اعداد operand)خوانده ميشوند. )عملوند

قّرار مي گيّرد.xسپس حاصل جمع در – مي يابد.تخصيص x به 4يا اصطالحا

و به دستور باال يک اپّراتور تخصيص مقدار اصطالحا يک =به –( ميگوييم.Assignment statement )دستور تخصيص مقدار

درسمت چپ يک دستور تخصيص مقدار فقط و فقط نام يک –متغيّر بايد باشد. سمت راست مي تواند تّرکيبي از نام متغيّر و

مقاديّر باشد.

4x

بعضي انواع متغيّرها

مصّرف حافظه )بايت(

نوع محدوده

int 4 تا صحيح

float 4 اعشاري رقم اعشار دقت- 6ماکزيمم

double 8 اعشاري با دقت

باال

- رقم اعشار دقت15ماکزيمم

long

(long int)

8 صحيح بزرگ

تا

short (short int)

2 صحيح کوچک

32,767تا 32,768-

char 1 کاراکتّر 127 تا 128-

3121231

6321263

float x;X=2.3;

short ys;ys=123;

char c;c='a‘;c=97;

ys=0x23;)1010( 3837

)1010( 308307

??

int x; short x;

x=2.3; x=3243243255556;

float x;

x=3;

بعضي انواع اپّراتورها

:محاسباتي * / % )باقيمانده( ++ -- -+

:تخصيص مقدار =

:مقايسه اي <!= == <

صورت هاي ديگّر نوشتن بّرنامه

Void main (){ int x; int y; y=2; x=y+2;}

Void main (){ int x,y; y=2; x=y+2;}

Void main (){ int y=2; int x; x=y+2;}

Void main (){ int y=2,x; x=y+2;}

Void main (){ int z=2,y=2,x; x=z+y;}

void main) ({ int x; x=2+2;}

چّرا متغيّر

Void main (){ int x=4; int y=5; x=2; y=x+2;}

نمايش مقاديّر در مانيتور

مسئله: مي خواهيم مقدار يک متغير را رويمانيتور چاپ کنيم.

#include <stdio.h>Void main (){ int x=4; int y=5; x=2; y=x+2; printf(“Result=%d”,y);}

%d يعني يک عدد صحيح را روي مانيتور نشان بده خواهد بود.yاين عدد صحيح

%d.نيز يک کاراکتر کنترلي مي باشد

نکات

چاپ بيش از يک مقدارVoid main (){ int x=2,y=2,z; z=x+y; printf(“%d + %d =%d”,x,y,z);

}

d%کاراکتّرهاي کنتّرلي مشابه

%d اعداد صحيح دهدهي

%f اعداد اعشاري float x=23.2;

printf(“%f”,x);

%c کاراکتّر char ch=‘B’;

char ch=66;

printf(“%c”,ch);

%x 16اعداد مبناي صحيح

int a=0x234;

printf(“%x”,a);

چند مثال

printf)“%d”,23(; چاپ مي شود. 23–

printf)“%c”,’a’( روي مانيتور چاپ مي شود.aکاراکتر –

printf)“%d”,’a’(; چاپ مي شود.97 يعني aکد اسکي کاراکتر –

printf)“%c”,97( چاپ مي a است يعني 97کاراکتري که کد اسکي آن –

شود.

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

با استفاده از دستورات ورودي مي توانيم مقدار وارد کنيم.keyboardمتغيرها را از طريق

scanfدستور

دريافت کند و مربع keyboardبرنامه اي بنويسيد که عددي صحيح را از آن را چاپ کند.

#include <stdio.h>void main)({ int x; scanf)“%d”,&x(; printf)“%d”,)x*x((;}

عالمت آدرس

يک عدد صحيح را از کاربر دريافت و آن را مي ريزد.xدر متغير

نکات

به طرزي مشابهprintff%براي خواندن اعداد اعشاري: –c%خواندن کارکترها:–x%: 16خواندن اعداد مبناي –

براي استفاده ازscanf هم بايد از stdio.h استفاده کرد.

بعد از وارد کردن مقدار بايدENTER.زده شود

مثال

بّرنامه اي بنويسيد که دو عدد را از صفحه کليد دريافت کّرده و حاصل ضّرب آنها راچاپ کند.

#include <stdio.h>void main(){

int x,y; printf(“\nEnter two numbers”);

scanf(“%d%d”,&x,&y);printf(“The sum=%d”,(x*y));

} زده ENTERهنگام وارد کّردن اعداد بايد بين آنها الاقل يک فاصله قّرار داده شود يا

شود. زده شود.ENTERبعد از وارد کّردن عدد آخّر بايد

باال را مي توان به صورت زيّر هم نوشت:scanfدستور scanf(“%d”,&x);scanf(“%d”,&y);

دريافت کّرد.scanfمي توان بيش از دو مقدار هم با دستور

يک مشکل در گّرفتن کاراکتّر با scanf

برنامه اي بنويسيد که دو کاراکتر بگيرد و سپس آنها را در کنار همچاپ کند.

ظاهرا اين برنامه بايد به صورت زير باشد: #include <stdio.h> void main() { char c1,c2; scanf("%c%c",&c1,&c2); printf("%c%c",c1,c2); }اما هنگام اجّراي بّرنامه مالحظه مي کنيم که تنها يکي از کاراکتّرهاي

وارد شده چاپ مي شود.

بافّر ورودي

:علت رخ دادن اين مشکل وارد مي کنيم در داخل scanfداده هايي که در هنگام اجّراي –

خوانده مي شود ذخيّره scanfمحلي از حافظه که بافّر دستور بسته به آنچه بّرايش مشخص شده است printfمي شود. دستور

از اين بافّر عنصّر بّر مي دارد و روي مانيتور چاپ مي کند. ( ، a ما ابتدا يک کاراکتّر )مثال scanfدر اين مثال هنگام اجّراي –

( را وارد کّرده b و بعد کاراکتّربعد )مثال ENTERسپس فاصله يا در واقع خود يک کاراکتّر ENTERايم. با توجه به اينکه فاصله يا

در بافّر 3هستند در واقع ما سه کاراکتّر وارد کّرده ايم که هّر scanf .قّرار مي گيّرند

و فاصله )يا a دو تا کاراکتّر اول يعني printfهنگام اجّراي –ENTER( چاپ مي شود و کاراکتّر مورد نظّر )b .چاپ نمي شود )

بّراي رفع مشکل مي توان نوشت :–scanf(“%c%c%c”,&c1,&c2,&c3);

به طور کلي استفاده ازscanf بّراي گّرفتن کاراکتّر مناسب نيست. دو دستور که مخصوص گّرفتن کاراکتّر

مي باشند.getch و getcheهستند و مشکل باال را ندارند

getche دستور

تنها براي دريافت کاراکتر ازkeyboard.به کار مي رود تفاوت آن باscanf اين است که در اينجا نيازي به زدن Enter بعد از

وارد کردن مقدار نيست. نياز بهheader file با نام conio.h.دارد

#include <conio.h>#include <stdio.h>void main)({char ch;ch=getche)(;printf)”\n%c",ch(;}

getchدستور

کامال مشابهgetche مي باشد. تنها تفاوت آن اين است که ورودي را نمي بينيم.

#include <stdio.h>Void main)({

float num=3.4;printf)“%f”,num(;

} ،چاپ خواهد شد.3.400000روي مانيتور %f رقم اعشار نشان مي دهد.6 به طور پيش فرض عدد را با با فرمت بندي خروجي مي توانيم مشخص کنيم اعداد چگونه

نمايش داده شوند.

فّرمت بندي خّروجي

فّرمت بندي خّروجي )ادامه(

در فرمت بندي خروجي دو چيز مشخص ميشود:

تعداد ارقام اعشار–تعداد مکان هاي در نظر گرفته شده براي نمايش عدد –

)طول ميدان(

مثالها:float x=2.3; 2.300مقدار چاپ شده :

printf)“%.3f”,x(;

float x=2.3; 2.3000000 مقدار چاپ شده :

printf)“%.7f”,x(;

رقم بعد از نقطه تعداد ارقام اعشاري را مشخص مي کند.

تعيين طول ميدان

2 3 2 3

float x=2.3;printf)“%7.3f”,x(;

2 . 300

float x=2.3;printf)“%-7.3f”,x(;

int x=23;printf)“%5d”,x(;

int x=23;printf)“%-5d”,x(;

2 . 3 0 0

چند مثال

1 2 3 4 5 6

2 3 . 4 6

2 3 . 4 6

int x=123456;printf)“%3d”,x(;

float x=23.456;printf)“%.2f”,x(;

float x=23.456;printf)“%2.2f”,x(;

تبديل انواع

زماني بروز مي کند که مي خواهيم عددي از يکنوع را در متغيري از نوع ديگر بريزيم.

int num;num=2.56;

2

قانون کلي

،int، long، shortمقدار اعشاري=متغير از نوع صحيح )char)

بخش اعشاري حذف مي شود و بخش صحيح در متغير قرار مي گيرد.

تخصيص مقدار خارج از محدوده عدد

short num;num=234567;

shortعددي در محدوده 32767- تا 32768بين

استفاده از کاراکتّرکنتّرلي نامناسب

float x=23.5;printf)“%d”,x(;

مقدار نامرتبط

int x=23;printf)“%f”,x(;

صفر

بايد دقت کرد که متناظر با نوع متغيرprintfدر % در استفاده از کاراکترهاي کنترلي باشد.

مثال هاي باال نمونه هايي از خطاهاي زمان اجرا مي باشد.

-- و ++اپّراتورهاي

X= X+1

X++ يا ++X

X=X-1

X-- يا --X

--jو j--يا ++j و j++تفاوت

#include <stdio.h>

void main)(

{

int i=0;

}

printf)"%d", i++(;printf)"%d",++ i(; 1خروجي: 0خروجي:

-=و +=

X=X+23;

X+=23;

X=X+Y;

X+=Y;

X=X-23;

X-=23;

X=X-Y;

X-=Y;

X*=z;

X/=Y;

X%=z;

تقدم )اولويت( عملگّرها

X=2+4*5%2;

?

مثال

2+4%2=2+0=2)2+4(%2=)6(%2=04+6%3/2*4=4+0/2*4=4+0*4=4+0=4

i=0;j=3;++i+4/2+ -- j=1+4/2+-- j=1+4/2+2=1+2+2=3+2=5

)(

++ --

/ * %

+ -

> >= < <=

== !=

= += -= *= /= %=در يک عبارت ،تقدم اپراتورهايي که در يک سطح اولويت

قرار دارند از چپ به راست مي باشد.

خالصه مطالب گذشته

آشنايي با دستور خروجيprintf براي چاپ متن يا مقدار متغيرها

:دستورات وروديscanf ، getche و getch فرمت بندي خروجي: تعيين تعداد ارقام اعشار و

طول ميدان اپراتورها، انواع آنها و اولويت

: بّرنامه اي بنويسيد که زاويه بّر حسب درجه را دريافت کّرده و معادل 1مثال راديان آن را روي مانيتور نشان دهد.

قبل از نوشتن يک بّرنامه قدم اول پيدا کّردن راه حل مسئله است. 1.در اين جا بايد رابطه اي بين درجه و راديان پيدا کّرد.–

. سپس آنچه در بّرنامه از ما خواسته شده را به صورت مجموعه اي از 2مّراحل مي نويسيم.

dگّرفتن درجه: –Rتبديل درجه به راديان با استفاده از رابطه باال: به دست آمدن –Rچاپ –

به بيان باال اصطالحا يک الگوريتم گفته مي شود. الگوريتم مجموعه اي ازمّراحل است که دنبال کّردن آنها ما را به حل مسئله مي رساند.

نوشتن الگوريتم مستقل از يک زبان بّرنامه نويسي خاص است.–

. در مّرحله آخّر با نوشتن دستورات مناسب الگوريتم را به بّرنامه واقعي 3تبديل مي کنيم.

dRRd

180180

نويسي بّرنامه مثال چند

گرفتنd :– scanf)“%f”,&d(;

تبديلd به R:– R=)3.14/180(*d;

چاپR:– printf)“%f”,R(;

نويسي بّرنامه مثال چند ادامه

#include <stdio.h>void main)({

float d,R;printf)"Enter a angle in degree:"(;scanf)"%f",&d(;R=)3.14/180(*d;printf)"It is %.2f radian",R(;

}

نويسي بّرنامه مثال چند ادامه

برنامه اي بنويسيد که مقدار را با 2مثال ) جمله اول سري 3استفاده از

محاسبه کند. همچنين خطاي حاصل را هم حساب کند.

:الگوريتممحاسبه–محاسبه خطا – چاپ دو مقدار محاسبه شده–

2sin

)2

(2

sin

)(!5!3)!12(

)1()sin(533

0

)12(

Aerror

xAxx

xn

xx

n

nn

0

)12(

)!12()1()sin(

n

nn

n

xx

)2

(

A

نويسي بّرنامه مثال چند ادامه

#include <stdio.h>void main(){

float x=3.141592/2;float A=x-(x*x*x)/(1*2*3)+(x*x*x*x*x)/(1*2*3*4*5);float E=1-A;printf("The sin(pi/2) by use of 3 terms=%f",A);printf("\nThe error=%f",E);

}

نويسي بّرنامه مثال چند ادامه

برنامه اي بنويسيد که عددي را بگيرد اگر عدد بر 3مثال ) چاپ کند. 1 و درغير اين صورت 0 بخش پذير بود 2

روش حل مسئله: اگر عددa بر دو بخش پذير باشد باقيمانده تقسيم آن بر دو صفر مي شود و اگر بخش پذير

نباشد يک . :الگوريتم

–aرا بگير –a%2را چاپ کن

نويسي بّرنامه مثال چند ادامه

#include <stdio.h>void main)({

int a;printf)"Enter a number"(;printf)"\nThe program will print 0 if it is dividable by 2"(;printf)"\nand 1 if not:"(;scanf)"%d",&a(;printf)"%d",a%2(;

}

نويسي بّرنامه مثال چند ادامه

شّرطی دستورات

(دستورات شرطيConditional statement: ) و C( در زبان expressionمقدمه: تعريف عبارت )–

انواع عباراتifدستور –if-elseدستور –switch-caseدستور –

)عبارت(expression– مقدمه

:اپراتورهامحاسباتي: + - * / % ++ - - –مقايسه اي: > < == => =< =! –منطقي: && )و( ||)يا( ! )نقيض(–

Expression.عبارت( : ترکيبي است از مقادير، متغيرها و اپراتورها( :انواع عبارتها

5+3محاسباتي : از اپراتورهاي محاسباتي استفاده مي شود: –3*4+3 x*2+y

منطقی: عبارتی است که می توان به آن ارزش درست یا نادرست – x<=0 3!=4 )x!=3 && z>=3( x==3 4==yنسبت داد. مانند

!)3==4(معموال این گونه عبارات با استفاده از اپراتورهای مقایسه ای و منطقی –

ساخته می شوند.

مقدار )ارزش( عبارات

هر عبارت )محاسباتي يا مقايسه اي( داراي مقدار)ارزش( است:

است. 7 برابر 4+3مقدار )ارزش( عبارت – در زبانc 1 به عبارت مقايسه اي درست ارزش

نسبت 0و به عبارت مقايسه اي نادرست ارزش داده مي شود.

است.0 ، 4<=3ارزش – است. 1 ، (2<3 || 5<=4)ارزش –

مثال

#include <stdio.h>

Void main)(

{

printf)“%d”,)3 4((;

}

< <

خواهد بود.1خروجي عدد خواهد بود.0خروجي عدد

دستورات شّرطي

در بسياري اوقات مي خواهيم يک دستور تنها زماني اجرا شود که شرط خاصي برقرار باشد.برنامه اي بنويسيد که عددي را از ورودي دريافت کرده و قدر مطلق آن را چاپ کند.مثال :

0

0

xx

xxxy

#include <stdio.h>void main)({float x;scanf)“%f”,&x(;??}

Cدستورات شّرطي در

سه نوع دستور شرطي درC:وجود دارد if، if-else و switch-case

if )عبارت منطقی(يک يا چند دستور if )x<0( y=-x;

if )x<0({ y=-x; z=y+1;}

if (عبارت منطقی)يک يا چند دستور else يک يا چند دستور if (x<0) y=-x;else y=x;

if (x<0){ y=-x; z=y+1;}else y=x;

عبارت منطقی حتما بايد در داخل پرانتز باشد.•

بيش ازelse يا ifدر حالتي که بخش هاي • يک دستور باشند بايد بين { و } قرار گيرند.

1مثال

محاسبه قدر مطلق:#include <stdio.h>

void main) ({float x;printf)“Enter the number:”(;scanf)“%f”,&x(;

if )x<0( printf)“%f”,-x(;

else printf)“%f”,x(;

}

2مثال

بّرنامه اي بّراي محاسبه 2مثال ) sign(x):include <stdio.h>void main()}float x;int y;printf("Enter a number:");scanf("%f",&x);if (x>0)}

y=1; printf("its sign=%d",y);

{else if (x<0)}

y=-1; printf("its sign=%d",y);

{

else printf("its sign undefined");

{

if-else يا if مي تواند دستور else ياifدر داخل بخش (nested if تودرتو-if-else ديگري قرار گيرد. )

به همراه مجموعه دستورات if-else يا if يک نکته:دروني شان در مجموع يک دستور فرض مي شوند .

اول از elseبه همين علت در برنامه روبرو براي }{ استفاده نشده است.

0

01

01

)(

xundefine

x

x

xsign

Nested-if

Nested if معموال موجب ناخوانايي برنامه و دشواري درک آن مي شود. در درک نحوه عملکرد

برنامه استفاده از قانون زير مي تواند راه گشا باشد:

قبل از خود وابسته است. if به نزديکترين elseهر –مشروط بر آنکه :

در داخل { و } محصور نشده باشد

1مثال

.خروجي قطعه برنامه زير را به دست آوريدx=-3;

if )x>=0(if )x>=12(printf)“X is greater than or equal 12”(;

elseprintf)“X is less than 12 and greater than 0”(;

elseprintf)“X is less than 0”(;

x is less than 0خّروجي

2مثال

x=-5;if )x>=0(}if )x>=12(printf)“x is greater or equal than 12”(;

{ else

printf)“x is less than 0”(; چاپ خواهد شد.x is less than 0عبارت

switch-caseدستور

:فرم کلي اين دستور به صورت زير استswitch ) متغير از نوع صحيح يا کاراکتر ({case :عدد صحيح يا کاراکتر دستور)ات( break;case :عدد صحيح يا کاراکتر دستور)ات( break;..................………….……….. default: دستور)ات(}

متغير يا مقدار صحيح با مقادير موجود درcase ها مقايسه مي شود. اگر با مقدار يکي از case ها مطابقت داشت اجرا مي default ها دستورات بخش caseدستورات داخل آن اجرا مي شود. در صورت عدم تطابق با هيچ يک از

شود. آوردن بخشdefault. اختياري است نيازي به قرار دادن }{ ما بين دستوراتcase .ها نيست نوشتنbreak در انتهاي دستورات هر case .الزامي است

1مثال

x=1;switch)x({case 1: printf)“*”(; break;case 2: printf)“**”(; break;case 3:

printf)“***”(; break;default:

printf)“Error”(;}

مي شود. switch موجب خروج از breakدستور بعدي اجرا مي شود.case نوشته نشود بدنه break اي caseاگر در انتهاي

2مثال

char x=‘b;switch)x({case ‘a’: printf)“%d”,’a’(; break;case ‘b’: printf)“%d”,’b’(; break;}

:دستور نکته مهمswitch فقط براي مقادير صحيح يا کاراکتر به کار مي رود.

breakنکته در مورد

نکته: دستورbreak موجب خروج از دستور switch .می شود break بر دستورات if و if-else

تأثیری ندارد و موجب خروج از آنها نمی شود. :مثال

سرويس هاي تلفني 1990 ژانويه 15در بعد از ظهر آمريکا )بزرگترين شرکت مخابراتي AT&Tشرکت

سال دچار اختاللي 114آمريکا( براي اولين بار در ساعت به طول انجاميد. 9گسترده شد که

مهندسان دریافتند که منبع اشکال در بخشی از نرم افزارنوشته شده برای کنترل خطوط است:

نویسندگان نرم افزار اشتباها تصور )if )y==1 در breakکرده بودند که دستور

می شود. در ifموجب خروج از بخش شرط می شود .switchحالی که موجب خروج از

نشان داده ____در نتیجه بخشی که به صورت شده اجرا نمی شود و موجب بروز مشکل

شده بود.

switch )line( { case 1: ........ break; case 2: if )x == 0( { ........... .......... if )y == 1( break; ............ ........... } ________ ________ break; default: ......... ........ } ........ ……………….

دستورات تکّرار )حلقه ها(

)با استفاده از دستورات تکّرار )حلقه هامي توانيم اجّراي بخشي از بّرنامه را چند

بار تکّرار کنيم.

سه دستور تکّرار در زبانC–for–while–do-while

ضّرورت وجود حلقه ها در بّرنامه

را 100 تا 1( بّرنامه ای بنویسید که اعداد 1مثال چاپ کند.

#include <stdio.h>void main(){ int i; i=0; i++; printf(“%d”,i); i++; printf(“%d”,i); ..... ..... ...}

يک برنامه بد

forدستور

for ) 2 دستور; عبارت منطقی; 1 دستور ( بخشي که اجّراي آن تکّرار خواهد شد.:forبخش دستور)ات(

الزم است.{ } استفاده از forبّراي بيش از يک دستور در بخش

1اجّراي دستور

عبارت منطقی

forاجّراي بخش

پايان

2اجّراي دستور

0 )نادرست

)

1 )درست(

مثال

عملکرد قطعه برنامه زير را توضيح دهيد:2مثال )for (i=0;i<2;i++)

printf(“\n%d” ,i);

.1i=0 اجّراء مي شود و printf است دستور i<2چون 2.

در مانيتور چاپ مي شود.0عدد .3i++ اجّرا مي شود. در نتيجه i=1.4i=1<2 در نتيجه مجددا دستور printf اجّراء مي

در مانيتور چاپ مي شود.1شود و اين بار عدد .5i++ اجّرا مي شود. در نتيجه i=2 بّرقّرار نيست. در نتيجه از حلقه i=2<2اين بار 6.

خارج مي شويم. دو بار اجّرا شد.printf دستور

اجراي 1دستور

عبارت

اجّرای بخش for

پايان

اجّراي دستور 2

0

1

با استفاده از حلقه ها 1( مثال 3مثال #include <stdio.h>

void main()

{

int i=0;

for (i=1;i<=100;++i)

printf("\n%d",i);

}

چند مثال ديگّر

for (i=5;i<=8;i++)

printf(“\n%d” ,i);

for (x=5;x>8;x++)

printf(“\n%d” ,x);

for (k=8;k>5;k--)

printf(“\n%d” ,k);

for (num=3;num>0;num++)

printf(“\n%d” ,num);

for (i=8;i>1;i/=2)

printf(“\n%d” ,i);

حلقه اصال اجّرا نمی شود

حلقه پایان ناپذیّر )بی نهایت(

مثال

:عملکرد قطعه برنامه زيرscanf(“%d”,&i);if (i>0) for(j=0;j<i;++j) printf(“\n%d”,j);

و دستورات داخل حلقه مجموعا if ، forمشابه يک دستور فّرض مي شوند و در نتيجه نيازي

نيست.if بّراي { }به

مثال

عدد را از کاربّر بگیّرد و حاصل جمع آنها را چاپ 100بّرنامه ای بنویسید که کند.

#include <stdio.h>void main(){ int i; float sum; float x; sum=0; for (i=0;i<100; i++) { scanf("%f", &x); sum+=x; } printf("The result=%f",sum);}

(nested forحلقه هاي تودرتو)

.عملکرد برنامه زير را توضيح دهيدfor )i=0;i<3;++i(

for )j=0;j<2;++j(printf)“*”(;

حلقه اي که در درون آن حلقه اي ديگر قرار گرفته است.for بار اجرا مي شود و در هر بار اجراي آن 3 اول for ،دوم

عالمت ستاره در 6دو بار اجرا مي شود. در نتيجه خروجي چاپ خواهد شد.

مثال

:عملکرد قطعه برنامه زيرfor (i=0;i<3;++i)

for (j=0;j<2;++j)

printf(“*”);

printf(“!”);

چاپ خواهد شد.! و تنها يک عالمت *شش

:عملکرد قطعه برنامه زيرfor (i=0;i<3;++i)

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

printf(“*”);

مثال

:عملکرد برنامه زير#include <stdio.h>void main(){int i,j;for (i=1;i<=10;++i){

printf("\n");for (j=1;j<=10;++j)

printf("%d\t",(i*j));}}

10*10چاپ جدول ضّرب

forنکاتی در مورد دستور

هر دستوری می تواند باشد.2 و دستور 1: در بخش های دستور 1نکته مثال

#include <stdio.h>#include <conio.h>void main(){

char ch;float x,sum=0;for (ch='y';ch=='y';ch=getche()){

printf("\nEnter a number:");scanf("%f",&x);sum+=x;printf("To continue press y: ");

}printf("\nThe sum=%f",sum);

} y را فشار می دهد عدد می خواند و زمانی که کاربّر کلیدی غیّر از yبّرنامه تا زمانی که کاربّر

را فشار دهد مجموع اعداد گّرفته شده را چاپ می کند.

)ادامه(forنکاتی در مورد دستور

یا 2 ، دستور 1( هر یک از بخش های دستور 2نکته عبارت منطقی را می توان حذف کرد

1مثال #include <stdio.h>void main(){ int i=3; for (;i<7;++i) { printf("%d\t",i); }}

2مثال #include <stdio.h>void main(){ int i; for (i=3;i<7; ) { printf("%d\t",i); i++; }}

3مثال #include <stdio.h>void main(){ int i; for (i=3;;i++ ) { printf("%d\t",i);}}

می توان بیش از یک 2 و 1( در بخش های دستور 3نکته ( از هم جدا ,دستور قرار داد. دستورات با استفاده از کاما )

می شوند. مثال:

#include <stdio.h>void main)({

int m,n;for )m=1,n=8; m<n;m++,n--(

printf)"m=%d , n=%d\n",m,n(;}

whileدستور

while (عبارت مقايسه اي)

دستور)ات(

عملکّرد: اگّر عبارت مقايسه اي درست باشددستور)ات( اجّرا مي شود. اگّر عبارت مقايسه

اي نادرست باشد از حلقه خارج مي شويم. استفاده از {} در صورت وجود بيش از يک

دستور در حلقه

مثال

i=0;

while (i<4)

{

printf(“%d”,i);

i++;

}

روي مانيتور نشان داده مي شود0123عبارت

مثال

#include <stdio.h>void main(){ char ch; int num,sum; ch='y'; sum=0; while (ch=='y') { printf("\nEnter a number: "); scanf("%d",&num); sum+=num; printf("\ncontinue(enter y/n):"); scanf("\n%c",&ch); } printf("The result= %d",sum);}

را انتخاب کند اعداد گرفته می شود yتا زمانی که کاربر از حلقه خارج می شویم yبا انتخاب هر کلیدی غیر از

و حاصل جمع مقادیر چاپ می شود.

while وforنکته-تفاوت مهم

با استفاده از دستورwhile مي توان حلقه هايي نوشت که در آنها تعداد تکرار از قبل مشخص

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

do-whileدستور

do

دستور)ات(while )عبارت مقايسه اي(;

while دارد. با اين تفاوت که در whileعملکردي کامال مشابه عبارت مقايسه اي در ابتدا و قبل از اجراي دستورات چک

اين کار در انتها و بعد از اجراي do-whileمي شود، اما در دستورات انجام مي شود.

بخش حلقه الاقل يک بار اجرا خواهد شد.

مثال

#include <stdio.h>void main(){ char ch; int num,sum; sum=0; do { printf("\nEnter a number: "); scanf("%d",&num); sum+=num; printf("\ncontinue(enter y/n):"); scanf("\n%c",&ch); } while (ch=='y'); printf("The result= %d",sum);}

breakدستور

.موجب خروج از حلقه می شود: مثال

#include <stdio.h>void main(){

int t;for (t=0;t<100;t++){

printf(“%d”,t);if (t==5)

break;}}

چند مثال بّرنامه نويسي–

Cتوابع : يکي از مهم تّرين مباحث زبان –

چند مثال برنامه نويسي

را 2برنامه اي بنويسيد که ضرايب يک معادله درجه بگيرد و ريشه هاي آن را محاسبه کند.

حل مسئله: 1.

الگوريتم:2.c و a، bگرفتن ضرايب 1.

محاسبه دلتا2.

محاسبه ريشه ها بر اساس مقدار دلتا3.

0

02

02

4

0

1

2,1

2

2

rootnoa

bx

a

bx

acb

cbxax

#include <stdio.h>#include <math.h>void main(){

float a,b,c,x1,x2,delta;printf("Enter the coefficients");printf("\na=");scanf("%f",&a);printf("b=");scanf("%f",&b);printf("c=");scanf("%f",&c);delta=b*b-4*a*c;if (delta>0){

x1=(-b+sqrt(delta))/(2*a);x2=(-b-sqrt(delta))/(2*a);printf("x1=%.2f\tx2=%.2f",x1,x2);

}else

if (delta==0){

x1=-b/(2*a);printf("x1=%.2f",x1);

}else

printf("No root");}

نکات: بّراي محاسبه ريشه دوم به کار sqrt دستور •

مي رود. header file ، آنmath.h.مي باشد

تبديل مختصات دکارتي 2مثال ) (x,y) به مختصات قطبي

به سهولت قابل انجام است:rمحاسبه –براي محاسبه وضعيت هاي مختلف زير را خواهيم داشت:–

(x>0 و y>=0) ( يا x>0 و y<0 )(x<0 و y>0 )(x<0 و y<=0 )(x=0 و y>0:)(x=0 و y<0:)

22 yxr

)arctan(x

y

)arctan(x

y

)arctan(x

y

الگوريتم:( x,y)گّرفتن 1.rمحاسبه 2.محاسبه با توجه به 3.

محل نقطه 2

2

),( r),[

نويسي برنامه مثال چند ادامه

#include <stdio.h>#include <math.h>void main(){

float x,y,r,teta;printf("Enter (x,y)\n");printf("x=");scanf("%f",&x);printf("y=");scanf("%f",&y);r=sqrt(x*x+y*y);if ((x>0 && y>=0) || (x>0 && y<0))

teta=atan(y/x);if (x<0 && y>0)

teta=atan(y/x)+3.141592;if (x<0 && y<=0)

teta=atan(y/x)-3.141592;if (x==0 && y>0)

teta=3.141592/2;if (x==0 && y<0)

teta=-3.141592/2;printf("polar cordinate:\n");printf("r=%.2f",r);printf("\nteta=%.2f radian\n",teta);

}

، بّراي محاسبه atanنکته: arc tan .به کار مي رود

header file آن math.h است.

نويسي برنامه مثال چند ادامه

برنامه اي بنويسيد که دو عدد را بگيرد و ب م مآنها را محاسبه کند.

)Greatest Common Devisor )GCD: ب م م

نويسي برنامه مثال چند ادامه

روش حل: محاسبه ب م م با روش پلکاني:1.

الگوريتم : 2.a>b( . فرض کنيد b( و عدد دوم )aالف( گرفتن عدد اول )

نشده است. a%b=0ب( تا زماني که c=a%b

a=b و بعد b=c را چاپ کنbج(

8 1 2

52 6 4 2 0

48 4 4

نويسي برنامه مثال چند ادامه

#include <stdio.h>void main(){

int a,b,c;printf("Enter 2 number. at first enter the larger\n");printf("Number 1:");scanf("%d",&a);printf("Number 2:");scanf("%d",&b);while (a%b !=0) { c=a%b;

a=b; b=c;} printf("The GCD=%d",b);

}

نويسي برنامه مثال چند ادامه

( h:m:s )ساخت يک ساعت کامپيوتريالگوريتم:

.1s=0، m=0،h=0 نمايش زمان2..3s=s+1m=m+1 و s=0 آنگاه s=60اگر 4.h=h+1 و m=0 آنگاه m=60اگر 5.h=0 آنگاه h=24اگر 6.يک ثانيه انتظار7. به تعداد بي نهايت7 تا 2انجام 8.

#include <stdio.h>#include <windows.h>void main(){ int hour=0,minute=0,second=0;

int i;for (;;){ printf("%d:%d:%d ",hour,minute,second); second++; if (second==60) { second=0; minute++; } if (minute==60) { minute=0; hour++; } if (hour==24) hour=0; for (i=0;i<11;++i) printf(”\b"); Sleep(1000);}

}

نکات: .1for);;(.يک حلقه پايان ناپذيّر است واحد 1 موجب مي شود که مکان نما b\کاراکتّر کنتّرلي 2.

به عقب بّرود. استفاده از آن موجب مي شود تا زمان بعدي رويقبلي چاپ شود و نه در محل مجزا.

به تّرتيب t\ و n\ است. )کد اسکي b ، 8\کد اسکي حّرف S بّراي ايجاد تاخيّر به کار مي رود . )Sleep. تابع 3

بزرگ است(. Sleep(n) به اندازه n.ميلي ثانيه تاخيّر ايجاد مي کند

header file آن windows.h .است مي باشد(. Turbo ، dos.h و borland)در

نويسي برنامه مثال چند ادامه

افزودن قابليت زنگ زدن در يک زمان مشخص يک صداي بوق توليد مي a\نکته : کاراکتر کنترلي

کند. کافي است دستوراتي براي گرفتن زمان بوق زدن

اضافه شود و همچنين يک دستور شرطي که رسيدن زمان را چک کند.

#include <stdio.h>#include <windows.h>void main(){ int hour=0,minute=0,second=0; int i; int h,m,s; printf("Set time to ring\n"); printf("Hour="); scanf("%d",&h); printf("Minute="); scanf("%d",&m); printf("Second="); scanf("%d",&s); for (;;) { printf("%d:%d:%d ",hour,minute,second); if (hour==h && minute==m && second==s) printf("\a\a"); second++;

if (second==60) { second=0; minute++; } if (minute==60) { minute=0; hour++; } if (hour==23) hour=0; for (i=0;i<11;++i) printf("\b"); Sleep(1000); }}

نويسي برنامه مثال چند ادامه

بازي حدس: توسط کامپيوتر عدد صحيح تصادفيتوليد مي شود )لکن به کاربر نشان 1000 تا 0بين

داده نمي شود( سپس از کاربر خواسته مي شود عددي را به عنوان حدس وارد کند . اگر عدد وارد

شده مساوي عدد مطلوب باشد بازي با برنده شدن فرد خاتمه مي يابد و اگر کوچکتر يا بزرگتر باشد به کاربر اعالم مي شود. کاربر مي تواند تا

حدس داشته باشد. در صورتي که تمام 13حداکثر حدس ها اشتباه باشد کاربر بازنده مي شود

نويسي برنامه مثال چند ادامه

:الگوريتم1000 تا 0توليد يک عدد بين 1.دريافت حدس کاربر 2.اگر عدد کاربر برابر عدد مطلوب بود اعالم موفقيت 3.و گرنه اعالم کوچکتر يا بزرگتر بودن به کاربر و سپس 4.

2بازگشت به بار13 به تعداد 4 تا 2انجام 5.

#include <stdio.h>#include <stdlib.h>void main(){ int x,y,i; x=rand()%1001; for(i=0;i<13;i++) { printf("\n Guess %dth number:",(i+1)); scanf("%d",&y); if (x==y) { printf("\nyou win"); break; } if(x>y) printf("\nthe number is greater than you entered"); if(x<y) printf("\nthe number is less than you entered"); } if(i==13) printf("you loss");}

rand)( 32767 تا 0 اعداد تصادفي بين rand()%1001توليد مي کند. در نتيجه

توليد مي کند. 1000 تا 0اعداد تصادفي بين

تابع

سؤال زيّر مي توان با اين 3با پاسخ به مفهوم آشنا شد:

تابع چيست؟1.

چگونه ساخته مي شود و در کجاي برنامه قرار م2.ي گيرد؟

چگونه استفاده مي شود؟3.

در اين جلسه به اين سؤال ها پاسخ داده مي شود.

تابع چيست؟؟ (1

مقدمه- تابع در رياضيات

مي توان گفت در هّر تابع در رياضيات عناصّر زيّر وجوددارد:

( f)در مثال باال نام: –( که متعلق به مجموعه اي به نام x )در مثال باال ورودي–

دامنه است.( که متعلق به مجموعه اي به نام بّرد y )مقدار بّرگشتي–

است. ) ( که ارتباط بين مقدار بّرگشتي و ضابطه تابع–

ورودي را مشخص مي کند. را y را مي گيّرد و بّر اساس ضابطه موجود، xتابع مقدار

محاسبه کّرده و بّرمي گّرداند.

RyRx

xxfy

2)(

2x

تابع چيست؟؟ )ادامه(

مفهوم تابع در زبانC مشابهت زيادي با مفهوم تابع در رياضيات دارد و در واقع

مدل کننده تابع در رياضيات است.

( ساخت تابع2

RyRx

xxfy

2)(

مقدار محاسبه شده را برمي گرداند.returnدستور

در مثال باال تابعي نوشتيم که يک ورودي اعشاري را مي گيرد و مجذور آن را برمي گرداند.

ورودي يا پارامتر ورودي مي گويند.xبه

y.هم مقدار برگشتي مي باشد

نام تابع نوع بّرگشتي (نام و نوع ورودي) }

پياده سازي ضابطه تابع با يک سّري دستورات

بّرگّرداندن مقدار بّرگشتي {

float f (float x){float y;y=x*x;return y;}

ساخت تابع )ادامه(

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

float func (float num){ float result; if (num < 0) result=-num; else result=num; return result;}

نام تابع نوع بّرگشتي (نام و نوع ورودي) }

پياده سازي ضابطه تابع با يک سّري دستورات

بّرگّرداندن مقدار بّرگشتي {

ساخت تابع )ادامه(

فّرم ديگّري از تابع مثال قبلfloat func (float num){ if (num < 0) return –num; else return num;}

ساخت تابع )ادامه(

تابعsign)x(

01

00

01

)(

x

x

x

xsign

محل قّرار گّرفتن تابع

void main(){…..…..}

#include …..#include ….……

float f (float x){float y;y=x*x;return y;}

قرار مي گيرد. include و بعد از دستورات mainقبل از

( استفاده از تابع 3

استفاده از تابع در رياضيات در واقع همان احضارتابع است.y=f)x(=3x+1 f)2(=7احضار تابع:

به دست مي y=7 قرار مي گيرد و x به جاي 2عدد آيد.

هم مي توان تابع را احضار کرد )مثال بعد(Cدر زبان

استفاده از تابع

مثالي از احضار تابع#include <stdio.h>float f (float x){float y;y=x*x;return y;} void main(){float z;

z=f(3.5);printf(“%f”,z);}

دستور احضار تابع

در اين مثال هنگام اجّراي بّرنامه زماني که به به ازاي ورودي f دستور احضار تابع مي رسيم تابع

x=3.5.محاسبه خواهد شد ريخته مي شودz( در yمقدار بّرگشتي تابع )يعني

آرگومان ورودي گفته مي شود3.5به

مثال قبل يک برنامه کامل و قابل اجرايC است.

: در اين مثال نوشته ايم که مجذور يک fتابعي به نام –

عدد را محاسبه مي کند. اين تابع را احضار کرده ايم.mainدر –

.مثال عملکرد تابع زير را توضيح دهيدfloat average (int n){ int i; float x,sum=0; for (i=0;i<n;++i) { scanf(“%f”,&x); sum+=x; }return (sum/n);}

عدد مي گيّرد و ميانگين آن را بّرمي گّرداندnتابع باال

مثال

#include <stdio.h>float average (int n){ int i; float x,sum=0; for (i=0;i<n;++i) { scanf(“%f”,&x); sum+=x; }

return (sum/n);}void main(){printf(“%f”,average(3));}

ادامه بّرنامه

بّرنامه ميانگين سه عدد را چاپ مي کند

مثال

#include <stdio.h>float average (int n){ int i; float x,sum=0; for (i=0;i<n;++i) { scanf(“%f”,&x); sum+=x; }

return (sum/n);}void main(){int p;scanf(“%d”,p)printf(“%f”,average(p));}

ادامه بّرنامه

مشابه مثال قبل . با اين تفاوت که در اينجا تعداد مقاديّر از کاربّر گّرفته مي شود.

خالصه مطالب قبل

آشنایی با مفهوم تابعطرز ساخت تابعچند مثال

مثال –تابع با بیش از یک ورودی

int max (int x, int y){ if (x>=y) return x; else return y;}

تابع ماکزیمم دو عدد را برمی گرداند. این تابع دارای دو ورودی می باشد)مشابه تابع دو متغیره در

ریاضیات(

#include <stdio.h>

int max (int x, int y)

{

if x>=y

return x;

else

return y;

}

void main()

{

int z,s;

scanf(“%d%d”,&z,&s);

printf(“%d”,max(z,s));

}

ادامه بّرنامه

نکته: تعداد و نوع آرگومانها باید با تعداد و نوع پارامتّرها یکسان باشد.

تعّریف چند تابع در بّرنامه

#include <stdio.h>long fact(int n){int i;long result=1;for (i=1;i<=n;++i) result*=i;return result;}

float pow(float x, int n){int j;float ret_val=1;for (j=0;j<n;++j) ret_val=ret_val*x;return ret_val;}

float exp(float x, int m){ int k; float res=1;for (k=1;k<=m;++k)res+=pow(x,k)/fact(k);return res;}void main(){ printf("%f",exp(2,10));}

(1ادامه ) (2ادامه )

توضیح بّرنامه

در این برنامه از سه تابع fact، pow و exp استفاده شده است. این نشان می دهد می توان

در یک برنامه از چند تابع استفاده کرد.

توضیح برنامه را با بررسی عملکرد این سه تابع آغاز می کنیم.

factتابع

long fact(int n)

{

int i;

long result=1;

for (i=1;i<=n;++i)

result*=i;

return result;

}

این تابع عددn را می گیّرد و n!.را حساب می کند

نکته: به ازایn های منفی خطایی گّرفته نمی شود اما

بّرگشت داده می 1نتیجه غلط شود.

powتابع

float pow(float x, int n)

{

int j;

float ret_val=1;

for (j=0;j<n;++j)

ret_val=ret_val*x;

return ret_val;

}

و عددx عدد حقیقی powتابع را می گیّرد و n صحیح

را محاسبه می کند.

nx

expتابع

float exp(float x, int m){ int k; float res=1;for (k=1;k<=m;++k)res+=pow(x,k)/fact(k);return res;}

!...

!3

3

!2

2

!1

1

!0

0

m

xxxxxe

mx

m و عدد صحیح x ، عدد حقیقی expتابع را می گیّرد و رابطه باال را محاسبه می کند.

عملکّرد بّرنامه

:عملکّرد بّرنامه شّروع می شود.mainاجّرای بّرنامه از 1. شّروع به اجّرا exp موجب می شود تابع exp(2,10)وجود 2.

کند. با پارامتّرهای مختلف احضار fact و pow توابع expدر تابع 3.

می شوند و محاسبات خود را انجام می دهند. مثال به احضار می pow(2,1) و exp ، fact(1) در تابع k=1ازای

شوند. محاسبه عبارت زیّر است:exp(2,10)نتیجه احضار تابع 4.

!10...

!3

3

!2

2

!1

1

!0

0 10xxxxxex

تقسیم بندی توابع

می توان از جنبه های مختلف توابع راتقسیم بندی کّرد:

ورودی: با ورودی –بی ورودی–مقدار بّرگشتی: با بّرگشتی- بی بّرگشتی–نوشته شده توسط کاربّر-کتابخانه ای–

تقسیم بندی تابع از نظّر ورودی

یک تابع می تواند دارای ورودی باشد)مانند مثالهایی کهتاکنون گذشت( و می تواند بدون ورودی باشد )مثال

صفحه بعد(

#include <stdio.h>#include <conio.h>int check_password ( ) یا int check_password (void){ char c1, c2,c3; c1=getche(); c2=getche(); c3=getche(); if (c1==‘A’ && c2==‘B’ && c3==‘C’) return 1; else return 0;}void main(){ int s=check_password(); if (s==1) printf(“Correct password”); else printf(“Incorrect password”);}

،گذاشته می شود. در داخل پّرانتز ) (بّرای تابع بی ورودی نوشته می شود.voidیا چیزی نمی نویسیم و یا کلمه

بگذاریم.)(هنگام احضار تابع نیز باید

تقسیم بندی از نظّر مقدار بّرگشتی

یک تابع می تواند یک مقدار بّرگّرداند)مانند مثالهایی که تا کنون گذشت( یا هیچ مقداری را بّرنگّرداند )مثال زیّر(

#include <stdio.h>void ave (int n){ float x,sum=0;

int i;for (i=0;i<n;++i){

scanf("%f",&x);sum+=x;

}printf("%f",sum/n);

}void main ( ){ ave(3);}

ندارد.returnتابع بدون برگشتی نوشته می شود. voidدر بخش نوع برگشتی

–تابع بی ورودی –بی 2مثال بّرگشتی

#include <stdio.h>

void header ( ) یا void header(void)

{

printf(“This program is written by Rouhollah Dianat”);

printf(“\nAs a part of computer programming course”);

printf(“\nfall 2006”);

}

void main()

{

header();

.....

......

}

( تابع بی ورودی - بی 3مثال بّرگشتی

#include <stdio.h>void ave ( ) { int i,n; float x,sum=0; printf("\nEnter a number:"); scanf("%d",&n); for (i=0;i<n;++i) {

scanf("%f",&x); sum+=x;

} printf("%f",sum/n);

}

void main (){ ave( );}

تابع بی ورودی بی برگشتی بنویسید که میانگین چند عدد را محاسبه کند.

mainتابع است

: نکته main درمی یابیم که در واقع mainبا نگاهی به بخش

خود یک تابع است. تابعی بی ورودی بی برگشتیبه بیان دقیق تر:

از چند تابع تشکیل می شود. نام Cیک برنامه در زبان باشد. خاصیت این تابع mainیکی از این توابع باید

این است که اجرای برنامه از آن شروع می شود.

نکته : می توانmain را به صورت تابعی با مقدار برگشتی تعریف کرد:

int main) ({............return 0;}

به سیستم عامل برگشت داده می mainمقدار برگشتی شود.

نکته: تابعmain.حتی می تواند ورودی داشته باشد )تحقیق(

نکته : اگر تابعmain در برنامه وجود نداشته باشد:

اعالم می شود. در واقع یکی از وظایف linkیک خطای –linker پیوند دادن اجزای مختلف برنامه برای رسیدن به

وجود mainیک برنامه قابل اجرا می باشد. زمانی که نمی تواند محل شروع اجرای linkerنداشته باشد

برنامه را تشخیص دهد و در نتیجه خطا اعالم می کند.

توابع نوشته شده توسط کاربّر-توابع کتابخانه ای

توابع نوشته شده توسط کاربر همان توابعی است کهتاکنون نوشته ایم.

توابع کتابخانه ای: در زبانC برای سهولت کار برنامه توابع زیادی از قبل تهیه شده اند و Cنویس در زبان

برنامه نویس می تواند از آنها استفاده کند. جزئیات این توابع در فایل هایheader متعدد قرار گرفته

است.

ای کتابخانه توابع

:انواع توابع کتابخانه ای و...printf، scanf، getche،getchتوابع ورودی-خّروجی: –

header file اغلب :stdio.h ، conio.h

)بّرای pow )بّرای محاسبه قدر مطلق( ،absتوابع ریاضی: – ،sin، cos، tan، sinh )محاسبه رادیکال( sqrtمحاسبه توان( ،

cosh، tanh،asin، acos، atan، exp محاسبه( ) ،log ( 10 در مبنای log )log10( ، e)لگاریتم در مبنای

header file: math.h و ...)در بخش fread، fwrite، fopen توابع بّرای کار با فایل ها: –

آشنایی با فایل ها توضیح داده خواهند شد(.header file: stdlib.h

کارهای گّرافیکی، کاربا پورت ها، نوشتن بّرنامه اسمبلی و......–

xe

ای کتابخانه توابع

و همچنین Cنکته: در کتاب های برنامه نویسی help محیط های نرم افزاری در مورد ورودی و

مقدار برگشتی توابع و نوع آنها و همچنین عملکرد آنها توضیح داده شده است.

نشان داده شده است.sin بّرای تابع borland c محیط helpدر شکل است. تابع یک ورودی از نوعdoubleمالحظه می شود که نوع مقدار بّرگشتی

double دارد و بّرای محاسبه sin.به کار می رود header file این تابع هم math.h.است

ای کتابخانه توابع ادامه

:مثال#include <stdio.h>

#include <math.h>

void main ()

{

printf("%f",sin(3.141));

}

توابع کاربّرد

مثال هايي از كاربّرد توابع

1 مثال

مي خواهيم برنامه اي بنويسيم كه مشتق تابع دلخواهf)x( را در نقطه x0.محاسبه كند

روش حل:

كوچك مي توان نوشت:hبه ازاي

اکنون برنامه ای می نویسیم که عبارت باال را محاسبه کند )صفحه بعد(

h

xfhxfxf h

)()(lim)( 00

00

h

xfhxfxf

)()()( 00

0

x=1محاسبه مشتق در

#include <stdio.h>#include <math.h>float f(float x){

return (pow(x,2)+1);}

float f_prime(float x0){

float res;float h=0.0001;res=(f(x0+h)-f(x0))/h;return res;

}

void main(){ printf("%f",f_prime(1));}

12 x

مشتق دوم

h

xfhxfh

xfhxfxf h

)()(

)()(lim)(

00

0000

در xsinx+1محاسبه مشتق دوم تابع x=3نقطه

#include <stdio.h>#include <math.h>float f(float x){

return (x*sin(x)+1);}

float f_prime(float x0){

float res;float h=0.0001;res=(f(x0+h)-f(x0))/h;return res;

}

float f_second(float x0){ float res; float h=0.0001; res=(f_prime(x0+h)-f_prime(x0))/h; return res;}

void main(){ printf("%f",f_second(3));}

نکته : روش های تحلیلی و عددی

معموال محاسبه مشتق ، با استفاده از تعریف مشتق و یکسری قضایا انجام می شود. به عبارت دیگر مشتق با استفاده

از استدالل و اثبات محاسبه می شود. به این گونه روش ها گفته می شود. حل تحلیلیروش های

در روشی که در این برنامه استفاده شد مشتق را با جایگذاریمقدار و انجام یک سری محاسبات روی آنها به دست آوردیم.

گفته می شود.حل عددیاصطالحا به این روش ها، روش های

روش های عددی به آسانی قابل پیاده سازی توسط کامپیوترهستند.

( به دست آوردن ریشه 2مثال معادله

تابعf)x( مفروض است. می خواهیم ریشه های معادله f)x(=0 .را تعیین کنیم

روش های تحلیلی محاسبه ریشه تنها برای دسته محدودیاز توابع ارائه شده اند.

در مقابل روش های عددی قادرند ریشه معادله را تا هردقتی محاسبه کنند.

یکی از این روش ها نیوتن-رافسون است که در این مثالبه پیاده سازی این روش می پردازیم.

روش نیوتن-رافسون

با استفاده از این روش می توان یک ریشه معادله را بهدست آورد. مراحل روش به این صورت است:

به عنوان تقریب اولیهx0انتخاب یک نقطه دلخواه –()x0(x0,f)رسم خط مماس بر نقطه ––x1نقطه تقاطع خط و محور به عنوان تقریب بعدی ()x1(x1,f)با رسم خط مماس بر –

می رسیمx2به تقریب ......

شرایط خاصی را ارضا کند این fمی توان ثابت کرد در صورتی تابع تقریب ها به سمت ریشه همگرا می شود.

x0x1x2

r

ادامه

:()x0(x0,f)معادله خط مماس بر

نیز می گذر خواهیم (x1,0)با توجه به اینکه این خط از نقطه داشت:

))(()( 000 xxxfxfy

x0x1x2

r

)(

)(

))(()(0

0

001

0100

xf

xfxx

xxxfxf

)(

)(

1

112 xf

xfxx

خواهیم داشت:x2به همین ترتیب برای

و در حالت کلی:

به تقریب بهتری دست می یابیم.nبا افزایش

)(

)(1

n

nnn xf

xfxx

ادامه

برنامه ای بنویسید که ریشه معادلهf)x(=xsinx-1 3 را تا رقم اعشار محاسبه کند.

رقم اعشار: 3)نکته : دقت

float root(){ float x0=1,x1; float d=fabs(x0); while (fabs(f(x0))>=0.5e-3) { x1=x0-f(x0)/f_prime(x0); x0=x1; } return x0;}void main(){ printf("%f",root());}

include <stdio.h<#include <math.h<#

float f(float x){float y=x*sin(x)-1;return y;

}float f_prime(float x0){float res;float h=0.001;res=(f(x0+h)-f(x0))/h;return res;

}

310*5.0)( nxf

نكات مثال قبل

fabsمحاسبه قدر مطلق اعداد حقيقي : براي محاسبه قدر مطلق اعداد صحيح به كار مي رود.absتابع

0.5e-3 اصطالحا نماد علمي نمايش اعداد خوانده مي شود و 5.0*310برابر است با :

-محاسبه انتگّرال3مثال

برنامه ای بنویسد که حاصل را محاسبه کند.بیان یک روش عددی:

xi را به نقاط متساوی الفاصله [a,b]بازه

تقسیم می کنیم.مجموعه مساحت ذوزنقه های تشکیل شده

در شکل مقابل می تواند تقریبی از انتگرال :باال باشد

b

a

dxxf )(

x0=a x1 x2 xn-1 xn=b

f(x0)

f(x1)

f(x2)

f(xn-1)f(xn)

))()(2...)(2)(2)((2

))()((2

))()((2

...))()((2

))()((2

1210

1122110

nn

nnnn

xfxfxfxfxfh

xfxfh

xfxfh

xfxfh

xfxfh

I

محاسبه

for (i=1;i<n;++i){

p=p+h;sum=sum+2*f(p);

}sum=sum+f(b);return(h/2*sum);

}

void main(){ printf(“%f”,integral(1,3,10));}

#include <stdio.h>#include <math.h>float f (float x){ return x*sinx+1;}

float integral(float a, float b,int n)

{

int i;

float p=a;

float sum=f(p);

float h=(b-a)/n;

3

1

)1sin( dxxx

نكته: متغیّرهای محلی و سّراسّری

برنامه زیر را در نظر بگیرید. #include <stdio.h>void func (int z){

int y; y=z*z;}void main (){int y;y=5;func (6);printf("%d",y);}

سوال: مقدار چاپ شده بّر روی مانیتور چقدر است:36 چاپ می شود نه main تعّریف شده درتابع y یعنی مقدار 5عدد

است.func تعّریف شده در y که مقدار

ادامه

بّرنامه زیّر را در نظّر بگیّرید: 2مثال ) #include <stdio.h>

void func (int z) { int y; y=z*z; }

void main (){func(3);printf("%d",y);}

این بّرنامه مواجه با خطای کامپایلی زیّر خواهد شد:y: undeclared identifier

را y متغیّری به نام main تعّریف نشده است. به عبارت دیگّر yیعنی نمی شناسد.

ادامه

با یاد گرفتن بحث متغیرهای محلی و سراسری می توان به سؤاالتی از این قبیل پاسخ داد.

متغیّرهای محلی و سّراسّری

دو دسته متغیر وجود دارد.Cدر زبان –( محلیlocal. )( عمومی-سراسریglobal.)

localمتغیّرهای

متغیرهایlocal متغیرهایی هستند که در داخل توابع تعریف شده اند.

.این متغیرها دارای ویژگی های زیر هستندتنها در داخل تابعی که تعریف شده اند معتبرند.– هنگام اجرای تابع ایجاد می شوند و هنگام خاتمه اجرا –

از بین می روند. همه متغیرهایی که تاکنون در مثال ها دیده ایم

هستند.localمتغیرهای

مثال

#include <stdio.h<void func (int z)}int y;

y=z*z;{

void main() }func(3);printf("%d",y);

{

محلی است. در نتیجه تنها زمانیfunc ، yدر تابع در حال اجّراست وجود دارد. و وقتی که func که

تمام می شود از بین می رود. funcاجّرای اشتباه استprintf(“%d”,y)به همین علت دستور

آن را چاپ کند. printf ای وجود ندارد که yچون

ادامه

#include <stdio.h>void func (int z){

int y; y=z*z;}void main (){int y;y=5;func (6);printf("%d",y);}

در این مثال مقداری که چاپ می شود مقدار متغیّر Y تعّریف شده در main است و نه yتعّریف شده

فقط در محدوده func تابع y. چون funcدر تابع شناخته main شناخته شده است و بّرای funcخود

شده نیست.

(globalمتغیّرهای سّراسّری )

تعّریف: به متغیّرهایی که خارج از توابع تعّریف می شوند متغیّرهای می گویند.globalسّراسّری یا

#include <stdio.h<int num=4;int func1 (int x){ num+=x; return num;}int func2 (int x){ num-=x; return num;}void main ( ){ printf("%d", func1(3)); printf("\n%d", func2(3));}

است. چون در خارج توابع تعّریف شده.num globalدر بّرنامه روبّرو، متغیّر اعتبار دارد.main و func1، func2این متغیّر در

عملکّرد بّرنامه: می شود.num=4ابتدا ••func1(3) اجّرا می شود. مقدار num شده و چاپ می شود.7 بّرابّر شده و چاپ می شود. 4 بّرابّر num اجّرا می شود. مقدار func2(3)سپس • صفّر num نوشته می شد، مقدار int num، تنها int num=4اگّر به جای •

می شد.

:globalدو ویژگی متغیّرهای ، از نقطه ای که تعّریف می شوند تا انتهای localبّرخالف متغیّرهای •

بّرنامه معتبّرند.اگّر هنگام نعّریف مقداری به آنها داده نشود مقدارشان صفّر در نظّر •

گّرفته می شوند.

Recursiveتابع بازگشتی )function)

.تابعی است که خودش را احضار کند در همه مثال هایی که تاکنون داشتیم احضار یک

تابع توسط تابعی دیگر صورت می گیرد. در زبان C این امکان وجود دارد که یک تابع توسط خودش

احضار شود)مثال بعد(.

1مثال

#include <stdio.h>long fact(int n){ if (n==0) return 1; else

return (n*fact(n-1));}void main(){

printf("%d",fact(2));}

، یک تابع بازگشتی است. funcتابع چون خودش را احضار کّرده است.

توضیح عملکّرد بّرنامه

#include <stdio.h>long fact(int n){ if (n==0) return 1; else

return (n*fact(n-1));}void main(){

printf("%d",fact(2));}

func(2)n=2return (2*fact(1))

func(1)n=1return (1*fact(0))

func(0)n=0return 1

11

mainبه 2بّرگشت

نکته

نکته :ایده ای که ما را به برنامه بازگشتی رساند فرمول زیربود:

یا:fact)n(=n*fact)n-1(

فرمول باال به روشنی مفهوم بازگشت را درخود دارد. )برای n-1 به ازای fact باید همان تابع n به ازای factمحاسبه

محاسبه شود(.

)!1(*! nnn

نکته

:در هر تابع بازگشتی دو رکن اصلی زیر وجود داردقانون )فرمول( بازگشت: چگونگی بازگشت را مشخص می کند. در مثال قبل –

بود.!)n!=n*)n-1قانون بازگشت شرط خاتمه: مشخص می کند بازگشت چه زمانی متوقف می شود. در مثال –

شرط خاتمه بود.n=0قبل

برای بتوانیم یک برنامه بازگشتی بنویسیم باید ابتدا این دو رکن را به دستآوریم. بعد از انجام این کار نوشتن برنامه های بازگشتی، به سادگی امکان

پذیر است.

01

0)1(*)(

n

nnfactnnfact

2مثال

برنامه ای بنویسید که را به صورت بازگشتی محاسبهکند.

n عدد صحیح غیر منفی و x .اعشاری است

بدین منظور بنویسیم powفرض کنید می خواهیم تابعی به نام :

ابتدا دو رکن بازگشت را مشخص می کنیم: :قانون بازگشت : شرط خاتمهn=0

nx

1* nn xxx

01

0)1,(*),(

n

nnxpowxnxpow

2بّرنامه مثال

#include <stdio.h>float pow(float x, int n){

if (n==0)return 1;

elsereturn (x*pow(x,n-1));

}

void main(){

printf("%f",pow(2.5,2));}

3مثال

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

داریم(a تا n)تعداد )rad)a,nفرض کنید می خواهیم تابعی بازگشتی به نام

بنویسیم که این کاررا انجام دهد.

: قانون بازگشت و شرط خاتمه

..... aaa

1

1)1,(),(

na

nnaradanarad

3بّرنامه مثال

#include <stdio.h>#include <math.h>float rad(float a , int n){

if (n==1)return sqrt(a);

elsereturn sqrt(a+rad(a,n-

1));}

void main(){

printf("%f",rad(2,3));}

از توابع کتابخانه ای sqrtنکته: تابع است.math.h آن header fileاست و

این تابع بّرای محاسبه رادیکال استفاده می شود.

4مثال

.برنامه ای بازگشتی بنویسید که ب.م.م دو عدد را محاسبه کند)Common Divisor Greatest )GCDب. م .م :

a بنویسیم که ب.م.م دو عدد )gcd)a,bمی خواهیم تابعی به نام را محاسبه کند.bو

روش معمول محاسبه ب.م.م، روش پلکانی است.

در این مثال:

ب.م.م (=6,3 )ب.م.م (=9,6 )ب.م.م (=33,9 )ب.م.م (3,0=)3

33 9 6 3 0

3

27

1

6

2

6

-ادامه4مثال

:با دقت در رابطه صفحه قبل می توان گفتgcd)33,9(=gcd)9,33%9(

)%: باقی مانده(به این ترتیب می توان قانون بازگشت و شرط خاتمه را به

صورت زیر به دست آورد:

0

0)%,gcd(),gcd(

ba

bbabba

4بّرنامه مثال

#include <stdio.h>int gcd(int a , int b){

if (b==0)return a;

elsereturn gcd(b,a%b);

}

void main(){

printf("%d",gcd(33,9));}

5مثال

عملکّرد بّرنامه زیّر را توضیح دهید.#include <stdio.h>long fact(int n){ long y; if (n==0) y=1; else { y= n*fact(n-1); printf(“%d”,y); } return y; }void main(){printf("%d",fact(2));}

fact(2)n=2y=2*fact(1)

y=22چاپ عدد

return 2

fact(1)n=1y=1*fact(0)

y=11چاپ عدد

return 1;

1

fact(9)y=1return 1;

1

Towers of-بّرج های هانوی )6مثال hanoi)

بازی برج های هانوی: داریم. می خواهیم A و تعدادی دیسک روی میله C و A، Bسه میله

انتقال دهیم . به C به B و با کمک میله Aاین دیسک ها را از نحوی که هیچ گاه دیسک بزگتر بر روی کوچکتر قرار نگیرد.

در اینجا می خواهیم برنامه بازگشتی بنویسیم که این بازی را پیاده کند.

4

A CB

3

2

1

بّرج های هانوی-ادامه

هدف: جابجاییnمبدأ از میله دیسک( A به میله )مقصد (C با کمک گرفتن از میله )کمکی( B.)

می خواهیم برنامه ما یک سری پیغام به صورت زیر چاپکند:

– move disk from A to C– move disk from A to B– .....

پیاده سازی بازی را با تابعی بازگشتی به نامmove انجام دهیم:

move (int n,char source,char destination, char spare ) تا 1دیسک ها را ازn( .1 شماره گذاری می کنیم

کوچکترین(

ادامه

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

سری جابجایی به وضعیت زیر رسیده ایم: جابجا کرده باشیم.B دیسک را به n-1یعنی

با این فرض بقیه مراحل به صورت زیر است:

منتقل کن.C ام را به nدیسک جابجاC به Bدیسک میله را از

کن.4

A CB

3

2

1

قانون بازگشت و شّرط خاتمه

در نتیجه: جابجاییn دیسک از A به C با کمک B:

C با کمک B به A دیسک از n-1جابجایی –C به A ام از nانتقال دیسک –A با کمک C به B دیسک از n-1جابجایی –

قانون بازگشت به صورت زیّر به عبارت بهتّر move (n,source,destination,spare)=

– move(n-1,source,spare,destination)– move(1,source,destination,spare)– move(n-1,spare,destination,source)

شّرط خاتمه: اگّرn=1 باشد دیسک را از source به destination.منتقل کن

بّرنامه بّرج های هانوی

#include <stdio.h>void move(int n ,char source,char destination,char spare ){

if (n==1)printf("\nMove top disk from %c to %c",source,destination);

else{

move(n-1,source,spare,destination);printf("\nMove top disk from %c to %c",source,destination);move(n-1,spare,destination,source);

}}void main(){

move(3,'A','C','B');}

مزایا و معایب بّرنامه های بازگشتی

:مزایاخواناتر بودن–اگر قانون بازگشت به دست آورده شود نوشتن یک –

برنامه به صورت بازگشتی بسیار ساده تر از معادل غیر بازگشتی آن است.مثال معادل غیربازگشتی برنامه برج

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

:معایبمصرف حافظه بیشتری دارند و سرعت اجرای آنها هم –

)بررسی به عنوان تحقیق(معموال کمتر است.

محل قّرار گّرفتن توابع

در زمانی که تنها یک تابع داشتیم محل آن قبل ازmain و بعد از include.ها بود

هنگامی که چند تابع وجود داشته باشند ؟:ضابطه کلی

یک تابع قبل آنکه احضار شود بایستی تعریف شده –باشد.

1مثال

#include <stdio.h>long fact(int n){int i;long result=1;for (i=1;i<=n;++i) result*=i;return result;}

float pow(float x, int n){int j;float ret_val=1;for (j=0;j<n;++j) ret_val=ret_val*x;return ret_val;}

float exp(float x, int m){ int k; float res=1;for (k=1;k<=m;++k)res+=pow(x,k)/fact(k);return res;}

void main(){ printf("%f",exp(2,10));در این برنامه ضابطه گفته شده در صفحه قبل رعایت شده .{

، تعریف شده است.exp قبل از احضار در powمثال تابع تعریف شده است. main قبل از احضار در expیا تابع

#include <stdio.h>

long fact(int n){int i;long result=1;for (i=1;i<=n;++i) result*=i;return result;}

float pow(float x, int n){int j;float ret_val=1;for (j=0;j<n;++j) ret_val=ret_val*x;return ret_val;}void main(){ printf("%f",exp(2,10));}

float exp(float x, int m){ int k; float res=1;for (k=1;k<=m;++k)res+=pow(x,k)/fact(k);return res;}

.رعایت نشده در این برنامه ضابطه گفته شده احضار شده در حالی که قبل از آن تعریف نشده است.exp در powتابع

در این گونه موارد در اکثر کامپایلر ها با خطای کامپایلی زیر روبرو می شویم:Call to undefined function pow

( شده بدون اینکه تعریف شود.call، احضار ) powیعنی تابعی به نام

2مثال

ادامه

برای سهولت بیشتر در نوشتن برنامه ها، در زبانC اجازه داده شده است که تابع بعد از محل احضار تعریف شود.

تابع را قبل از احضار ذکر کنیم.خط اولمشروط بر اینکه می فهمد که چنین تابعی در برنامه complierبه این ترتیب

وجود دارد وهنگامی که در جایی تابع احضار شد می داند چنین تابعی در برنامه وجود دارد و در نتیجه پیغام خطایی

نمی دهد. گفته می شود.عنوان تابعبه این خط اصطالحا

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

مثال

#include <stdio.h>long fact(int n);float pow(float x, int n);

float exp(float x, int m)

{ int k;

float res=1;

for (k=1;k<=m;++k)

res+=pow(x,k)/fact(k);

return res;}

float pow(float x, int n){int j;float ret_val=1;for (j=0;j<n;++j) ret_val=ret_val*x;return ret_val;}

long fact(int n){int i;long result=1;for (i=1;i<=n;++i) result*=i;return result;}

void main(){ printf("%f",exp(2,10));}

اعالن کّرده ایم exp تعّریف شده اند اما چون آنها را قبل از exp بعد از fact و powدر این مثال توابع مشکلی پیش نمی آید.

ادامه

تعریف تابع(Function definition) نوشتن کامل تابع : اعالن تابع(Function declaration)نوشتن خط اول تابع:

اعالن شود يا تعريفهر تابع قبل از احضار مي بايست يا شده باشد.

مزایای استفاده از توابع

نوشتن بّرنامه های خواناتّر : تقسیم بّرنامه بهچند تابع سبب می شود که فهم بّرنامه آسان

تّر شود.

امکان نوشتن پّروژه های بزرگ به صورتساده تّر و سّریع تّر.

تقسیم پّروژه به چند بخش.–انجام هّر بخش توسط یک تیم مجزا . مثال حاصل –

کار هّر تیم، می تواند یک تابع باشد.در کنار هم قّرار دادن توابع و استفاده از آنها .–

توصیه هایی جهت نوشتن بّرنامه های خوانا

. استفاده از توابع در نوشتن بّرنامه1

. انتخاب نام های مناسب و با مسمی بّرای متغیّرها و توابع2 یک factمثال بّرای تابعی که فاکتوریل را حساب می کند –

نام مناسب است.بّرای متغیّری که حاصل جمع چند عدد را نگاه می دارد نام –

sum.مناسب است

ادامه

. دندانه ای کّردن :رعایت یک تّرتیب خاص در نوشتن 3خطوط بّرنامه

مثال دستورات داخل تابع با کمی فاصله نسبت به خط اول –تابع قّرار گیّرند.

void main)(}

int x; x=4;

{دستورات داخل شّرط و حلقه ها با کمی فاصله نسبت به –

خود دستورات شّرط و حلقه قّرار گیّرند.if (x==0) return 1;

ادامه

( بّرای comment. نوشتن توضیح )4دستورات

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

زبان معمولي خود بنویسیم.

commentنوشتن

#include <stdio.h>long fact)int n( //This function compute factorial of n{

if )n==0( //stop condition

return 1; else

return n*fact)n-1(; //Recursion formula}void main)({

printf)“%d”,fact)2((;}

commentنوشتن

*/ و /* اگر توضیحات ما بیش از یک خط باشد از استفاده می کنیم.

/*this program

is written by .....

Date: 1384/9/13 */

قرار گرفته اند */ و /*کامپایلر خطوطی را که بین را در نظر نمی گیرد.

آرايه ها

آرایه هاضرورت وجود آرایه ها– تعریف آرایه–مثال هایی از کاربرد آرایه ها –آرایه ها به عنوان ورودی و برگشتی تابع–(constantثابت )–

ضّرورت وجود آرایه ها

عدد را بگیرد و میانگین و واریانس آنها را محاسبه کند.5مثال: برنامه ای بنویسید که

نقطه ، و....و از روابط زیر به دست می آیند:nنکته: میانگین و واریانس

اگر تنها هدف به دست آوردن میانگین بود به راحتی می توانستیم آن را انجام دهیم:

float x;sum=0;for )i=0;i<5;++i({ scanf)“%f”,&x(; sum+=x;}ave=sum/5;

n

xn

ii

1

0n

xn

ii

1

0

2

2

)(

0x1x1nx

ادامه

در اینجا برای به دست آوردن واریانس نیاز به همهxi ها داریم. اما در کد نوشته شده قبل تنها آخرین عدد را داریم و بقیه مقادیر از بین رفته

اند.در نتیجه ناچاریم کد خود را به صورتی مثل این بنویسیم:

float x0,x1,x2,x3,x4;float ave,var;scanf)“%f%f%f%f%f”,&x0,&x1,&x2,&x3,&x4(;ave=)x0+x1+x2+x3+x4(/5;var=)pow)x0-ave,2(+pow)x1-ave,2(+pow)x2-ave,2(+pow)x3-

ave,2(+pow)x4-ave,2((/5;

ادامه

به این ترتیب کد نامناسبی خواهیم داشت. این موضوع به عدد( بیشتر نمود پیدا 1000ازای داده های زیادتر )مثال

می کند.

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

به طور كلي آرايه ها در مواردي به كار برده مي شوند كهبا مجموعه اي از داده هاي هم نوع سروكار داشته باشيم.

تعّريف آرايه

يادآوري: با دستور تعريف متغير مثلint x; مكاني در به برنامه تخصيص داده مي شد.xحافظه به نام

در زبانC اگر بنويسيم int x[5]; پنج مكان مجاور هم در ، اين مكان ها به حافظه به برنامه تخصيص داده مي شود.

ناميده مي شوند.x[4] و x[0]، x[1]، x[2]صورت اصطالحا مي گوييم آرايه اي به نامx از نوع ، int 5 و با

عنصر تعريف كرده ايم. اصطالحا انديس آرايه گفته مي شود.4و 3، 2 ،1، 0به به همين ترتيب مي توان آرايه هايي ازانواع ديگر مثل

float، char، short .و ....داشت

1مثال

Void main( ){ float num[3];

num[0]=1.2; num [1]=2;

num[2]=3.4; printf(“%f”,num[1])}

Void main( )

{

char c[4];

c[2]=‘A’;

c[0]=‘d’;

c[1]=‘D’;

c[3]=getche();

}

2مثال

#include <stdio.h>void main) ({ int i; int x[4]; for )i=0;i<4;++i( scanf)“%f”,&x[i](; for )i=0;i<4;++i( printf)“\t%f”,x[i](;}

قرار می دهد و حلقه xحلقه اول مقادیر را دریافت می کند و در آرایه دوم این مقادیر را چاپ می کند.

ادامه

عدد5 ( محاسبه ميانگين و واريانس 3مثال #include <stdio.h>#include <math.h>void main( ){ float x[5]; float sum=0 , ave; int I; for (i=0;i<5;++i) { scanf(“%f”,&x[i]); sum+=x[i]; }ave=sum/5;var=0;for (i=0;i<5;++i) var+=pow (x[i]-ave,2)/5; printf(“The average=%f”,ave);Printf(“The variance=%f”,var) }

ادامه

مقدار را از کاربّر دریافت کّرده و آنها 40( بّرنامه ای بنویسید که 4مثال در یک آرایه بّریزد و سپس ماکزیمم مقادیّر و اندیس عنصّر ماکزیمم را

محاسبه کند.

#include <stdio.h>void main(){ int i;

float x[40];float max;int max_index;for (i=0;i<40;++i){ printf("Enter number %dth:",(i+1));

scanf("%f",&x[i]);}max=x[0];max_index=0;for (i=1;i<40;++i)

if (x[i]>max){

max=x[i];max_index=i;

}printf("\nThe maximum=%f",max);printf("\nAnd its index=%d",max_index);

}

ادامه

عدد از کاربر بگیرد آنها را به صورت 10( برنامه ای بنویسید که 5مثال صعودی مرتب کرده و چاپ کند.

برنامه از دو بخش تشکیل شده است:دریافت اعداد

مرتب کردن آنها دریافت اعداد را می توان با تعریف یک آرایه و نوشتن قطعه برنامه 1.

ای به صورت زیر انجام داد:float x[10];int i;for )i=0;i<10;++i( scanf)“%f”,&x[i](;

ادامه

گفته sorting. به مسئله مرتب سازی اصطالحا 2می شود. برای مرتب سازی روش های متعددی

وجود دارد. مانند :bubble sort( ،)مرتب سازی حبابیquick sort،

merge sort.....و که یکی از ساده ترین bubble sortدر این مثال از

آنهاست استفاده می شود.

Bubbleبّرای مّرتب سازی صعودی sort

ابتدا دو عنصر اول و دوم آرایه با هم مقایسه می شوند.اگر عنصر اول از دومبزرگتر بود جای دو عنصر عوض می شود. سپس عناصر دوم و سوم مقایسه می

شوند و مشابه قبل تعویض مکان در صورت لزوم انجام می گیرد. همین کارها ، و....انجام می شود تا به انتهای آرایه برسیم. 5 و 4، 4 و 3برای عناصر

زمانی که به انتهای آرایه برسیم ماکزیمم مقادیر در آخرین مکان آرایه قرار گرفتهاست و به عبارت دیگر

زمانی که یک باراز ابتدا تا انتهای آرایه پیمایش شود عنصر آخر می شود. در مرحله بعد این پیمایش و اعمال گفته شده روی عناصر اول تا یکی مانده به

آخر انجام می شود و در نتیجه : عنصر مرتب می شوند. 2با دو بار پیمایش

در مرحله بعد پیمایش از ابتدا تا عنصر دوتا مانده به آخر آرایه انجام می شود و درنتیجه:

با سه بار پیمایش سه عنصر مرتب می شود. ، به این ترتیب اگر آرایه n عنصری باشد با n-1 پیمایش ، کل آرایه مرتب می

شود.

تعویض دو مقدار

فرض کنید دو متغیرx=23 و y=34 داشته باشیم و بخواهیم مقدار آنها را با هم تعویض کنیم.

با تعریف متغیری به نامtemp و نوشتن قطعه کد زیر می توان این کار را انجام داد:

float temp;temp=x;x=y;y=temp;

5بّرنامه مثال

#include <stdio.h>void main(){ int i,j;

float A[10];float temp;for (i=0;i<10;++i)

scanf("%f",&A[i]);for (i=0;i<9;++i)

for (j=0;j<9-i;++j)if (A[j]>A[j+1]){

temp=A[j];A[j]=A[j+1];A[j+1]=temp;

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

printf("\n%f",A[i]);}

مقدار دهی به آرایه ها

سه روش برای مقدار دهی به آرایه ها وجوددارد: با دستورات ورودی مثلscanf یا getche:

ch[0]=getche)(;

scanf)“%d”,&x[2](;:مقدار دهی مستقیم

ch[0]=‘a’;

x[2]=23;)مقداردهی هنگام تعریف: )صفحه بعد

مقداردهی هنگام تعّریف

می توان آرایه ها را )تنها(هنگام تعریف به صورتزیر مقداردهی کرد:

int x[3]={2,3,-5};

قرار می x[3]- در 5 و x[1] در x[0]، 3 در 2در اینجا گیرد.

مثال های دیگر:float f[2]={0.34,4.33};

char ch[4]={‘a’,’d’,’x’,’v’};

چند سوال

} { اگر در مقداردهی هنگام تعریف، تعداد مقادیر نوشته شده داخلاز اندازه مشخص شده برای آرایه بیشتر باشد خطا اعالم می شود.

int x[2]={3,4,6,7,8}:اگر تعداد مقادیر کمتر باشد، بقیه صفر در نظر گرفته می شوند

int x[3]={3,4} می شود. x[2]=0در اینجا

مثال دیگر:int x[100]={0}

همه مقادیر صفر می شوند. )این روشی برای صفر کردن همه عناصر آرایه است(.

:اگر بنویسیمint x[ ]={2,3} در نظر گرفته می شود. 2 اندازه آرایه

يك نكته

Int i=8;

Int x[i];

اندازه آرايه بايد يك عدد ثابت باشد. بنابراين نوشتن به صورت باال نادرست است.

آرایه ها به عنوان ورودی و بّرگشتی توابع

آرایه ها مانند سایر متغیرها می توانند ورودی یابرگشتی تابع باشند.

آرایه به عنوان ورودی تابع

: تابعی بنویسید که یک آرایه را بگیرد و ماکزیمم آن را برگرداند:6مثال ورودی: آرایه برگشتی: یک عدد

float max)float x[10]({

int i;float max=x[0];for )i=1;i<10;++i(

if )x[i]>max(max=x[i];

return max;}

6بّرنامه کامل مثال

#include <stdio.h>float max(float x[10]){

int i;float max=x[0];for (i=1;i<10;++i)

if (x[i]>max)max=x[i];

return max;}

void main(){

int i;float A[10];for (i=0;i<10;++i)

scanf("%f",&A[i]);

printf("\nThe maximum=%f",max(A));}

(Constantثابت )

،در بسیاری مواقع نیاز به کار با مقادیر ثابت در برنامهپیش می آید و این مقادیر ممکن است چند بار در

در مثال قبل 10برنامه تکرار شوند. مانند عدد عدد را 20اگر در مثال قبل بخواهیم ماکزیمم فرضا

تبدیل کنیم. 20 را به 10حساب کنیم باید تمام اعداد این امر دو مشکل دارد: وقت گیر بودن و فراموش

کردن تعویض همه مقادیر. دستورdefine در زبان C این مشکل را مرتفع می

سازد.

defineدستور

: همان مثال قبل با تغییّرات جزئی: )با رنگ قّرمز(7مثال

#include <stdio.h>#define SIZE 10float max(float x[SIZE]){

int i;float max=x[0];for (i=1;i<SIZE;++i)

if (x[i]>max) max=x[i];

return max;}

void main(){

int i;float A[SIZE];for (i=0;i<SIZE;++i)

scanf("%f",&A[i]);printf("\nThe maximum=%f",max(A));

}

یک دستور راهنمای پیش پّردازندهinclude، مانند defineدستور •است.

10عدد مواجه شود به جای آن SIZE کامپایلّر در هّر جای بّرنامه که با • قّرار می دهد.

•SIZE( اصطالحا یک ثابت constant.خوانده می شود )اسم ثابت، دلخواه است. معموال ثابت ها را با نام های با حّروف بزرگ •

تعّریف می کنند. مقدار ثابت در بّرنامه غیّرقابل تغییّر است. مثال اگّر دستوری •

در بّرنامه بنویسیم خطا داده می شود. SIZE=23مثل را در10 عدد کار کنیم تنها کافی است عدد 20اگّر مثال خواستیم با • define تبدیل کنیم.20 به هاست. )تّرتیب نوشتنinclude در بخش defineمحل دستور •

include ها و defineمهم نیست و می توانند قبل یا بعد هم قّرار گیّرند(

ادامه آرایه

:تعّریف آرایهint a[3];

نام آرایه ای بهa نوع ازint عنصّر3 و با اندازه تعّریف کّرده ایم.

به عناصّر آرایه می توان از طّریق اندیسشاندستّرسی داشت.

a[0]a[1]a[2]

a[0]=4;scanf(“%d”,a[1]);for (i=0;i<3;++i) scanf(“%d”,&a[i]);

ادامه آرایه

مقداردهی اولیه:float a[4]={4.34,9.45,3.23,1.02};

اگّر تعداد مقادیّر از اندازه مشخص شده بّرای آرایه بیشتّر باشد خطا رخ می دهد:

float a[3]={7.34,1.2,3.4,1.44};اگّر تعداد مقادیّر از اندازه کمتّر باشد، بقیه

مقادیّر صفّر در نظّر گّرفته می شوند:float a[3]={2.34,3.23};

نحوه تعّریف رشته ها

درC رشته ها به صورت آرایه ای از کاراکترها ،پیاده می شوند.

با st می توانیم رشته ای به نام ;char st [20]با نوشتن – تعریف کرده ایم.20ماکزیمم طول

نحوه مقداردهی

:به دو صورت می توان به یک رشته مقدار نحوه مقداردهی داد:

با استفاده از کارکتّر scanfبا استفاده از دستورات ورودی: مثل1.s%کنتّرلی

– scanf(“%s”,st) یا scanf(“%s”,&st);

به صورت مستقیم هنگام تعّریف رشته2.char st[20]=“Ali”;

نحوه قّرار گّرفتن رشته در حافظه به این صورت است:1.

.2C در انتهای هّر رشته به طور خودکار کاراکتّر NULL پوچ-تهی( )که با( نشان داده می شود( را قّرار می دهد. 0\عالمت

در نتیجه طول واقعی یک رشته یکی بیشتّر از تعداد کاراکتّرهایش است. 3.

A l i \00 1 2 3

ادامه

، صفر است.NULLنکته:کد اسکی کاراکتر printf)“%c”,’\0’(;کاری انجام نمی شود .printf)“%d”,’\0’(; صفر چاپ می شود.

و استفاده از کاراکتر printfبا دستور نحوه چاپ یک رشته:s%کنترلی

ادامه

1مثال )#include <stdio.h>void main)({

char st[20]="Hello";printf)"%s",s(;

} تعریف شده .خروجی این برنامه پیغام Hello با مقدار stرشته ای به نام

Hello .است می توان این برنامه را با یک دستور زیر نوشت:

printf)“%s”,”Hello”(;

ادامه

( رشته ای را از کاربّر دریافت کّرده و آن را 2مثال چاپ می کند.

#include <stdio.h>

void main()

{

char ch[4];

scanf("%s",ch);

printf("%s",ch);

}

ادامه

( 3مثال #include <stdio.h>void main(){

char str[23]="Hello";printf("%c",str[2]);

} با استفاده از اندیس می توان به کاراکتّرهای داخل

رشته دستّرسی داشت.

ادامه

نکته: چند وضعیت مختلف در مقداردهی هنگام تعریف. رشته از اندازه آرایه کوچکتر است.1

char s[8]=“abc”; در نظر می گیرد.NULLبقیه عناصر را

. رشته از اندازه آرایه بزرگتر است2char s[3]=“aghugii;”

خطا . رشته مساوی اندازه آرایه است. 3

char s[3]=“ali”; جزو رشته حساب نمی NULLخطا نیست. در اینجا کاراکتر

شود.

ادامه

در طول NULL( بّرنامه ای بنویسید که طول یک رشته را حساب کند )کاراکتّر 4مثال رشته در نظّر گّرفته نشود(.

#include <stdio.h>int strlen(char str[20]){

int i=0;while (str[i] != '\0')

i++; return i;}void main(){

char str[20];scanf("%s",str);printf("%d",strlen(str));

}

ادامه

بّرنامه ای بنویسید که یک رشته از کاربّر بگیّرد و آن را به رشته ای 4مثال ) تبدیل ”ABAF“ به ”abAF“که تمام حّروفش بزرگ است تبدیل کند. )مثال

شود. #include <stdio.h>void main(){

char str[20];int i;printf("Enter a string:");scanf("%s",str);i=0;while (str[i] != '\0'){

if (str[i]>=97 && str[i]<=122)printf("%c",str[i++]-32);

}}

چند تابع کتابخانه ای بّرای کار با رشته ها

strlen ورودی آن یک رشته و بّرگشتی آن طول رشته :است.

x=strlen(“ali”);printf(“%d”,x);

puts:بّرای چاپ رشته :puts(“ali is a student”);char ch[20]=“ali;puts(ch);

دارد؛ با دو تفاوت:printfعملکّردی مشابه فقط بّرای نمایش رشته به کار می رود و نمی تواند مقدار متغیّر ها را نشان دهد.–بعد از چاپ رشته به خط بعد می رود.–

getsبّرای دریافت رشته از کاربّر :

char ss[20];gets(ss);

ادامه

strcat:بّرای الحاق دو رشته به یکدیگّر به کار می رود : strcat(s1,s2) اضافه می کند.s1 را به انتهای s2رشته

#include <string.h>#include <stdio.h>void main(){

char s1[20]="Ali";char s2[20]="Mehdi";

strcat(s1,s2); strcat(s2,”\nhassan”);

puts(s1); puts(s2);}