250
م ي حّ ر ل ا ن م حّ ر ل ه ا ل ل م ا س بWWW.OUGHIYANOOS.PERSIANBLOG .IR ط وس ت: گاه ش ب :دا( ه$ ت ف ر ش) ی+ پ ی ه ساز م ا رن بC )

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

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: بسم الله الرّحمن الرّحيم

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

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

:دانشگاه

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

Page 2: بسم الله الرّحمن الرّحيم

: درس طّرح

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

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

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

برگزار شود.

Page 3: بسم الله الرّحمن الرّحيم

درس جایگاه

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

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

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

Page 4: بسم الله الرّحمن الرّحيم

مطالب فهّرست

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

Page 5: بسم الله الرّحمن الرّحيم

مطالب فهّرست

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

Page 6: بسم الله الرّحمن الرّحيم

مطالب فهّرست

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

Page 7: بسم الله الرّحمن الرّحيم

مطالب فهّرست

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

Page 8: بسم الله الرّحمن الرّحيم

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

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

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

Page 9: بسم الله الرّحمن الرّحيم

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

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

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

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

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

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

Page 10: بسم الله الرّحمن الرّحيم

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

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

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

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

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

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

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

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

Page 11: بسم الله الرّحمن الرّحيم

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

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

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

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

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

Page 12: بسم الله الرّحمن الرّحيم

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

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

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

Build=compile+link Builder=compiler+linker

متنcompiler برنامه

فايلobject

Linkerفايل

executable

(اجّرايي)

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

Page 13: بسم الله الرّحمن الرّحيم

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

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

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

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

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

Page 14: بسم الله الرّحمن الرّحيم

Cزبان

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

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

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

آمد.

Page 15: بسم الله الرّحمن الرّحيم

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

Page 16: بسم الله الرّحمن الرّحيم

نکته

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

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

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

Page 17: بسم الله الرّحمن الرّحيم

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

Page 18: بسم الله الرّحمن الرّحيم

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

void main) ({}

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

Page 19: بسم الله الرّحمن الرّحيم

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

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

Page 20: بسم الله الرّحمن الرّحيم

IDE

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

کنند.IDE: Integrated Development Environment

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

Page 21: بسم الله الرّحمن الرّحيم

1- نکات

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

sensitivity)

Page 22: بسم الله الرّحمن الرّحيم

2نکات-

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

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

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

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

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

Page 23: بسم الله الرّحمن الرّحيم

error

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

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

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

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

Page 24: بسم الله الرّحمن الرّحيم

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

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

#include <stdio.h>

void main()

{

printf(“Hello”);

}

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

Page 25: بسم الله الرّحمن الرّحيم

نکات

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

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

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

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

Page 26: بسم الله الرّحمن الرّحيم

نکات )ادامه(

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

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

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

Welcome

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

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

Printf(“Hello\nWelcome”); }

خطا

Page 27: بسم الله الرّحمن الرّحيم

\t

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

Printf(“Hello\tWelcome”);

}

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

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

Page 28: بسم الله الرّحمن الرّحيم

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

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

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

void main(){}

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

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

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

Page 29: بسم الله الرّحمن الرّحيم

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

Page 30: بسم الله الرّحمن الرّحيم

مثال

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

{ int x;

x=2+2;}

Page 31: بسم الله الرّحمن الرّحيم

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

Page 32: بسم الله الرّحمن الرّحيم

2نکات-

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

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

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

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

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

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

4x

Page 33: بسم الله الرّحمن الرّحيم

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

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

نوع محدوده

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

Page 34: بسم الله الرّحمن الرّحيم

??

int x; short x;

x=2.3; x=3243243255556;

float x;

x=3;

Page 35: بسم الله الرّحمن الرّحيم

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

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

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

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

Page 36: بسم الله الرّحمن الرّحيم

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

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;}

Page 37: بسم الله الرّحمن الرّحيم

چّرا متغيّر

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

Page 38: بسم الله الرّحمن الرّحيم

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

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

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

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

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

Page 39: بسم الله الرّحمن الرّحيم

نکات

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

}

Page 40: بسم الله الرّحمن الرّحيم

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);

