+ All Categories
Home > Documents > ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا...

ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا...

Date post: 19-Feb-2020
Category:
Upload: others
View: 4 times
Download: 0 times
Share this document with a friend
42
ﺗﺎرﻳﺨﭽﻪ: ﭼﺮﺗﻜﻪ: ﻣﺤﺎﺳﺒﺎﺗﻲ وﺳﻴﻠﻪ اوﻟﻴﻦ1946 : ENIAC اﻟﻜﺘﺮوﻧﻴﻜﻲ ﻛﺎﻣﭙﻴﻮﺗﺮ اوﻟﻴﻦo وزن30 ﺗﻦo ﺣﺠﻢ10 × 15 ﻣﺘﺮ دﻫﻪ1970 : o ﺣﺠﻢ3 × 4 ﻣﺘﺮo ﻗﻴﻤﺖ100,000 $ o ﺑﻮدﻧﺪ آن ﺗﻬﻴﻪ ﺑﻪ ﻗﺎدر ﺑﺰرگ ﺷﺮﻛﺘﻬﺎي ﻓﻘﻂ. دﻫﻪ1980 : o ﺷﺮﻛﺖIBM ﺷﺨﺼﻲ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺗﻮﻟﻴﺪ) desktop - روﻣﻴﺰي( ﻛـﺮد آﻏـﺎز را. ﻣﻌﻤـﺎري ﭼـﻮن ﺷﺨﺼﻲ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﺳﺎﺧﺖIBM ﺑﺎز) ِ ﻏﻴﺮيّ( ﻛﺮدﻧـﺪ ﺑﺮداري ﻛﭙﻲ آن از ﺷﺮﻛﺘﻬﺎ ﺳﺎﻳﺮ ﺑﻮد، ﺑﺎ ﺳﺎزﮔﺎر ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي وIBM ﺳﺎﺧﺘﻨﺪ. 1990 : o ﺑﻪ ﺷﺨﺼﻲ ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎي ﻗﻴﻤﺖ3000 $ ﻳﺎﻓﺖ ﻛﺎﻫﺶ. اﺑﺘﺪاي در اﻧ ﺳﺎﺧﺖ ﻴﺎك، ﻧﻮﻳﺴﻲ ﺑﺮﻧﺎﻣﻪ آن ﺳﻮﺋﻴﭽﻬﺎ و ﺳﻴﻤﻬﺎ ﻛﻤﻚ ﺑﻪ ﻣﻲ ﺻﻮرت ﮔﺮﻓﺖ ؛ ﻛﻪ ﻧﺘﻴﺠﻪ در، ﺑﺮﻧﺎﻣﻪ ﻗﺎﺑـﻞ ﻫﺎ ذﺧﻴﺮه ﺳﺎزي ﻧﺒﻮدﻧﺪ ﻧﺒﻮد ﻣﻤﻜﻦ آﻧﻬﺎ از ﻣﺠﺪد اﺳﺘﻔﺎده و. زﻣﺎن، آن درJohn von Neumann ﺑﺮﻧﺎﻣﻪ از اﺳﺘﻔﺎده اﻳﺪه ﻫﺎي ﻣﻔﻬﻮم و ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ ﺑﺮاي ﺳﺎزي ذﺧﻴﺮه ﻗﺎﺑﻞstored-program computers ﻛـﻪ ﻛـﺮد ﻣﻄـﺮح را ﻛﺎﻣﭙﻴﻮﺗﺮﻫـﺎي ﻣﺒﻨـﺎي اﻣﺮوز ي ﻣﻲ ﺑﺎﺷﺪ. اﻳ اﻳﻦ در ﺑﺮﻧﺎﻣﻪ ﺳﻮﺋﻴﭽﻬﺎ، و ﺳﻴﻤﻬﺎ ﺟﺎي ﺑﻪ ﺪه، ﺗﻌﺪادي ﺻﻮرت ﺑﻪ ﻫﺎ0 و1 در ﻣﻲ ﻗﺮار ﺣﺎﻓﻈﻪ ﮔﻴﺮﻧﺪ ﻣﻲ اﺟﺮا ﺳﭙﺲ و ﺷﻮﻧﺪ. ﻛﺎﻣﭙﻴﻮﺗﺮﻫﺎ ﺳﺎﺧﺘﺎر: اﻓﺰار ﺳﺨﺖ: 1 - CPU (Central Processing Unit) : از ﻣﺮﻛـﺰي ﭘﺮدازﺷﮕﺮ واﺣﺪ اﺳـﺖ ﺷـﺪه ﺗﺸـﻜﻴﻞ اﺻـﻠﻲ ﻗﺴـﻤﺖ دو: ALU (Arithmetic & Logic Unit) - ﻣﺤﺎ واﺣﺪ ﻣﻨﻄﻘﻲ و رﻳﺎﺿﻲ ﺳﺒﺎت- رﺟﻴﺴﺘﺮﻫﺎ و. واﺣﺪALU ﻗﺎدر داده روي را ﻣﺘﻨﻮﻋﻲ ﻋﻤﻠﻴﺘﻬﺎي اﺳﺖ دﻫﺪ اﻧﺠﺎم رﺟﻴﺴﺘﺮﻫﺎ درون ﻫﺎي. اﺻﻞ از اﻳﻨﺘﻞ ﺷﺮﻛﺖ ﭘﺮدازﺷﮕﺮﻫﺎيbackward compatibility ﻣﻲ ﭘﻴﺮوي ﻛﻨﻨﺪ ﺟﺪﻳﺪ ﻧﻮع ﻫﺮ ﻳﻌﻨﻲ، CPU اﺳﺖ ﺳﺎزﮔﺎر ﻗﺒﻠﻲ اﻧﻮاع ﺑﺎ. 2 - Memory : ﻛﺎﻣﭙﻴﻮﺗﺮ اﺻﻠﻲ ﺣﺎﻓﻈﻪ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﺳﺎزي ذﺧﻴﺮه داده ﻫﺎ، ﺑﺮﻧﺎﻣـﻪ ﻫﺎي اﻃﻼﻋـﺎت ﻫﺮﮔﻮﻧـﻪ و ﻫـﺎ ﻛﻪ دﻳﮕﺮي ﺳﻴﺴﺘﻢ ﻛﺎر زﻣﺎن در ﺑﺎﺷﺪ ﻧﻴﺎز ﻣﻮرد. ﺑﺎﻳﺖ ﺣﺎﻓﻈﻪ در دﻫﻲ آدرس ﻗﺎﺑﻞ واﺣﺪ ﻛﻮﭼﻜﺘﺮﻳﻦ اﺳـﺖ
Transcript
Page 1: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:تاريخچه اولين وسيله محاسباتي:چرتكه 1946: ENIAC –اولين كامپيوتر الكترونيكي

o تن30وزن

o متر15 × 10حجم

: 1970دهه

o متر4 × 3حجم

o 100,000قيمت$ o فقط شركتهاي بزرگ قادر به تهيه آن بودند.

:1980دهه

o شركتIBM توليد كامپيوترهاي شخصي )desktop - چـون معمـاري .را آغـاز كـرد ) روميزيبود، ساير شركتها از آن كپي برداري كردنـد ) رّيغير سِ ( باز IBMساخت كامپيوترهاي شخصي

. ساختندIBMو كامپيوترهاي سازگار با 1990:

o كاهش يافت$3000قيمت كامپيوترهاي شخصي به .

ها قابـل برنامه،در نتيجه كه ؛گرفتصورت مي به كمك سيمها و سوئيچها آنبرنامه نويسي ياك، ساخت ان در ابتداي

هاي ايده استفاده از برنامهJohn von Neumannدر آن زمان، . و استفاده مجدد از آنها ممكن نبود نبودندسازيذخيرهمبنـاي كامپيوترهـاي را مطـرح كـرد كـه stored-program computersقابل ذخيره سازي براي كامپيوترها و مفهوم

گيرند حافظه قرار ميدر 1 و 0ها به صورت تعدادي ده، به جاي سيمها و سوئيچها، برنامهدر اين اي. باشدمي يامروز . شوندو سپس اجرا مي

:ساختار كامپيوترها

:سخت افزار

1 - CPU (Central Processing Unit) : دو قسـمت اصـلي تشـكيل شـده اسـت واحد پردازشگر مركـزي از : ALU (Arithmetic & Logic Unit) - واحد . و رجيسترها-سبات رياضي و منطقيواحد محاALU قادر پردازشگرهاي شركت اينتل از اصل . هاي درون رجيسترها انجام دهد است عمليتهاي متنوعي را روي داده

backward compatibilityيعني هر نوع جديد كنند پيروي مي ،CPUبا انواع قبلي سازگار است . 2 - Memory : هـا و هرگونـه اطالعـات هاي برنامـه ها، داده ذخيره سازي برنامه براي –حافظه اصلي كامپيوتر

اسـت كوچكترين واحد قابل آدرس دهي در حافظه بايت .مورد نياز باشد در زمان كار سيستم ديگري كه

Page 2: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

كيلو بايـت : عبارتند ازر حافظهتگبزرواحدهاي .)گيرد مي1 يا 0هر بيت مقدار ( بيت است 8كه مجموعه )1KB = 210 byte = 1024 byte( مگا بايت ،)1MB = 1024KB( گيگا بايت ،)1GB = 1024MB (ِرا و ت

.)1TB = 1024GB(بايت

a. RAM (Random Access Memory) :از طريـق آدرس آن (تـوان اي كه به هر بايت آن ميحافظه ( عنياست، ي) volatile(حافظه موقتي نوع اين .داشت) خواندن و نوشتن(به طور مستقيم دسترسي

.روداطالعات آن با قطع برق از بين مي

b. ROM (Read-Only Memory) :تـوان اطالعـات آن را تغييـر داد و فقـط بـراي اي كه نميحافظههـا توسـط اطالعات در اين نوع حافظه نوشتن اوليه . گيردخواندن اطالعات مورد استفاده قرار مي

EPROM = Erasable Programmableد ماننـ ( در برخي انـواع .گيرديكارخانه سازنده صورت م

ROM(باشد اههاي مخصوص قابل تغيير مي توسط دستگ، اطالعات آنها.

3 - Storage : هاي جانبي با سرعت و قيمت كمتر اما حجـم هاي اصلي، حافظه با توجه به قيمت باالي حافظه؛ ماننـد ديسـكهاي يرنـد گبسيار بيشتر براي ذخيره پايدار و طوالني مدت اطالعات مورد استفاده قرار مـي

سازي اطالعـات در ايـن نـوع حافظـه از دو ديـد قابـل نحوه ذخيره. flash disk و CD ،tapeمغناطيسي، :بررسي است

a. در ديسـكهاي . در انواع مختلف ديسك، روش فيزيكي ذخيره اطالعـات متفـاوت اسـت :فيزيكي هـر .سـت ا تشـكيل شـده از صفحاتي مـدور هر ديسك، Floppy و Hard diskمغناطيسي، مانند

در هـر . شـود تقسيم مـي ) sector( هر شيار نيز به تعدادي قطاع و )track (صفحه به تعدادي شيار يـك قطـاع كـوچكترين حجـم . اطالعـات ذخيـره كـرد )نيم كيلو بايت ( بايت 512توان قطاع مي

سـخت در ديسـكهاي . توان خواند يا نوشـت اطالعات است كه در هر بار دسترسي به ديسك مي )hard disk (انـد، بـه مجموعـه شـيارهاي هـم تشكيل شده محوري صفحات هم زيادكه از تعداد

در يـك ديسـك سـخت، . گوينـد مـي ) cylinder(يك استوانه ) گيرندكه روي هم قرار مي (شعاع

) هـاي مـوازي headبـه كمـك (ميتوان به اطالعات شيارهاي درون يك استوانه به طـور همزمـان . دسترسي داشت

b. ديسـكها، اطالعـات از ديـد كـاربر بـه صـورت فايلهـا و انـواع براي اسـتفاده راحتتـر از : منطقيـ فيزيكي آنهـا آدرسبه هافايلنام و نگاشت مديريتوظيفه . شونددايركتوريها ذخيره مي ر عهـده ب

در برخـي . شـود مشخص مي » )cluster (هاخوشه «ر فايل بر اساس آدرس ه . است» فايل سيستم «

Track

Sector

Page 3: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

. دوشـ مشتمل بر تعدادي قطاع مي باشد، اما در اكثر موارد منطبق بر يك قطاع مي خوشههر موارد، به عنـوان مثـال .تعداد قطاعهاي درون هر خوشه بستگي به نوع فايل سيستم و اندازه ديسك دارد

شـود، در حاليكـه در ها اسـتفاده مـي خوشه بيت براي آدرس دهي 32 از FAT32در فايل سيستم FAT) ياFAT16 ( بنابراين، استفاده از . شود بيت استفاده مي16ازFAT32 نسبت به FAT در يك

دهد تعداد بيشـتري خوشـه روي ديسـك تعريـف اجازه مي ) و داراي حجم باال (ديسك مشخص هـر (از آنجائيكه به هر فايـل . شودانتخاب ها كوچكتر كند اندازه خوشهكمك ميشود و در نتيجه

هدر رفـتن كاهش هاي كوچكتر باعث يابد، خوشه يك خوشه اختصاص مي حداقل )چند كوچك .شود مي ديسكفضاي فيزيكي

دسـتگاههاي .گيرند در اين زمره قرار مي ساير دستگاههاي كامپيوتر ): I/O(خروجي /دستگاههاي ورودي - 4فحه كليـد و ماننـد صـ را دارند؛ - كاربر يا دستگاههاي ديگر - بيرونگرفتن اطالعات از وظيفه ورودي،ـ -فرسـتادن اطالعـات بـه بيـرون دستگاههاي خروجي . ماوس يـا ارسـال بـه كـاربر راينمـايش آنهـا ب

دسـتگاههايي ماننـد مـودم .و پرينتر) كارت گرافيك(؛ مانند مانيتور را بر عهده دارند -دستگاههاي ديگر .باشندهم ورودي و هم خروجي مي

2 چـون هـر سـيم .باشـند گيرد كه متشكل از تعدادي سيم مي ورت مي ها ص Busارتباط قسمتهاي مختلف از طريق از آنجائيكـه بـراي آدرس دهـي . حالت مختلف را ايجـاد كنـد 2nتواند سيم مي n داراي Busحالت دارد، پس يك

هاي قابل شود، و براي اينكه نامگذاري حجم حافظهاستفاده مي) Address Busبه نام ( مخصوص Busحافظه نيز از .استفاده شده است... و KB ،MBبراي 1000به جاي 210 ضريبدرس دهي ساده شود، ازآ

نرم افزار

. باشد، مفيد ميكنندمينيازهاي كاربر را برطرف عمالً ه ك نرم افزارهايي تنها در كنارسخت افزار كامپيوتر 1- BIOS (Basic Input Output Services) :اين نرم افـزار . ظه روشن شدن را داردوظيفه راه اندازي سيستم از لح

POSTابتـدا طـي عمليـات . شـود اجرا ميCPU قرار دارد و به محض روشن شدن كامپيوتر توسط ROMدر يك

(Power-On Self Test)سپس برنامه . كند از سالم بودن قطعات مختلف كامپيوتر اطمينان حاصل ميbootstrap را به . ندكداخل حافظه آورده و اجرا مي

2- bootstrap : توانـد بـر روي ديسـك مـي ) بـايتي 512(اين برنامه كوچـك . ديسك وجود دارد سكتوردر اولين در ،)boot sequence(شـود مشـخص مـي SETUP در به ترتيبي كـه BIOS. قرار داشته باشدCDسخت، فالپي يا

سيسـتم عامـل از پيـدا كـردن bootstrapيفه وظ. گردد ميbootstrap موجود در كامپيوتر به دنبال ديسكهاي مختلفِ كردن سيستم عامل، كافيست loadبراي ، DOSدر سيستم عاملهاي قديمي، مانند . باشد ي آن مي روي ديسك و اجرا

اما در اكثر سيستم عاملهاي جديد . خوانده و اجرا شوند ديسك روي آدرس مشخصي از اصلي سيستم عاملفايلهايانـدازد، سـپس بـه كمـك آن ابتدا يك فايل سيستم ساده را راه مي bootstrapبرنامه ...) و windows ،Linuxمانند (

.بنابرين، فايلهاي سيستمي لزوماً نبايد در آدرس مشخصي باشند .تواند فايلهاي سيستم عامل را پيدا و اجرا كندميگيرد و به كاربران امكـان اسـتفاده مي اي است كه در نهايت كنترل سيستم را بر عهده برنامه) : OS( سيستم عامل -3

را بـراي )command line (در حاليكه سيستم عاملهاي قديمي فقط محيطي متني. دهداز سخت افزار كامپيوتر را مي . باشندنيز مي) GUI(استفاده كاربران داشتند، امروزه تقريباً تمام سيستم عاملها داراي رابط كاربر گرافيكي

Page 4: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

4- Application) دهنـد هاي كاربردي مختلف را مي سيستم عاملها به كاربران امكان اجراي برنامه ):برنامه كاربردي .كنند تا نيازهاي مختلف خود را برطرف كننـد و شـامل بازيهـا، محيطهـاي برنامـه بران كمك مي رها به كا اين برنامه

. شوندمي... نويسي، محيطهاي تايپ، مرورگر اينترنت و

Page 5: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:)Algorithm (الگوريتميك الگوريتم، روش حل مسأله به صورت يكسري دستورالعمل در . گرفته شده است » الخوارزمي«اين كلمه از لغت

. دسـتورالعملهاي آن اسـت ترتيبـي مهمترين ويژگي الگـوريتم، اجـراي . شود، بيان مي به ترتيب اجرا شوند بايد كه ز اينكه روش كلي حل مسأله را يافتيم، بايد سـعي كنـيم آن را مرحلـه بـه بنابراين براي نوشتن يك الگوريتم، پس ا

.مرحله بيان كنيمو ) ها(سپس، ورودي . اي كه قرار است حل كنيم را بشناسيم براي نوشتن يك الگوريتم ابتدا بايد صورت دقيق مسأله

له را به صـورت گـام بـه گـام در اين مرحله، عمليات الزم براي حل مسأ . كنيممسأله را مشخص مي ) هاي(خروجي الـي 10، به طور تقريبي بـيش از نويسيم الگوريتمي كه براي حل يك مسأله مي كنيمبايد هميشه سعي .كنيمبيان مي

شـود اي كه براي حل آن ارائـه مـي دستورالعمل نباشد؛ يعني اگر مسأله مورد نظر بزرگ باشد، در الگوريتم اوليه 15كوچك بودن اندازه الگوريتم، بررسي صـحت . ي استفاده شود تا طول الگوريتم زياد نشود بايد از دستورالعملهاي كل

. كند و در يك نگاه امكانپذير ميهو سقم آن را سادگيـريم و بـراي حـل آن در مراحل بعدي، هر كدام از دستورالعملهاي كلي را بعنوان يك زيرمسأله جديد در نظر مي

به همين ترتيب تا جـايي . ) دستورالعمل بيشتر شود15 الي 10اندازه آن هم نبايد از كه (نويسيمالگوريتم ديگري مي بـاال بـه به اين روش حل مسـأله، روش . دهيم ادامه مي )به ريزترين دستورات قابل قبول برسيم يعني (كه الزم باشد

.گويندمي) Top-down (پايينآورد؛ به اين مفهوم كه يك زيرمسأله ممكن اسـت را به وجود مي)reuse(ها امكان بازبكارگيري استفاده از زيرمسأله

توان به هـر زيرمسـألة از ديدگاهي ديگر، مي . دوهاي مختلف استفاده ش در جاهاي مختلف يك مسأله و يا در مسأله بـه به اين ترتيب، با حل هر زيرمسأله، يك دستورالعمل جديد . حل شده به عنوان يك دستورالعمل جديد نگاه كرد

. شودمجموعه دستورالعملهاي قابل قبول اضافه ميكنـيم و اشـكاالت هر زيرمسأله را به طور جداگانه بررسي مـي لگوريتمابعالوه، اگر الگوريتم به درستي عمل نكند،

به عبارت ديگر، به جاي بررسي صـدها خـط الگـوريتم بـه هـم پيچيـده، تعـدادي . كنيماحتمالي آنها را برطرف مي .كنيم خطي مجزا را بررسي مي10م الگوريت

يـك زبـان بامطابقبه الگوريتمي كه . كندنويسي، عمالً ريزترين دستورات قابل قبول را مشخص مي يك زبان برنامه قابل اجـرا CPUزباني كه دستورات آن مستقيماً توسط .شود گفته مي »برنامه«، نويسي نوشته شده باشد خاص برنامه

زبان اسـمبلي، بـه ازاي هـر دسـتور در .باشنددستورات اين زبان به صورت اعداد مي . نام دارد » زبان ماشين «باشند، سـطح پـايين زبان ماشـين و اسـمبلي، زبانهـاي . شودفته مي زبان ماشين، يك نام قابل درك توسط انسان در نظر گر

بنابراين نوشـتن برنامـه بـه ايـن زبانهـا، . دهد هر دستور در اين زبانها، كار بسيار كوچكي انجام مي .شوند ناميده مي . است)اما ممكن (باشد و در نتيجه سخت و وقتگيرنيازمند نوشتن تعداد بسيار زيادي دستور مي

هـر آنهـا، در اند كـه ختراع شده ا،سطح باال، تحت عنوان زبانهاي نويسي، زبانهاي ديگري براي ساده كردن امر برنامه در اين زبانها بسيار بيشتر از زبانهاي سطح پايين نيز وع دستورات تن .دهدميبه تنهايي كارهاي بيشتري انجام دستور قابـل انـد و بعنـوان دسـتورات از قبل حل شده هاي پركاربرد زيرمسألهتعداد زيادي از زبانها، در واقع در اين . است

در از آنجائيكه تنوع اين دستورات بسيار زياد است، معموالً آنها را .دنانويسان قرار داده شده يار برنامه استفاده در اخت

Page 6: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

اشـاره BASICتوان به پاسكال، جـاوا و زبانهاي سطح باال مي ميان از .كنندبندي مي دستههايي »)library(كتابخانه « .باشندهاي حاصله كوچكتر ميو برنامهتر نويسي با اين زبانها سادهطبيعتاً برنامه .كرد

د ابتدا به زبـان ماشـين ترجمـه بايبراي اينكه اجرا شود، ، به هر زباني كه نوشته شده باشد، هر برنامه اما به هر حال، در صـورت ( برنامـه ، يك Cمانند پاسكال، جاوا و در برخي زبانها، . ترجمه به دو شكل قابل انجام است عمل .شود

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

بـراي اجـراي چنـين . BASICد زبان شوند؛ مانن مي )Interpret (در نقطه مقابل، زبانهايي هستند كه اصطالحاً تفسير به اين ترتيـب در رونـد اجـراي .شودهايي، هر خط از برنامه، پس از ترجمه به زبان ماشين بالفاصله اجرا مي برنامه

.شودبرنامه، فايل اجرايي مجزايي توليد نمي

:نوشتن الگوريتم

يا هر گونه داده ديگر، از متغيرها اسـتفاده الگوريتمها، براي گرفتن ورودي و نگهداري نتيجه محاسبات و در نوشتن در الگوريتمهـا، . تواند اطالعات از انواع مختلف را نگهداري كنـد يك متغير، قسمتي از حافظه است كه مي . كنيممي

براي مشخص كردن متغيرها، نام هر متغير را داخل پرانتز قرار . انجام عمليات فقط به كمك متغيرها قابل انجام است .يمدهمي .محاسبه معدل: مثال

نمرات دروس، تعداد واحد هر درس، تعداد دروس :ورودي

معدل نمرات :خروجي :متالگوري .را بگير) تعداد دروس( -

. صفر) مجموع نمره( - . صفر) مجموع واحد( - :اعمال زير را تكرار كن) تعداد دروس(به -

o بگير) نمره(يك عدد را بعنوان.

o گيرب) واحد(يك عدد را بعنوان.

o ) واحد + ()واحدمجموع ( ) واحدمجموع(. o )نمره + ()مجموع نمره( ) مجموع نمره( .

.)واحدمجموع ( تقسيم بر )مجموع نمره( ) عدلم( - .را بعنوان خروجي برگردان) معدل( -

Page 7: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:Cمعرفي زبان تـوان بـا از يك طرف اين زبان به زبان ماشين نزديـك اسـت و مـي . يك زبان سطح متوسط است Cزبان - 1

اما از طرف ديگر از سـاختارهاي سـطح بـاال نيـز . جزئياتي در حد زبان ماشين در اين زبان برنامه نوشت . مند استبهره

توان مسائل را به روش باال به پـايين و بـه ان مي يعني به كمك اين زب . يافته است يك زبان ساخت Cزبان - 2 . ها حل نمودوسيله تقسيم آنها به زيرمسأله

. نيز بايد انجام شود ) link(، پس از كامپايل، عمل لينك Cالبته در زبان . است compiled يك زبان Cزبان - 3انـد بـه برنامـه اضـافه شـده هايي كه در برنامـه اسـتفاده در عمل لينك، كد زبان ماشين مربوط به كتابخانه

. تا يك فايل اجرايي كامل توليد شودشود ميتوجـه خـاص » زمـان اجـرا «و » زمان كامپايـل «، بايد به تفاوت )Cمانند (در كار با زبانهاي كامپايل شدني

شـود، امـا ، يك خطاي زمان كامپايل را موجب ميCبعنوان مثال، وجود اشتباه تايپي در يك برنامه . داشت .ل تقسيم بر صفر ممكن است در زمان اجرا رخ دهد و ايجاد يك خطاي زمان اجرا كندعم

اي بـراي هـر تـوان هـر برنامـه يعني با اين زبان مي. است) general purpose( زباني چند منظوره Cزبان - 4هستند كه فقط براي مقاصـد خاصـي ) special purpose(در مقابل، زبانهاي تك منظوره . منظوري نوشت

. رودها به كار مي كه فقط براي دسترسي به پايگاه دادهSQLشوند، مانند استفاده مي

شـوند و كه داده شـده باشـند اجـرا مـي يعني دستورات دقيقاً به همان ترتيبي . اجراي ترتيبي دارد Cزبان - 5ارند كه دستورات در نقطه مقابل، زبانهايي وجود د. شودجابجا كردن آنها باعث تغيير در عملكرد برنامه مي

، هـر دسـتور يـك prologبعنوان مثال در زبان . شوند آنها بدون توجه به ترتيب و يكجا در نظر گرفته مي .نها تأثيري در معناي آنها نداردكند كه ترتيب بيان آاصل منطقي را بيان مي

:Cساختار يك برنامه

Cاز آنجائيكه زبان . باشداعد يك زبان مشخص مييك برنامه مانند يك الگوريتم روش حل يك مسأله، اما تحت قو امكـان Cبنـابراين، در زبـان . شـود يافته است، در آن براي حل يك مسأله، از روش باال به پايين استفاده مـي ساخت

هر زيرمسأله به كمك يك Cدر زبان . هاي جديد و استفاده از آنها در حل مسأله اصلي وجود دارد تعريف زيرمسأله بنابراين، ساختار كلي يك برنامـه . دهد الگوريتم و روش حل زيرمسأله را نشان مي ،بدنه تابع . شود تعريف مي »تابع«

C دهد و عمالً نقطه شـروع تابع اصلي، كه الگوريتم حل مسأله اصلي را نشان مي . از تعدادي تابع تشكيل شده است . اشدب مي( )mainدهد، تابعي با نام اجراي برنامه را نشان مي

جهـت . انـد بنـدي شـده هاي مختلفي طبقـه وجود دارند كه در كتابخانه Cتوابع از پيش تعريف شده زيادي در زبان كه ( )printfبعنوان مثال تابع . كرداعالناستفاده از هر كدام از اين توابع بايد كتابخانه حاوي آن را در ابتداي برنامه

و براي ايـن منظـور فايـل قرار دارد stdioرود، در كتابخانه به كار مي براي نمايش اطالعات بر روي صفحه نمايش stdio.h) كهheader file متناظر با كتابخانه stdioدر ابنداي برنامه ) است#includeنامه سـاده زيـر از بر در.شود مي

Page 8: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

نحـوه وه شـده اسـت اسـتفاد C براي نمايش اطالعات بر روي نمايشگر در قالب يـك برنامـه سـاده ( )printfتابع #include توان ديد مي راكتابخانه حاوي آن كردن.

#include <stdio.h> main ( ) { printf ("Welcome to programming.\n"); }

. را قرار داد) معادل دستورالعملهاي الگوريتم(توان دستورات الزم مي{ و } بين حد فاصل، يعني( )mainدرون تابع همانطور كه قبالً اشـاره كـرديم، هـر . شودقرار داده مي) semicolon (;، يك عالمت Cستور در زبان در انتهاي هر د

.توان به عنوان يك دستور جديد به كار بردرا مي) زيرمسأله(تابع

نوشتن برنامهمــثالً (د وشــمــيذخيــره ) cpp 1بــا پســوند( و تحــت يــك نــام مناســب ه نوشــته شــدeditor برنامــه در يــك ابتــدا

welcome.cpp .( محتوي خود برنامهفايلبه source file يـاsource code بايـد توسـط سـپس برنامـه . گوينـد مـي خواهـد obj فايلي با پسـوند گويند، ميobject codeحاصل كامپايل، كه به آن . به زبان ماشين ترجمه شود 2كامپايلر

به آن اضـافه ) ( )printfدر اين مثال تابع (استفاده شده سپس براي اينكه كد توابع). welcome.objدر اين مثال (بود در ايـن مثـال بـا نـام ( خواهـد بـود )executable code (يـك فايـل قابـل اجـرا نتيجه لينك . شود3شود بايد لينكwelcome.exe .( اي تحت عنوان اين مراحل، محيطهاي يكپارچهانجام براي ساده كردنIntegrated Development

Environment (IDE)در آنها با فشردن يك كليد و يـا يـك كليـك مـاوس فوقاند، كه انجام مراحل به وجود آمده . قابل انجام است

.گيردبه قسمت انتهايی نام فايل که بعد از يک نقطه قرار می 12 compiler 3 link

Page 9: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:متغيرها. شـود هر برنامه، براي گرفتن ورودي و نگهداري نتيجه محاسبات و يا هر گونه داده ديگر، از متغيرها استفاده مي در

و مقـدار آن در طـول را نگهـداري كنـد خاصنوع يك تواند اطالعات از يك متغير، قسمتي از حافظه است كه مي : اجزاي يك متغير عبارتند از.ن است تغيير كند ممك)در اثر اجراي دستورات مختلف (اجراي برنامه

، كـه از آن بـراي دسترسـي بـه آن متغيـر اسـتفاده شودبراي هر متغير يك نام در نظر گرفته مي : نام متغير - 1 . نباشدkeyword و باشد) identifier(شود، بايد شناسه نامي كه براي يك متغير استفاده مي. شود مي

، كلماتي هستند كه براي كامپايلر معناي خاصي دارنـد و )keywords(كليدي كلمات رزرو شده يا كلمات . جزئي از قواعد دستوري زبان هستند

)قرار داده شده است" " داخل معتبرهر نام: (نامهاي معتبر"ali" , "_var_" , "first123" , "long_variable_name_1" , "total" , "i" , "camelHunchName"

:عتبرنامهاي نام"1_variable" , "No space" , "only-underline" , "www.yahoo.com" , "int" , "#include"

از آنجائيكه هر متغير نماينده فضايي در حافظه است، هر متغير داراي يك آدرس در حافظـه : آدرس متغير - 2 .باشدكنيم كه هر بايت از حافظه داراي آدرس مشخصي مي يادآوري مي.باشدمي

ي در آدرس متنـاظر بـا آن اطالعاتكند چه نوع نوع يك متغير، مشخص مي): data type(اي متغير ع دادهنو - 3شوند، نوع يـك با توجه به اينكه تمام اطالعات درون كامپيوتر بصورت صفر و يك ذخيره مي . وجود دارد

ع انـو دسـته از ا سه Cان به طور كلي در زب . دهدمتغير نحوه تفسير درست از اين صفر و يكها را نشان مي اي يك متغير، طول آن را نيز مشـخص عالوه بر اين، نوع داده . عددي، حرفي و آدرس : اي وجود دارد داده .كندمي

در ايـن دسـتور، . قابل تغيير است ) assignment(توجه داشته باشيد كه مقدار متغيرها معموالً توسط دستور انتساب گيرد كه نتيجه آن بايـد درون سمت راست عبارتي قرار مي در گيرد و رار مي ق = عالمت چپمتغير مقصد در سمت

همچنـين، مقـدار يـك . كند خود را حفظ مي قبلي مقدار مقدار جديد، هر متغير، تا انتساب . متغير مقصد ذخيره شود .بيني استمتغير قبل از اولين انتساب، نامشخص و غيرقابل پيش

:Cاي در انواع داده

:اعدادصحيح به طور كلي با كلمه رزرو شـده اعداد . دنباشاي عددي، شامل دو دسته اعداد صحيح و اعشاري مي ع داده اوان

int پيشوند . شوند مشخص ميlong پيشـوند و آورد را فراهم مـي امكان ذخيره اعداد بزرگترshort بـراي كـوچكتر دو بايـت و short int و int انـدازه Borland C++ 3.1 بعنوان مثـال در كامپـايلر . شود استفاده ميتغيركردن اندازه م

بايـت چهـار long int و int بايت و اندازه دو short int اندازه Visual C++ 6.0اما در . بايت است،long intاندازه .است

.باشد مي_ و يا عالمت Z تا z ،A تا aيكي از حروف : ن حرف اول آ-1: يك شناسه.باشد مي_ و يا عالمت 9 تا 0، اعدادZ تاz،A تاaاز حروف:ساير حروف آن-2

Page 10: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

در نظر ) تيا بدون عالم( مثبت ، اعدادةيكي اينكه هم. توان دو حالت را در نظر گرفتبراي ذخيره اعداد صحيح ميدر حالت دوم، امكان ذخيره اعداد مثبت و منفي . شود استفاده ميunsignedگرفته شوند، كه در اينصورت از پيشوند

اگـر هيچكـدام از دو پيشـوند اسـتفاده نشـود، حالـت . شود استفاده مي signedدر اينصورت از پيشوند . وجود دارد ، long كلمـات .دهـيم دامه نحوه ذخيره اعداد عالمتدار را توضيح مـي در ا . شوددر نظر گرفته مي ) signed(عالمتدار

short ،signed يا unsignedدون ذكر كلمه توان ب و تركيبات قابل قبول آنها را ميintنيز به كار برد .

بايـت double 8 بايت و نـوع 4 معموالً floatنوع . وجود دارندdouble و floatبراي ذخيره اعداد اعشاري، دو نوع به همراه عددي كـه موقعيـت ، )مانتيس(براي ذخيره اعداد اعشاري، ارقام تشكيل دهنده عدد . كنندفضا را اشغال مي

floatاز هر دو قسمت بزرگتر doubleدر نوع . شوند ذخيره مي )توان در نمايش نماد علمي (دهدرا نشان مي » مميز«و هم عدد بزرگتـري ) كه اين به معني دقت بيشتر است (ن ذخيره كرد تواهستند؛ يعني هم تعداد ارقام بيشتري را مي

اعداد اعشاري هميشه به صورت عالمتـدار ).يعني امكان ذخيره اعداد بزرگتر (توان در نظر گرفت را بعنوان توان مي . )هم در قسمت مانتيس و هم در قسمت توان (شوندذخيره مي

:)متن (فوحربنـابراين بـراي . )1 و 0بـه صـورت (در حافظه كامپيوتر فقط اعداد قابل ذخيره هسـتند همانطور كه قبال اشاره شد،

يـك عـدد )و ساير عالمتهـاي متنـي (گيرند كه به هر حرف ، جداولي را در نظر مي نوشتن متن فراهم آوردن امكان American Standard Code for Informationمشـهورترين ايـن جـداول، اسـتاندارد . دهـد متنـاظر نسـبت مـي

Interchange (ASCII)در . دكنـ براي ذخيره انواع متني اسـتفاده مـي ) حالت مختلف256(باشد كه از يك بايت ميالفباي انگليسي براي ارقام و ساير عالمتها نيز كدهاي معـادلي در كوچك و بزرگ حالت، عالوه بر حروف 256اين

اي اين نـوع داده . گويند مي 1يك كاراكتر ...) امل حروف، ارقام و ش(به هر كدام از اين عالمتها . نظر گرفته شده است . باشد قابل تعريف ميchar به وسيله كلمه كليدي Cدر زبان

2 از در جـداول جـا داد، هـم را حروف الفباي ساير زبانهاي زنده دنيـا بتواندر استانداردهاي جديدتر، براي اينكه Unicode بـايتي، 2معروفتـرين ايـن اسـتانداردهاي . شوداكتر استفاده مي براي نمايش هر كار ) حالت 65536(بايت . اند گنجانده شدهنيزحروف الفباي زبان فارسي اشكال مختلف در اين استاندارد، . باشدمي

در ايـن شـرايط، . استفاده نمود توان نيز مي بصورت عددي charبه اين نكته توجه داشته باشيد كه از متغيرهاي نوع ). استsignedحالت پيش فرض ( نيز تعريف نمود unsigned char و signed charتوان انواع مي

:آدرسمتغيرهاي از اين نوع در بخشهاي آينده مورد . توان از يك متغير براي ذخيره آدرس ساير متغيرها نيز استفاده نمودمي

.بررسي قرار خواهند گرفت

:اعداد عالمتدار

همانطور كه در ابتدا نيز اشـاره شـد، . در نظر گرفتعالمتدار و بدون عالمت به دو صورت توانمياعداد صحيح را يـا در (بنابراين با در نظر گرفتن انواع مختلـف . دهداين فقط نوع برداشت ما از محتويات درون حافظه را نشان مي

1 character

Page 11: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

از محتويات يك قسـمت مشـخص از تفسيرهاي متفاوتي توان مي، )تر، در نظر گرفتن يا نگرفتن عالمت حالتي ساده در اين حالت، . باشدترين برداشت از محتويات حافظه، بصورت عدد صحيح بدون عالمت مي ساده. حافظه ارائه داد

در ايـن شـرايط، يـك . در نظر گرفت و مقدار آن را محاسبه نمود 2كافيست صفر و يكها را بعنوان يك عدد مبناي . را در خود ذخيره كند2n - 1 تا 0داد تواند اع بيت ميnمتغير با طول

(00001010)2 = (10)10 (10001010)2 = (138)10 (00000000)2 = (0)10 (10000000)2 = (128)10 (11111111)2 = (255)10 (10000001)2 = (129)10

عالمتبدون اعداد نكتـه . وشهاي مختلفي استفاده نمود توان از ر ، مي )مثبت و منفي اعداد (براي امكان ذخيره اعداد به صورت عالمتدار

در مثالهاي . شودمهمي كه در اين روشها وجود دارد اينست كه ابتدا يك طول مشخص براي اعداد در نظر گرفته مي تـوان همـين بايـت نيـز مـي 4 يا 2براي اعداد به طول . در نظر گرفته شده است ) بايت 1( بيت 8زير، هميشه طول

.روشها را اعمال نمودترين روش اينست كه يك بيت را بعنوان بيت عالمت در نظر بگيـريم و بقيـه بيتهـاي عـدد را بعنـوان اولين و ساده

توان اعداد را منفـي را بـا در نظر بگيريم، ميرا بيت عالمت ) بيت سمت چپ (اگر با ارزشترين بيت . قدرمطلق عدد در اين روش، يـك .اين بيت، نشان داد مقدار صفر به اعداد مثبت را با انتساب و به بيت عالمت مقدار يك انتساب

. را در خود ذخيره كند2n-1 - 1 تا (2n-1 – 1)–تواند اعداد بيت ميnمتغير با طول (0 0001010)2 = (+10)10 (1 0001010)2 = (-10)10 (0 0000000)2 = (+0)10 (1 0000000)2 = (-0)10 (1 1111111)2 = (-127)10 (1 0000001)2 = (-1)10

)روش مقدار و عالمت(اعداد عالمتدار شـود و عالمـت مثبـت يـا براي تعبير مقدار عددي، قسمت قدرمطلق عدد به سادگي در مبناي دو در نظر گرفته مي

شود، در ايـن روش همانطور كه در مثالهاي باال ديده مي . شودمنفي، بر اساس بيت عالمت، در كنار آن قرار داده مي تـوان از همـان نمـي ي جمع كردن دو عدد در اين نمـايش، براعالوه بر اين، . ي عدد صفر وجود دارد دو نمايش برا

استفاده كرد؛ چرا كه روش جمع دو عدد مثبت با روش جمـع يـك ) اعداد بدون عالمت براي(الگوريتم جمع ساده ، توجـه داشـت به طور خاص ع بايد به عالمت اعداد يعني در هنگام جم . عدد مثبت با يك عدد منفي متفاوت است

. شودكه اين باعث پيچيده شدن مدارات سخت افزاري جمع و تفريق ميمكمـل اول در روش. هاي ديگري پيشـنهاد شـدند الزم براي جمع و تفريق، روش براي ساده كردن طراحي مدارهاي

)1's complement(توان بـا ارزشـترين چنان ميهم. كنيم، براي منفي كردن يك عدد، تمام بيتهاي آن را معكوس مي . دهندبيت را بعنوان بيت عالمت در نظر گرفت، ولي بقيه بيتها لزوماً قدرمطلق عدد را نشان نمي

(0 0001010)2 = (+10)10 (1 0001010)2 = (-117)10 (1 1110101)2 = (-10)10 (0 0000000)2 = (+0)10 (1 0000000)2 = (-127)10 (1 1111110)2 = (-1)10 (1 1111111)2 = (-0)10 (1 0000001)2 = (-126)10

)روش مكمل اول(اعداد عالمتدار . مقدار عددي كه به روش مكمل اول نمايش داده شده است، ابتدا بايد به بيت عالمت آن توجه نمود شخيصبراي ت

اما اگر عدد منفي . ندده، بقيه بيتها مقدار قدر مطلق عدد را نشان مي )بيت عالمت مساوي صفر (اگر عدد مثبت باشد سـپس از . كنيم تا عدد مثبت متناظر آن به دسـت آيـد ، تمام بيتهاي آن را معكوس مي )1بيت عالمت مساوي (باشد

توانـد بيـت مـي nدر اين روش نيز، يك متغير بـا طـول . آوريمروي آن مقدار قدر مطلق عدد اصلي را به دست مي .د ذخيره كند را در خو2n-1 - 1 تا (2n-1 – 1)–اعداد

Page 12: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

براي بـه دسـت ). با توجه به بيت عالمت (اوالً اين يك عدد منفي است . را در نظر بگيريد 2(10000001) عدد :لامث 2(01111110) = 2(10000001)- : كنيممحاسبه مي) شودكه عددي مثبت مي(آوردن قدر مطلق عدد، منفي آن را

.باشد مي126-، بنابراين عدد اول برابر 10(126) = 2(01111110)شويم كه با تبديل مبنا، متوجه ميتوان از الگوريتم ساده جمـع مي بيشتري موارد در توان مالحظه كرد كه براي جمع كردن دو عدد در اين نمايش، مي

مثبـت و (استفاده نمود؛ ولي همچنان وجود دو نمـايش بـراي صـفر ) رودكه براي اعداد بدون عالمت نيز بكار مي (مثالً جمع هر عدد با منفي خـودش، مقـدار . شود در برخي حاالت اين الگوريتم جواب اشتباه بدهد اعث مي ب) منفيدهـد مثبت را نتيجه مـي مقدار صفرِ 1 منفي با ، ولي جمع كردن صفرِ )كه درست است (دهد منفي را نتيجه مي صفرِ

. كه اشتباه استدر اين روش براي منفي كـردن عـدد، پـس از . كندرف مييص را برطااين نق) s complement'2(روش مكمل دوم

با ارزشـترين بيـت، عالمـت نوز هم ه. شود، يك واحد به مقدار آن اضافه مي )مكمل اول (معكوس كردن تمام بيتها دهد، ولي براي به دست آوردن قدرمطلق اعداد منفـي، هماننـد روش قبلـي، عـدد را يكبـار منفـي عدد را نشان مي

. كنيمو از روي آن قدرمطلق عدد را محاسبه مي) مقدار مثبت متناظر آن به دست آيدتا (كنيم مي(0 0001010)2 = (+10)10 (1 0001010)2 = (-118)10 (1 1110110)2 = (-10)10 (0 0000000)2 = (+0)10 (1 0000000)2 = (-128)10 (1 1111111)2 = (-1)10 (1 1111111)2 = (-1)10 (1 0000001)2 = (-127)10

)دومروش مكمل (اعداد عالمتدار براي تحقيق اين مسأله كافيست سـعي كنيـد عـدد . كامالً واضح است كه در اين نمايش، فقط يك صفر وجود دارد

در استفاده از روش مكمل دوم، به اين مسأله بايد بيشتر توجه كنيد كه طول اعـداد بايـد از ابتـدا . صفر را منفي كنيد كنـيم، بسياري از اوقات، وقتي عددي را با اين روش منفي مـي ). بيت در نظر گرفتيم 8ثالها در اين م (مشخص شود

:كنيمميصفر و 10 در زير سعي در منفي كردن اعداد .شودآيد كه دور ريخته مييك بيت در محاسبات اضافه مي مكمل اول :0 مكمل اول :10

)شودور ريخته ميد جمع زبيت نهم حاصل ا ( 1

تـوان از انـد، مـي توان مالحظه نمود كه براي جمع دو عدد عالمتدار كه به صورت مكمل دوم نمـايش داده شـده مي

در كامپيوترها نيـز از روش . استفاده كرد ) رودكه براي اعداد بدون عالمت نيز به كار مي (همان الگوريتم جمع ساده nبنابراين اگر طول يك متغير از نوع عدد صـحيح عالمتـدار . شوداستفاده مي مكمل دوم براي نگهداري اعداد منفي

. )باشد عدد مختلف مي2nكه شامل ( را ذخيره كند(2n-1 – 1) تا (2n-1) –تواند مقادير بيت باشد، اين متغير مي

:تعريف متغير

، ابتدا نوع Cبراي تعريف متغيرها در زبان . قبل از اينكه از يك متغير در برنامه استفاده شود، بايد آن را تعريف نمود ). انـد از هم جدا شـده ,كه با (توان در يك تعريف، نام چندين متغير را قرار داد مي. شودو سپس نام متغير آورده مي

.دهيم قرار مي;در انتهاي تعريف main () { int value; char ch1, ch2; long bigValue;

00001010 11110101

+00000001

11110110

00000000 11111111

+00000001

00000000

Page 13: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

unsigned non_negative; double amplitude, frequency; bigValue = 0; }

به عنوان مثال با قـرار دادن نـام متغيـر در سـمت چـپ .كنيمبراي دسترسي به مقدار متغيرها، از نام آنها استفاده مي دار عبـارت سـمت راسـت در دستور انتساب، هميشه مقـ كنيم كه تأكيد كي .توان به آن مقدار داد دستور انتساب مي را در b مقدار متغيـر ;a = bبه عنوان مثال، دستور .شود و در متغير سمت چپ مساوي قرار داده ميمساوي محاسبه

a جمع شده و مقدار جديد در متغيـر 1 با aشود مقدار قبلي موجب مي;a = a + 1دهد؛ و يا دستور قرار ميaمتغير . قرار گيرد

Page 14: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

):constants(ثابتها ثابتهـا نيـز ماننـد متغيرهـا داراي نـوع . كند فضايي از حافظه است كه مقدار آن در طول برنامه تغيير نمي »ثابت«يك .نام، و نامداربي: اندثابتها دو دسته. اي مشخص هستندداده

:نامثابتهاي بينـوع ايـن مقـادير بـر اسـاس . شـوند برنامه ذكر مي نام، در واقع مقاديري هستند كه به صورت صريح در ثابتهاي بي

:شوداستانداردهاي زير شناخته مي 123: شود؛ مانندعددي صحيح در نظر گرفته مي نوشته شود، دون مميزوقتي عددي ب

o در نظر 8عدد صحيحي، صفر گذاشته شود، عدد در مبناي ) سمت چپ (وقتي بعنوان اولين رقم . نداريم091بنابراين عددي مانند ). 10 در مبناي 8دل عدد معا (010شود؛ مانند گرفته مي

o 0، در ابتداي آن 16براي نمايش اعداد صحيح در مبنايx 0گذاريم، مانند ميx10) در 16معادل )10 در مبناي 255معادل (0xFF، )10 در مبناي 10معادل (0xA، )10مبناي

o شودمي در نظر گرفته 10در غير موارد فوق، عدد در مبناي.

1.2شود؛ مانند شناخته ميdoubleوقتي عددي بصورت مميزدار نوشته شود، اعشاري بوده و از نوع

o براي نوشتن اعداد از نوعfloat در سمت راست عدد حرف f1.2دهند؛ مانند قرار ميf

'1' يا '+'، 'a' شود؛ مانند قرار داده مي'براي نوشتن ثابتهاي كاراكتري، كاراكتر مربوطه درون دو عالمت

)رشته تهي ("" يا "This is a text" ،"a" مانند گيرند؛قرار مي " عالمت درون دواي ثابتهاي رشته

در زير، به مـواردي كـه ممكـن اسـت اشـتباهاً . توجه داشته باشيد ) از ديد كامپايلر (در استفاده از ثابتها، به نوع آنها :كنيماستفاده شوند، اشاره مي

int i = '0'; char c = 0; char c2 = "a";

'0'، از يك ثابت كاراكتري استفاده شده است، و نتيجه اجراي آن، قرار گرفتن معـادل اسـكي كـاراكتر اول در دستور در دستور دوم، بر عكس دستور اول، از يك ثابت عددي استفاده شده است، ونتيجـه . باشد مي iدر متغير ) 48عدد (

دستور سـوم سـعي در قـرار دادن . )صفرمعادل كد اسكي ( است c متغير در NULL1 اراكتراجراي آن قرار گرفتن ك خطاي زمان (در متغيري كاراكتري دارد، كه اين دستور به هيچ وجه قابل اجرا نيست ) "a"ثابت (اي يك مقدار رشته

. باشد ولي مورد سوم نميدباشن قابل قبول ميCتوجه داشته باشيد كه دو مورد اول از نظر كامپايلر . )كامپايل

:ثابتهاي نامدار اسـتفاده constشوند، با اين تفاوت كه قبل از ذكـر نـوع آنهـا، كلمـه كليـدي اينگونه ثابتها مانند متغيرها تعريف مي

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

const double pi = 3.14; const int continents = 5;

.گویند میNULLه آن در واقع هيچ کارکتری معادل کد اسکی صفر وجود ندارد، و اصطالحًا ب 1

Page 15: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

منتسب ، كافيست مقدار كه در صورت لزوم عوض كردن مقدار آنها مزيت استفاده از ثابتهاي نامدار در برنامه اينست از ) به دفعات زيادي (اي كه بعنوان مثال، اگر پس از نوشتن برنامه . دكر در ابتداي برنامه عوض فقط به ثبت نامدار را

توان به كند، به اين نتيجه برسيم كه دقت دو رقم اعشار براي آن كافي نيست، مي استفاده مي ) با تعريف باال (piثابت ، در جاهاي مختلف اسـتفاده از آن، ايـن در كل برنامه قرار داد و نيازي نيست pi ثابت در راحتي مقدار دقيقتر آن را

. اعمال كردتغيير را

#define بـراي ايـن منظـور بـه . نام استفاده نمود براي نامگذاري ثابتهاي بي define#، از شبه دستور Cهاي توان در برنامه مي

:شودصورت زير عمل مي#define PI 3.14 #define CONTINENTS 5

بـه عبـارت دقيقتـر، در هـر بـار . باشد مفهومي در زمان كامپايل مي define# در اينست كه const و define#تفاوت شـوند و سـپس اند، جايگزين مي تعريف شده define#تمام مواردي كه توسط ) به طور موقتي (كامپايل برنامه، ابتدا

. افتدعمل كامپايل اتفاق مي

:كاراكترهاي خاصاند، تعدادي كاراكتر وجود دارند كه نمايش آنها متفـاوت از ه در جدول اسكي تعريف شده كاراكتري ك 256در ميان

از روش زيـر اسـتفاده ،C كاراكترها در يك برنامـه گونه اين بيانبراي . ساير كاراكترهاست و عالمت متناظري ندارند به همراه كاراكتر بعدي در نظـر گرفتـه \اي استفاده شود، اين درون يك ثابت كاراكتري يا رشته \هر گاه از : شود مي :انددر زير توضيح داده شدهو نتيجه چاپ آنها، ي كاراكتريبرخي از اين ثابتهامفهوم . شوندمي

'\n' : New Line دهدنما را خط بعدي انتقال ميمكان.

'\r' : Carriage Return دهدنما را به ابتداي خط انتقال ميمكان. '\b' : Back-space دهدنما را يك ستون به عقب انتقال ميمكان. '\t' : Tab بردبندي عمودي صفحه به راست مينما را بر اساس جدولمكان. '\v' : Vertical Tab برد پايين ميهبندي افقي بنما را بر اساس جدولمكان. '\'' : The ' character '\"' : The " character '\\' : The \ character

اي و در موقـع نوشـتن ثابتهـاي كـاراكتري و رشـته Cداشته باشيد كه اين نحوه نگارش، فقط در درون برنامه توجه از يك ثابـت C قرار دارد، در يك برنامه C:\aaa\b.txt به عنوان مثال، براي بيان نام فايلي كه در آدرس .كاربرد دارد

"C:\\aaa\\b.txt" :شوداي به صورت زير استفاده ميرشته به عنوان يك كـاراكتر 'b\' و 'a\'، بنويسيد "C:\aaa\b.txt" را به شكل اي ثابت رشته صورتيكه در توجه داشته باشيد، )! تشكيل شده است كاراكتر 12و نه كاراكتر 10يعني اين رشته از (شونددر نظر گرفته مي

Page 16: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

):expression(عبارت يـك . باشداست و شامل عبارات رياضي، شرطي، منطقي و غيره مي يك مفهوم بسيار كلي Cمفهوم عبارت در زبان

و فراخواني توابع ،توانند متغير، ثابت عملوندها مي . آيد به وجود مي 2به كمك عملگرها 1عبارت از تركيب عملوندها بـر ( نمود بنديگاني دسته توان به عملگرهاي يكاني، دوگاني و سه نيز مي را عملگرها. باشنديا يك عبارت كوچكتر . تقسيم نمود... و ايتوان عملگرها را به انواع محاسباتي، بيتي، مقايسهاز ديدگاهي ديگر مي. )اساس تعداد عملوندها

.شونددر زير برخي از عملگرهاي پركاربرد معرفي ميشود مقدار اين عملگر باعث مي . شودنمايش داده مي = باشد كه به صورت نتساب مي پركاربردترين عملگر، عملگر ا

سمت چپ عملگر انتسـاب اصـطالحاً بايـد از . عبارت سمت راست محاسبه شود و در متغير سمت چپ قرار گيرد ه سـمت راسـت البتـ . نوشت ;a = 2و يا ;a + 2 = b + 2توان دستوري به صورت ؛ يعني مثالً نمي باشدl-valueنوع

، كه در اينصـورت عبـارت سـمت ;a = b = c+2 باشد، مانند ديگرتواند خود يك دستور انتسابعملگر انتساب ميتوان عملگر انتساب را عملگري دوگـاني مي. گيرد قرار مي a و سپس در bشود و در محاسبه مي ) c+2يعني (راست

در نظـر به همراه دو عملوندش را به عنوان يـك عبـارت در نظر گرفت و مجموعه اين عملگر ) داراي دو عملوند (در اينصورت، مقدار انتساب يافته، در عبارت بزرگتر مورد . گرفت و اين عبارت را در يك عبارت بزرگتر به كار برد

قرار aر جمع كرده و د2 ا، همين مقدار را بc به متغير 5 پس از انتساب ;a = 2 + (c = 5)مثالً . گيرداستفاده قرار مي . دهدمي

:عملگرهاي محاسباتياما . را دارند ) جمع، تفريق، ضرب و تقسيم : به ترتيب (همان كاربرد متعارف خود / و * ، -، + دوگاني عملگرهاي

توجه داشته باشيد كه اگر طرفين عملگر تقسيم اعداد صحيح باشند، عمل تقسيم نيز به صورت صحيح انجام خواهد %عملگر دوگـاني . باشدمي 0.5و 0 ، 2 ، 1به ترتيب برابر 3.0/6و 3/6 ، 10/5 ، 3/2يجه عبارات يعني مثالً نت . شد

باشـد، كـه به صورت يكاني نيز قابل اسـتفاده مـي –بعالوه، عملگر . گرداندباقيمانده تقسيم صحيح دو عدد را برمي وجود دارند C نيز در زبان --و ++ يكاني عملگرهاي . دهدعملوند خود را انجام مي ) مكمل دوم (عمل منفي كردن

تـوان قبـل يـا بعـد از اين دو عملگر را مي. كنند مي يا از آن كم يك واحد به مقدار عملوند خود اضافه به ترتيب كه :برد كه تفاوت آنها در مثال زير مشخص است عملوند به كار

b = a--; b = --a; :معادل است با :معادل است با

b = a; ( ر قبليمقدا ) a = a – 1;

a = a – 1; b = a; (مقدار جديد)

1 operands 2 operators

Page 17: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:عملگرهاي بيتي و ¦ و &عملگرهـاي دوگـاني . گذارنداين دسته از عملگرها به صورت بيت به بيت روي عملوندهاي خود تأثير مي

. كنندروي عملوندهاي خود عمل مي ، بيت به بيت،ول زيرابر طبق جد) معادل مكمل اول( ~عملگر يكاني

NOT:

10~

0 1 OR:

10¦1 0 0 1 1 1

AND:

1 0 & 0 0 0 1 0 1

و 2 به منزله تقسيم بـر shift rightهر بار . باشند ميshift left و shift right به ترتيب >> و <<عملگرهاي دوگاني shift rightاما در . شودرد مي هميشه از سمت راست صفر واshift leftدر . باشد مي2 مشابه ضرب در shift leftهر

و اگر عالمتدار باشد، بيت عالمـت كپـي شود؛ وارد مي اگر عملوند مربوطه بدون عالمت باشد، از سمت چپ صفر .)sign extension (شودمي

int a,b,c; a = 0x0F; // 00001111 = 15 b = 0x87; // 10000111 = -121 c = a & b; // 00000111 c = a ¦ b; // 10001111 c = ~ c; // 01110000 c = a << 3; // 01111000 = 120 = 15 * 23 c = a << 6; // 11000000 c = b >> 2; // 11100001 = -31 ≈ -121 / 22 (sign extension)

:توان براي خالصه نويسي، از يكي بودن دو عبارت زير استفاده نمود ميCدر زبان : نكته

var = var operator expression var operator= expression

:به عنوان مثالa += 2; a = a + 2; x &= (y ¦ z) x = x & (y ¦ z);

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

در مسـاوي بـوده و sizeof(int) و sizeof(a) باشـد، مقـادير int از نـوع a اگر متغيـر مثالً. اي استفاده نمود نوع داده Borland C 3.1 و در 2 برابرvisual C++ 6.0 از ي مسـتقل يهـا توان برنامهبه كمك اين عملگر مي. باشدمي 4 برابر . كامپايلر نوشت

ل آنهـا بـر اسـاس جـدول تقـدم ترتيـب اعمـا كار رونـد، ه ي در يك عبارت ب عملگرهاي مختلف در صورتيكه : نكتهدر . تقـدم بـاالتري دارنـد ) sizeof و --، ++، -، ~ماننـد (به طور كلي عملگرهاي يكاني . گيردعملگرها صورت مي

توان اين تقـدمها را اما هميشه مي.عملگرهاي دوگاني نيز تقدم عملگرهاي محاسباتي باالتر از عملگرهاي بيتي است .شود در موارد مشكوك هميشه از پرانتز استفاده شود همچنين توصيه مي.به كمك پرانتز جا به جا كرد

شود و بر اساس تقدم عملگرهـا، عملگرهـا ترين پرانتز شروع مي اين ترتيب، محاسبه نتيجه يك عبارت از داخلي به يگزين شوند و نتيجه آن به عنوان يك مقـدار مـوقتي در عبـارت جـا يكي يكي بر روي عملوندهاي خود اعمال مي

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

Page 18: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:)comment (توضيحات

اضـافه ) comment(توان بـه برنامـه توضـيحات براي اينكه مشخص كنيم هدفمان از هر دستور، يا تابع چيست، مي استفاده از توضيحات . دهستننويس مفيد د و فقط براي برنامه نشواين توضيحات توسط كامپايلر صرف نظر مي . كرد

در برخي مـوارد از ايـن . شودويس بسيار توصيه مي براي روشن كردن الگوريتم مورد استفاده و افكار ذهني برنامه ن . توان استفاده نمودامكان براي حذف موقتي قسمتي از برنامه مي

:توان نوشتتوضيحات را به دو صورت چند خطي و يك خطي ميشروع و خاتمه اين نـوع توضـيحات در . يابد خاتمه مي /*شود و با شروع مي */توضيحات چند خطي با -

.تواند باشدط ميهر كجاي خ . شودتا انتهاي خط نيز به عنوان توضيحات در نظر گرفته مي// در هر خط، از -

):type conversion(تبديل نوع به طور كلي، در يك عبارت رياضي، عملوندهاي عملگرهاي دوگاني بايد از يك نوع باشند؛ در غير اينصورت، نيـاز

اين تبـديل نـوع ممكـن اسـت صـريحاً در برنامـه . ين شرايط فراهم شود ، ا يكي از عملوندها با تبديل نوع است تا .درخواست شود، و يا به طور ضمني و خودكار اتفاق بيافتد

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

ر عمل انتساب، اگر نوع نتيجه به دست آمده از عبارت سمت راست از نوع متغير سمت چـپ كـوچكتر د افتد؛ ولي اگر بزرگتر باشد، تبديل نوع ممكـن اسـت باشد، بدون هيچ مشكلي تبديل نوع ضمني اتفاق مي

داده شود، مثالً اگر عددي اعشاري در متغيري صحيح قرار . باعث از دست رفتن قسمتي از اطالعات شود قرار داده شود، اطالعات بايتهـاي short در متغيري longاگر عددي . قسمت اعشاري از بين خواهد رفت

) warning(در اكثر كامپايلرها، اين تبديل نوع ضمني فقط بـا يـك اخطـار . با ارزشتر از بين خواهند رفت .شود و خطا گرفته نميباشدهمراه مي

int a; long b; double x; x = b / a;

. شـود انجام مي ) به طور صحيح (شود و سپس عمل تقسيم تبديل مي long به int از نوع a، ابتدا متغير اين دستور در توجه داشته باشيد كه متغير سمت چپ انتساب تأثيري در عمل تقسيم ندارد و تنها نتيجـه تقسـيمِ صـحيح، پـس از

. گيرد قرار ميx متغير در) با قسمت اعشاري صفر(تبديل به نوع اعشاري توجه كنيد در تبديل انواع صحيح به يكديگر، براي تبديل انواع بزرگتر به كوچكتر، بايتهاي بـا ارزش بيشـتر حـذف

اگر نـوع كـوچكتر بـدون عالمـت ) int به char، يا long به intمثل (اما در تبديل نوع كوچكتر به بزرگتر . شوندميشود و اگر نوع كوچكتر عالمتدار باشد، بيت عالمت به سمت چپ آن اضافه مي 0مقدار باشد، به تعداد الزم بيت با

.كنندبه اين ترتيب، اعداد منفي همچنان مقدار منفي خود را حفظ مي. )sign extension(شودبه تعداد الزم تكرار ميرعكس، قسمت اعشاري با شود و در تبديل ب همچنين در تبديل انواع اعشاري به صحيح، قسمت اعشاري حذف مي

. شودمقدار صفر به عدد اضافه مي

Page 19: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:شوددر ادامه مثال فوق، دستور زير با توجه به تقدم عملگرها، موجب تبديل نوع ضمني به شكل زير ميchar c; a = ( a + b - c ) / d; int + long char double long + long long - char long - long long / double double / double

intباشد كـه بـراي اينكـه بتوانـد در متغيـري مي doubleدر نهايت، نتيجه عبارت سمت راست انتساب، يك مقدار ، تعداد بايتهاي سمت راست قسمت صحيح آن intه ناچار قسمت اعشاري آن حذف و به اندازه طول ذخيره شود، ب

. گيرد قرار ميaدر متغير type(توان بـا تبـديل نـوع صـريح در مواردي كه تبديل نوع ضمني موجب بروز خطا يا اخطار شود، مي

cast( تبديل نوع صـريح، نـوع مقصـد را در داخـل براي انجام . ، كامپايلر را از قصد واقعي خود آگاه كنيمهمـانطور كـه قـبالً . كنـيم آن را بر عملوند مربوطه اعمال مي عملگري يكاني پرانتز قرار داده و به صورت

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

:دستورات زير را در ادامه مثال قبلي در نظر بگيريدd = (double) b / a;

بـه نـوع aشود، عالوه بر تبـديل شود و اين باعث مي تغيير نوع داده مي double به نوع bدر اين دستور، ابتدا متغير double ليكه در عبارت زير، عملگر تبديل نوع صـريح پـس از انجـام در حا . ، تقسيم نيز به طور اعشاري انجام شود

):شودوجود آن تأثيري نخواهد داشت و تقسيم به طور صحيح انجام مي(شود عمل تقسيم اعمال ميd = (double) (b / a);

م اخطـار ، پيغا )شودكه بالفاصله قبل از انتساب انجام مي (همچنين، در عبارت زير، به دليل وجود تبديل نوع صريح :شود حذف مي)possible loss of data (مربوط به تبديل نوع بزرگتر به كوچكتر

a = (int) ((a + b – c) / d);

Page 20: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:( )printfتابع ( )printfاز تـابع ) باشـد مـي صـفحه نمـايش كه در حالت معمـولي (خروجي استاندارد براي چاپ اطالعات روي

عملكـرد تـابع . كنـد باشد كه قالـب خروجـي را مشـخص مـي اولين پارامتر اين تابع، يك رشته مي . شوداستفاده مي printf( ) قسمتهايي از رشته كه كند، مگر در يناً در خروجي چاپ مي است كه رشته قالب خروجي را عشكل به اين

كاراكتر بعدي آن، بر اساس جدول زيـر تعبيـر و %كاراكتر تركيب در اين صورت، . استفاده شده باشد%از كاراكتر دي توجه داشـته باشـ .شود چاپ مي،به ترتيب، مقدار پارامترهاي بعد از رشته قالب، %به جاي هر تركيب شود و مي

%تركيـب و ( به نوع متغير بستگي نـدارد، بلكـه بـه رشـته قالـب ( )printfكه نحوه چاپ مقدار يك متغير در تابع استفاده شود، متغير متناظر آن، از هر نوعي كه باشد، به u%يعني مثالً اگر در رشته قالب از . بستگي دارد )متناظر آن

.)مثال بعدي را ببينيد (شودي چاپ م10و در مبناي بدون عالمت صورت عددي صحيح نوع ورودي/ نحوه چاپ خروجي %تركيب

c% كاراكتر i , %d% )10مبناي (عدد صحيح عالمتدار

u% )10مبناي (عدد صحيح بدون عالمت f% )نماد مميزدار(عدد اعشاري

e% )نماد علمي(عدد اعشاري e %g% يا f%به تشخيص كامپايلر يكي از

s% رشته x% 16د صحيح در مبناي عد

o% 8عدد صحيح در مبناي

%% شود چاپ مي%يك كاراكتر و كاراكتر مشخص كننده نوع خروجي، عددي را به عنوان حداقل فضاي الزم براي %توان بين كاراكتر به عالوه مي

ـ را number مقـدار متغيـر ;printf ("%4d", number)مثالً . چاپ آن قسمت از خروجي در نظر گرفت ه صـورت بيعني . گيرد كاراكتر براي آن در نظر مي 4كند و حداقل فضايي معادل چاپ مي 10عددي صحيح عالمتدار در مبناي

دهـد، امـا اگـر عـدد قرار مي ) spaceكاراكتر ( رقم باشد، به اندازه كافي، قبل از آن فضاي خالي 4اگر عدد، كمتر از تعداد ارقام اعشاري مورد توانهمچنين در مورد اعداد اعشاري، مي . كندپ مي رقم باشد، تمام عدد را چا 4بيشتر از

همـانطور كـه قـبالً نيـز \شوند، كاراكتر داده مي( )printfاي كه به واضح است كه در ثوابت رشته. نياز را اعالم كرد : مثال.شودتوضيح داده شد، تعبير مي

printf ("\"%3d\", \'%3d\', {%d}, %c, %5.2f", 1, -1234, 'a', 98, 1.12345);

" 1", '-1234', {97}, b, 1.12 خروجي:

در ضـمن، . دنشـو در خروجي چاپ مي )' و "(متناظر كوتيشن هايكاراكتر '\و "\ هايكيبرت ازاي دردر مثال فوق، بـه طريـق . شـود چـاپ مـي )97 ( آن معادل استفاده شده است، مقدار اسكي d% از 'a'چون متناظر ثابت كاراكتري

5.2f% همچنـين .شـود مـي )98 متناظر كد اسكي (bكاراكتر موجب چاپ قرار دارد، كه 98 عدد c%مشابه، متناظر .چاپ شود رقم اعشار2و تا ) براي كل عدد (5يعني عدد متناظر، بصورت اعشاري با حداقل طول

Page 21: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:( )scanfتابع از تابع ،)باشد مي keyboardكه در حالت معمولي ( از طريق دستگاه ورودي استاندارد براي گرفتن ورودي از كاربر،

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

ايـن آدرسـها ر ورودي در ادي مق.شود داده مي( )scanf به تابع متغيريك آدرس، %متناظر هر تركيب از رشته قالب، .1توان آدرس آن را به دست آوردقبل از نام هر متغير مي &عملگر با قرار دادن . دنشوميذخيره

int number; char operator; scanf("%d %c", &number, &operator);

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

، هر چند در شود ميخطادچار در زمان اجرا كوچكتر است، برنامه int از char شود، چون اندازه استفاده d%متناظر . شودزمان كامپايل خطايي گزارش نمي

كاراكتر ديگري نيز وجود داشته باشد، آن كاراكترها نيز بايد در %همچنين اگر در قالب ورودي، به غير از تركيبات : دستور زيرمثالً براي. ورودي رعايت شود

scanf("(%d,%d)", &a, &b); ذخيـره b و a بـه ترتيـب در متغيرهـاي 2 و 1 اعـداد تـا وارد شوند (1,2)در ورودي بايد دو عدد حتماً به صورت

، وارد شود، مقادير قرار گرفته در ( )scanfاگر ورودي به هر شكل ديگري، غير از قالب خواسته شده در تابع . ندشوa و b خواهند بود نامعتبر.

:نكتهنـوع در آن، در اينست كه در هر دو يك رشته قالـب وجـود دارد كـه ( )printf و ( )scanfشباهت توابع -

. شود مشخص مي%توسط تركيبات خروجي /ورودي بـراي چـاپ مقـدار يـك متغيـر، ( )printfدو تابع در اينست كـه در در نحوه فراخواني مهمترين تفاوت -

بايد ( )scanfكافيست از نام آن استفاده كنيم، اما در ) كردن نحوه چاپ در رشته قالبعالوه بر مشخص (ي مگر در موارد (نيز قبل از نام متغير استفاده شود ) براي به دست آوردن آدرس آن متغير ( &حتماً عملگر

. )كه خود متغير حاوي آدرس باشد

توابع در ادامـه نحوه تعريف و فراخواني . كندين آنها را چاپ مي گيرد و ميانگ برنامه زير دو عدد از ورودي مي : مثال

.شوندتوضيح داده مي#include <stdio.h> float average (int n1, int n2){ float ave; ave = (n1 + n2) / (float) 2; return ave; }

و باشدمی، خود متغير محتوی آدرس مورد نظر کنيمهای بعدی به آنها اشاره می قسمتای که درع رشتهانو مانند ایی متغيرهادر 1

. الزم نيست&استفاده از عملگر

Page 22: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

main() { int num1, num2; float mean; scanf("%d %d", &num1, &num2); mean = average (num1, num2); printf ("Average = %f.\n", mean); }

Page 23: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:توابعتوان به روش باال بـه پـايين برنامـه يافته است و به كمك اين زبان مي زباني ساخت Cهمانطور كه قبالً گفتيم، زبان

بلكـه مسـأله را بـا تعريـف چنـدين . شـويم از همان ابتدا وارد جزئيات نمي ، حل مسأله برايدر اين روش، . نوشت. شوداستفاده مي» توابع«ها از مسأله)زير(، براي تعريف Cدر زبان . يمكنها حل مي زيرمسأله و استفاده از آن زيرمسأله

آن راخـواني فو دوم ) مسـأله الگـوريتم حـل ( تعريف خود تـابع يكي: استفاده از توابع دو بخش دارد بدين ترتيب، ). تردر حل مسأله كلياستفاده از آن (

. سـت ناد كاربرد آنهـا در رياضـي به بسيار شبيه توانرا مي Cبرد توابع در زبان ر كا ،كامالً متفاوت ز ديدگاهي ا: نكتههمچنـين در زمـان . دارد و يك خروجـي )پارامتر ( تعدادي ورودي ، مانند توابع رياضي، هر تابع ، Cدر زبان چرا كه

به داده شده محاسبه و سپس در محاسـ ي)پارامترها (استفاده از يك تابع در يك عبارت، مقدار تابع براساس وروديها فرمـول يـا چنـد اما نحوه تعريف خود تابع، بر خالف رياضيات كـه بـه صـورت يـك . رودنتيجه عبارت به كار مي

. گيردصورت مي) با اجراي ترتيبي( به صورت يك الگوريتم Cگرفت، در زبان رياضي صورت ميايـن نـوع توابـع، . روجي ندارند توان توابعي نوشت كه خ ، عالوه بر امكان تعريف توابع رياضي، مي Cدر زبان : نكته

را voidنـوع . شـود تعيـين مـي voidنوع خروجي چنين توابعي . بيشتر از جنبه حل يك زيرمسأله قابل نگاه هستند براي تعريـف متغيرهـا voidتوان از نوع واضح است كه نمي . در نظر گرفت » بدون نوع «يا » هيچ«توان به معناي مي

دهنـد؛ مـثالً در پاسـكال، ها، به دليل تفاوتهاي زياد اينگونه توابع، نام ديگري به آنها مي در برخي زبان . 1استفاده نمود .شود استفاده ميprocedureهايي كه خروجي ندارند، از براي بيان زيرمسأله

:تعريف تابعود، هـاي مسـأله مشـخص شـ و خروجـي هـا ها، ابتدا الزم اسـت ورودي همانطور كه در تعريف مسائل و زيرمسأله

عالوه بر آن، براي هر تابع بايـد . ها و خروجي آن است ورودينوع مهمترين قسمت نوشتن تابع نيز مشخص كردن تـابع 2، كه بـه امضـاي Cدر زير نحوه بيان اين اطالعات در زبان . يك نام مشخص شود تا از طريق آن شناخته شود

:)ختياري هستند ا[ ]قسمتهاي داخل عالمت (شهرت دارد، نشان داده شده است ([… , نام پارامتر نوع پارامتر , نام پارامتر نوع پارامتر]) نام تابع [نوع خروجي]

قسمت امضـاي تـابع ناي آن اولي، كه نوع دادهتواند به طور رسمي يك مقدار خروجي داشته باشد مي Cهر تابع در بعبـارت ديگـر، هرگـاه نـوع . از نوشتن آن صـرفنظر كـرد توان باشد، مي intدر صورتيكه نوع خروجي تابع . 3است

. گيرد در نظر ميintخروجي تابع تعيين نشود، كامپايلر آن را سـپس . نباشد) رزرو شده ( كلمات كليدي نام متغيرها، بايد شناسه باشد و از گيرد، كه همانند سپس نام تابع قرار مي هـر ورودي بـا . تواند صفر يـا بيشـتر باشـد ها مي تعداد ورودي . شوندهاي تابع مشخص مي در داخل پرانتز ورودي

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

:شود، که استفاده از آن اختياری است برای نشان دادن نداشتن ورودی نيز استفاده میvoidگاهی اوقات از کلمه 1

int function (void); 2 signature .توان به عنوان خروجی تعریف کردالبته برخی از پارامترهای تابع را نيز می 3

Page 24: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

توان يعني نمي( نوع هر ورودي بايد به طور جداگانه و صريحاً ذكر شود،تعريف پارامترهادر .شود گفته مي»پارامتر«نامگذاري پارامترها نيز از قواعد نامگـذاري متغيرهـا . )چند پارامتر از يك نوع را به صورت يك ليست تعريف نمود

. كندپيروي ميزها براي تشخيص توابع اهميت خاصي دارد، تقريباً هميشه براي نام بردن از يك تابع، جلوي از آنجائيكه وجود پرانت

.شودنام آن يك پرانتز باز و بسته قرار داده مي

، كـه بـراي گويندميتابع prototypeقرار داده شود، به آن ) ;(اگر بالفاصله بعد از امضاي تابع، سميكالون • . شود مياستفاده الگوريتم تعريف بدون ، امضاي تابعبيان

را )الگـوريتم (توان در ادامه آن، متن تابع قرار داده شود، مي ) آكوالد باز (} اگر بعد از امضاي تابع عالمت •، Cبه طور كلي، در يـك برنامـه . شودقرار داده مي ) آكوالد بسته ( {پس از پايان متن تابع، عالمت . نوشت

در خارج از توابـع . باشدو در متن توابع مي } و {رايي را نوشت، بين توان دستورات اج تنها جايي كه مي )include# و define#ماننـد ( و شـبه دسـتورات )مانند تعريف متغيرها (دستورات تعريفي از توان ميتنها

. )شوندجزء دستورات اجرايي محسوب نمياينها (استفاده كرد

بـر اسـاس . تمام دستورات اجرايي به همراه تعريف متغيرها استفاده نمود توان از تابع، مي )الگوريتم (در نوشتن متن 10مشابه حل مسأله اصـلي در ) معادل نوشتن الگوريتم حل يك زيرمسأله (روش باال به پايين، نوشتن متن يك تابع

. شود كه اين ممكن است منجر به نوشتن توابعي ديگر شود دستور انجام مي15الي بـه عبـارت . باشد كه محتوي الگوريتم حل مسأله اصلي اسـت ، نيز خود يك تابع مي( )mainد كه توجه داشته باشيتـوان همچنين دقت كنيد كه تعريف توابع به صورت تودرتو ممكن نيست؛ يعني نمي . برنامه است عديگر نقطه شرو

شـوند تعريف مي) يكديگرادامةدر (بلكه توابع به طور كامالً مجزا . در داخل متن يك تابع، تابع ديگري تعريف كرد اما ترتيب نوشتن توابع بايد به نحوي باشد كه تعريف هر تـابع . 4شوندو بر اساس نياز در توابع ديگر فراخواني مي

Cبه خاطر آوريد كه يك برنامـه (هاي آن قرار گيرد باالتر از تمام فراخواني ) prototypeبه صورت كامل و يا فقط ( تـابع در برنامـه وجـود prototype فقـط دقت كنيد كه اگر. )شود كامپايل ميخوانده وابتدا تا انتها خط به خط و از

شـود، ولـي در نباشد، در زمان كامپايل خطـايي داده نمـي موجود متن آن اما) قبل از هر فراخواني تابع (داشته باشد . شود بروز خطا ميزمان لينك موجب

به ادامه اجراي تابع returnتوان به كمك دستور دار خروجي تابع مشخص شود، مي در هر قسمت از متن تابع كه مق ، مقـدار ميـانگين ( )averageدر مثال قبلي، در متن تابع . كه بايد برگردانده شود نيز اعالم شوديخاتمه داد و مقدار

كنيم كـه مقـدار ايـن شخص مي م returnبه كمك دستور در اين مرحله، . گيرد قرار مي aveمحاسبه شده و در متغير اسـتفاده از دسـتور به طور خالصـه، . )شده است خروجي مورد نظر در اين متغير ذخيره (متغير بايد برگردانده شود

return گردانـد كند و مقدار خواسته شده را به محل فراخواني تابع برمي در هر جاي تابع، اجراي تابع را متوقف مي. .)چون مقدار برگشتي وجود ندارد ( فقط وظيفه خاتمه اجراي تابع را داردreturnدستور ، void توابع مورداما در

. گویند می) recursive(تواند در حين اجرا، خودش را نيز فراخوانی کند، که به آن تابع بازگشتی یک تابع در صورت لزوم می 4

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

بان لي در ز ك طور متنـاظرش،) آكـوالد بسـته ({تا عالمت ) آكوالد باز (}، از هر عالمت C ه .شوداميده مييك بالك ن

Page 25: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:)function call (خواني تابعافرتوان آن را به عنوان يك دستور واحد در نظر گرفت و از آن در ساير قسـمتهاي برنامـه مي، تعريف يك تابع پس از

. شودتابع مي ) الگوريتم(متن گويند، چون موجب اجراي دستورات به استفاده از تابع، فراخواني آن مي . استفاده نمود متنـاظر مقادير ةمشخص كنند ) يا متغيرهاي (نويسيم و در داخل پرانتز عبارات نام آن را مي براي فراخواني يك تابع،

؛ در ع ورودي نداشته باشد، گذاشتن پرانتزها الزامـي اسـت اگر تاب حتي در اينجا نيز . دهيم تابع را قرار مي پارامترهايهاي تابع در محـل فراخـواني، به ورودي . )شودضمن اينكه خطايي داده نمي (شود غير اينصورت تابع فراخواني نمي

.گويندآرگومان ميدر محـل تعريـف (رهـا فراخواني تابع دقت كنيد كه آرگومانها دقيقاً به همان ترتيبي نوشته شوند كـه پارامت محلدر در صـورت عـدم . بعالوه نوع هر آرگومان بايد با نوع پارامتر متناظرش مطابقـت داشـته باشـد . اندنوشته شده ) تابع

مگر اينكه كامپايلر بتوانـد از طريـق تبـديل (شود رعايت هر كدام از اين دو مورد، خطايي در زمان كامپايل اعالم مي گومانها كامالً از هـم مجـزا هسـتند و توجه داشته باشيد كه پارامترها و آر).د آوردنوع ضمني، تطابق الزم را به وجو

بعالوه، در فراخواني تابع، يك آرگومـان . )به بحث محدوده ديد متغيرها رجوع شود (لزوماً داراي نام يكسان نيستند .وشتيك عبارت رياضي نتوان به صورت را مي

كـه يـك تـابع در محلـي . باشـد مشابه نحوه استفاده از توابع در رياضـيات مـي ،)voidغير از نوع (فراخواني توابع ورودي محاسـبه و در عبـارت فراخواننـده تـابع پارامترهـاي معادل تابع، بر اساس مقادير ، مقدار شودفراخواني مي مـثالً .باشـد ير مـي امكانپذاجراي دستورات درون تابع طبيعتاً، محاسبه مقدار معادل تابع از طريق .شودجايگزين مي

و سـپس شـده دو تابع باشند، در عبارت زير، مقادير آنها بر اسـاس وروديهـاي داده شـده محاسـبه ( )g و ( )fاگر :گيرد قرار ميa در آنها جمعحاصل

a = f(p1,10) + g();

صورت يك دستور جديد توان با آنها به و مي باشد درون عبارات رياضي امكانپذير نمي voidتوابع از نوع فراخواني به شكل يك دستور مستقل فراخواني كرد كه در آن voidتوان مانند توابع توابع از انواع ديگر را نيز مي .برخورد كرد

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

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

:ارسال پارامترهابنابراين، در زمـان فراخـواني يـك . باشندمترها و آرگومانها دو مفهوم مجزا و متفاوت مي همانطور كه تأكيد شد، پارا

محاسبه شده و قبل از شروع اجراي دستورات ) كه در حالت كلي يك عبارت رياضي هستند (تابع، مقادير آرگومانها از طريـق – )parameter passing (به اين عمل ارسال پارامترهـا . شوند پارامترهاي متناظر كپي ميدروندرون تابع،

. 5گويندمي –مقدار

. پردازیمتر، ارسال پارامترها ممکن است از طریق کپی مقدار آرگومانها نباشد، که فعًال به این مقوله نمیالبته در حالت کلی 5

Page 26: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:متغيرها) scope(محدوده ديد اي محـدوده . تواند درون يا بيرون تابعها باشد تعريف متغيرها مي . متغير بايد آن را تعريف نمود هر استفاده از قبل از

الكي است كه متغير در آن تعريف شده است توان استفاده نمود، بعد از تعريف متغير و تا انتهاي ب كه از هر متغير مي توجه كنيد كه درون يك بالك ممكـن اسـت . )يك بالك با آكوالد باز شروع و تا آكوالد بسته متناظرش ادامه دارد (

ترين بالكي است كـه متغيـر بزرگمتغير، ) scope(در اين صورت، محدوده ديد . بالكهاي ديگري وجود داشته باشند توان نتيجه گرفت كه محـدوده بنابراين مي . )شوداش هم مي كه البته شامل بالكهاي دروني (تدر آن تعريف شده اس

بـه . گوينـد مي) global(به اين متغيرها، سراسري . تمام برنامه استشوند،ريف ميديد متغيرهايي كه خارج توابع تع . شوندرهاي محلي آن تابع محسوب مي متغيجزءپارامترهاي يك تابع نيز . گويندمي) local(ساير متغيرها محلي

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

شوند و در زمان خـروج از آن بـالك، از بـين ي محلي، در زمان ورود به بالك مورد نظر ايجاد مي دارند، اما متغيرها ).تواند به متغيرهاي بعدي تخصيص يابدشود و ميحافظه تخصيص داده شده به آنها آزاد مي(روند مي

برنامه باعـث پيچيـدگي باشد، اما در صورت بزرگ شدن تر مي هر چند استفاده از متغيرهاي سراسري به ظاهر ساده همچنين، استفاده مفرط از متغيرهاي سراسري، خـالف روش برنامـه . كندبرنامه شده و اشكالزدايي آن را مشكل مي

هاي كوچكتر و مجزايـي اسـت كـه باشد، چرا كه در اين روش، هدف تقسيم مسأله به مسأله نويسي باال به پايين مي دهـد و ايـن باعـث ها را به هم پيوند مي ه از متغيرهاي سراسري، اين زيرمسأله اما استفاد . تر باشد حل هر كدام ساده . شودپيچيدگي مسأله مي

توان متغيرهايي با يك نـام ميمختلفاما در بالكهاي . توان دو متغير با يك نام تعريف نمود در يك بالك، نمي : نكتهـ لـ تخ قسـمت م ود(باشـند و اين متغيرها كامالً متفاوت از يكديگر مـي داشت آنهـا تخصـيص داده هف از حافظـه ب

مـورد اسـتفاده خود هر متغير در محدوده ديد هاي ديد اين بالكها كامالً مجزا و مستقل باشد، اگر محدوده ). شود مي ترين محدوده ديد داخلي متغيري كه در اما اگر بالكها تودرتو باشند، يا يكي از متغيرها سراسري باشد، . گيردقرار مي

.شوداستفاده مي شد،باdouble xx; void f1( ) { int xx; { int xx; xx = 2; } xx = 0; } void f2 ( ){ xx = 1; }

Page 27: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

دستورات شرطي است بر اساس شرايط مختلف تصـميمات مختلفـي اتخـاذ شـود و يـا عملياتهـاي الزمدر يك برنامه، گاهي اوقات

مـثالً (شـوند اجـرا مـي خاص ديگر، برخي دستورات وجود دارند كه فقط در شرايط به عبارت .متفاوتي اجرا شوند Cدر زبـان : ?تايي و عملگر سهswitch و ifتورات دس). عمل تقسيم در صورت صفر نبودن مخرج بايد اجرا شود

. آورنداين امكان را فراهم مي

ifدستور :شكل كلي اين دستور به صورت روبرو است

if (شرط)

statement1; [else statement2;]

غير اينصورت، دسـتور دوم در. شوداجرا مي ) statement1(در صورتيكه شرط داخل پرانتز برقرار باشد، دستور اول )statement2 ( براي اينكه بتوان تعـداد . تواند قرار گيرد در هر كدام از اين قسمتها فقط يك دستور مي .شوداجرا مي

كنـيم يادآوري مي . توان از يك بالك به جاي دستور متناظر استفاده نمود دستور در اين قسمتها قرار داد، مي بيشتريشود حتي اگر يـك دسـتور توصيه مي . اند محصور شده { و }عه دستورات است كه داخل كه يك بالك، يك مجمو

. وجود دارد، باز هم آن را داخل يك بالك قرار دهيدifداخل توان بـراي حالـت ؛ يعني مي ) نشان داده شده است []كه با عالمت ( اختياري است elseوجود قسمت ، ifدر دستور

كه به كمك عملگرهاي شرطي (براي بيان شرط، از عبارات شرطي . صي را معين نكرد برقرار نبودن شرط، دستور خا :مثال. شونداين عملگرها در ادامه معرفي مي. شوداستفاده مي) شوندساخته مي

if (b != 0) c = a / b; else printf ("Divide by Zero.\n");

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

اسـتفاده else در قسـمت ifاگـر از . ) تودرتـو if ( ديگر به كار رود ifتواند به عنوان دستور داخل خود مي ifدستور در ايـن نردبـان، . ادامه يابد تواند به هر تعداد اين نردبان مي . ي از شرطها به شكل زير ايجاد كرد توان نردبان شود، مي

. شـود شوند و اولين شرطي كه برقرار باشد، دستور متناظر آن اجرا مـي هر كدام از شرايط، از باال به پايين بررسي مي . شوداجرا مي) در صورت وجود (elseاگر هيچ كدام از شرطها برقرار نباشند، قسمت

if ( 1شرط )

statement1; else if ( 2شرط )

statement2; else if ( 3شرط )

statement3; else statement4;

در خط بعدي و در چند ستون جلوتر، از نظر كامپايلر اهميتـي ifداخل ) ات(توجه داشته باشيد كه قرار دادن دستور ). شوداما شديداً توصيه مي(ندارد، و فقط براي خوانايي برنامه است

Page 28: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

بنابراين، اگر . باشد و نه انتهاي خطبراي نشان دادن انتهاي هر دستور مي) ;( سميكالون كنيم كههمچنين يادآوري مي در نظـر گرفتـه if سميكالون قرار دهيم، اين سميكالون به تنهايي به عنوان دستور داخل »)ifشـرط ( «بالفاصله بعد از

نيـز اسـتفاده شـده باشـد، از ديـدگاه elseدر چنين حالتي، اگر از . خواهد بود ifشود و دستور بعدي، مستقل از مي else withoutداند و خطاي ي نميif را متعلق به هيچ elseدستور ) else و ifبعلت وجود دو دستور بين (كامپايلر،

ifاگر قسمت در اين حالت، دقت كنيد كه. شود اعالم ميelseشود وجود نداشته باشد، هيچ خطايي داده نمي .

:عبارات شرطيگيرند كه داراي دو حالت در نظر مي ) booleanمعموالً با نام (اي خاصي ر برخي زبانها، براي بيان شرطها، نوع داده د

true) درست ( وfalse) اما در زبان . باشدمي) غلطC در عوض از نوع . اي وجود ندارد ، چنين نوع دادهint براي اين بنـابراين . دنباشـ مـي » نادرسـت «به منزله » صفر«و مقدار » درست«زله به من » غيرصفر«شود؛ مقادير منظور استفاده مي

