Adv Prg - آپلود سنتر صفرآپ, لینک
Download
Report
Transcript Adv Prg - آپلود سنتر صفرآپ, لینک
الرحمن ّ
بسم هللا ّ
الرحيم
برنامه سازی پیشرفته ()C
توسطWWW.OUGHIYANOOS.PERSIANBLOG.IR:
دانشگاه:
طرح درس:
درس 4واحدی جهت دانشگاه پیام نور
40ساعت ( 20جلسه 2ساعته در سایت یا ( )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گفته مي شد و به هر دستور ،يک دستور زبان ماشین گفته مي شد.
مشکل نوشتن برنامه به زبان ماشین سختي نوشتن و ناخوانايي آن بود.
براي رفع اين مشکل زبانهاي اسمبلي شکل گرفت .در اين زبان ها براي هر دستور زبان
ماشین يک عبارت تعريف شده است .مثال براي جمع دو خانه حافظه Aو Bعبارت
. ADD A,Bدر اين حالت برنامه نويس به جاي نوشتن يک سري 0و ، 1با اين عبارات
برنامه خود را مي نوشت.
برنامه اي که برنامه اسمبلي نوشته شده توسط کاربر را به زبان ماشین تبديل مي کند
اسمبلر خوانده مي شود.
زبان هاي سطح باال
با وجود آنکه زبان هاي اسمبلي کار برنامه نويس ي را آسان مي کرد اما باز
برنامه ها طوالني و معموال ناخوانا بودند.
براي رفع اين مشکل زبان هاي سطح باال بوجود آمدند .در اين زبان ها
هر چند دستور زبان ماشین به يک عبارت با معنا که به زبان معمولي
نزديک بود تبديل مي شود.
دو برنامه کامپايلر( )compilerو linkerروي هم کار تبديل برنامه
سطح باال به زبان ماشین را انجام مي دهند.
مراحل ايجاد يک برنامه
اجرا توسط سيستم عامل
فايل
executable
(اجرايي)
Linker
فايل
object
compiler
متن
برنامه
مراحل ايجاد برنامه سطح باال :نوشتن متن برنامه ،کامپيايل link ،و اجرا
به مجموع دو عمل compileو linkاصطالحا Buildمي گوييم.
Builder=compiler+linker
Build=compile+link
تاريخچه زبان هاي برنامه نويس ي
اولین زبان برنامه نويس ي در 1946توسط Plankalkülآمد و
اولین زبان سطح باال FORTRAN Iبود که در 1954بوجود آمد.
به مرور زمان برنامه نويس ي ساده تر و پيشرفته تر شد:
–
زبان هاي مجهز به امکانات گرافيکي :زبان هاي ويژوال :امکان نوشتن برنامه بدون
تايپ دستورات :دهه 1960
–
زبان هاي ش يء گرا (Simula :دهه )1970
انجام کارهاي شبکه اي و اينترنتي)1995( java :
–
زبان C
موضوع درس آشنايي با زبان سطح باالي Cاست.
اين زبان در سال توسط 1972توسط دنيس ريچي ( Dennis
)Ritchieبوجود آمد که بر اساس زبان ديگري به نام Bشکل
گرفته بود.
Bتوسط Ken Thompsonدر 1969بوجود آمد.
)1972( Rithchie وThompson تصويري از
نکته
در يک زبان عادي براي بيان يک مفهوم مي توان از عبارات مختلفي استفاده کرد :
– علي به خانه رفت.
– علي خانه رفت.
– علي رفت خانه.
– رفت علي خانه.
در يک زبان برنامه نويس ي نياز دستورات نياز به بيان دقيق دارند و بايد طبق ساختار
مشخص ي که در زبان مشخص شده استفاده شوند تا کامپايلر قادر به درک آنها
باشد.
برنامه نويس ي به زبان C
ساده ترين برنامه به زبان C
) (void main
{
}
نکات:
.1
.2
.3
.4
خط اول در هر برنامه Cبايد وجود داشته باشد.
{ :شروع برنامه
{ :خاتمه برنامه
دستورات برنامه در داخل {} نوشته مي شوند.
نمايش مراحل سه گانه نوشتن link ،compile ،و اجرا
.1
نوشتن
.2
Compile
Link
اجراء
.3
.4
IDE
مشکل :زمانبر بودن
رفع مشکل :ارائه نرم افزارهايي که امکان ويرايش ،کامپايل link ،و اجرا را
در يک محيط فراهم مي کنند.
IDE: Integrated Development Environment
مانند Visual C ،Borland C :و....
اجراي برنامه در Visual C
نکات 1-
فاصله گذاري
حساس بودن به حالت حروف ()case sensitivity
نکات2-
:errorبه خطاهاي برنامه نويس ي errorمي گويند.
انواع خطاها در برنامه نويس ي:
خطاهاي زمان :)compile errors(compile
خطاهاي زمان :)Link errors( link
مانع کامپايل صحيح برنامه مي شوند.
براي کامپايل مزاحمتي ايجاد نمي کنند اما مانع Linkبرنامه مي شوند.
خطاهاي زمان اجرا:)Run time errors( :
کامپايل و Linkبا موفقيت انجام مي شود ولي اجراي برنامه دچار اشکال مي شود .
error
حسن سيب را خورد.
هسن سيب را خورد.
را حسن خورد سيب.
متناظر با خطاي کامپايل
متناظر با خطاي Link
سيب حسن را خورد.
متناظر با خطاي زمان اجرا
مثال )2نمايش متن بر روي مانيتور
برنامه اي بنويسيد که پيغام Helloرا در مانيتور نشان دهد.
>#include <stdio.h
)(void main
{
;)”printf(“Hello
}
پيغام Helloچاپ مي شود و مکان نما بعد از حرف oقرار مي گیرد.
نکات
• Stdio.hنمونه اي از يک header fileاست .فايل هاي headerجزئيات غير مرتبط با
کاربر را از ديد او مخفي مي کند و موجب مي شود برنامه اي خالصه تر و خواناتر داشته باشيم.
• دستور #include ….يک راهنماي پيش پردازش ( )preprocessor directiveيا
راهنماي کامپايلر ( )compiler directiveخوانده مي شود Compiler .قبل از شروع
کامپايل محتويات اين فايل را به برنامه اضافه مي کند و سپس کامپايل آغاز مي گردد.
در انتهاي هر دستور زبان Cداخل mainعالمت ; قرار داده مي شود.
)نکات (ادامه
Printf)“Hello
welcome”(;
خروجي ؟؟
.فاصله ها هم نمايش داده مي شوند
–
:مي خواهيم خروجي ما به صورت زير باشد
#include <stdio.h>
Hello
Void main( )
{
Welcome
Printf(“Hello
Welcome”);
}
خطا
#include <stdio.h>
Void main( )
{
\nWelcome”);
Printf(“Hello
}
\t
>#include <stdio.h
) (Void main
{
حرکت به اندازه يک tab
;)”Welcome
\t
Printf(“Hello
}
\nو \tاصطالحا کاراکترهاي کنترلي ناميده مي شوند .کاراکترهاي کنترلي در printfعينا چاپ
نمي شوند بلکه اثراتي ديگر از خود بروز مي دهند.
خالصه مطالب قبل
تعريف و تاريخچه مختصري از کامپيوتر
مقدمه اي بر مفهوم برنامه نويس ي و چگونگي شکل گیري آن
نوشتن چند برنامه ساده به زبان C
کاراکترهاي کنترلي :مانند \nو \t
>#include <stdio.h
)(void main
{
)(void main
{
}
;)"printf("Hello
چاپ متن روي مانيتور
}
ساده ترين برنامه
آشنايي با مفهوم متغیرها ،اپراتورها (عملگرها)
چاپ مقدار متغیرها
دستورات ورودي
فرمت بندي خروجي
تبديل انواع
تقدم عملگرها
مثال
برنامه اي بنويسيد که حاصل 2+2را محاسبه کند.
) (void main
{
;int x
;x=2+2
}
نکات1-
;int x
– هنگام اجراي اين دستور:
يک مکان 4بايتي حافظه به برنامه اختصاص داده مي شود.
اين مکان را xمي نامد.
به برنامه اجازه مي دهد که يک عدد صحيح ( )integerدر xبريزد.
–
–
–
–
اصطالحا به ، xيک متغیر ( )Variableاز نوع صحيح ( )intگفته مي شود.
به دستور باال دستور تعريف متغیر مي گوييم.
xنام متغیر مي باشد.
نام متغیر
ترکيبي از حروف aتا zو Aتا ، Zارقام 0تا 9و _ ( )Undelineمي باشد.
نبايد با يک رقم شروع شود.
مثال :اسامي مجاز_A ، A09 ،ali ،asd ،a :
اسامي غیر مجازA-s ،9a :
x
نکات2-
X=2+2;
–
–
–
–
ابتدا 2با 2جمع مي شود.
به عالمت +اصطالحا يک ( operatorعملگر) ميگوييم.
x
هر يک از اعداد 2يک ( operandعملوند) خوانده ميشوند.
4
سپس حاصل جمع در xقرار مي گيرد.
يا اصطالحا 4به xتخصيص مي يابد.
به = اصطالحا يک اپراتور تخصيص مقدار و به دستور باال يک دستور تخصيص مقدار
( )Assignment statementميگوييم.
درسمت چپ يک دستور تخصيص مقدار فقط و فقط نام يک متغير بايد باشد .سمت راست مي تواند
ترکيبي از نام متغير و مقادير باشد.
بعض ي انواع متغيرها
محدوده
نوع
مصرف حافظه
(بايت)
صحيح
4
;float x
;X=2.3
;short ys
;ys=123
;ys=0x23
;char c
;‘c='a
;c=97
231
تا
231 1
int
اعشاري
4
float
اعشاري با
دقت باال
8
double
صحيح بزرگ
8
long
)(long int
-32,768تا 32,767
صحيح کوچک
2
short
)(short int
-128تا 127
کاراکتر
1
char
ماکزيمم 6رقم اعشار دقت-
) (1037 1038
ماکزيمم 15رقم اعشار دقت -
63تا 2
) (10307 10308
263 1
??
int x;
x=2.3;
float x;
x=3;
short x;
x=3243243255556;
بعض ي انواع اپراتورها
محاسباتي:
+
-
/
*
تخصيص مقدار:
=
مقايسه اي:
< < ==
=!
( %باقيمانده) -- ++
صورت هاي ديگر نوشتن برنامه
Void main ()
{
int x;
int y;
y=2;
x=y+2;
}
void main( )
{
int x;
x=2+2;
}
Void main ()
{
int x,y;
y=2;
x=y+2;
}
Void main ()
{
int y=2;
int x;
x=y+2;
}
Void main ()
{
int z=2,y=2,x;
x=z+y;
}
Void main ()
{
int y=2,x;
x=y+2;
}
چرا متغير
Void main ()
{
int x=4;
int y=5;
x=2;
y=x+2;
}
نمايش مقادير در مانيتور
مسئله :مي خواهيم مقدار يک متغیر را روي مانيتور چاپ کنيم.
%dيعني يک عدد صحيح را روي مانيتور نشان بده
اين عدد صحيح yخواهد بود.
%dنیز يک کاراکتر کنترلي مي باشد.
>#include <stdio.h
)( Void main
{
;int x=4
;int y=5
;x=2
;y=x+2
;)printf(“Result=%d”,y
}
نکات
چاپ بيش از يک مقدار
Void main ()
{
int x=2,y=2,z;
z=x+y;
printf(“%d + %d =%d”,x,y,z);
}
کاراکترهاي کنترلي مشابه %d
اعداد صحيح دهدهي
%d
;float x=23.2
;)printf(“%f”,x
اعداد اعشاري
%f
;’char ch=‘B
;char ch=66
;)printf(“%c”,ch
کاراکتر
%c
;int a=0x234
;)printf(“%x”,a
اعداد مبناي 16صحيح
%x
چند مثال
;)printf)“%d”,23
–
23چاپ مي شود.
–
کاراکتر aروي مانيتور چاپ مي شود.
–
کد اسکي کاراکتر aيعني 97چاپ مي شود.
–
کاراکتري که کد اسکي آن 97است يعني aچاپ مي شود.
(’printf)“%c”,’a
;(’printf)“%d”,’a
)printf)“%c”,97
دستورات ورودي
با استفاده از دستورات ورودي مي توانيم مقدار متغیرها را از طريق
keyboardوارد کنيم.
دستور scanf
برنامه اي بنويسيد که عددي صحيح را از keyboardدريافت کند و مربع آن را چاپ کند.
>#include <stdio.h
)(void main
{
عالمت آدرس
;int x
;(scanf)“%d”,&x
;((printf)“%d”,)x*x
يک عدد صحيح را از کاربر دريافت و آن را
}
در متغیر xمي ريزد.
نکات
به طرزي مشابه printf
–
–
–
براي خواندن اعداد اعشاري%f :
خواندن کارکترها%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بسته به آنچه برايش مشخص شده
است از اين بافر عنصر بر مي دارد و روي مانيتور چاپ مي کند.
در اين مثال هنگام اجراي scanfما ابتدا يک کاراکتر (مثال ، )aسپس فاصله يا ENTERو
بعد کاراکتربعد (مثال )bرا وارد کرده ايم .با توجه به اينکه فاصله يا ENTERدر واقع خود يک
کاراکتر هستند در واقع ما سه کاراکتر وارد کرده ايم که هر 3در بافر scanfقرار مي گيرند.
هنگام اجراي printfدو تا کاراکتر اول يعني aو فاصله (يا )ENTERچاپ مي شود و کاراکتر
مورد نظر ( )bچاپ نمي شود.
براي رفع مشکل مي توان نوشت :
;)scanf(“%c%c%c”,&c1,&c2,&c3
به طور کلي استفاده از scanfبراي گرفتن کاراکتر مناسب نيست .دو دستور که
مخصوص گرفتن کاراکتر هستند و مشکل باال را ندارند getcheو getchمي
باشند.
دستور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رقم اعشار نشان مي دهد.
با فرمت بندي خروجي مي توانيم مشخص کنيم اعداد چگونه نمايش داده شوند.
فرمت بندي خروجي (ادامه)
در فرمت بندي خروجي دو چیز مشخص مي شود:
–
–
تعداد ارقام اعشار
تعداد مکان هاي در نظر گرفته شده براي نمايش عدد (طول ميدان)
مثالها:
رقم بعد از نقطه تعداد ارقام
اعشاري را مشخص مي کند.
مقدار چاپ شده 2.300 :
;float x=2.3
;(printf)“%.3f”,x
مقدار چاپ شده 2.3000000 :
;float x=2.3
;(printf)“%.7f”,x
تعيين طول ميدان
int x=23;
printf)“%5d”,x(;
2 3
float x=2.3;
printf)“%7.3f”,x(;
2 . 300
int x=23;
printf)“%-5d”,x(;
2 3
float x=2.3;
printf)“%-7.3f”,x(;
2 . 300
چند مثال
int x=123456;
printf)“%3d”,x(;
123456
float x=23.456;
printf)“%.2f”,x(;
23 . 46
float x=23.456;
printf)“%2.2f”,x(;
23 . 46
تبديل انواع
زماني بروز مي کند که مي خواهيم عددي از يک نوع را در متغیري از نوع
ديگر بريزيم.
;int num
;num=2.56
2
قانون کلي
مقدار اعشاري=متغیر از نوع صحيح ()char ،short ،long ،int
بخش اعشاري حذف مي شود و بخش صحيح در متغیر قرار مي گیرد.
تخصيص مقدار خارج از محدوده عدد
;short num
;num=234567
عددي در محدوده short
بین -32768تا 32767
استفاده از کاراکترکنترلي نامناسب
;int x=23
;(printf)“%f”,x
صفر
;float x=23.5
;(printf)“%d”,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);
}
0 :خروجي
1
-= و+=
X=X+23;
X+=23;
X=X-23;
X-=23;
X=X-Y;
X-=Y;
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=0
4+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براي چاپ متن يا مقدار متغیرها
دستورات ورودي getche ، scanf :و getch
فرمت بندي خروجي :تعيین تعداد ارقام اعشار و طول ميدان
اپراتورها ،انواع آنها و اولويت
چند مثال برنامه نویسي
مثال :1برنامه اي بنويسيد که زاويه بر حسب درجه را دريافت کرده و معادل راديان آن را روي مانيتور نشان دهد.
.1قبل از نوشتن يک برنامه قدم اول پيدا کردن راه حل مسئله است.
–
در اين جا بايد رابطه اي بين درجه و راديان پيدا کرد.
–
گرفتن درجهd :
تبديل درجه به راديان با استفاده از رابطه باال :به دست آمدن R
چاپ R
d
R
R
d
180نويسيم.
.2سپس آنچه در برنامه از ما خواسته شده را به صورت مجموعه اي از مراحل مي
180
–
–
به بيان باال اصطالحا يک الگوريتم گفته مي شود .الگوريتم مجموعه اي از مراحل است که دنبال کردن آنها
ما را به حل مسئله مي رساند.
–
نوشتن الگوريتم مستقل از يک زبان برنامه نويس ي خاص است.
.3در مرحله آخر با نوشتن دستورات مناسب الگوريتم را به برنامه واقعي تبديل مي کنيم.
ادامه چند مثال برنامه نویسي
گرفتن :d
تبديل dبه :R
چاپ :R
;(scanf)“%f”,&d
;R=(3.14/180)*d
;(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باsinاستفاده از 3جمله اول سري
مثال )2برنامه اي بنويسيد که مقدار
x
حاصل را هم حساب کند.
محاسبه کند.
خطايsin(x
همچنین) (
)1
)( 2 n 1
n
!)(2n 1
n 0
)x ( 2 n 1
x3 x5
)sin(x) (1
) x A( x
!)(2n 1
!3! 5
n 0
3
n
الگوريتم:
–
–
–
محاسبه
خطا(A
محاسبه )
2
چاپ دو مقدار محاسبه شده
) ( A
2
2
error sin
ادامه چند مثال برنامه نویسي
#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برنامه اي بنويسيد که عددي را بگیرد اگر عدد بر 2بخش پذير بود 0و
درغیر اين صورت 1چاپ کند.
روش حل مسئله :اگر عدد 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
–
–
–
–
مقدمه :تعريف عبارت ( )expressionدر زبان Cو انواع عبارات
دستور if
دستور if-else
دستور switch-case
مقدمه – ( expressionعبارت)
اپراتورها:
–
–
–
محاسباتي- - ++ % / * - + :
مقايسه اي!= >= <= == > < :
منطقي( && :و) ||(يا) ! (نقيض)
( Expressionعبارت) :ترکيبي است از مقادير ،متغیرها و اپراتورها.
انواع عبارتها:
–
–
–
محاسباتي :از اپراتورهاي محاسباتي استفاده مي شودx*2+y 3*4+3 3+5 :
منطقی :عبارتی است که می توان به آن ارزش درست یا نادرست نسبت داد .مانند x<=0
!(3==4) 4==y x==3 (x!=3 && z>=3) 3!=4
معموال این گونه عبارات با استفاده از اپراتورهای مقایسه ای و منطقی ساخته می شوند.
مقدار (ارزش) عبارات
هر عبارت (محاسباتي يا مقايسه اي) داراي مقدار (ارزش) است:
–
مقدار (ارزش) عبارت 3+4برابر 7است.
در زبان cبه عبارت مقايسه اي درست ارزش 1و به عبارت مقايسه اي
نادرست ارزش 0نسبت داده مي شود.
–
–
ارزش 0 ، 3>=4است.
ارزش ) 1 ، (4>=5 || 3>2است.
مثال
خروجي عدد 1خواهد بود.
خروجي عدد 0خواهد بود.
>#include <stdio.h
)(Void main
{
;))printf)“%d”,)3<< 4
}
دستورات شرطي
در بسياري اوقات مي خواهيم يک دستور تنها زماني اجرا شود که شرط خاص ي برقرار باشد.
مثال :برنامه اي بنويسيد که عددي را از ورودي دريافت کرده و قدر مطلق آن را چاپ کند.
x x 0
y x
x x 0
>#include <stdio.h
)(void main
{
;float x
;(scanf)“%f”,&x
??
}
دستورات شرطي در C
سه نوع دستور شرطي در Cوجود دارد if-else ،if:و switch-case
• عبارت منطقی حتما بايد در داخل پرانتز باشد.
•در حالتي که بخش هاي ifيا elseبيش از
يک دستور باشند بايد بین } و { قرار گیرند.
)عبارت منطقی( if
يک يا چند دستور
else
يک يا چند دستور
)if (x<0
;y=-x
else
;y=x
)if (x<0
{
;y=-x
;z=y+1
}
else
;y=x
)عبارت منطقی( if
يک يا چند دستور
)if (x<0
;y=-x
)if (x<0
{
;y=-x
;z=y+1
}
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 مثال
:sign(x) ) برنامه اي براي محاسبه2 مثال
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");
{
x0
1
sign( x) 1
x0
undefine x 0
if-else ياif مي تواند دستورelse ياif در داخل بخش
)nested if- تودرتوif-else( .ديگري قرار گیرد
به همراه مجموعه دستوراتif-else ياif يک:نکته
. دروني شان در مجموع يک دستور فرض مي شوند
اول ازelse به همین علت در برنامه روبرو براي
.{} استفاده نشده است
Nested-if
Nested ifمعموال موجب ناخوانايي برنامه و دشواري درک آن مي
شود .در درک نحوه عملکرد برنامه استفاده از قانون زير مي تواند راه
گشا باشد:
–
هر elseبه نزديکترين ifقبل از خود وابسته است .مشروط بر آنکه :
در داخل } و { محصور نشده باشد
1 مثال
.خروجي قطعه برنامه زير را به دست آوريد
x=-3;
if (x>=0)
if (x>=12)
printf)“X is greater than or equal 12”(;
else
printf)“X is less than 12 and greater than 0”(;
else
printf)“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ها مطابقت داشت دستورات داخل آن اجرا مي شود .در صورت عدم
تطابق با هيچ يک از caseها دستورات بخش defaultاجرا مي شود.
آوردن بخش 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تأثیری ندارد و موجب خروج از
آنها نمی شود.
مثال:
در بعدد از ظهدر 15ژانويده 1990سدرويس هداي تلفندي شدرکت AT&Tآمريکدا
(بزرگت ددرين ش ددرکت مخ ددابراتي آمريک ددا) ب دراي اول ددین ب ددار در 114س ددال دچ ددار
اختاللي گسترده شد که 9ساعت به طول انجاميد.
مهندسان دریافتند که منبع اشکال در بخش ی از نرم افزار نوشته شده برای کنترل
خطوط است:
)switch (line
{
case 1:
نویسندگان نرم افزار اشتباها تصور
........
;break
case 2:
کرده بودند که دستور breakدر )if (y==1
)if (x == 0
{
موجب خروج از بخش شرط ifمی شود .در
...........
..........
)if (y == 1
حالی که موجب خروج از switchمی شود .
;break
............
...........
در نتیجه بخش ی که به صورت ____ نشان داده
}
________
شده اجرا نمی شود و موجب بروز مشکل
________
;break
default:
شده بود.
.........
........
}
........
………
……….
دستورات تکرار (حلقه ها)
با استفاده از دستورات تکرار (حلقه ها) مي توانيم اجراي بخش ي از
برنامه را چند بار تکرار کنيم.
سه دستور تکرار در زبان C
–
–
–
for
while
do-while
ضرورت وجود حلقه ها در برنامه
مثال )1برنامه ای بنویسید که اعداد 1تا 100را چاپ کند.
يک برنامه بد
>#include <stdio.h
)(void main
{
;int i
;i=0
;i++
;)printf(“%d”,i
;i++
;)printf(“%d”,i
.....
.....
...
}
دستور for
)دستور ; 2عبارت منطقی ;دستور for (1
بخش :forبخش ي که اجراي آن تکرار خواهد شد.
براي بيش از يک دستور در بخش forاستفاده از } { الزم است.
اجراي دستور 1
( 0نادرست)
پايان
عبارت
منطقی
( 1درست)
اجراي بخش for
اجراي دستور 2
دستور(ات)
اجراي دستور 1
پايان
عبار
ت
0
1
اجرای بخش for
اجراي دستور 2
مثال
مثال )2عملکرد قطعه برنامه زير را توضيح دهيد:
.1
i=0
چون i<2است دستور printfاجراء مي شود و عدد 0در مانيتور چاپ مي
شود.
i++اجرا مي شود .در نتيجه i=1
i=1<2در نتيجه مجددا دستور printfاجراء مي شود و اين بار عدد 1در
مانيتور چاپ مي شود.
i++اجرا مي شود .در نتيجه i=2
اين بار i=2<2برقرار نيست .در نتيجه از حلقه خارج مي شويم.
دستور printfدو بار اجرا شد.
)for (i=0;i<2;i++
;)printf(“\n%d” ,i
.2
.3
.4
.5
.6
با استفاده از حلقه ها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
مشابه for ، ifو دستورات داخل حلقه مجموعا يک دستور فرض مي
شوند و در نتيجه نيازي به } { براي 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
نکته :1در بخش های دستور 1و دستور 2هر دستوری می تواند باشد.
مثال
>#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);
}
}
نکته )3در بخش های دستور 1و 2می توان بیش از یک دستور قرار داد .دستورات با
استفاده از کاما ( ),از هم جدا می شوند.
مثال:
>#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;
را انتخاب کند اعداد گرفته می شودy تا زمانی که کاربر
int num,sum;
ch='y';
از حلقه خارج می شویم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);
}
نکته-تفاوت مهم forو while
با استفاده از دستور 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را بگیرد و ريشه هاي آن را
محاسبه کند.
ax2 bx c 0
.1
.2
حل مسئله:
الگوريتم:
.1
گرفتن ضرايب b ،aو c
محاسبه دلتا
.3
محاسبه ريشه ها بر اساس مقدار دلتا
.2
b 4ac
2
0
0
0
b
x1, 2
2a
b
x1
2a
root
no
#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 • دستور
.مي رود
. مي باشدmath.h ، آنheader file
ادامه چند مثال برنامه نویسي
مثال ) 2تبديل مختصات دکارتي ) (x,yبه مختصات قطبي
–
–
) (r ,
) [ ,
محاسبه rبه سهولت قابل انجام است:
وضعيت هاي مختلف زير را خواهيم داشت:
براي محاسبه
r x2 y2
( x>0و )y>=0يا ( x>0و )y<0
y
( x<0و )y>0
) ( arctan
x
y
( x<0و arctan( ) )y<=0
x
( x=0و :)y>0
2
( x=0و :)y<0
2
y
x
) ( arctan
الگوريتم:
.1گرفتن )(x,y
.2محاسبه r
.3محاسبه با توجه به
محل نقطه
#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
math.h آنheader file
.است
ادامه چند مثال برنامه نویسي
برنامه اي بنويسيد که دو عدد را بگیرد و ب م م آنها را محاسبه کند.
):Greatest Common Devisor (GCDب م م
ادامه چند مثال برنامه نویسي
.1
روش حل :محاسبه ب م م با روش پلکاني:
.2
الگوريتم :
0
الف) گرفتن عدد اول ( )aو عدد دوم ( . )bفرض کنيد a>b
ب) تا زماني که a%b=0نشده است.
c=a%b
a=bو بعد b=c
ج) bرا چاپ کن
2
1
8
2
4
6
52
4
4
48
ادامه چند مثال برنامه نویسي
#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
الگوريتم:
h=0 ،m=0 ،s=0 .1
.2نمايش زمان
s=s+1 .3
.4اگر s=60آنگاه s=0و m=m+1
.5اگر m=60آنگاه m=0و h=h+1
.6اگر h=24آنگاه h=0
.7يک ثانيه انتظار
.8انجام 2تا 7به تعداد بي نهايت
>#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
for(;;) .1يک حلقه پايان ناپذير است.
{
.2کاراکتر کنترلي \bموجب مي شود که مکان نما 1واحد
;second=0; minute++
به عقب برود .استفاده از آن موجب مي شود تا زمان بعدي روي
}
قبلي چاپ شود و نه در محل مجزا.
)if (minute==60
کد اسکي 8 ، \bاست( .کد اسکي \nو \tبه ترتيب
{
.3تابع Sleepبراي ايجاد تاخير به کار مي رود S( .حرف
;minute=0; hour++
بزرگ است).
}
) Sleep(nبه اندازه nميلي ثانيه تاخير ايجاد مي کند.
)if (hour==24
header fileآن windows.hاست.
;hour=0
(در borlandو dos.h ، Turboمي باشد).
)for (i=0;i<11;++i
;)"printf(”\b
;)Sleep(1000
}
}
ادامه چند مثال برنامه نویسي
افزودن قابليت زنگ زدن در يک زمان مشخص
نکته :کاراکتر کنترلي \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);
}
}
ادامه چند مثال برنامه نویسي
بازي حدس :توسط کامپيوتر عدد صحيح تصادفي بین 0تا 1000توليد
مي شود (لکن به کاربر نشان داده نمي شود) سپس از کاربر خواسته مي
شود عددي را به عنوان حدس وارد کند .اگر عدد وارد شده مساوي
عدد مطلوب باشد بازي با برنده شدن فرد خاتمه مي يابد و اگر کوچکتر
يا بزرگتر باشد به کاربر اعالم مي شود .کاربر مي تواند تا حداکثر 13
حدس داشته باشد .در صورتي که تمام حدس ها اشتباه باشد کاربر
بازنده مي شود
ادامه چند مثال برنامه نویسي
الگوريتم:
.1
توليد يک عدد بین 0تا 1000
دريافت حدس کاربر
اگر عدد کاربر برابر عدد مطلوب بود اعالم موفقيت
و گرنه اعالم کوچکتر يا بزرگتر بودن به کاربر و سپس بازگشت به 2
.5
انجام 2تا 4به تعداد 13بار
.2
.3
.4
32767 تا0 اعداد تصادفي بينrand()
#include <stdio.h>
#include <stdlib.h>
rand()%1001 در نتيجه.توليد مي کند
void main()
. توليد مي کند1000 تا0 اعداد تصادفي بين
{ 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");
}
تابع
با پاسخ به 3سؤال زير مي توان با اين مفهوم آشنا شد:
.1
تابع چيست؟
چگونه ساخته مي شود و در کجاي برنامه قرار مي گيرد؟
چگونه استفاده مي شود؟
.2
.3
در اين جلسه به اين سؤال ها پاسخ داده مي شود.
)1تابع چيست؟؟
مقدمه -تابع در رياضيات
مي توان گفت در هر تابع در رياضيات عناصر زير وجود دارد:
y f ( x) x 2
xR yR
– نام( :در مثال باال )f
– ورودي (در مثال باال )xکه متعلق به مجموعه اي به نام دامنه است.
– مقدار برگشتي ( )yکه متعلق به مجموعه اي به نام برد است.
– ضابطه تابع ( )x 2که ارتباط بين مقدار برگشتي و ورودي را مشخص مي کند.
تابع مقدار xرا مي گيرد و بر اساس ضابطه موجود y ،را محاسبه کرده و برمي
گرداند.
تابع چيست؟؟ (ادامه)
مفهوم تابع در زبان Cمشابهت زيادي با مفهوم تابع در رياضيات دارد
و در واقع مدل کننده تابع در رياضيات است.
)2ساخت تابع
y f ( x) x 2
)float f (float x
{
;float y
;y=x*x
;return y
}
(نام و نوع ورودي) نام تابع نوع برگشتي
}
پياده سازي ضابطه تابع با يک سري دستورات
برگرداندن مقدار برگشتي
yR
{
دستور returnمقدار محاسبه شده را برمي گرداند.
در مثال باال تابعي نوشتيم که يک ورودي اعشاري را مي گیرد و مجذور آن را برمي گرداند.
به xورودي يا پارامتر ورودي مي گويند.
yهم مقدار برگشتي مي باشد.
xR
(نام و نوع ورودي) نام تابع نوع برگشتي
}
پياده سازي ضابطه تابع با يک سري دستورات
ساخت تابع (ادامه)
برگرداندن مقدار برگشتي
{
تابعي بنويسيد که يک ورودي اعشاري بگیرد و قدر مطلق آن را محاسبه کند.
)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) تابع
1 x0
sign( x ) 0 x 0
1 x 0
محل قرار گرفتن تابع
#include …..
#include ….
……
void main()
{
…..
…..
}
float f (float x)
{
float y;
y=x*x;
return y;
}
. قرار مي گیردinclude و بعد از دستوراتmain قبل از
)3استفاده از تابع
استفاده از تابع در رياضيات در واقع همان احضار تابع است.
y=f(x)=3x+1
احضار تابعf(2)=7 :
عدد 2به جاي xقرار مي گیرد و y=7به دست مي آيد.
در زبان Cهم مي توان تابع را احضار کرد (مثال بعد)
استفاده از تابع
مثالي از احضار تابع
در اين مثال هنگام اجراي برنامه زماني که به
دستور احضار تابع مي رسيم تابع fبه ازاي ورودي
x=3.5محاسبه خواهد شد.
مقدار برگشتي تابع (يعني )yدر zريخته مي شود
دستور احضار تابع
به 3.5آرگومان ورودي گفته مي شود
>#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
}
مثال قبل يک برنامه کامل و قابل اجراي 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));
}
تعداد و نوع آرگومانها باید با تعداد:نکته
.و نوع پارامترها یکسان باشد
تعریف چند تابع در برنامه
)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;
}
)2( ادامه
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));
}
توضیح برنامه
در این برنامه از سه تابع pow ،factو expاستفاده شده است.
این نشان می دهد می توان در یک برنامه از چند تابع استفاده کرد.
توضیح برنامه را با بررس ی عملکرد این سه تابع آغاز می کنیم.
تابع fact
این تابع عدد nرا می گيرد و ! nرا حساب می
کند.
نکته :به ازای nهای منفی خطایی گرفته نمی شود
اما نتیجه غلط 1برگشت داده می شود.
)long fact(int n
{
;int i
;long result=1
)for (i=1;i<=n;++i
;result*=i
;return result
}
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;
}
راn و عدد صحیحx عدد حقیقیpow تابع
.محاسبه می کند
x n می گيرد و را
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;
}
x0 x1 x2 x3
xm
e
...
0! 1! 2! 3!
m!
x
m و عدد صحیحx عدد حقیقی، exp تابع
.را می گيرد و رابطه باال را محاسبه می کند
عملکرد برنامه
عملکرد برنامه:
.1
.2
.3
.4
اجرای برنامه از mainشروع می شود.
وجود ) exp(2,10موجب می شود تابع expشروع به اجرا کند.
در تابع expتوابع powو factبا پارامترهای مختلف احضار می شوند و محاسبات خود
را انجام می دهند .مثال به ازای k=1در تابع fact(1) ، expو ) pow(2,1احضار می
شوند.
نتیجه احضار تابع ) exp(2,10محاسبه عبارت زیر است:
10
x
0
x
1
x
2
x
3
x
ex
...
!0! 1! 2! 3
!10
تقسیم بندی توابع
می توان از جنبه های مختلف توابع را تقسیم بندی کرد:
–
ورودی :با ورودی –بی ورودی
مقدار برگشتی :با برگشتی -بی برگشتی
–
نوشته شده توسط کاربر-کتابخانه ای
–
تقسیم بندی تابع از نظر ورودی
یک تابع می تواند دارای ورودی باشد(مانند مثالهایی که تاکنون گذشت) و می
تواند بدون ورودی باشد (مثال صفحه بعد)
#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 در داخل پرانتز یا چيزی نمی نویسیم و یا کلمه. ) ( گذاشته می شود،برای تابع بی ورودی
.نوشته می شود
.هنگام احضار تابع نيز باید )( بگذاریم
تقسیم بندی از نظر مقدار برگشتی
یک تابع می تواند یک مقدار برگرداند(مانند مثالهایی که تا کنون گذشت) یا هیچ مقداری را برنگرداند (مثال زیر)
تابع بدون برگشتی returnندارد.
در بخش نوع برگشتی 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
}
–تابع بی ورودی –بی برگشتی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متعدد قرار گرفته است.
توابع کتابخانه ای
انواع توابع کتابخانه ای:
–
توابع ورودی-خروجی getch،getche ،scanf ،printf :و...
:header fileاغلب conio.h ، stdio.h
– توابع ریاض ی( abs :برای محاسبه قدر مطلق) ( pow،برای محاسبه توان) ( sqrt ،محاسبه
رادیکال) exp ،atan ،acos ،asin،tanh ،cosh ،sinh ،tan ،cos ،sin
) ( log ، xلگاریتم در مبنای log( log10 ، )eدر مبنای )10
(محاسبه
math.h :header file
– توابع برای کار با فایل ها fopen ،fwrite ،fread :و (...در بخش آشنایی با فایل ها توضیح داده
خواهند شد).
e
stdlib.h :header file
– کارهای گرافیکی ،کاربا پورت ها ،نوشتن برنامه اسمبلی و......
توابع کتابخانه ای
نکته :در کتاب های برنامه نویس ی Cو همچنین helpمحیط های نرم
افزاری در مورد ورودی و مقدار برگشتی توابع و نوع آنها و همچنین
عملکرد آنها توضیح داده شده است.
در شکل helpمحیط borland cبرای تابع sinنشان داده شده است.
مالحظه می شود که نوع مقدار برگشتی doubleاست .تابع یک ورودی از نوع
doubleدارد و برای محاسبه sinبه کار می رود.
header fileاین تابع هم math.hاست.
ادامه توابع کتابخانه ای
:مثال
#include <stdio.h>
#include <math.h>
void main ()
{
printf("%f",sin(3.141));
}
کاربرد توابع
مثال هايي از كاربرد توابع
مثال 1
مي خواهيم برنامه اي بنويسيم كه مشتق تابع دلخواه ) f(xرا در نقطه x0
محاسبه كند.
) f ( x0 h) f ( x0
روش حل:
f ( x0 ) limh0
h
به ازاي hكوچك مي توان نوشت:
) f ( x0 h) f ( x0
h
f ( x0 )
اکنون برنامه ای می نویسیم که عبارت باال را محاسبه کند (صفحه بعد)
2
x
1 محاسبه مشتق
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));
}
مشتق دوم
f ( x0 h) f ( x0 )
h
f ( x0 h) f ( x0 )
h
f ( x0 ) lim h0
x=3 در نقطهxsinx+1 محاسبه مشتق دوم تابع
#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,f(x0
– x1نقطه تقاطع خط و محور به عنوان تقریب بعدی
– با رسم خط مماس بر ))(x1,f(x1
r
به تقریب x2می رسیم
x2 x1 x0
......
می توان ثابت کرد در صورتی تابع fشرایط خاص ی را ارضا کند این تقریب ها به سمت ریشه همگرا
می شود.
ادامه
معادله خط مماس بر )):(x0,f(x0
) y f ( x0 ) f ( x0 )(x x0
r
x0
x2 x1
با توجه به اینکه این خط از نقطه ) (x1,0نیز می گذر خواهیم داشت:
) 0 f ( x0 ) f ( x0 )(x1 x0
) f ( x0
x1 x0
) f ( x0
به همین ترتیب برای x2خواهیم داشت:
و در حالت کلی:
) f ( x1
x2 x1
) f ( x1
) f ( xn
xn 1 xn
) f ( xn
با افزایش nبه تقریب بهتری دست می یابیم.
ادامه
رقم اعشار محاسبه3 را تاf(x)=xsinx-1 برنامه ای بنویسید که ریشه معادله
.کند
#include <stdio.h>
f ( xn ) 0.5 *103 : رقم اعشار3 دقت: (نکته
#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;
{
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());}
نكات مثال قبل
:fabs محاسبه قدر مطلق اعداد حقيقي
تابع absبراي محاسبه قدر مطلق اعداد صحيح به كار مي رود.
0.5e-3 اصطالحا نماد علمي نمايش اعداد خوانده مي شود و برابر است با :
3
0.5 *10
مثال -3محاسبه انتگرال
b
f ( x ) dxرا محاسبه کند.
برنامه ای بنویسد که حاصل
a
بیان یک روش عددی:
بازه ] [a,bرا به نقاط متساوی الفاصله xi
تقسیم می کنیم.
مجموعه مساحت ذوزنقه های تشکیل شده
در شکل مقابل می تواند تقریبی از انتگرال
باال باشد:
)f(xn-1)f(xn
)f(x2
)f(x1
)f(x0
xn-1 xn=b
x0=a x1 x2
h
h
h
h
I ( f ( x0 ) f ( x1 )) ( f ( x1 ) f ( x2 )) ... ( f ( xn2 ) f ( xn1 )) ( f ( xn 1 ) f ( xn ))
2
2
2
2
h
)) ( f ( x0 ) 2 f ( x1 ) 2 f ( x2 ) ... 2 f ( xn1 ) f ( xn
2
3
( x sin x 1)dx محاسبه
1
#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;
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));
}
نكته :متغيرهای محلی و سراسری
برنامه زیر را در نظر بگیرید.
سوال :مقدار چاپ شده بر روی مانیتور چقدر است:
عدد 5یعنی مقدار yتعریف شده درتابع mainچاپ می شود نه 36
که مقدار yتعریف شده در funcاست.
>#include <stdio.h
)void func (int z
{
;int y
;y=z*z
}
)( void main
{
;int y
;y=5
;)func (6
;)printf("%d",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
هستند.
مثال
در تابع y ، funcمحلی است .در نتیجه تنها زمانی
که funcدر حال اجراست وجود دارد .و وقتی که
اجرای funcتمام می شود از بين می رود.
به همين علت دستور ) printf(“%d”,yاشتباه است
چون yای وجود ندارد که printfآن را چاپ کند.
>#include <stdio.h
)void func (int z
{
;int y
;y=z*z
}
)( void main
{
;)func(3
;)printf("%d",y
}
ادامه
در این مثال مقداری که چاپ می شود مقدار متغير
Yتعریف شده در mainاست و نه yتعریف شده
در تابع .funcچون yتابع funcفقط در محدوده
خود funcشناخته شده است و برای mainشناخته
شده نیست.
>#include <stdio.h
)void func (int z
{
;int y
;y=z*z
}
)( void main
{
;int y
;y=5
;)func (6
;)printf("%d",y
}
متغيرهای سراسری ()global
تعریف :به متغيرهایی که خارج از توابع تعریف می شوند متغيرهای سراسری یا globalمی گویند.
دو ویژگی متغيرهای :global
•برخالف متغيرهای ،localاز نقطه ای که تعریف می شوند تا انتهای
برنامه معتبرند.
•اگر هنگام نعریف مقداری به آنها داده نشود مقدارشان صفر در نظر
گرفته می شوند.
در برنامه روبرو ،متغير global numاست .چون در خارج توابع تعریف شده.
این متغير در func2 ،func1و mainاعتبار دارد.
عملکرد برنامه:
•ابتدا num=4می شود.
•) func1(3اجرا می شود .مقدار numبرابر 7شده و چاپ می شود.
•سپس ) func2(3اجرا می شود .مقدار numبرابر 4شده و چاپ می شود.
•اگر به جای ،int num=4تنها int numنوشته می شد ،مقدار numصفر
می شد.
>#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
}
تابع بازگشتی ()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=2
return (2*fact(1))
1
main به2 برگشت
func(1)
n=1
return (1*fact(0))
1
func(0)
n=0
return 1
نکته
یا:
نکته :ایده ای که ما را به برنامه بازگشتی رساند فرمول زیر بود:
!)n! n * (n 1
)fact(n)=n*fact(n-1
فرمول باال به روشنی مفهوم بازگشت را درخود دارد( .برای محاسبه factبه ازای nباید
همان تابع factبه ازای n-1محاسبه شود).
نکته
در هر تابع بازگشتی دو رکن اصلی زیر وجود دارد:
–
قانون (فرمول) بازگشت :چگونگی بازگشت را مشخص می کند .در مثال قبل قانون بازگشت !) n!=n*(n-1د
بود.
–
شرط خاتمه :مشخص می کند بازگشت چه زمانی متوقف می شود .در مثال قبل n=0شرط خاتمه بود.
n0
)n * fact(n 1
fact(n)
1
n0
برای بتوانیم یک برنامه بازگشتی بنویسیم باید ابتدا این دو رکن را به دست آوریم .بعد از انجام این کار
نوشتن برنامه های بازگشتی ،به سادگی امکان پذیر است.
مثال 2
برنامه ای بنویسید که nراxبه صورت بازگشتی محاسبه کند.
nعدد صحیح غیر منفی و xاعشاری است.
فرض کنید می خواهیم تابعی به نام powبدین منظور بنویسیم :
ابتدا دو رکن بازگشت را مشخص می کنیم:
قانون بازگشت:
x n x * x n1
شرط خاتمه n=0 :
n0
n0
) x * pow( x, n 1
pow( x, n)
1
2 برنامه مثال
#include <stdio.h>
float pow(float x, int n)
{
if (n==0)
return 1;
else
return (x*pow(x,n-1));
}
void main()
{
printf("%f",pow(2.5,2));
}
مثال 3
برنامه بازگشتی بنویسید که حاصل عبارت زیر را محاسبه کند:
a a a .....
(تعداد nتا aداریم)
فرض کنید می خواهیم تابعی بازگشتی به نام ) rad(a,nبنویسیم که این کاررا انجام
دهد.
قانون بازگشت و شرط خاتمه :
n 1
n 1
) a rad (a, n 1
rad (a, n)
a
3 برنامه مثال
#include <stdio.h>
#include <math.h>
float rad(float a , int n)
{
if (n==1)
return sqrt(a);
else
return sqrt(a+rad(a,n-1));
}
void main()
{
printf("%f",rad(2,3));
}
از توابع کتابخانه ایsqrt تابع:نکته
. استmath.h آنheader file است و
این تابع برای محاسبه رادیکال استفاده
.می شود
مثال 4
برنامه ای بازگشتی بنویسید که ب.م.م دو عدد را محاسبه کند.
ب .م .م )GCD( Greatest Common Divisor:
می خواهیم تابعی به نام ) gcd(a,bبنویسیم که ب.م.م دو عدد aو bرا محاسبه کند.
روش معمول محاسبه ب.م.م ،روش پلکانی است.
در این مثال:
0
2
1
3
3
6
9
33
6
6
27
(3,0)=3ب.م.م =) (6,3ب.م.م =) (9,6ب.م.م =) (33,9ب.م.م
مثال -4ادامه
با دقت در رابطه صفحه قبل می توان گفت:
)gcd(33,9)=gcd(9,33%9
( :%باقی مانده)
به این ترتیب می توان قانون بازگشت و شرط خاتمه را به صورت زیر به دست آورد:
b0
b0
)gcd(b, a%b
gcd( a, b)
a
4 برنامه مثال
#include <stdio.h>
int gcd(int a , int b)
{
if (b==0)
return a;
else
return gcd(b,a%b);
}
void main()
{
printf("%d",gcd(33,9));
}
5 مثال
.عملکرد برنامه زیر را توضیح دهید
#include <stdio.h>
long fact(int n) fact(2)
{
long y;
n=2
if (n==0)
y=2*fact(1)
1
y=1;
y=2
else {
2 چاپ عدد
y= n*fact(n-1);return 2
printf(“%d”,y);
}
return y; }
void main()
{printf("%d",fact(2));}
fact(1)
n=1
y=1*fact(0)
1
y=1
1 چاپ عدد
return 1;
fact(9)
y=1
return 1;
مثال -6برج های هانوی ()Towers of hanoi
C
B
A
1
2
3
بازی برج های هانوی:
4
سه میله B ،Aو Cو تعدادی دیسک روی میله Aداریم .می خواهیم این دیسک ها را از Aو
با کمک میله Bبه Cانتقال دهیم .به نحوی که هیچ گاه دیسک بزگتر بر روی کوچکتر قرار
نگیرد.
در اینجا می خواهیم برنامه بازگشتی بنویسیم که این بازی را پیاده کند.
برج های هانوی-ادامه
هدف :جابجایی 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( .کوچکترین)
ادامه
به دست آوردن قانون بازگشت:
فرض کنید بازی را شروع کرده اید و بعد از انجام یک سری جابجایی به
وضعیت زیر رسیده ایم:
یعنی n-1دیسک را به Bجابجا کرده باشیم.
با این فرض بقیه مراحل
B
C
A
به صورت زیر است:
دیسک nام را به Cمنتقل کن.
دیسک میله را از Bبه Cجابجا
1
کن.
2
3
4
قانون بازگشت و شرط خاتمه
در نتیجه:
جابجایی nدیسک از Aبه Cبا کمک :B
–
–
–
جابجایی n-1دیسک از Aبه Bبا کمک C
انتقال دیسک nام از Aبه C
جابجایی n-1دیسک از Bبه Cبا کمک A
به عبارت بهتر قانون بازگشت به صورت زیر
=)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;
}
. در این برنامه ضابطه گفته شده در صفحه قبل رعایت شده
. تعریف شده است، exp قبل از احضار درpow مثال تابع
. تعریف شده استmain قبل از احضار در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;
}
void main()
{
printf("%f",exp(2,10));
}
2 مثال
#include <stdio.h>
long fact(int n)
{int i;
long result=1;
for (i=1;i<=n;++i)
result*=i;
return result;}
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;}
void main()
{
printf("%f",exp(2,10));
}
. در این برنامه ضابطه گفته شده رعایت نشده
. احضار شده در حالی که قبل از آن تعریف نشده استexp درpow تابع
:در این گونه موارد در اکثر کامپایلر ها با خطای کامپایلی زیر روبرو می شویم
Call to undefined function pow
.) شده بدون اینکه تعریف شودcall( احضار،pow یعنی تابعی به نام
ادامه
برای سهولت بیشتر در نوشتن برنامه ها ،در زبان 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;}
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));
}
اعالن کرده ایمexp تعریف شده اند اما چون آنها را قبل ازexp بعد ازfact وpow در این مثال توابع
.مشکلی پیش نمی آید
ادامه
تعریف تابع) :(Function definitionنوشتن کامل تابع
اعالن تابع ):(Function declarationنوشتن خط اول تابع
هر تابع قبل از احضار مي بايست يا تعريف شود يا اعالن شده باشد.
مزایای استفاده از توابع
نوشتن برنامه های خواناتر :تقسیم برنامه به چند تابع سبب می شود که
فهم برنامه آسان تر شود.
امکان نوشتن پروژه های بزرگ به صورت ساده تر و سریع تر.
–
–
–
تقسیم پروژه به چند بخش.
انجام هر بخش توسط یک تیم مجزا .مثال حاصل کار هر تیم ،می تواند یک تابع
باشد.
در کنار هم قرار دادن توابع و استفاده از آنها .
توصیه هایی جهت نوشتن برنامه های خوانا
.1استفاده از توابع در نوشتن برنامه
.2انتخاب نام های مناسب و با مسمی برای متغيرها و توابع
– مثال برای تابعی که فاکتوریل را حساب می کند factیک نام مناسب است.
– برای متغيری که حاصل جمع چند عدد را نگاه می دارد نام sumمناسب است.
ادامه
.3دندانه ای کردن :رعایت یک ترتیب خاص در نوشتن خطوط برنامه
–
مثال دستورات داخل تابع با کمی فاصله نسبت به خط اول تابع قرار گيرند.
)(void main
{
;int x
;x=4
}
–
دستورات داخل شرط و حلقه ها با کمی فاصله نسبت به خود دستورات شرط و حلقه
قرار گيرند.
)if (x==0
;return 1
ادامه
.4نوشتن توضیح ( )commentبرای دستورات
اگر در خطی از برنامه از //استفاده شود ،کامپایلر از بعد از آن
تا انتهای خط را هنگام کامپایل در نظر نمی گيرد .به این
ترتیب می توانیم برای خطوط مختلف برنامه توضیحاتی به
زبان معمولي خود بنویسیم.
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نقطه
xx
0 ،و....و
1
x
1ازnروابط زیر به دست می آیند:
اگر تنها هدف به دست آوردن میانگین بود به راحتی می توانستیم آن را انجام دهیم:
2
)
n 1
x
n 1
(x
i
n
i 0
i
2
i 0
n
;float x
;sum=0
)for (i=0;i<5;++i
{
;(scanf)“%f”,&x
;sum+=x
}
;ave=sum/5
ادامه
در اینجا برای به دست آوردن واریانس نیاز به همه 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[2] ،x[1] ،x[0و ]x[4
ناميده مي شوند.
اصطالحا مي گوييم آرايه اي به نام ، xاز نوع intو با 5عنصر تعريف كرده ايم.
به 3 ،2، 1 ،0و 4اصطالحا انديس آرايه گفته مي شود.
به همین ترتيب مي توان آرايه هايي ازانواع ديگر مثل short ،char ،floatو
....داشت.
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);
}
ادامه
مثال )5برنامه ای بنویسید که 10عدد از کاربر بگیرد آنها را به صورت صعودی مرتب کرده و چاپ کند.
برنامه از دو بخش تشکیل شده است:
دریافت اعداد
مرتب کردن آنها
.1دریافت اعداد را می توان با تعریف یک آرایه و نوشتن قطعه برنامه ای به صورت زیر انجام داد:
;]float x[10
;int i
)for (i=0;i<10;++i
;(]scanf)“%f”,&x[i
ادامه
.2به مسئله مرتب سازی اصطالحا sortingگفته می شود .برای مرتب
سازی روش های متعددی وجود دارد .مانند :
(bubble sortمرتب سازی حبابی)merge sort ،quick sort ،
و.....
در این مثال از bubble sortکه یکی از ساده ترین آنهاست استفاده می
شود.
Bubble sortبرای مرتب سازی صعودی
ابتدا دو عنصر اول و دوم آرایه با هم مقایسه می شوند.اگر عنصر اول از دوم بزرگتر بود جای دو عنصر عوض
می شود .سپس عناصر دوم و سوم مقایسه می شوند و مشابه قبل تعویض مکان در صورت لزوم انجام می
گیرد .همین کارها برای عناصر 3و 4 ،4و ،5و....انجام می شود تا به انتهای آرایه برسیم.
زمانی که به انتهای آرایه برسیم ماکزیمم مقادیر در آخرین مکان آرایه قرار گرفته است و به عبارت دیگر
زمانی که یک باراز ابتدا تا انتهای آرایه پیمایش شود عنصر آخر می شود.
در مرحله بعد این پیمایش و اعمال گفته شده روی عناصر اول تا یکی مانده به آخر انجام می شود و در
نتیجه :
با دو بار پیمایش 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
در اینجا 2در ] 3 ،x[0در ] x[1و -5در ] x[3قرار می گیرد.
مثال های دیگر:
;}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عدد را حساب کنیم باید
تمام اعداد 10را به 20تبدیل کنیم .این امر دو مشکل دارد :وقت گیر
بودن و فراموش کردن تعویض همه مقادیر.
دستور defineدر زبان Cاین مشکل را مرتفع می سازد.
دستور define
مثال :7همان مثال قبل با تغیيرات جزئی( :با رنگ قرمز)
•دستور ،defineمانند includeیک دستور راهنمای پیش پردازنده
است.
• کامپایلر در هر جای برنامه که با SIZEمواجه شود به جای آن عدد 10
قرار می دهد.
• SIZEاصطالحا یک ثابت ( )constantخوانده می شود.
•اسم ثابت ،دلخواه است .معموال ثابت ها را با نام های با حروف بزرگ
تعریف می کنند.
•مقدار ثابت در برنامه غيرقابل تغیير است .مثال اگر دستوری
مثل SIZE=23در برنامه بنویسیم خطا داده می شود.
•اگر مثال خواستیم با 20عدد کار کنیم تنها کافی است عدد 10را در
defineبه 20تبدیل کنیم.
•محل دستور defineدر بخش includeهاست( .ترتیب نوشتن
includeها و defineمهم نیست و می توانند قبل یا بعد هم
قرار گيرند)
>#include <stdio.h
#define SIZE 10
)]float 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
}
ادامه آرایه
تعریف آرایه:
آرایه ای به نام aاز نوع intو با اندازه 3عنصر تعریف کرده ایم.
به عناصر آرایه می توان از طریق اندیسشان دسترس ی داشت.
;]int a[3
]a[2] a[1] a[0
;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رشته ها به صورت آرایه ای از کاراکترها پیاده می شوند.
–
با نوشتن ;] char st [20می توانیم رشته ای به نام stبا ماکزیمم طول 20
تعریف کرده ایم.
نحوه مقداردهی
نحوه مقداردهی :به دو صورت می توان به یک رشته مقدار داد:
.1
.2
با استفاده از دستورات ورودی :مثل scanfبا استفاده از کارکتر کنترلی %s
;) scanf(“%s”,&stیا )scanf(“%s”,st
به صورت مستقیم هنگام تعریف رشته
–
;”char st[20]=“Ali
نحوه قرار گرفتن رشته در حافظه به این صورت است:
Cدر انتهای هر رشته به طور خودکار کاراکتر ( NULLپوچ-تهی) (که با عالمت \0نشان داده می شود) را
قرار می دهد.
در نتیجه طول واقعی یک رشته یکی بیشتر از تعداد کاراکترهایش است.
3
\0
2
i
1
0
A l
ادامه
نکته:کد اسکی کاراکتر ، NULLصفر است.
کاری انجام نمی شود printf)“%c”,’\0’(;.
صفر چاپ می شودprintf)“%d”,’\0’(; .
نحوه چاپ یک رشته :با دستور printfو استفاده از کاراکتر کنترلی %s
ادامه
مثال )1
>#include <stdio.h
)(void main
{
;"char st[20]="Hello
;)printf("%s",s
}
رشته ای به نام stبا مقدار Helloتعریف شده .خروجی این برنامه پیغام 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در نظر می گیرد.
.2رشته از اندازه آرایه بزرگتر است
خطا
.3رشته مساوی اندازه آرایه است.
;”char s[3]=“aghugii
;”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
ادامه
اضافهs1 را به انتهایs2 رشتهstrcat(s1,s2): برای الحاق دو رشته به یکدیگر به کار می رود: strcat
.می کند
#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);
}