Page 41: بسم الله الرّحمن الرّحيم

چند مثال

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

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

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

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

شود.

Page 42: بسم الله الرّحمن الرّحيم

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

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

Page 43: بسم الله الرّحمن الرّحيم

scanfدستور

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

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

عالمت آدرس

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

Page 44: بسم الله الرّحمن الرّحيم

نکات

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

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

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

Page 45: بسم الله الرّحمن الرّحيم

مثال

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

#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مي توان بيش از دو مقدار هم با دستور

Page 46: بسم الله الرّحمن الرّحيم

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

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

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

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

Page 47: بسم الله الرّحمن الرّحيم

بافّر ورودي

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

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

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

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

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

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

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

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

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

Page 48: بسم الله الرّحمن الرّحيم

getche دستور

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

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

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

Page 49: بسم الله الرّحمن الرّحيم

getchدستور

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

Page 50: بسم الله الرّحمن الرّحيم

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

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

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

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

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

Page 51: بسم الله الرّحمن الرّحيم

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

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

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

)طول ميدان(

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

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

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

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

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

Page 52: بسم الله الرّحمن الرّحيم

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

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

Page 53: بسم الله الرّحمن الرّحيم

چند مثال

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(;

Page 54: بسم الله الرّحمن الرّحيم

تبديل انواع

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

int num;num=2.56;

2

Page 55: بسم الله الرّحمن الرّحيم

قانون کلي

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

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

Page 56: بسم الله الرّحمن الرّحيم

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

short num;num=234567;

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

Page 57: بسم الله الرّحمن الرّحيم

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

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

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

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

صفر

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

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

Page 58: بسم الله الرّحمن الرّحيم

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

X= X+1

X++ يا ++X

X=X-1

X-- يا --X

Page 59: بسم الله الرّحمن الرّحيم

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

#include <stdio.h>

void main)(

{

int i=0;

}

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

Page 60: بسم الله الرّحمن الرّحيم

-=و +=

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;

Page 61: بسم الله الرّحمن الرّحيم

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

X=2+4*5%2;

?

Page 62: بسم الله الرّحمن الرّحيم

مثال

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

)(

++ --

/ * %

+ -

> >= < <=

== !=

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

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

Page 63: بسم الله الرّحمن الرّحيم

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

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

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

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

Page 64: بسم الله الرّحمن الرّحيم

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

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

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

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

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

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

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

dRRd

180180

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

Page 65: بسم الله الرّحمن الرّحيم

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

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

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

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

Page 66: بسم الله الرّحمن الرّحيم

#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(;

}

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

Page 67: بسم الله الرّحمن الرّحيم

برنامه اي بنويسيد که مقدار را با 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

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

Page 68: بسم الله الرّحمن الرّحيم

#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);

}

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

Page 69: بسم الله الرّحمن الرّحيم

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

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

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

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

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

Page 70: بسم الله الرّحمن الرّحيم

#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(;

}

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

Page 71: بسم الله الرّحمن الرّحيم

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

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

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

Page 72: بسم الله الرّحمن الرّحيم

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

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

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

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

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

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

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

Page 73: بسم الله الرّحمن الرّحيم

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

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

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

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

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

Page 74: بسم الله الرّحمن الرّحيم

مثال

#include <stdio.h>

Void main)(

{

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

}

< <

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

Page 75: بسم الله الرّحمن الرّحيم

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

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

0

0

xx

xxxy

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

Page 76: بسم الله الرّحمن الرّحيم

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در حالتي که بخش هاي • يک دستور باشند بايد بين { و } قرار گيرند.

Page 77: بسم الله الرّحمن الرّحيم

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(;

}

Page 78: بسم الله الرّحمن الرّحيم

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

Page 79: بسم الله الرّحمن الرّحيم

Nested-if

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

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

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

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

Page 80: بسم الله الرّحمن الرّحيم

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خّروجي

Page 81: بسم الله الرّحمن الرّحيم

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عبارت

Page 82: بسم الله الرّحمن الرّحيم

switch-caseدستور

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

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

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

Page 83: بسم الله الرّحمن الرّحيم

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اگر در انتهاي

Page 84: بسم الله الرّحمن الرّحيم

2مثال

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

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

Page 85: بسم الله الرّحمن الرّحيم

breakنکته در مورد

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

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

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

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

Page 86: بسم الله الرّحمن الرّحيم

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

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

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

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

شده بود.

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

Page 87: بسم الله الرّحمن الرّحيم

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

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

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

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

Page 88: بسم الله الرّحمن الرّحيم

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

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

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

يک برنامه بد

Page 89: بسم الله الرّحمن الرّحيم

forدستور

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

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

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

عبارت منطقی

forاجّراي بخش

پايان

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

0 )نادرست

)