. باشد شرطي هميشه نادرست مي0 شرطي هميشه درست و مقدار ثابت 1توان نتيجه گرفت مقدار ثابت مي :شودبراي بيان عبارات شرطي از عملگرهاي شرطي زير استفاده مي

> < >= <= = = != ساويكوچكتر يا م بزرگتر كوچكتر تست عدم تساوي تست تساوي بزرگتر يا مساوي

! && ¦¦ NOT AND OR

: دقت كنيد . براي تست تساوي= =رود، اما عملگر براي انتساب به كار مي=عملگر - بر مبناي صفر يـا ! و ¦¦، &&كنند، ولي عملگرهاي به صورت بيت به بيت عمل مي ~ و ¦، &عملگرهاي -

بدون (تواند موجب اشتباه در اجراي برنامه شود بنابراين استفاده جا به جا مي . دكننغيرصفر بودن عمل مي در مبنـاي (01011010 داراي مقدار aبه عنوان مثال اگر متغير ). اينكه خطايي در زمان كامپايل اعالم شود

00000000 برابـر a!و مقـدار ) معكوس بيت به بيت، يا مكمـل اول (10100101 برابر a~باشد، مقدار ) 2 ). كندهر مقدار غيرصفر را به صفر تبديل مي(خواهد بود

: ?عملگر تواند در بين عملگرهاي ديگر در عبـارات رياضـي بـه كـار گرفتـه اين عملگر سه تايي داراي شكل زير است و مي

. )!البته بر عملگر انتساب مقدم است (اين عملگر از پايين ترين اولويت برخوردار است. شود1عبارت ? شرط 2عبارت :

. 2شـود، و در غيـر اينصـورت، عبـارت مـي ) و جايگزين( محاسبه 1، اگر شرط درست باشد، عبارت فوقدر عبارت else كه قسمت ifبرخالف ( را حذف كرد 2توان قسمت عبارت دقت كنيد كه اين يك عملگر سه تايي است و نمي

). اختياري بوددر غيـر . شـود قـرار داده مـي x در متغيـر g باشـد، مقـدار 20 و 0 بـين aبه عنوان مثال، در دستور زير، اگر مقـدار

.گيرد مي0 مقدار xاينصورت، متغير x = (a > 0) && (a < 20) ? g : 0;

:دستور فوق معادل دستورات زير استif ((a > 0) && (a < 20)) { x = g; } else { x = 0;

Page 29: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

}

بـراي ايـن منظـور كافيسـت در قسـمت . درست كـرد else ifتوان شرايطي شبيه نردبان نيز مي: ?به كمك عملگر در زير براي خوانايي بيشتر، عبارت مورد نظر در چند خط نوشـته .عبارت دوم، دوباره از همين عملگر استفاده كرد

.شده است1شرط 1عبارت ? :

2شرط 2عبارت ? :

3شرط 3عبارت ? : 4بارتع

شـوند و عبـارت متنـاظر اولـين شـرط درسـت، ، شرطها به ترتيب ارزيابي مـي else ifدر عبارت فوق، مانند نردبان . شودشود و در صورت نادرست بودن تمام شرطها، عبارت آخر محاسبه ميمحاسبه مي

ر هـر كـدام از زيرعبارتهـاي را درون عبارات رياضي بـه كـار بـرد، د ) voidاز نوع غير (توان توابع همانطور كه مي توان بدون ، هر عبارت را ميCبعالوه، از آنجائيكه در زبان . را فراخواني نمود ) voidغير (توان توابع عبارت فوق مي

:توان دستوراتي مانند دستور زير داشت، مي1انتساب به يك متغير استفاده نمود(a <= 0) ? operation1(a) : (a <= 1) ? operation2 (a) : printf ("The value is bigger than 1);

ثانياً توابـع . دهيماوالً، چون اين عبارت به تنهايي به عنوان يك دستور استفاده شده، در انتهاي آن سميكالون قرار مي operation1() ،operation2() و printf()2 از نوع void صرفنظر ، اما در عبارت باال، از مقدار خروجي آنها باشند نمي

. شودمي

switchدستور تـوان از گيرد، مـي انجام مي ) يك عبارت ،تريا در حالت كلي (گيري بر اساس مقدار يك متغير در مواردي كه تصميم

.ساختار اين دستور به شكل زير است. استفاده نمودswitchدستور switch (عبارت رياضي) {

case 1ثابت :

1مجموعه دستورات

case 2ثابت :

2مجموعه دستورات

… [default : 3مجموعه دستورات ] }

هـا شود و اگر مقدار آن با هر كدام از ثابت عملكرد اين دستور به اين شكل است كه مقدار عبارت رياضي محاسبه مي )constant( سـت كـه مـثالً در صـورت اين بدان معني ا . دهد برقرار بود، از اولين دستور بعد از آن، اجرا را ادامه مي

از مگـر اينكـه ( و تمام دستورات بعدي نيز اجـرا خواهنـد شـد 2، مجموعه دستورات 1اجراي مجموعه دستورات . شوند اجرا مي defaultاگر هيچ كدام از مقادير درست نبود، مجموعه دستورات بعد از . ) استفاده شود breakدستور ، يك صفر(توان به هر تعداد قسمت مي هر ، در ifجه كنيد كه بر خالف تو. اختياري است default قسمت ifهمانند تواند چك كند كه يك مقـدار شود، كامپايلر مي ها از ثابتها استفاده مي caseاز آنجائيكه در . دستور قرار داد ) يا بيشتر . وجود نداشته باشدcaseدر دو

رسد، اما در مواردی اين امر در عبارات معمولی غيرمعقول به نظر می. شودت مقدار نهايی عبارت دور ريخته میدر اين صور 1

.ای از همين موارد است بدون استفاده از مقدار خروجی آن، نمونهvoidمثًال فراخوانی يک تابع غير . مفيد است .شودد کاراکترهای چاپ شده را دربردارد، صرفنظر می، که تعدا()printfتقريبًا هميشه از مقدار خروجی تابع 2

Page 30: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

در (تـوان در انتهـاي هـر مجموعـه دسـتورات مـي هاي بعـدي، caseبراي جلوگيري از اجراي دستورات مربوط به ، اجـرا را بـه اولـين دسـتور بعـد از switch درون بالك breakاجراي دستور . استفاده نمود break از )صورت لزوم

switch بدين ترتيب، استفاده از .كند منتقل مي break بعد از آخرين مجموعه دستورات لزومي ندارد، هرچند به هـر همچنـين، واضـح اسـت كـه اگـر . استفاده شـود breakشود براي آخرين مجموعه دستورات نيز از يحال، توصيه م

. )مثال زير در 7خط ( بعدي وجود داشته باشد، هيچگاه قابل اجرا نخواهد بودcase و قبل از breakدستوري بعد از :سازي كرد شبيهelse ifتوان با نردبان مانند زير را ميswitchيك دستور

switch (2*a – 3) { case 0: case 1: // The following are executed if either 0 or 1 f1(); f2(); break; // statements between "break" and the next "case", like here, are unreachable! (produce a warning: unreachable code) case 2: f3(); break; default: f4(); }

:از نظر عملكرد، معادل است باif (2*a – 3 = = 0 || 2*a – 3 = = 1) { f1(); f2(); } else if (2*a – 3 = = 2) { f3(); } else { f4(); }

هر چنـد (شود مي محاسبه به طور جداگانه براي هر شرط a – 3*2، عبارت else ifاما بايد توجه داشت كه در نردبان else ifهمچنين، در حالت كلي، در يـك نردبـان . شود فقط يكبار محاسبه ميswitch، اما در )مقدار آن تفاوتي نكند

، امـا در )شـود كه در اين صورت اولـين شـرط اجـرا مـي (ممكن است شرطهاي بيش از يك قسمت درست باشند switch مقادير caseهاي مختلف الزاماً متفات هستند .

Page 31: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

تكراردستورات دفعات اجراي ايـن . شود، براي اينكه تعدادي دستور به دفعات اجرا شوند، از دستورات تكرار استفاده مي Cدر زبان

دستورات تكـرار در زبـان . كنترل شودصتواند به تعدادي ثابت يا متغير باشد و يا از طريق شرطي خا دستورات مي C دستورات ،for و whileشودگفته مي» 1حلقه«شوند، عه دستوراتي كه تكرار ميبه مجمو. هستند .

:forدستور . رود به كـار مـي )ثابت يا متغير ( به تعداد دفعات مشخص عموماً براي ايجاد تكرار از طريق يك شمارنده forحلقه

ترين شكل ساده. شودشود كه براي شمارش دفعات تكرار در يك حلقه استفاده مي يك شمارنده به متغيري گفته مي شـوند چـاپ مـي 10 تـا 1در مثـال زيـر، اعـداد . باشد براي ايجاد تكرار به تعداد از پيش تعيين شده مي forكاربرد

):كند كه شمارنده حلقه است را چاپ ميi متغير مقدارشود و بار تكرار مي10 به تعداد ( )printfدستور (for (int i=1; i <= 10; i++) printf ("%5d", i);

: زير استصورت به for دستور شكل كليfor (تغيير شمارنده ; شرط ادامه ; مقداردهي اوليه) statement;

بايد ) و فقط براي يكبار(تواند شامل دستور يا دستوراتي باشد كه قبل از شروع تكرارها مي» مقداردهي اوليه«قسمت . باشدمي) و احتماالً تعريف متغير شمارنده (به شمارنده حلقه اين قسمت معموالً حاوي مقداردهي اوليه . اجرا شوند

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

، )و قبل از بررسي شرط بـراي نوبـت بعـدي (پس از هر بار تكرار . شودوالً مقدار انتهايي شمارنده مشخص مي معميـا (توان مقدار شمارنده را به ميزان دلخواه زيـاد در اين قسمت مي. شود اجرا مي» تغيير شمارنده « يعنيقسمت سوم

:)راست به چپ (ت زير بيان كرد را به صورforتوان اجراي قسمتهاي مختلف حلقه مي. كرد) كماجـراي { – })بررسـي شـرط ادامـه (–) تغييـر شـمارنده (–اجراي دسـتورات { –) بررسي شرط ادامه (–) مقداردهي اوليه (

... -})بررسي شرط ادامه (–) تغيير شمارنده (–اجراي دستورات { – })بررسي شرط ادامه (–) تغيير شمارنده (–دستورات

. كندبرقرار باشد، ادامه پيدا مي» شرط ادامه«ي كه روند فوق تا زمانتوان قرار داد، مگر اينكه تعدادي دستور درون يك بالك قـرار نيز فقط يك دستور مي for، در حلقه ifمشابه دستور

هرگـاه . اسـتفاده نمـود breakتوان از دستور براي متوقف كردن تكرار حلقه، قبل از سرآمدن شرط ادامه، مي . گيرند ادامـه for قطع شده و اجرا از اولين دستور بعـد از for اجرا شود، ادامه اجراي حلقه break، دستور forدرون حلقه

توان فهميد شود و به اين ترتيب، مي دقت كنيد كه در اينصورت، آخرين مقدار شمارنده در آن حفظ مي . كندپيدا مي . پس از چندمين تكرار قطع شده استforكه حلقه

شود كـه از ادامـه تكـرار فعلـي استفاده شود، اجراي اين دستور باعث مي continueگر درون يك حلقه، از دستور اتغييـر «، بـه معنـي forشروع تكرار بعـدي در حلقـه . حلقه صرفنظر شده و بالفاصله تكرار بعدي حلقه شروع شود

. باشداي دستورات حلقه ميو در صورت برقراري شرط ادامه، اجر» بررسي شرط ادامه«، »شمارنده

1 loop

Page 32: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

بـر توان را مي » تغيير شمارنده «و » شرط ادامه «، »مقداردهي اوليه «، هر كدام از سه قسمت Cاز نظر قواعد زبان : نكته، مگر اينكه به كنداگر قسمت شرط حذف شود، حلقه براي هميشه ادامه پيدا مي. حذف نموداساس مقتضيات برنامه

. اجراي حلقه شكسته شودbreakكمك دستور ) به روشي كه در باال ذكر شـد (، لزومي به استفاده از شمارنده نيست و تنها ترتيب تكرار قسمتها forدر دستور : نكته

بنابراين . كند تغيير مي forتوجه كنيد كه شمارنده فقط يك متغير است كه مقدار آن در قسمتهاي مختلف . مهم است بعالوه متغير شمارنده، ماننـد هـر . هاي ديگر نيز استفاده نمود ي ايجاد انواع متنوعي از حلقه اتوان بر مي forاز حلقه

اما بايد توجه داشت كـه تغييـر . توان از آن قبل، بعد و يا حتي داخل حلقه نيز استفاده نمود متغير ديگري است و مي . گذاردكرار تأثير مي درون حلقه، طبيعتاً در تعداد دفعات ت توسط دستوراتمتغير شمارنده

:whileدستور :باشدباشد و شكل كلي آن به صورت زير مي ميforتر از اين دستور ساده

while (شرط)

statement;

. شود دستور مشخص شده درون حلقه، تا زماني كه شرط مورد نظر برقرار باشد، تكرار شـود دستور فوق، باعث مي . توان از يك بالك از دسـتورات اسـتفاده نمـود ميif و for همانند while درون براي قرار دادن بيشتر از يك دستور

توان به اين صورت بيان نمود كه شـرط مشـخص شـده، قبـل از هـر بـار تكـرار را مي whileعملكرد دقيقتر حلقه ته باشـيد توجه داشـ . شوندشود و در صورت برقرار بودن شرط، دستورات يكبار ديگر اجرا مي دستورات بررسي مي

شود و اگر از همان ابتـدا شـرط برقـرار نباشـد، وارد كه قبل از اولين مرتبه اجراي دستورات نيز اين شرط چك مي . شودحلقه نمي وجود دارد كه تنها تفاوت آن با دستور بـاال در اينسـت كـه شـرط با عملكردي مشابه do/whileدستور ، Cدر زبان دستورات شود، بعد از اولين اجراي اولين بار كه شرط چك مي شود، در نتيجه مي از هر بار تكرار بررسي بعد حلقه،

:شوند يكبار اجرا مي حداقلگيرد؛ بنابراين، اين دستورات صورت ميداخل حلقهdo { statements; } while (شرط);

شود؛ در حاليكه در دستور ميقرار داده ) ;(يك سميكالون ) شرط بعد از (،do/while دقت كنيد كه در انتهاي دستورwhile) و (، اگر بعد از شرط سميكالون قرار دهيم، خود آن سميكالون به عنوان يك دستور مجـزا )شكل اول دستور

بـه معنـي ;while (1)بنابراين، به عنوان مثال، دستوري بـه صـورت . شوددر نظر گرفته مي) تنها دستور درون حلقهدستور داخل حلقه يك سميكالون است كـه هـيچ (ست كه دستوري در آن وجود ندارد اي بينهايت در برنامه ا حلقه

.)چنين دستوري به معناي قفل كردن برنامه است ()دهدكاري انجام نمي باعـث خـروج از breakدسـتور . دارد for عملكردي مشابه do/while و while درون continue و breakدستورات

طبيعتـاً شـروع تكـرار . باشـد ث صرفنظر از ادامه تكرار فعلي و شروع تكرار بعدي مي باع continueحلقه، و دستور .باشد منوط به برقراري شرط حلقه ميdo/while و while در بعدي

while (شرط) { for ( ; شرط ; ) {

)معادل است با( … …

} }

Page 33: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

;مقداردهي for (تغيير ; شرط ; مقداردهي) { while (شرط) {

)معادل است با( … …

;تغيير { }

. انددو قطعه برنامه زير، داراي عملكردي يكسان هستند و براي محاسبه مجموع تعدادي عدد مثبت نوشته شده : مثال

.يابدبرنامه با وارد كردن عددي منفي خاتمه ميint sum = 0, n; n = 0; // n needs to be initialized before it is used in the condition below while (n >= 0) { scanf ("%d", &n); if (n < 0) break; // To avoid adding the negative number to sum sum += n; } ---- int sum = 0, n; scanf ("%d", &n); while (n >= 0) { sum += n; scanf ("%d", &n); }

Page 34: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

هاهيآراـ سـر و كـار دار با هم ارتباط دارنـد، ير كه به نوع ي متغ يا تعداد ي، رهاي از متغ يستي كه با ل يدر موارد ـ م، از آراي هـا هيـ ير معمول يك متغ يف يه تعر يه، شب يك آرا يف ينحوه تعر . ميكنياستفاده م ـ پـس از نـام آرا ي است، ول د تعـداد يـ ه باي

.ذكر شود) [ ]داخل (از يعناصر مورد نياوع دادهن هينام آرا ;[ ثابت ]

، از نـوع )ك ثابت باشد يد يكه لزوماً با (شود، به تعداد خواسته شده يف م ي به شكل فوق تعر ياهير آرا يك متغ ي يوقت باعـث ;int num[6]ف يـ مـثالً تعر . شـود يص داده ميفضا تخص) به طور پشت سر هم( مورد نظر، در حافظه ياداده . شوديح مي عدد صح6اندازه ص حافظه به يتخص

تـوان از يس، م يان اند ي ب يبرا. داشت يمناسب دسترس » سياند«ماً به كمك يتوان مستق يه م يبه هر كدام از عناصر آرا ان يـ عبارت ب ). شودي مشخص م ثابتك يه با يف كه طول آرا يبر خالف هنگام تعر ( استفاده كرد ياضيك عبارت ر ي

ف شـده باشـد، ي تعرn با طول يا هي آرايوقت. شودي قرار داده مياهير آراي نام متغيجلو و در [ ]س، داخل يكننده اندم، ي بخـوان يه را قبل از مقـدارده يكه هر عنصر آرا يدر صورت . ندداشته باش n-1 تا 0 ني ب يري مقاد ديبامجاز يسهاياند

. ) دارندين وضعي ساده هم چنيرهايالبته متغ ( خواهد داشتينيبشيرقابل پي غيمقدارint a[15], b; // 15 integers for 'a', and one integer as 'b' a[0] = 10; // a[0] is the first element a[a[0]] = 2; // since a[0] is 10 now, a[a[0]] corresponds to a[10] b = 3; a[2*b] = 1; // assigns 1 to a[2*3], which is a[6] scanf ("%d", &a[7]); // read an integer from standard input and store it in a[7] if (a[b+1] = = a[5] ) { // a[3+1] and a[5] are both unassigned, so they may contain any numbers!! b = 2 * a[7] + 15; // use a[7] (the input value from scanf( ) above) to evaluate the expression }

. استintاست، و هر عنصر آن از نوع » int از ياهيآرا« از نوع aر يدر مثال فوق، متغ: نكتهـ ي نگهـدار يز برا ي از حافظه ن يه، قسمت يشود، عالوه بر عناصر آرا يف م يه تعر ي از نوع آرا يري متغ يوقت ن ي آدرس اول

ـ ا. گردانـد يرس را برمـ ن آد يس، ا يه بدون اند ياستفاده از نام آرا . ابدييص م يه تخص يعنصر آرا ، بـه كمـك ن آدرس ي :شوديه استفاده مير عناصر آراي محاسبه آدرس ساي برار،يفرمول ز )هياندازه هر عنصر آرا * i+ (ن عنصر يآدرس اول = i سي با اندآدرس عنصر

فرمول، چـك نيبعالوه، در ا. استيس صفر قابل دسترس يه با اند ين عنصر آرا يدهد كه چرا اول يمول فوق نشان م رف خـارج از محـدوده مجـاز يسي از انديوقتن، يبنابرا. س داده شده در محدوده مجاز قرار داشته باشد يشود كه اند ينم

ييتواند منجر بـه خطـا ين مسأله م يا. شودي م يست دسترس ي از حافظه كه مربوط به برنامة ما ن ياستفاده شود، قسمت ـ جـه گرفـت كـه آرا يتـوان نت يمـ ). شـود ي داده نم ييل خطا يدر زمان كامپا (در زمان اجرا شود ياهـا از انـواع داده هي

. باشندي مCخطرناك در

Page 35: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

ياهيارسال پارامتر آرار، يـ شود، مقـدار آن متغ ي استفاده م يك تابع در هنگام فراخوان ي به عنوان آرگومان يري متغ يم كه وقت يقبالً اشاره كرد

سـپس دسـتورات درون يعنـ ي(رد يـ گي انجام م يشود و سپس فراخوان ي م ي، در پارامتر متناظر كپ يدر لحظه فراخوان . دارديها به عنوان پارامتر ظرافت خاصهياما استفاده از آرا ).شونديتابع اجرا م

نـام آن ي، جلـو ) تـابع يدر امضـا (ف تـابع يه باشد، در هنگام تعري از نوع آراي تابع ي از پارامترها يكيكه يدر صورت اً يـ بـوده، و ثان ياريـ اوالً اخت اسـتفاده نمـود كـه [ و ]ن يك ثابت بيتوان از يالبته م. ميدهي قرار م[ ]پارامتر عالمت

ـ ين صورت هنگام فراخوان يدر ا . شوديصرفنظر م لر يتوسط كامپا ـ ن عنصـر آرا ي تـابع، فقـط آدرس اول ه در پـارامتر يع ين بـدان معناسـت كـه اگـر درون تـا يا. شوندي نم يه كپ يگر، تك تك عناصر آرا يبه عبارت د . شودي م يمتناظر كپ

در . شـود يمـنعكس مـ ) تـابع يپس از اتمام اجرا(ز ي نيه اصلير در آرايين تغ ير كند، ا ييه تغ ي از عناصر آرا يكيمقدار ر در مقدار پارامترها منحصر بـه درون تـابع بـوده و آرگومـان متنـاظر يي ساده، هر گونه تغ يرهايكه در مورد متغ يحال

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

ـ صرا عن يچرا كه وقت . ه به عنوان آرگومان مورد نظر باشد يگر كل آرا يو به عبارت د سـاده ياه از نـوع داده يـ آرا كيشـود ي و ارسال مـ ين صورت مقدار آن كپ يك پارامتر ساده استفاده شود و در ا يند به عنوان توايمهر عنصر د، نباش

).باشدي ساده ميار با نوع دادهيك متغي در حكم يعني(

):متن(رشته از ياهيـ ك رشته آرا يگر يبه عبارت د . نمود استفاده يه كاراكتر يتوان از نوع آرا يم) ا متن ي(ك رشته ي ي نگهدار يبرااسـتفاده ) 0 يكد اسـك (NULL رشته، از كاراكتر ي مشخص كردن انتها يبرا، C در زبان نيعالوه بر ا . راكتر است كا تـا n (از اسـت يـ از نوع كاراكتر نn+1 با طول ياهي، به آرا n با طول يا رشته ي نگهدار يشه برا ين، هم يبنابرا. شوديم

. )يي انتهاNULLره ي ذخيبرابراي خود رشته و يكي <include <string.h#ها وجود دارد كه براي استفاده از آنها بايد از توابع مختلفي براي كار بر روي رشتهC زبان در

:توان به موارد زير اشاره نموداز جمله اين توابع مي. استفاده نمودstrcpy (char d[], char s[]) كه عناصر s را يكي يكي در dين تابع بايد دقت داشـت قبل از فراخواني ا. كند كپي مي

براي اطمينان از اينكه در صورت بزرگ بودن طول مبـدأ، كاراكترهـاي اضـافي . باشد ه اندازه كافي ب dآراية طول كه اين تابع پارامتر سومي هم دارد كه حداكثر تعداد كاراكترهـايي كـه . استفاده نمود strncpyتوان از شوند، مي كپي نمي .كندا مشخص ميتواند كپي كند رتابع مي

Page 36: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

strcmp (char d[], char s[]) دو رشتة s و dاگر تمام كاراكترهاي آنها يكي بود مقدار صفر . كند را با هم مقايسه مياگر بخواهيم در مقايسه بين حروف كوچك و بزرگ انگليسي تفاوتي . گرداندو در غيراينصورت مقدار غيرصفر برمي

. استفاده نمودstricmpقائل نشويم، بايد از تابع strlen (char s[])گرداندشود را برمياي كه بعنوان پارامتر تابع داده مي طول رشته .

ي چند بعديهاهيآرا

تواند به صورت ماتريسـي اما اين ليست مي . ها براي ذخيره ليستي از متغيرها استفاده كرديم در قسمت قبلي، از آرايه هـاي دو بعـدي اسـتفاده توان از آرايه براي اين منظور مي . ها داريم ، ليستي از آرايه در واقع، در چنين حالتي . نيز باشد

مثالً بـراي . براي تعريف يك آرايه دو بعدي كافيست اندازه بعد دوم را بالفاصله بعد از بعد اول مشخص كنيم . نمود : از اعداد صحيح، تعريفي به شكل زير الزم است3 در 3ذخيره يك ماتريس

int matrix [3] [3]; مثالً در تعريـف . براي دسترسي به هر يك از عناصر آرايه، كافيست انديس هر بعد را به طور جداگانه مشخص كنيم

از صفر تـا دو اين ماتريس توجه كنيد كه انديس هر بعد (دهد عنصر وسط ماتريس را نشان مي matrix[1][1]فوق، باشد كه هـر عنصـر آن خـود يـك آرايـه از اعـداد اي مي از نوع آرايه matrix، متغير Cاز ديدگاه كامپايلر ). باشدمي

. است[ ] int از نوع خود يك آرايهmatrix[0]مثالً . صحيح است ;double five_five[5][5][5][5][5] :مثالً. هاي با ابعاد بيشتر نيز تعريف نمود توان آرايه به طريق مشابه مي

اي چندبعدي است، الزم است كه ابعاد دوم و بيشـتر آن را پارامترهاي آن از نوع آرايه براي تعريف تابعي كه يكي از بعـالوه، در ). شـود همچنان تعيين اندازه بعد اول الزم نيست و در صورت تعيين در نظر گرفتـه نمـي (مشخص كنيم

. ) متناظرين پارامتر و آرگومانب (هنگام فراخواني تابع نيز، اندازه ابعاد دوم و بيشتر بايد مطابقت داشته باشندvoid function1 (char names[][10]); void function2 ( ) { char titles[50][10]; function1 (titles); }

).10عدد (يكسان است ) پارامتر (namesو ) آرگومان (titlesدر مثال فوق، اندازه بعد دوم

تخصيص حافظه به صورت پويااما اگر بخـواهيم . ها استفاده كرد ها، همانطور كه اشاره شد، بايد از اعداد ثابت براي تعيين طول آرايه در تعريف آرايه

گر متغيري اسـت كـه خـود يك اشاره . گرها استفاده نمود توان از اشاره اي در زمان اجرا مشخص شود، مي طول آرايه گـر، نـوع اطالعـات اصـلي بايـد يف يك اشـاره براي تعر . باشدمي) اطالعات اصلي (توي آدرس يك متغير ديگر مح

تعريف كنيم، به صـورت زيـر عمـل Xگر به اطالعات از نوع يعني اگر بخواهيم متغيري از نوع اشاره. مشخص شود :كنيممي

X *name, *name1;

Page 37: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

ر بـا نامهـاي گدستور فوق، دو اشاره . گرها نيز بايد به صورت يك شناسه انتخاب شود همانند ساير متغيرها نام اشاره name و name1 براي ذخيره آدرس اطالعاتي از نوع Xبه جاي . كند تعريف ميXاي توان هر كدام از انـواع داده مي

دهـد گر فقط براي نگهداري يك آدرس فضا تخصيص مـي توجه داشته باشيد كه تعريف يك اشاره .مجاز را قرار داد فضاي كافي براي اطالعات اصلي نيز تخصـيص newه كمك دستور بنابراين، ب . و نه براي نگهداري اطالعات اصلي

. شودگر نسبت داده ميمعموالً به طور همزمان آدرس فضاي تخصيص داده شده به يك اشاره. دهيمميint *s; s = new int;

int معـادل يـك دستور دوم فضايي . باشد مي sگر كند و نام اين اشاره تعريف مي intگر به نوع دستور اول يك اشاره تـوان فضـايي بـراي مـي newبـه كمـك دسـتور البتـه، .دهـد قرار مي sگيرد و آدرس آن را در در حافظه در نظر مي

. اي از اطالعات نيز تخصيص دادنگهداري آرايهint *s; s = new int [10];

شـود صحيح تخصيص داده مي عدد 10گر، فضايي براي نگهداري به عنوان يك اشاره sدر اين مثال، پس از تعريف . اگر دقت كنيد، اين نوع تعريف اثري دقيقاً مانند تعريف يك آرايه دارد . گيرد قرار مي sو آدرس ابتداي آنها در متغير

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

گرفته شده است، تا زماني كه بـه طـور صـريح آزاد نشـود، در اختيـار newبعالوه فضايي كه به كمك دستور . نمودكه (شود وده ديد آنها برسيم، به طور خودكار آزاد مي ها زمانيكه به انتهاي محد فضاي آرايه حاليكهدر ؛ باشد مي هبرنام

بـا گرفتـه شـده، new دسـتور بـا sگر براي اشاره يي كه آزادسازي فضا . ) تابع است همزمان با خاتمه اجراي معموالً :شود به شكل زير انجام مي وdeleteدستور

delete [] s; كند كه فضاي تخصيص داده شـده بـه به كامپايلر يادآوري ميگر، و نام اشاره delete بين دستور []قرار دادن عالمت

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

پس از آن، تا قبل از اينكـه ايـن . فضا تخصيص داد به اندازه كافي براي آن new استفاده نمود و با دستور هاگراشاره . گر مانند يك آرايه استفاده كردتوان از اين اشاره شود، ميdeleteفضا در مقابل استفاده نابجا از . دهند، به برنامه نويس قدرت مانور زيادي مي ++C در زبان delete و newدستورات : نكته

مانند آزاد نكردن برخي فضاها، يا تالش براي آزاد كردن فضايي (برنامه شود تواند باعث مشكالت زيادي در آنها مي معمـوالً (تواند باعث ايجاد خطاهـايي استفاده بي رويه از اين دستورات مي . !)كه به برنامه تخصيص داده نشده است

run-time ( ن ايـن امكـان، حـل هر چند در برخـي مـوارد بـدو . در برنامه شود كه پيدا كردن آنها بسيار مشكل است !نويسي غير ممكن استبرخي مسائل برنامه

Page 38: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

:فايلبراي ايجاد يك جريان كافيسـت متغيـري از . نسبت داد » 1جريان« براي كار با فايلها بايد ابتدا آنها را به يك Cدر زبان

كنـيم و فايـل را بـاز مـي ( ) fopenبراي انتساب يك فايل به يك جريان، به كمك دسـتور . تعريف كنيم* FILEنوع توان مي( ) fprintf و ( ) fscanfپس از آن به كمك دستورات . دهيم مي نسبتدهمزمان آن را به جريان مورد نظر خو

. بنـديم فايل را مـي ي عملياتدر انتها. اطالعات موجود در فايل باز شده را خواند و يا در فايل اطالعات جديد نوشت دي و خروجـي اسـتاندارد بـه ورو / به فايل كامالً مشابه خواندن و نوشتن از / به طور كلي عمليات خواندن و نوشتن از

عملكـردي دقيقـاً هماننـد ( )fprintf و ( )fscanfباشد و به همين دليـل دسـتورات مي) صفحه كليد و صفحه نمايش( . دارند( )printf و ( )scanfهاي خود يعني همخانواده

بازكردن فايلFILE *fopen (char *name, char *mode);

كنـد شود، سعي مـي اجرا مي( ) fopenوقتي دستور . رودي باز كردن فايلها به كار مي با امضاي فوق برا( ) fopenتابع و modeمقـادير مختلـف . دارد modeنحوه باز كردن فايل بستگي به پـارامتر دوم يعنـي . را باز كند nameفايلِ با نام

:عملكرد متناظر آنها در ذيل آمده استo "r" : براي خواندنقط ف) در صورت وجود(باز كردن فايل o "w" : رود از بين مياطالعات آن اگر فايلي با همين نام از قبل وجود داشته باشد، –ايجاد فايل براي نوشتن . o "a" : شتو ايجاد فايل اگر وجود ندا) اطالعات قبليبا حفظ (در انتهاي فايل نوشتن – اضافه كردن. o "r+" : رودات قبلي فايل از بين نمي اطالع–نوشتن / باز كردن فايل براي خواندن. o "w+" : رود اگر فايلي با همين نام از قبل وجود داشته باشد، فايل قبلي از بين مي–نوشتن / ايجاد فايل براي خواندن . o "a+" : امكان خواندن از فايلعالوة ب،اضافه كردن در انتهاي فايل

كند و جريان متناظر فايل را بعنوان خروجي خواسته شده باز مي را در حالت name فايل با نام ( ) fopenبنابراين، تابع

اما اگر به هر دليلـي، . ايم، نسبت داد تعريف كرده* FILEتوان اين جريان را به متغيري كه قبالً از نوع مي. گرداندبرميتيـب، هميشـه بايـد بـه ايـن تر . خواهد بـود NULL برابر ( ) fopenباز كردن فايل به شكست بيانجامد، خروجي تابع

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

a.txt كه در مسير C:\ ترين اشكاالت در توجه كنيد كه يكي از محتمل .دهدرد را براي خواندن از فايل نشان مي قرار دابنـابراين در صـورت . اينست كه فايلي با نام مورد نظر وجود نداشته باشد ) rحالت (زمان باز كردن فايل براي خواندن

1 stream

Page 39: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

البته بايـد در نحـوه بـه . د نظر چاپ كردتوان پيغامي مبني بر پيدا نكردن فايل مور مي( ) fopenشكست در فراخواني . در آدرس دهي فايلها نيز دقت نمود\كار بردن كاراكتر

FILE *inFile; inFile = fopen ("C:\\a.txt", "r"); if (inFile == NULL){ printf("\"a.txt\" not found.\n"); return 1; }

. ه به شكل زير نيز قابل نوشتن استكه به طور خالصFILE *inFile; if ( ! (inFile = fopen ("C:\\a.txt", "r")) ){ printf("\"a.txt\" not found.\n"); return 1; }

خواندن و نوشتن در فايلfscanf (FILE* input, char *format, …); fprintf (FILE* output, char *format, …);

fscanfيان منتسب به فايل مورد نظر را به عنوان اولين پارامتر توابع براي خواندن و نوشتن در فايلها، كافيست ابتدا جر

نوع و تعداد وروديهاي مـورد ( ) printf و ( ) scanfدقيقاً مانند ) format(سپس رشته قالب . قرار داد( ) fprintf و ( ) . متغيرهاي مورد نظر داده شوند) آدرس(كند و بعد از آن نيز بايد نظر را مشخص مي

Cدر زبـان . گيرنـد از ورودي و خروجي استاندارد انجام مـي ( )printf و ( )scanfعمليات خواندن و نوشتن در توابع و ( ) fscanf وجود دارند كه اگـر بـه توابـع stdout و stdinمتناظر ورودي و خروجي استاندارد، به ترتيب جريانهاي

fprintf ( )ورودي اسـتاندارد (ع نيز ورودي يا خروجي خود را از صفحه كليد داده شوند، باعث خواهند شد اين تواب ( .انجام دهند) خروجي استاندارد(و به صفحه نمايش

char *fgets (char *str, int n, FILE* inFile); آن بـه strاي كـه خواند و در فضـاي حافظـه ميinFile را از فايل متناظر با n-1اي با حداكثر طول رشته( )fgetsتايع

) كه معادل يـك رشـته اسـت (تواند به صورت يك آرايه از كاراكترها اين فضاي حافظه مي . دهدكند، قرار مي اشاره مي گـري بـه اولـين عنصـر آرايـه كنيم كه به كاربردن نام آرايه بدون انديس معـادل اشـاره يادآوري مي (تعريف شده باشد

بـه انـدازه كـافي فضـاي new تعريف نمود و به كمـك دسـتور * charتوان متغيري از نوع به طريق ديگر، مي). استهـا بـا كـاراكتر انتهـاي رشـته cبا توجه به اينكه در زبـان . حافظه براي ذخيره رشته خوانده شده از فايل تخصيص داد

NULL اي بـه طـول )رشته (شود، بنابراين با تعريف آرايه مشخص ميn اي بـا حـداكثر طـول كـاراكتر، رشـتهn-1 را . توان در آن ذخيره نمود مي ( ) fwrite و ( ) freadدستورات متنوع ديگري نيز براي خواندن و نوشتن در فايلها وجود دارد، از جملـه توابـع : نكته

بـراي اسـتفاده از ايـن )دهـد قـرار مـي int خوانده و در يـك بايت 2يعني مثالً ! (نمايند رفتار مي باينري كه به صورت ). ( ) fopen در mode به رشته bاضافه كردن ( را نيز بايد به صورت باينري باز كرد دستورات فايلها

Page 40: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

بستن فايلfclose ( FILE *stream);

شود كه تغييراتي كه در حـين برنامـه در فايـل اين عمل باعث مي . بندد را مي streamاين دستور فايل متناظر با جريان به عبارت ديگر، اگر قبل از اتمـام برنامـه، . شده و عمالً روي ديسك منتقل شوند اند، نهايي داده شده streamمتناظر با

. فايلي بسته نشود، اين احتمال وجود دارد، كه اطالعات فايل در روي ديسك به طور نادرستي ذخيره شود

:تست انتهاي فايلint feof (FILE *stream);

شود؛ بعنوان مثـال وقتـي فايـل درون فايل در نظر گرفته مينماانشود، به طور مجازي يك مك هنگامي كه فايلي باز مي با هر عمـل خوانـدن يـا نوشـتن . گيرد ي فايل قرار مي يا انتها در ابتدا به ترتيب نما باز شود، مكان "a"يا "r"در حالت

در انتهاي فايل قـرار بگيـرد، نما اگر مكان . رودنما با اندازه اطالعات خوانده يا نوشته شده به جلو مي درون فايل، مكان بـراي تسـت ) استEnd Of File مخفف eofكه (( ) feofتابع . باشدپس از آن عمل خواندن از فايل امكان پذير نمي

. روداين مسأله به كار ميخوانـده و در كاراكتر از فايـل 125هايي با طول حداكثر طعه برنامه زير، تا زمانيكه با انتهاي فايل نرسيده، رشته ق :مثال

. كندصفحه نمايش چاپ ميwhile (!feof(fp)) if (fgets(str, 126, fp)) printf("%s", str);

باشد كـه اي مي رشته strهمچنين . باشد و قبل از دستورات فوق بايد باز شده باشد مي *FILE از نوع fpدر مثال فوق، باشـد، هـر گـاه مقـدار مـي 0 معادل عدد NULLاز آنجائيكه مقدار . كاراكتر فضا در اختيار دارد 126حداقل به اندازه

همچنين دقت كنيد كه براي چـاپ . استif باشد، به معني برقرار نبودن شرط NULLگر اشاره( ) fgetsبرگشتي تابع ته بـه تـوان از خـود رشـ استفاده نمود و نمـي ( ) printf در رشته قالب تابع s%يك رشته روي صفحه نمايش بايد از

).شود در آن رشته به عنوان يك قالب در نظر گرفته مي%در آنصورت، كاراكتر (عنوان رشته قالب استفاده نمود

خروجي استاندارد/ وروديهمانطور كه در ابتداي اين بخش اشاره شد، منظور از ورودي و خروجي استاندارد، همان صفحه كليد و صفحه نمايش

بـه ) DOSدر سيسـتم عامـل ( هر گونه عمليات خواندن و نوشتن معمولي در هر برنامـه اين بدان معناست كه . هستند اين امكان وجود دارد كه قبـل از اجـراي هـر DOSاما در سيستم عامل . شودورودي و خروجي استاندارد هدايت مي

محيطي متني بـراي اجـراي DOS در سيستم عامل .برنامه، ورودي و خروجي استاندارد برنامه را به فايلهايي تغيير داد Windows XPدر . وارد كـرد » 2خـط فرمـان «دستورات وجود دارد كه براي اجراي هر برنامه بايد نام آن برنامـه را در

. ايجـاد گـردد DOS را اجرا نمود تا محيطي شبيه به خط فرمان cmd.exe، برنامه Run و سپس Startتوان از منوي مي

2 Command Line

Page 41: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

توانـد چيـزي شـبيه زيـر خط فرمان مـي . قرار دارد <نوشته شده و در انتها عالمت در خط فرمان، آدرس مسير جاري ):Windowsسازي شده توسط در محيط شبيه(باشد

C:\Documents and Settings\Guest> :توان نام برنامه مورد نظر را بعد از آن وارد كرد تا برنامه اجرا شودمي

C:\Documents and Settings\Guest> test.exe توان نام فايل محتوي اما براي تغيير ورودي استاندارد اين برنامه، مي . شود مي test.exeدستور فوق باعث اجراي برنامه

: قرار داد> عالمت بعد ازها راوروديC:\Documents and Settings\Guest> test.exe < input.txt

:ودش استفاده مي<براي تغيير خروجي استاندارد از عالمت C:\Documents and Settings\Guest> test.exe > output.txt

. عوض كردنيز توان همزمان ورودي و خروجي را البته واضح است كه مي نيز متغيرهاي استانداردي براي كار مستقيم بـا دسـتگاههاي ورودي و خروجـي اسـتاندارد Cاز ديدگاه ديگر، در زبان

بنـابراين هركـدام از دسـتورات كـار بـا . معادل خروجي استاندارد هستند stdoutو معادل ورودي stdin. وجود دارند به عنـوان . باشد نمي توجه داشته باشيد كه نيازي به باز كردن اين فايلها . توان روي اين متغيرها اعمال نمود فايلها را مي

: استفاده نمودstdin به همراه ( )fgetsتوان از تابع مثال براي خواندن يك رشته از ورودي با حداكثر طول مشخص ميfgets (str, 126, stdin);

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

. كه با تغيير خروجي استاندارد، پيغامهاي خطا همچنان روي صفحه نمايش چاپ خواهند شد

Page 42: ﻪﭽﺨﻳرﺎﺗjaghouri/Files/C_Material.pdfAlgorithm) ﻢﺘﻳرﻮﮕﻟا ﻞﻤﻌﻟارﻮﺘﺳد يﺮﺴﻜﻳ ترﻮﺻ ﻪﺑ ﻪﻟﺄﺴﻣ ﻞﺣ شور ،ﻢﺘﻳرﻮﮕﻟا

#include <stdio.h>#include <stdlib.h> // for exit()

void readData (FILE* f, char **names, float **gr, int n) { for (int ii=0; ii<n; ii++) { // there are 'n' records

// allocate memory for record number ii names [ii] = new char [10]; // mem for one name gr[ii] = new float[3]; // mem for three grades

// read record ii fscanf (f, "%s", names[ii]); // read the name for (int k=0; k<3; k++) fscanf (f, "%f", &gr[ii][k]); // read each grade }}

void compute (float **gr, int c, float *m) { for (c--; c>=0; c--) { // there are 'c' records m[c] = 0; for (int a=0; a<3; a++) m[c] += gr[c][a]; // compute sum

m[c] /= 3; // average! }}

void output (char **names, float *aver, int n) { FILE *f; if (!(f = fopen ("out.txt", "w"))) { fprintf (stderr, "Could not create file: out.txt\n"); exit(1); // FATAL ERROR! }

for (int i=0; i<n; i++){ fprintf (f, "%s : \t%6.2f\n", names[i], aver[i]); }}

main () { FILE *in;

if (!(in = fopen ("inText.txt", "r"))) { fprintf (stderr , "Could not open input file: inText.txt\n"); return -1; }

float **grades; char **names; int n; fscanf (in, "%d", &n);

// the first dimension of each array MUST be allocated in main() names = new char* [n]; grades = new float* [n];

readData (in, names, grades, n);

float *aver = new float [n]; compute (grades, n, aver);

output (names, aver, n);

return 0;}

1


Recommended