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‬رقم اعشار دقت‪-‬‬
‫) ‪ (1037 1038‬‬
‫ماکزيمم ‪ 15‬رقم اعشار دقت ‪-‬‬
‫‪ 63‬تا‪ 2‬‬
‫) ‪ (10307 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");
{
x0
1

sign( x)   1
x0
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‬‬
‫‪xR yR‬‬
‫– نام‪( :‬در مثال باال ‪)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‬‬
‫}‬
‫(نام و نوع ورودي) نام تابع نوع برگشتي‬
‫}‬
‫پياده سازي ضابطه تابع با يک سري دستورات‬
‫برگرداندن مقدار برگشتي‬
‫‪yR‬‬
‫{‬
‫دستور ‪ return‬مقدار محاسبه شده را برمي گرداند‪.‬‬
‫در مثال باال تابعي نوشتيم که يک ورودي اعشاري را مي گیرد و مجذور آن را برمي گرداند‪.‬‬
‫به ‪ x‬ورودي يا پارامتر ورودي مي گويند‪.‬‬
‫‪ y‬هم مقدار برگشتي مي باشد‪.‬‬
‫‪xR‬‬
‫(نام و نوع ورودي) نام تابع نوع برگشتي‬
‫}‬
‫پياده سازي ضابطه تابع با يک سري دستورات‬
‫ساخت تابع (ادامه)‬
‫‪‬‬
‫برگرداندن مقدار برگشتي‬
‫{‬
‫تابعي بنويسيد که يک ورودي اعشاري بگیرد و قدر مطلق آن را محاسبه کند‪.‬‬
‫)‪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 x0

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 )  limh0‬‬
‫‪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 h0
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 *103 :‫ رقم اعشار‬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 ( xn2 )  f ( xn1 ))  ( f ( xn 1 )  f ( xn )) ‬‬
‫‪2‬‬
‫‪2‬‬
‫‪2‬‬
‫‪2‬‬
‫‪h‬‬
‫)) ‪( f ( x0 )  2 f ( x1 )  2 f ( x2 )  ...  2 f ( xn1 )  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‬شرط خاتمه بود‪.‬‬
‫‪n0‬‬
‫)‪n * fact(n  1‬‬
‫‪fact(n)  ‬‬
‫‪1‬‬
‫‪n0‬‬
‫‪‬‬
‫برای بتوانیم یک برنامه بازگشتی بنویسیم باید ابتدا این دو رکن را به دست آوریم‪ .‬بعد از انجام این کار‬
‫نوشتن برنامه های بازگشتی‪ ،‬به سادگی امکان پذیر است‪.‬‬
‫مثال ‪2‬‬
‫‪ ‬برنامه ای بنویسید که ‪n‬را‪x‬به صورت بازگشتی محاسبه کند‪.‬‬
‫‪ n‬عدد صحیح غیر منفی و ‪ x‬اعشاری است‪.‬‬
‫فرض کنید می خواهیم تابعی به نام ‪ pow‬بدین منظور بنویسیم ‪:‬‬
‫ابتدا دو رکن بازگشت را مشخص می کنیم‪:‬‬
‫‪ ‬قانون بازگشت‪:‬‬
‫‪x n  x * x n1‬‬
‫‪‬‬
‫شرط خاتمه ‪n=0 :‬‬
‫‪n0‬‬
‫‪n0‬‬
‫)‪ 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‬‬
‫(‪ :%‬باقی مانده)‬
‫به این ترتیب می توان قانون بازگشت و شرط خاتمه را به صورت زیر به دست آورد‪:‬‬
‫‪b0‬‬
‫‪b0‬‬
‫)‪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);
}