1 )درست(

Page 90: بسم الله الرّحمن الرّحيم

مثال

عملکرد قطعه برنامه زير را توضيح دهيد: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

Page 91: بسم الله الرّحمن الرّحيم

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

void main()

{

int i=0;

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

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

}

Page 92: بسم الله الرّحمن الرّحيم

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

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);

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

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

Page 93: بسم الله الرّحمن الرّحيم

مثال

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

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

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

Page 94: بسم الله الرّحمن الرّحيم

مثال

عدد را از کاربّر بگیّرد و حاصل جمع آنها را چاپ 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);}

Page 95: بسم الله الرّحمن الرّحيم

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

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

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

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

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

Page 96: بسم الله الرّحمن الرّحيم

مثال

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

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

printf(“*”);

printf(“!”);

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

Page 97: بسم الله الرّحمن الرّحيم

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

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

printf(“*”);

Page 98: بسم الله الرّحمن الرّحيم

مثال

:عملکرد برنامه زير#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چاپ جدول ضّرب

Page 99: بسم الله الرّحمن الرّحيم
Page 100: بسم الله الرّحمن الرّحيم

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بّرنامه تا زمانی که کاربّر

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

Page 101: بسم الله الرّحمن الرّحيم

)ادامه(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);}}

Page 102: بسم الله الرّحمن الرّحيم

می توان بیش از یک 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(;}

Page 103: بسم الله الرّحمن الرّحيم

whileدستور

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

دستور)ات(

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

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

دستور در حلقه

Page 104: بسم الله الرّحمن الرّحيم

مثال

i=0;

while (i<4)

{

printf(“%d”,i);

i++;

}

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

Page 105: بسم الله الرّحمن الرّحيم

مثال

#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با انتخاب هر کلیدی غیر از

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

Page 106: بسم الله الرّحمن الرّحيم

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

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

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

Page 107: بسم الله الرّحمن الرّحيم

do-whileدستور

do

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

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

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

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

Page 108: بسم الله الرّحمن الرّحيم

مثال

#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);}

Page 109: بسم الله الرّحمن الرّحيم

breakدستور

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

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

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

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

break;}}

Page 110: بسم الله الرّحمن الرّحيم

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

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

Page 111: بسم الله الرّحمن الرّحيم

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

را 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

Page 112: بسم الله الرّحمن الرّحيم

#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.مي باشد

Page 113: بسم الله الرّحمن الرّحيم

تبديل مختصات دکارتي 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),[

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

Page 114: بسم الله الرّحمن الرّحيم

#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 است.

Page 115: بسم الله الرّحمن الرّحيم

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

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

)Greatest Common Devisor )GCD: ب م م

Page 116: بسم الله الرّحمن الرّحيم

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

روش حل: محاسبه ب م م با روش پلکاني: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

Page 117: بسم الله الرّحمن الرّحيم

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

#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);

}

Page 118: بسم الله الرّحمن الرّحيم

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

( 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.

Page 119: بسم الله الرّحمن الرّحيم

#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)در

Page 120: بسم الله الرّحمن الرّحيم

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

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

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

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

Page 121: بسم الله الرّحمن الرّحيم

#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); }}

Page 122: بسم الله الرّحمن الرّحيم

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

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

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

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

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

Page 123: بسم الله الرّحمن الرّحيم

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

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

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

Page 124: بسم الله الرّحمن الرّحيم

#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اعداد تصادفي بين

Page 125: بسم الله الرّحمن الرّحيم

تابع

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

تابع چيست؟1.

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

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

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

Page 126: بسم الله الرّحمن الرّحيم

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

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

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

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

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

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

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

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

RyRx

xxfy

2)(

2x

Page 127: بسم الله الرّحمن الرّحيم

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

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

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

Page 128: بسم الله الرّحمن الرّحيم

( ساخت تابع2

RyRx

xxfy

2)(

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

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

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

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

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

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

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

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

Page 129: بسم الله الرّحمن الرّحيم

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

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

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

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

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

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

Page 130: بسم الله الرّحمن الرّحيم

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

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

Page 131: بسم الله الرّحمن الرّحيم

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

تابعsign)x(

01

00

01

)(

x

x

x

xsign

Page 132: بسم الله الرّحمن الرّحيم

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

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

#include …..#include ….……

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

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

Page 133: بسم الله الرّحمن الرّحيم

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

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

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

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

Page 134: بسم الله الرّحمن الرّحيم

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

مثالي از احضار تابع#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به

Page 135: بسم الله الرّحمن الرّحيم

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

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

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

Page 136: بسم الله الرّحمن الرّحيم

.مثال عملکرد تابع زير را توضيح دهيد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تابع باال

Page 137: بسم الله الرّحمن الرّحيم

مثال

#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));}

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

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

Page 138: بسم الله الرّحمن الرّحيم

مثال

#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));}

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

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

Page 139: بسم الله الرّحمن الرّحيم

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

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

Page 140: بسم الله الرّحمن الرّحيم

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

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

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

ریاضیات(

Page 141: بسم الله الرّحمن الرّحيم

#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));

}

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

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

Page 142: بسم الله الرّحمن الرّحيم

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

#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ادامه )

Page 143: بسم الله الرّحمن الرّحيم

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

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

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

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

Page 144: بسم الله الرّحمن الرّحيم

factتابع

long fact(int n)

{

int i;

long result=1;

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

result*=i;

return result;

}

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

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

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

Page 145: بسم الله الرّحمن الرّحيم

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

Page 146: بسم الله الرّحمن الرّحيم

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تابع را می گیّرد و رابطه باال را محاسبه می کند.

Page 147: بسم الله الرّحمن الرّحيم

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

:عملکّرد بّرنامه شّروع می شود.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

Page 148: بسم الله الرّحمن الرّحيم

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

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

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

Page 149: بسم الله الرّحمن الرّحيم

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

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

صفحه بعد(

Page 150: بسم الله الرّحمن الرّحيم

#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یا چیزی نمی نویسیم و یا کلمه

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

Page 151: بسم الله الرّحمن الرّحيم

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

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

#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در بخش نوع برگشتی

Page 152: بسم الله الرّحمن الرّحيم

–تابع بی ورودی –بی 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();

.....

......

}

Page 153: بسم الله الرّحمن الرّحيم

( تابع بی ورودی - بی 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( );}

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

Page 154: بسم الله الرّحمن الرّحيم

mainتابع است

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

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

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

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

Page 155: بسم الله الرّحمن الرّحيم

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

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

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

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

Page 156: بسم الله الرّحمن الرّحيم

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

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

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

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

Page 157: بسم الله الرّحمن الرّحيم

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

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

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

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

است.

Page 158: بسم الله الرّحمن الرّحيم

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

:انواع توابع کتابخانه ای و...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

Page 159: بسم الله الرّحمن الرّحيم

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

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

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

Page 160: بسم الله الرّحمن الرّحيم

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

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

Page 161: بسم الله الرّحمن الرّحيم

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

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

#include <math.h>

void main ()

{

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

}

Page 162: بسم الله الرّحمن الرّحيم

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

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

Page 163: بسم الله الرّحمن الرّحيم

1 مثال

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

روش حل:

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

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

h

xfhxfxf h

)()(lim)( 00

00

h

xfhxfxf

)()()( 00

0

Page 164: بسم الله الرّحمن الرّحيم

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

Page 165: بسم الله الرّحمن الرّحيم

مشتق دوم

h

xfhxfh

xfhxfxf h

)()(

)()(lim)(

00

0000

Page 166: بسم الله الرّحمن الرّحيم

در 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));}

Page 167: بسم الله الرّحمن الرّحيم

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

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

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

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

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

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

Page 168: بسم الله الرّحمن الرّحيم

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

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

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

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

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

Page 169: بسم الله الرّحمن الرّحيم

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

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

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

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

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

x0x1x2

r

Page 170: بسم الله الرّحمن الرّحيم

ادامه

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

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

))(()( 000 xxxfxfy

x0x1x2

r

)(

)(

))(()(0

0

001

0100

xf

xfxx

xxxfxf

Page 171: بسم الله الرّحمن الرّحيم

)(

)(

1

112 xf

xfxx

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

و در حالت کلی:

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

)(

)(1

n

nnn xf

xfxx

Page 172: بسم الله الرّحمن الرّحيم

ادامه

برنامه ای بنویسید که ریشه معادله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

Page 173: بسم الله الرّحمن الرّحيم

نكات مثال قبل

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

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

Page 174: بسم الله الرّحمن الرّحيم

-محاسبه انتگّرال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

Page 175: بسم الله الرّحمن الرّحيم

محاسبه

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

Page 176: بسم الله الرّحمن الرّحيم

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

برنامه زیر را در نظر بگیرید. #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 که مقدار

Page 177: بسم الله الرّحمن الرّحيم

ادامه

بّرنامه زیّر را در نظّر بگیّرید: 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یعنی نمی شناسد.

Page 178: بسم الله الرّحمن الرّحيم

ادامه

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

Page 179: بسم الله الرّحمن الرّحيم

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

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

Page 180: بسم الله الرّحمن الرّحيم

localمتغیّرهای

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

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

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

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

Page 181: بسم الله الرّحمن الرّحيم

مثال

#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چون

Page 182: بسم الله الرّحمن الرّحيم

ادامه

#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خود

شده نیست.

Page 183: بسم الله الرّحمن الرّحيم

(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بّرخالف متغیّرهای •

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

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

Page 184: بسم الله الرّحمن الرّحيم

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

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

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

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

Page 185: بسم الله الرّحمن الرّحيم

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تابع چون خودش را احضار کّرده است.

Page 186: بسم الله الرّحمن الرّحيم

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

#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بّرگشت

Page 187: بسم الله الرّحمن الرّحيم

نکته

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

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

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

محاسبه شود(.

)!1(*! nnn

Page 188: بسم الله الرّحمن الرّحيم

نکته

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

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

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

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

پذیر است.

01

0)1(*)(

n

nnfactnnfact

Page 189: بسم الله الرّحمن الرّحيم

2مثال

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

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

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

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

nx

1* nn xxx

01

0)1,(*),(

n

nnxpowxnxpow

Page 190: بسم الله الرّحمن الرّحيم

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));}

Page 191: بسم الله الرّحمن الرّحيم

3مثال

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

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

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

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

..... aaa

1

1)1,(),(

na

nnaradanarad

Page 192: بسم الله الرّحمن الرّحيم

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است و

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

Page 193: بسم الله الرّحمن الرّحيم

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

Page 194: بسم الله الرّحمن الرّحيم

-ادامه4مثال

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

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

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

0

0)%,gcd(),gcd(

ba

bbabba

Page 195: بسم الله الرّحمن الرّحيم

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));}

Page 196: بسم الله الرّحمن الرّحيم

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

Page 197: بسم الله الرّحمن الرّحيم

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

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

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

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

4

A CB

3

2

1

Page 198: بسم الله الرّحمن الرّحيم

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

هدف: جابجایی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 شماره گذاری می کنیم

کوچکترین(

Page 199: بسم الله الرّحمن الرّحيم

ادامه

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

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

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

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

کن.4

A CB

3

2

1

Page 200: بسم الله الرّحمن الرّحيم

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

در نتیجه: جابجایی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.منتقل کن

Page 201: بسم الله الرّحمن الرّحيم

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

#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');}

Page 202: بسم الله الرّحمن الرّحيم

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

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

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

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

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

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

Page 203: بسم الله الرّحمن الرّحيم

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

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

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

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

Page 204: بسم الله الرّحمن الرّحيم

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یا تابع

Page 205: بسم الله الرّحمن الرّحيم

#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مثال

Page 206: بسم الله الرّحمن الرّحيم

ادامه

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

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

وجود دارد وهنگامی که در جایی تابع احضار شد می داند چنین تابعی در برنامه وجود دارد و در نتیجه پیغام خطایی

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

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

Page 207: بسم الله الرّحمن الرّحيم

مثال

#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در این مثال توابع مشکلی پیش نمی آید.

Page 208: بسم الله الرّحمن الرّحيم

ادامه

تعریف تابع(Function definition) نوشتن کامل تابع : اعالن تابع(Function declaration)نوشتن خط اول تابع:

اعالن شود يا تعريفهر تابع قبل از احضار مي بايست يا شده باشد.

Page 209: بسم الله الرّحمن الرّحيم

مزایای استفاده از توابع

نوشتن بّرنامه های خواناتّر : تقسیم بّرنامه بهچند تابع سبب می شود که فهم بّرنامه آسان

تّر شود.

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

تقسیم پّروژه به چند بخش.–انجام هّر بخش توسط یک تیم مجزا . مثال حاصل –

کار هّر تیم، می تواند یک تابع باشد.در کنار هم قّرار دادن توابع و استفاده از آنها .–

Page 210: بسم الله الرّحمن الرّحيم

توصیه هایی جهت نوشتن بّرنامه های خوانا

. استفاده از توابع در نوشتن بّرنامه1

. انتخاب نام های مناسب و با مسمی بّرای متغیّرها و توابع2 یک factمثال بّرای تابعی که فاکتوریل را حساب می کند –

نام مناسب است.بّرای متغیّری که حاصل جمع چند عدد را نگاه می دارد نام –

sum.مناسب است

Page 211: بسم الله الرّحمن الرّحيم

ادامه

. دندانه ای کّردن :رعایت یک تّرتیب خاص در نوشتن 3خطوط بّرنامه

مثال دستورات داخل تابع با کمی فاصله نسبت به خط اول –تابع قّرار گیّرند.

void main)(}

int x; x=4;

{دستورات داخل شّرط و حلقه ها با کمی فاصله نسبت به –

خود دستورات شّرط و حلقه قّرار گیّرند.if (x==0) return 1;

Page 212: بسم الله الرّحمن الرّحيم

ادامه

( بّرای comment. نوشتن توضیح )4دستورات

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

زبان معمولي خود بنویسیم.

Page 213: بسم الله الرّحمن الرّحيم

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((;}

Page 214: بسم الله الرّحمن الرّحيم

commentنوشتن

*/ و /* اگر توضیحات ما بیش از یک خط باشد از استفاده می کنیم.

/*this program

is written by .....

Date: 1384/9/13 */

قرار گرفته اند */ و /*کامپایلر خطوطی را که بین را در نظر نمی گیرد.

Page 215: بسم الله الرّحمن الرّحيم

آرايه ها

آرایه هاضرورت وجود آرایه ها– تعریف آرایه–مثال هایی از کاربرد آرایه ها –آرایه ها به عنوان ورودی و برگشتی تابع–(constantثابت )–

Page 216: بسم الله الرّحمن الرّحيم

ضّرورت وجود آرایه ها

عدد را بگیرد و میانگین و واریانس آنها را محاسبه کند.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

Page 217: بسم الله الرّحمن الرّحيم

ادامه

در اینجا برای به دست آوردن واریانس نیاز به همه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;

Page 218: بسم الله الرّحمن الرّحيم

ادامه

به این ترتیب کد نامناسبی خواهیم داشت. این موضوع به عدد( بیشتر نمود پیدا 1000ازای داده های زیادتر )مثال

می کند.

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

به طور كلي آرايه ها در مواردي به كار برده مي شوند كهبا مجموعه اي از داده هاي هم نوع سروكار داشته باشيم.

Page 219: بسم الله الرّحمن الرّحيم

تعّريف آرايه

يادآوري: با دستور تعريف متغير مثل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 .و ....داشت

Page 220: بسم الله الرّحمن الرّحيم

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();

}

Page 221: بسم الله الرّحمن الرّحيم

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حلقه اول مقادیر را دریافت می کند و در آرایه دوم این مقادیر را چاپ می کند.

Page 222: بسم الله الرّحمن الرّحيم

ادامه

عدد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) }

Page 223: بسم الله الرّحمن الرّحيم

ادامه

مقدار را از کاربّر دریافت کّرده و آنها 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);

}

Page 224: بسم الله الرّحمن الرّحيم

ادامه

عدد از کاربر بگیرد آنها را به صورت 10( برنامه ای بنویسید که 5مثال صعودی مرتب کرده و چاپ کند.

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

مرتب کردن آنها دریافت اعداد را می توان با تعریف یک آرایه و نوشتن قطعه برنامه 1.

ای به صورت زیر انجام داد:float x[10];int i;for )i=0;i<10;++i( scanf)“%f”,&x[i](;

Page 225: بسم الله الرّحمن الرّحيم

ادامه

گفته sorting. به مسئله مرتب سازی اصطالحا 2می شود. برای مرتب سازی روش های متعددی

وجود دارد. مانند :bubble sort( ،)مرتب سازی حبابیquick sort،

merge sort.....و که یکی از ساده ترین bubble sortدر این مثال از

آنهاست استفاده می شود.

Page 226: بسم الله الرّحمن الرّحيم

Bubbleبّرای مّرتب سازی صعودی sort

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

شوند و مشابه قبل تعویض مکان در صورت لزوم انجام می گیرد. همین کارها ، و....انجام می شود تا به انتهای آرایه برسیم. 5 و 4، 4 و 3برای عناصر

زمانی که به انتهای آرایه برسیم ماکزیمم مقادیر در آخرین مکان آرایه قرار گرفتهاست و به عبارت دیگر

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

آخر انجام می شود و در نتیجه : عنصر مرتب می شوند. 2با دو بار پیمایش

در مرحله بعد پیمایش از ابتدا تا عنصر دوتا مانده به آخر آرایه انجام می شود و درنتیجه:

با سه بار پیمایش سه عنصر مرتب می شود. ، به این ترتیب اگر آرایه n عنصری باشد با n-1 پیمایش ، کل آرایه مرتب می

شود.

Page 227: بسم الله الرّحمن الرّحيم

تعویض دو مقدار

فرض کنید دو متغیرx=23 و y=34 داشته باشیم و بخواهیم مقدار آنها را با هم تعویض کنیم.

با تعریف متغیری به نامtemp و نوشتن قطعه کد زیر می توان این کار را انجام داد:

float temp;temp=x;x=y;y=temp;

Page 228: بسم الله الرّحمن الرّحيم

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]);}

Page 229: بسم الله الرّحمن الرّحيم

مقدار دهی به آرایه ها

سه روش برای مقدار دهی به آرایه ها وجوددارد: با دستورات ورودی مثلscanf یا getche:

ch[0]=getche)(;

scanf)“%d”,&x[2](;:مقدار دهی مستقیم

ch[0]=‘a’;

x[2]=23;)مقداردهی هنگام تعریف: )صفحه بعد

Page 230: بسم الله الرّحمن الرّحيم

مقداردهی هنگام تعّریف

می توان آرایه ها را )تنها(هنگام تعریف به صورتزیر مقداردهی کرد:

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’};

Page 231: بسم الله الرّحمن الرّحيم

چند سوال

} { اگر در مقداردهی هنگام تعریف، تعداد مقادیر نوشته شده داخلاز اندازه مشخص شده برای آرایه بیشتر باشد خطا اعالم می شود.

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 اندازه آرایه

Page 232: بسم الله الرّحمن الرّحيم

يك نكته

Int i=8;

Int x[i];

اندازه آرايه بايد يك عدد ثابت باشد. بنابراين نوشتن به صورت باال نادرست است.

Page 233: بسم الله الرّحمن الرّحيم

آرایه ها به عنوان ورودی و بّرگشتی توابع

آرایه ها مانند سایر متغیرها می توانند ورودی یابرگشتی تابع باشند.

Page 234: بسم الله الرّحمن الرّحيم

آرایه به عنوان ورودی تابع

: تابعی بنویسید که یک آرایه را بگیرد و ماکزیمم آن را برگرداند: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;}

Page 235: بسم الله الرّحمن الرّحيم

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));}

Page 236: بسم الله الرّحمن الرّحيم

(Constantثابت )

،در بسیاری مواقع نیاز به کار با مقادیر ثابت در برنامهپیش می آید و این مقادیر ممکن است چند بار در

در مثال قبل 10برنامه تکرار شوند. مانند عدد عدد را 20اگر در مثال قبل بخواهیم ماکزیمم فرضا

تبدیل کنیم. 20 را به 10حساب کنیم باید تمام اعداد این امر دو مشکل دارد: وقت گیر بودن و فراموش

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

سازد.

Page 237: بسم الله الرّحمن الرّحيم

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مهم نیست و می توانند قبل یا بعد هم قّرار گیّرند(

Page 238: بسم الله الرّحمن الرّحيم

ادامه آرایه

:تعّریف آرایه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]);

Page 239: بسم الله الرّحمن الرّحيم

ادامه آرایه

مقداردهی اولیه: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};

Page 240: بسم الله الرّحمن الرّحيم

نحوه تعّریف رشته ها

درC رشته ها به صورت آرایه ای از کاراکترها ،پیاده می شوند.

با st می توانیم رشته ای به نام ;char st [20]با نوشتن – تعریف کرده ایم.20ماکزیمم طول

Page 241: بسم الله الرّحمن الرّحيم

نحوه مقداردهی

:به دو صورت می توان به یک رشته مقدار نحوه مقداردهی داد:

با استفاده از کارکتّر 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

Page 242: بسم الله الرّحمن الرّحيم

ادامه

، صفر است.NULLنکته:کد اسکی کاراکتر printf)“%c”,’\0’(;کاری انجام نمی شود .printf)“%d”,’\0’(; صفر چاپ می شود.

و استفاده از کاراکتر printfبا دستور نحوه چاپ یک رشته:s%کنترلی

Page 243: بسم الله الرّحمن الرّحيم

ادامه

1مثال )#include <stdio.h>void main)({

char st[20]="Hello";printf)"%s",s(;

} تعریف شده .خروجی این برنامه پیغام Hello با مقدار stرشته ای به نام

Hello .است می توان این برنامه را با یک دستور زیر نوشت:

printf)“%s”,”Hello”(;

Page 244: بسم الله الرّحمن الرّحيم

ادامه

( رشته ای را از کاربّر دریافت کّرده و آن را 2مثال چاپ می کند.

#include <stdio.h>

void main()

{

char ch[4];

scanf("%s",ch);

printf("%s",ch);

}

Page 245: بسم الله الرّحمن الرّحيم

ادامه

( 3مثال #include <stdio.h>void main(){

char str[23]="Hello";printf("%c",str[2]);

} با استفاده از اندیس می توان به کاراکتّرهای داخل

رشته دستّرسی داشت.

Page 246: بسم الله الرّحمن الرّحيم

ادامه

نکته: چند وضعیت مختلف در مقداردهی هنگام تعریف. رشته از اندازه آرایه کوچکتر است.1

char s[8]=“abc”; در نظر می گیرد.NULLبقیه عناصر را

. رشته از اندازه آرایه بزرگتر است2char s[3]=“aghugii;”

خطا . رشته مساوی اندازه آرایه است. 3

char s[3]=“ali”; جزو رشته حساب نمی NULLخطا نیست. در اینجا کاراکتر

شود.

Page 247: بسم الله الرّحمن الرّحيم

ادامه

در طول 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));

}

Page 248: بسم الله الرّحمن الرّحيم

ادامه

بّرنامه ای بنویسید که یک رشته از کاربّر بگیّرد و آن را به رشته ای 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);

}}

Page 249: بسم الله الرّحمن الرّحيم

چند تابع کتابخانه ای بّرای کار با رشته ها

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);

Page 250: بسم الله الرّحمن الرّحيم

ادامه

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);}