PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مقدمه اي بر زبان c



Admin
23rd September 2008, 06:42 AM
مقدمه اي بر زبان c

تهیه شده جهت سایت علمی نخبگان جوان

Admin
23rd September 2008, 06:43 AM
مقدمه:

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

1- زبان ماشين (سطح پايين) : اين زبان مستقيما با صفر و يک نوشته مي شود و بدون هيچ واسطه اي برروي کامپيوتر قابل اجرا است. طراحان سخت افزار هر کامپيوتر، زبان ماشين خاص خود را براي آن ماشين طراحي مي نمايند. به همين دليل هر برنامه اي که به زبان ماشين نوشته شود، فقط برروي همان ماشين خاص کار مي کند، بهمين دليل برنامه هاي نوشته شده به زبان ماشين را غير قابل حمل مي نامند. از طرف ديگر يادگيري اين زبان بسيار مشکل بوده و برنامه نويسي با آن نيز بسيار سخت است و همچنين احتمال بروز خطا نيز در آن زياد است.

2- زبان اسمبلي : اين زبان شکل ساده تر زبان ماشين است، بدين صورت که براي هر دستورالعمل زبان ماشين، يک اسم نمادين انتخاب شده است (مانند دستور ADD بجاي کد دودويي دستورالعمل جمع) که بخاطر سپردن و برنامه نويسي با آنها براي انسانها ساده تر است. اما اين برنامه ها براي ماشين قابل فهم نيست و بايد قبل از اجرا شدن توسط برنامه مترجمي بنام اسمبلر به زبان ماشين تبديل شود. توجه کنيد که از آنجا که هر دستور زبان اسمبلي معادل يک دستور زبان ماشين است، اين زبان نيز وابسته به ماشين مي باشد و برنامه هاي نوشته شده به اين زبان فقط برروي همان کامپيوتري که براي آن نوشته شده اند قابل اجرا است. علاوه براين کار با اين زبانها هنوز هم نسبتا مشکل بود و فقط متخصصين کامپيوتر قادر به استفاده از آنها بودند.

3- زبانهاي سطح بالا : دستورالعملهاي اين زبانها بسيار نزديک به زبان انسانها (بطور مشخص زبان انگليسي) مي باشد و بهمين دليل برنامه نويسي به آنها بسيار ساده تر بوده و مي توان الگوريتمها را به راحتي به اين زبانها تبديل کرد. از آنجا که اين زبانها به هيچ ماشين خاصي وابسته نيستند، برنامه هاي نوشته شده با اين زبانها (تا حد زيادي) قابل حمل مي باشند. مثالهايي از اين زبانها عبارتند از :


- بيسيک (Basic): براي کاربردهاي آموزشي
- فرترن (Fortran) : براي کاربردهاي علمي و مهندسي
- پاسکال (Pascal) : براي کاربردهاي آموزشي و علمي

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

تاريخچه C

براي بررسي تاريخچه زبان C بايد به سال 1967 بازگرديم که مارتين ريچاردز زبان BCPL را براي نوشتن نرم افزارهاي سيستم عامل و کامپايلر در دانشگاه کمبريج ابداع کرد. سپس در سال 1970 کن تامپسون زبان B را بر مبناي ويژگيهاي زبان BCPL نوشت و از آن براي ايجاد اولين نسخه هاي سيستم عامل Unix در آزمايشگاههاي بل استفاده کرد. زبان C در سال 1972 توسط دنيس ريچي از روي زبان B و BCPL در آزمايشگاه بل ساخته شد و ويژگيهاي جديدي همچون نظارت بر نوع داده ها نيز به آن اضافه شد. ريچي از اين زبان براي ايجاد سيستم عامل Unix استفاده کرد اما بعدها اکثر سيستم عاملهاي

ديگر نيز با همين زبان نوشته شدند. اين زبان با سرعت بسياري گسترش يافت و چاپ کتاب "The C Programming Language" در سال 1978 توسط کرنيگان و ريچي باعث رشد روزافزون اين زبان در جهان شد.

متاسفانه استفاده گسترده اين زبان در انواع کامپيوترها و سخت افزارهاي مختلف باعث شد که نسخه هاي مختلفي از اين زبان بوجود آيد که با يکديگر ناسازگار بودند. در سال 1983 انستيتوي ملي استاندارد آمريکا (ANSI) کميته اي موسوم به X3J11 را را مامور کرد تا يک تعريف فاقد ابهام و مستقل از ماشين را از اين زبان تدوين نمايد.در سال 1989 اين استاندارد تحت عنوان ANSI C به تصويب رسيد و سپس در سال 1990، سازمان استانداردهاي بين المللي (ISO) نيز اين استاندارد را پذيرفت و مستندات مشترک آنها تحت عنوان ANSI/ISO C منتشر گرديد.

در سالهاي بعد و با ظهور روشهاي برنامه نويسي شي گرا نسخه جديدي از زبان C بنام C++ توسط بيارنه استراوستروپ در اوايل 1980 در آزمايشگاه بل توسعه يافت. در C++ علاوه بر امکانات جديدي که به زبان C اضافه شده است، خاصيت شي گرايي را نيز به آن اضافه کرده است.

با گسترش شبکه و اينترنت، نياز به زباني احساس شد که برنامه هاي آن بتوانند برروي هر ماشين و هر سيستم عامل دلخواهي اجرا گردد. شرکت سان مايکروسيستمز در سال 1995 ميلادي زبان Java را برمبناي C و C++ ايجاد کرد که هم اکنون از آن در سطح وسيعي استفاده مي شود و برنامه هاي نوشته شده به آن برروي هر کامپيوتري که از Java پشتيباني کند(تقريبا تمام سيستمهاي شناخته شده) قابل اجرا مي باشد. شرکت مايکروسافت در رقابت با شرکت سان، در سال 2002 زبان جديدي بنام C# (سي شارپ) را ارائه داد که رقيبي براي Java بشمار مي رود.

برنامه نويسي ساخت يافته

در دهه 1960 ميلادي توسعه نرم افزار دچار مشکلات عديده اي شد. در آن زمان سبک خاصي براي برنامه نويسي وجود نداشت و برنامه ها بدون هيچگونه ساختار خاصي نوشته مي شدند. وجود دستور پرش (goto) نيز مشکلات بسياري را براي فهم و درک برنامه توسط افراد ديگر ايجاد مي کرد، چرا که جريان اجراي برنامه مرتبا دچار تغيير جهت شده و دنبال کردن آن دشوار مي گرديد. لذا نوشتن برنامه ها عملي بسيار زمان بر و پرهزينه شده بود و معمولا اشکال زدايي, اعمال تغييرات و گسترش برنامه ها بسيار مشکل بود. فعاليتهاي پژوهشي در اين دهه باعث بوجود آمدن سبک جديدي از برنامه نويسي بنام روش ساختيافته گرديد؛ روش منظمي که باعث ايجاد برنامه هايي کاملا واضح و خوانا گرديد که اشکال زدايي و خطايابي آنها نيز بسيار ساده تر بود.

اصلي ترين نکته در اين روش عدم استفاده از دستور پرش (goto) است. تحقيقات بوهم و ژاکوپيني نشان داد که مي توان هر برنامه اي را بدون دستور پرش و فقط با استفاده از 3 ساختار کنترلي ترتيب، انتخاب و تکرار نوشت.

ساختار ترتيب، همان اجراي دستورات بصورت متوالي (يکي پس از ديگري) است که کليه زبانهاي برنامه نويسي در حالت عادي بهمان صورت عمل مي کنند.

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


ساختار تکرار نيز به برنامه نويسان اجازه مي دهد مجموعه خاصي از دستورات را تا زمانيکه شرط خاصي برقرار باشد، تکـــــرار

نمايد.

هر برنامه ساخت يافته از تعدادي بلوک تشکيل مي شود که اين بلوکها به ترتيب اجرا مي شوند تا برنامه خاتمه يابد(ساختار ترتيب). هر بلوک مي تواند يک دستورساده مانند خواندن، نوشتن يا تخصيص مقدار به يک متغير باشد و يا اينکه شامل دستوراتي باشد که يکي از 3 ساختار فوق را پياده سازي کنند. نکته مهم اينجاست که درمورد دستورات داخل هر بلوک نيز همين قوانين برقرار است و اين دستورات مي توانند از تعدادي بلوک به شرح فوق ايجاد شوند و تشکيل ساختارهايي مانند حلقه هاي تودرتو را دهند.

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

از جمله اولين تلاشها در زمينه ساخت زبانهاي برنامه نويسي ساختيافته، زبان پاسکال بود که توسط پروفسور نيکلاس ويرث در سال 1971 براي آموزش برنامه نويسي ساختيافته در محيطهاي آموزشي ساخته شد و بسرعت در دانشگاهها رواج يافت. اما بدليل نداشتن بسياري از ويژگيهاي مورد نياز مراکز صنعتي و تجاري در بيرون دانشگاهها موفقيتي نيافت.

کمي بعد زبان C ارائه گرديد که علاوه بر دارا بودن ويژگيهاي برنامه نويسي ساختيافته بدليل سرعت و کارايي بالا مقبوليتي همه گير يافت و هم اکنون سالهاست که بعنوان بزرگترين زبان برنامه نويسي دنيا شناخته شده است.

Admin
23rd September 2008, 06:44 AM
مراحل اجراي يک برنامه C

براي اجراي يک برنامه C ابتدا بايد آن را نوشت. براي اينکار مي توان از هر ويرايشگر متني موجود استفاده کرد و سپس فايل حاصل را با پسوند .C ذخيره نمود (فايلهاي ++C با پسوند CPP ذخيره مي گردند). به اين فايل، کد مبدا (source code) گفته مي شود. مرحله بعدي تبديل کد مبدا به زبان ماشين است که به آن کد مقصد (object code) گفته مي شود. همانطورکه قبلا نيز گفته شد براي اينکار از يک برنامه مترجم بنام کامپايلر استفاده مي شود. کامپايلرهاي متعددي براي زبان C توسط شرکتهاي مختلف و براي سيستم عاملهاي مختلف نوشته شده است که مي توانيد برحسب نياز از هريک از آنها استفاده نماييد. اما هنوز برنامه براي اجرا آماده نيست. معمولا برنامه نويسان از در برنامه هاي خود از يک سري از کدهاي از پيش آماده شده براي انجام عمليات متداول (مانند محاسبه جذر و يا سينوس) استفاده مي کنند که برنامه آنها قبلا نوشته و ترجمه شده است. اين برنامه ها يا در قالب کتابخانه هاي استاندارد توسط شرکتهاي ارائه کننده نرم افزار عرضه شده است و يا توسط ديگر همکاران برنامه نويس اصلي نوشته و در اختيار وي قرار داده شده است. در اين مرحله بايد کد مقصد برنامه اصلي با کدهاي مربوط به اين برنامه هاي کمکي پيوند زده شود. براي اينکار نياز به يک پيوند زننده (Linker) داريم و نتيجه اين عمل يک فايل قابل اجرا خواهد بود (در ويندوز اين فايل پسوند .EXE خواهد داشت). مرحله بعدي اجراي برنامه و دادن وروديهاي لازم به آن و اخذ خروجيها مي باشد. در شکل زير اين مراحل نشان داده شده اند.

مسلما طي مراحل بالا براي اجراي هر برنامه زمانبر مي باشد، بهمين دليل اکثر توليد کنندگان کامپايلرها، محيطهايي را براي برنامه نويسي ارائه کرده اند که کليه مراحل بالا را بطور اتوماتيک انجام مي دهند.

به اين محيطها (IntegratedDevelopment Environment)IDE : يا محيط مجتمع توسعه نرم افزار گفته مي شود. اين محيطها داراي يک ويرايشگر متن مي باشند که معمولا داراي خواص جالبي همچون استفاده از رنگهاي مختلف براي نشان دادن اجزاي مختلف برنامه مانند کلمات کليدي، و يا قابليت تکميل اتوماتيک قسمتهاي مختلف برنامه مي باشد. پس از

نوشتن برنامه و با انتخاب گزينه اي مانند Run کليه عمليات فوق بطور اتوماتيک انجام شده و برنامه اجرا مي گردد. علاوه براين، اين محيطها معمولا داراي امكانات اشكالزدايي برنامه (Debug) نيز مي باشند كه شامل مواردي همچون اجراي خط به خط برنامه و يا ديدن محتويات متغيرها در زمان اجرا است. چند محيط معروف برنامه نويسي عبارتند از :


Borland C++ 3.1 براي محيط DOS
++Borland C از نسخه 4 به بالا براي Windows
++Microsoft Visual C براي محيط Windows
Borland C++ Builder براي محيط Windows

Turbo C++ براي محيط Windows

خطاهاي برنامه نويسي

بنظر مي رسد خطاها جزء جداناپذير برنامه ها هستند. بندرت مي توان برنامه اي نوشت که در همان بار اول بدرستي و بدون هيچگونه خطايي اجرا شود. اما خطاها از لحاظ تاثيري که بر اجراي برنامه ها مي گذارند، متفاوتند. گروهي ممکن است باعث شوند که از همان ابتدا برنامه اصلا کامپايل نشود و گروه ديگر ممکن است پس از گذشت مدتها و در اثر دادن يک ورودي خاص به برنامه، باعث يک خروجي نامناسب و يا يک رفتار دور از انتظار (مانند قفل شدن برنامه) شوند. بطور کلي خطاها به دو دسته تقسيم مي شوند:

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

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

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

c. خطاهاي غيرمهلک: در اين دسته خطا،d. اجراي برنامه ادامه مي يابد ولي برنامه نتايج اشتباه توليد مي نمايد. بعنوان مثال ممکن است دراثر وجود يک خطاي منطقي در يک برنامه حقوق و دستمزد،e. حقوق کارمندان اشتباه محاسبه شود و تا مدتها نيز کسي متوجه اين خطا نشود!

با توجه به آنچه گفته شد، در مي يابيم که رفع اشکال برنامه ها بخصوص خطاهاي منطقي از مهمترين و مشکلترين وظايف يک برنامه نويس بوده و گاهي حتي سخت تر از خود برنامه نويسي است! بهمين دليل است که بسياري از شرکتها(همانند مايکروسافت) ابتدا نسخه اوليه نرم افزار خود را در اختيار کاربران قرار مي دهند تا اشکالات آن گزارش شده و رفع گردد. بسيار

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

آخرين نکته اينکه در اصطلاح برنامه نويسي به هر گونه خطا، bug و به رفع خطا debug گفته مي شود.

يك برنامه نمونه

در اين قسمت براي آشنايي اوليه با زبان C يك برنامه نمونه آورده شده است كه بدون هيچ تغييري در محيط BorlandCPP قابل اجرا است.


// This Program Computes the Area of a Circle
#include <stdio.h>
void main() {
int radius ;
float area;
printf("please enter radius : ");
scanf("%d",&radius);
area = 2 * 3.14 * radius;
printf("Area is %f",area);
{
please enter radius : 10
Area is 62.8

درمورد برنامه فوق به نکات زير توجه کنيد :
- خط اول يک توضيح درمورد برنامه است. در زبان C براي توضيحات يک خطياز علامت // استفاده مي گردد. اما چنانچه توضيحات بيش از يک خط بود،- آن را باعلامت /* شروع کرده و با */ پايان دهيد. کامپايلر از اين توضيحات صرفنظر خواهد کرد. اين توضيحات باعث مي شوند که برنامه شما خواناتر شده و ديگران بهتر آن را درککنند.
- هر دستوري که با علامت # شروع شود،- يک دستور C نيست،- بلکه جزودستورات پيش پردازنده محسوب مي گردد. دستورات پيش پردازنده،- دستوراتي هستند کهتوسط کامپايلر قبل از شروع به کامپايل انجام مي شوند. بعنوان مثال دستور #include باعث مي شود که تعاريف اوليه مربوط به توابعي (زيربرنامه هايي) که قصد استفاده ازآنها را داريم به برنامه اضافه شود. در مثال بالا براي استفاده از توابع printf و scanf که در کتابخانه استاندارد C تعريف شده اند،- فايل سرآمد stdio.h را که اينتوابع در آن تعريف شده اند را استفاده کرده ايم.
- هر برنامه C بايد داراي تابعي به نام main باشد که اجراي برنامه ازآن شروع مي شود و در حقيقت همان برنامه اصلي است. البته مي توان هر تعداد ديگريتابع (زيربرنامه) نيز تعريف کرد،- اما وجود تابع main الزامي است. دقت کنيد که گرچهاين تابع پارامتر ورودي ندارد،- اما از پرانتز باز و بسته تنها استفاده شدهاست.
- در زبان C هر بلوک برنامه با علامت { آغاز شده و با } پايان مييابد. اين دو معادل دستورات begin و end در زبانهاي ديگر ازجمله پاسکال مي باشند کهبراي سادگي زبان انتخاب شده اند.

دو خط بعدي به تعريف متغيرهاي radius و area مي پردازد. در زبان C قبل از استفاده از هر متغيري بايد آن رامعرفي نماييد. معرفي متغير شامل نام و نوعمتغير است. در مثال فوق،- متغير radius از نوع عدد صحيح(integer) و متغير area ازنوع عدد اعشاري (float) تعريف شده اند.
- توابع printf و scanf جزو کتابخانه استاندارد C محسوب مي گردند وبه ترتيب براي چاپ اطلاعات در خروجي استاندارد (نمايشگر) و دريافت اطلاعات از ورودياستاندارد (صفحه کليد) استفاده مي شوند. براي چاپ رشته مورد نظر بايد آنها را درداخل علامت " قرار داد. درمورد اين توابع بعد توضيح خواهيم داد.
- دقت کنيد که در پايان هر دستورالعمل از علامت ; استفاده شده است. در مجموع C يک زبان قالب آزاد است و شما مي توانيد دستورات را به هر نحوي که دوستداريد قرار دهيد (مثلا چند دستور در يک خط از برنامه). تنها چيزي که نشاندهندهپايان يک دستور است،- علامت ; است)و نه انتهاي خط(.
- از آنجا که C يک زبان قالب آزاد است،- مي توان با استفاده از مکاننوشتن دستورات شکل بهتري به برنامه داد. بعنوان مثال دقت کنيد که پس از شروع تابع main،- دستورات حدود 3 کاراکتر جلوتر نوشته شده اند. به اين نحوه نوشتن دستوراتدندانه گذاري مي گويند. بطور کلي هربار که بلوک جديدي آغاز مي شود،- بايد آن را کميجلوتر برد. اين مسئله باعث جدا شدن بلوکها از يکديگر و خوانايي بهتر برنامه ميشود.
- در پايان برنامه و در داخل مستطيل خاکستري،- يک نمونه از اجرايبرنامه که شامل يک ورودي و خروجي نمونه است،- آورده شده است.

Admin
23rd September 2008, 07:01 AM
مفاهيم اوليه زبان C

شناسه ها در C

شناسه (identifier) نامي است که به يک قسمت از برنامه مانند متغير،تابع، ثابت و يا ... داده مي شود. در زبان C براي انتخاب شناسه ها فقط مي توان ازعلائم زير استفاده کرد: - حروف انگليسي کوچک و بزرگ (A…Z a…z) - ارقام (0…9)

- علامت خط پايين يا _ ( under line )

البته يک شناسه نمي تواند با يک رقم شروع شود. مثلا شناسه هاي sum ، average ، name2 و يا student_average مجاز هستند، اما شناسه هاي 2name و يا student average مجاز نيستند. البته در برنامه نويسي امروزي پيشنهاد مي شود بجايشناسه هايي همانند student_average از studentAverage استفاده گردد. يعني بجاياينکه در شناسه ها از _ براي جداکننده استفاده کنيم، اولين حرف هر قسمت را بصورتبزرگ بنويسيم.
نکته مهم ديگري که بايد به آن اشاره کرد آنست که زبان C برخلاف بسيارياز زبانهاي ديگر به کوچک و بزرگي حروف حساس است (case sensitive). در نتيجه شناسههاي زير با يکديگر متفاوتند :

Sum ≠ sum ≠ SUM

اين مسئله معمولا در هنگام برنامه نويسي باعث ايجاد بعضي خطاها ميشود.
آخرين نکته اينست که در هنگام انتخاب شناسه نمي توانيد از کلمات کليدي کهبراي منظورهاي خاص در زبان C رزرو شده اند استفاده کنيد. زبان C داراي 32 کلمهکليدي است که عبارتند از:





http://alladin.persiangig.ir/image/njavan.ir/programming/programming1.JPG

البته در نسخه هاي جديد C کلمات کليدي ديگري نيز به ليست فوق اضافهشده است. دقت کنيد که کليه اين کلمات با حروف کوچک نوشته شده اند.

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

همانطور که قبلا نيز گفتيم هر متغير پيش از آنکه استفادهگردد ابتدا بايد اعلان گردد. اعلان يک متغير تعيين نوع آن را نيز دربر مي گيرد. سوال اصلي آنستکه چه نوع داده هايي در زبان C و جود دارد. انواع داده هاي متداولعبارتند از :
http://alladin.persiangig.ir/image/njavan.ir/programming/programming2.JPG

البته چند نکته مهم درمورد جدول فوق قابل ذکر است :
- اندازه int در محيطهاي 16 بيتي مانند DOS برابر 16 بيت است. اما درمحيطهاي 32 بيتي همانند Windows اندازه آن 32 بيت مي باشد که در اينصورت محدوده ايبرابر -2,147,483,647 تا +2,147,483,647 را پوشش مي دهد.
- در بعضي از کامپايلرهاي C، نوع داده bool نيز وجود دارد که ميتواند يکي از مقادير trueدرست) يا false غلط را نشان دهد . اما در نسخه هاياوليه C از همان نوع داده صحيح يا int براي اينکار استفاده مي شد. بدين صورت که 0نشاندهنده false و هر عدد غير صفر (1) نشاندهنده true است.
- از آنجا که براي ذخيره سازي کاراکترها کد اسکي آنها ذخيره مي گردد،از يک متغير کاراکتري يا char مي توان بعنوان يک عدد صحيح کوچک نيز استفاده کرد واعمال رياضي برروي آنها نيز مجاز است.

علاوه براين چندين اصلاح کننده نيز وجود دارد که به ما اجازه مي دهدنوع داده مورد نظر را با دقت بيشتري براي نيازهاي مختلف استفاده نماييم.
اين اصلاح کننده ها عبارتند از : short, long, signed, unsigned
تمام اصلاح کننده هاي فوق مي توانند به نوع داده int اعمال شوند واثر آنها بستگي به محيط دارد. مثلا در يک محيط 16 بيتي، short int بازهم برابر 16بيت است ولي long int برابر 32 بيت خواهد بود. علاوه براين unsigned int باعث ميشود که يک عدد 16 بيتي بدون علامت داشته باشيم که بازه بين 0 تا 65535 را پوشش ميدهد. signed int نيز همانند int معمولي بوده و تفاوتي ندارد. البته ترکيب اين اصلاحکننده ها نيز ممکن است. مثلا unsigned long int يک عدد 32 بيتي بدون علامت است کهبازه 0 تا 4,294,967,295 را پوشش مي دهد.
اما برروي نوع داده char فقط اصلاح کننده هاي signed و unsigned رامي توان اعمال کرد. معمولا از اصلاح کننده unsigned وقتي استفاده مي شود که قصدداشته باشيم از char بعنوان يک عدد صحيح مثبت بين 0 تا 255 استفاده کنيم.
برروي نوع داده double تنها اصلاح کننده long قابل اعمال است ودراينصورت عدد اعشاري با 80 بيت را خواهيم داشت که قادر است هر عددي در بازه 3.4e-4932 تا 1.1e+4932 را در خود نگاه دارد.
تعريف متغيرها
براي تعريف متغيرها به شکل زير عمل مي کنيم:

<type> <variable-list>;

که type يکي از نوع داده هاي گفته شده و variable-list ليستي از متغيرها است کهبا کاما از يکديگر جدا شده اند. بعنوان مثال :

int sum;
float average;
long int a, b, c ;
unsigned long int i, j, k ;

علاوه براين مي توان در هنگام تعريف متغير به آن مقدار اوليه نيزداد. مثال :

int d = 0 ;


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

ثابتها
ثابتها مقادير ثابتي هستند كه مقدار آنها در حين اجرايبرنامه تغيير نمي يابد. ثابتها مي توانند از هريك از نوع داده هاي اصلي باشند. براينمايش هر ثابت بسته به نوع آن عمل مي كنيم كه شرح هريك در زير آمده است :
ثابت عددي صحيح : براي نمايش اين دسته از ثابتها، از دنباله اي از ارقام بعلاوهعلامت + يا - استفاده مي كنيم. بعنوان مثال 45- و يا 3489 ثابتها صحيح هستند. درحالت عادي C هر عدد را در كوچكترين نوع داده اي كه مي تواند قرار مي دهد. مثلا عدد 85 در يك int قرار مي گيرد، اما عدد 145398 در يك long int قرار خواهد گرفت. امااگر قصد داريد يك عدد كوچك بعنوان long محسوب گردد، مي توانيد از پسوند L در انتهايآن استفاده مي كنيم. مثلا 245L يك عدد long محسوب مي شود.


long int a = 20L;


ضمن اينكه پسوند U در انتهاي عدد نيز نشانه بدون علامتبودن آن است.
نكته ديگر آنكه C به شما اجازه مي دهد درصورت لزوم ثابتها صحيح خودرا در مبناي 8 يا 16 نيز كه از مبناهاي متداول در برنامه نويسي هستند، بنويسيد. براي نوشتن عدد در مبناي 8 بايد آن را با 0 آغاز كنيد، مثلا 0342 يك عدد در مبنـــاي 8محسوب مي گردد. اما براي نوشتن يك عدد در مبناي 16 بايد آن را با 0x آغاز نماييد،مانند 0x27A4.
ثابتها عددي اعشاري : براي نمايش اعداد اعشاري، بايد از نقطهاعشـــار استفاده كنيم، مانند 237.45 ، اما نكته جـــــالب آنستكه مي توانيد از نماد علمينيز براي نمايش اعداد اعشاري استفاده كنيد. براي اينكار كافي است از حرف e براينمــايش قسمت توان استفاده نماييد. بعنوان مثال :

-23.47 × 10 5 = -23.47e5
42.389 × 10 -3 = 42.389e-3

دقت كنيد كه قسمت توان، حتما يك عدد صحيح است. نكتهجالب اينجاست كه برخلاف مورد قبل، كامپايلر بطور پيش فرض داده هاي اعشاري را از نوع double فرض مي كند.چنانچه دوست داريد ثابت شما ازنوع float درنظر گرفته شود، درانتهاي آن F قرار دهيد. ضمنا پسوند L نيز داده اعشاري را از نوع long double درنظرمي گيرد. ثابتها كاراكتري : براي نشان دادن ثابتها كاراكتري، آنها را در داخل ' قرار مي دهيم. بعنوان مثال 'A' يك ثابت كاراكتري است.

char ch = 'S' ;


دقت كنيد كه همانطور كه قبلا گفته شد، كد اسكيكاراكترها در متغير ذخيره مي گردد، بنابراين مي توان از آن بعنوان يك عدد صحيح نيزاستفاده كرد. نكته مهم ديگر آنستكه به تفاوت عدد 5 و كاراكتر '5' دقت داشته باشيد. در حقـيقت '5' برابر است با عدد 53 كه همان كد اسكي آن است.
از آنجا كه بعضيكاراكترها، مانند enter قابل نمايش نيستند، بهمين دليل آنها را با استفاده از \ نمايش مي دهيم. عـلاوه براين بعضي كاراكترها مانند خود " نيز چون داراي معناي خاصهستند، بايد با استفاده از \ نمايش داده شوند. مــوارد مهم عبارتند از :

\n خط جديد
\t tab كاراكتر
\a بوق كامپيوتر \" "
\' ' \\ \


ثابتها رشته اي : C علاوه بر ثابتها فوق، از يك ثابت ديگر بنامرشته نيز حمايت مي كند. رشته، دنباله اي از كاراكترها است كه در داخل " قرار ميگيرند. بعنوان مثال "this is a test" يك رشته است. دقت كنيد كه 'a' يك كاراكتر است،اما "a" يك رشته است كه فقط شامل يك كاراكتر مي باشد.
عملگرها
عملگر، نمادي است كه به كامپايلر مي گويد تا عمليات محاسباتي يامنطقي خاصي را برروي يك يا چند عملوند، انجام دهد. به عملگرهايي كه فقط يك عملونددارند، عملگر يكاني مي گوييم و همواره عملگر در سمت چپ عملوند قرار مي گيرد(مانندعدد -125). اما عملگرهايي كه برروي دو عملوند اثر مي كنند را عملگر دودويي ناميده وعملگر را بين دو عملوند قرار مي دهيم (مانند 23+86). هر ترکيب درستي از عملگرها وعملوندها را يک عبارت مي ناميم.

C از نقطه نظر عملگرها يك زبان بسيار قوي است. اين عملگرها بهچند دسته اصلي تقسيم مي گردند كه آنها را به ترتيب بررسي مي كنيم..
عملگرهاي محاسباتي
اين عملگرها، همان اعمال متداول رياضي هستند كه در زبان C مورداستفاده قرار مي گيرند. اين اعمال عبارتند از :

http://alladin.persiangig.ir/image/njavan.ir/programming/programming3.JPG

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



int a,b ;
float c,d ;
a = 10 ; b = 4 ;
c = 8.2; d = 4.0;

اكنون به نتايج عمليات زير دقت كنيد :

a / b = < 2
c / d = < 2.05
a / d = < 2.5
a / 4 = < 2


چنانچه به آخرين مورد توجه كنيد، متوجه مي شويد كه از آنجا كه a يكمتغير صحيح است و 4 نيز يك ثابت صحيح در نظر گرفته شده، درنتيجه تقسيم بصورت صحيحبر صحيــح انجام گرفته است. چنانچه بخواهيم تقسيــم بصورت اعشــاري صورت پذيرد، به دو شكلمي توانيم عمل كنيم. اول اينكه آن را بصورت a / 4.0 بنويسيم و دوم اينكه از عملگرقالب ريزي استفاده كنيم.
عملگر قالب ريزي مي تواند يك نوع را به نوع ديگريتبديل نمايد. شكل كلي آن به شكل زير است :

(< type >) < expression >


كه type نوع مورد نظر است كه قصد تبديل عبارت expression به آن نوعرا داريم. بعنوان مثال در مورد بالا مي توان به شكل زير عمل كرد :

(float) a / 4


در اين حالت ابتدا از كامپايلر خواسته ايم كه ابتدا عدد a را بهاعشاري تبديل كند (البته بصورت موقت) و سپــس آن را بر 4 تقسيم نمايد، كه مسلما حاصلاعشاري خواهد بود.
بطوركلي هرگاه ثابتها و متغيرهايي از انواع مختلف در يكعبارت محاسباتي داشته باشيم، كامپايلر C همه آنها را به يك نوع يكسان كه همانبزرگترين عملوند موجود است تبديل خواهد كرد. بعنوان مثال به مورد زير دقت كنيد :
http://alladin.persiangig.ir/image/njavan.ir/programming/programming4.JPG

نكته بسار مهم ديگري كه بايد به آن توجه كرد، اولويت عملگرها است. يعني در عبارتي که شامل چندين عملگر است، کداميک در ابتدا اعمال خواهد گرديد. اولويت عملگرهاي محاسباتي از بالا به پايين بشرح زير است:

1عملگر يکاني –
2عملگرهاي * و / و %
3عملگرهاي + و –

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

http://alladin.persiangig.ir/image/njavan.ir/programming/programming5.JPG

مثال زير، يک مثال کامل در اين زمينه مي باشد :

http://alladin.persiangig.com/image/njavan.ir/programming/programming6.JPG

Admin
23rd September 2008, 07:13 AM
عملگرهاي انتساب
در زبان C براي انتساب چندين عملگر وجود دارد. ساده ترين عملگرانتساب، همان عملگر = است که در بسياري از زبانها استفاده مي شود. بعنوان مثال :

a = 5;
b = c + 2 * d;

اين عملگر باعث مي شود که عبارت سمت راست در عبارت سمت چپ قرار گيرد. توجه کنيد که مقدار سمت چپ بايد عبارتي باشد که بتوان به آن يک مقدار را نسبتداد(مانند يک متغير) که به آن Lvalue گفته مي شود، بنابراين يک ثابت نمي تواند درسمت چپ قرار گيرد. نکته ديگر اينکه اولويت عملگر = از عملگرهاي رياضي کمتر است ودرنتيجه ابتدا آن عمليات انجام شده و در پايان حاصل در عبارت سمت چپ ريخته مي شود. لازم به ذکر است که در هنگام انتساب، درصورت لزوم نوع عبارت سمت راست به نوع عبارتسمت چپ تبديل مي شود. مثال:

int a;
a = 2.5 * 5.0;


که دراينصورت عدد 12 در a ذخيره خواهد شد.
شرکت پذيري اين عملگراز راست به چپ مي باشد، بدين معنا که چنانــچه چندين عمــلگر نسبت دهـــي داشته باشيم، اينعملگرها از راست به چپ محاسبه مي شوند. مثلا پس از اجراي دستور زير :

a = b = c = 10;


مقدار هر 3 متغير برابر 10 خواهد شد.
نکته جالب درمورد زبان C آنستکه داراي يک سري عملگرهاي انتساب خلاصه شده است که باعث مي شوند در بعضي مواردبتوانيم عبارات کوتاهتري را بنويسيم. اين عملگرها عبارتند از:





http://alladin.persiangig.com/image/njavan.ir/programming/programming7.JPG

عملگر اول و دوم، عملگرهاي يکاني هستند که بترتيب عملگر افزايش وعملگر کاهش ناميده مي شوند. نکته جالب آنستکه اين دو عملگر به دوصورت مورد استفادهقرار مي گيرند. در حالتي که از دستور a ++; استفاده شود به آن پس افزايش مي گويند وبدين معناست که ابتدا از مقدار فعلي a در عبارت موردنظر استفاده کن و سپس آن راافزايش بده. اما دستور ++ a که به آن پيش افزايش گفته مي شود، ابتدا a را افزايشداده و سپس از آن در عبارت استفاده مي کند. به برنامه زير دقت کنيد:


#include < stdio.h >
void main() {
int a ,b ;
a = 5 ;
b = a ++;
printf(“a=%d and b=%d \n”,a,b);
a = 5 ;
b = ++ a;
printf(“a=%d and b=%d \n”,a,b);
}



a=6 b=5
a=6 b=6

و اما پنج عملگر بعدي هنگامي مي توانند استفاده شوند که عبارتي بصورتزير داشته باشيم:
عبارت عملگر متغير = متغير
که عملگر يکي از عملگرهاي محاسباتي ( + ، - ، * يا / ) باشد،دراينصورت مي توانيم آن را بصورت زير بنويسيم:
عبارت =عملگر متغير


عملگرهاي مقايسه اي (رابطه اي)
اين عملگرها دو عبارت را بايکديگر مقايسه کرده و نتيجه را باز ميگردانند. نتيجه مي تواند درست (true) يا غلط (false) باشد. همانطور که قبلا نيزگفته شد در کامپايلرهاي جديد C++ نوع داده bool اضافه شده است و بنابراين نتيجه اينعملگرها يک مقدار bool است. اما در کامپايلرهاي قديميتر، نتيجه اين عملگرها يک عددصحيح است که درصورت درست بودن 1 و درصورت غلط بودن 0 باز مي گردانند. اين عملگرهاعبارتند از:





http://alladin.persiangig.com/image/njavan.ir/programming/programming8.JPG

نکته مهمي که بايد به آن دقت کرد عملگر مساوي (==) است، چرا که يکاشتباه بسيار متداول برنامه نويسان C استفاده اشتباه از عملگر انتساب (=) بجايعملگر تساوي (==) است که باعث ايجاد خطا در برنامه مي شود.



اولويت اين عملگرهااز بالا به پايين بشرح زير است:

3 عملگرهاي <، > ، =< و = >
4 عملگرهاي == و =!
لازم بذکر است که در هنگام مساوي بودن اولويت چند عملگر، اينعملگرها از چپ به راست محاسبه مي گردند.
عملگرهاي منطقي
اين عملگرها به شمااجازه مي دهند که شرطهاي ساده اي را که با استفاده از عملگرهاي مقايسه اي ايجاد شدهاند را با يکديگر ترکيب نموده و شرطهاي پيچيده تري را بسازيد. اين عملگرها عبارتنداز :

http://alladin.persiangig.com/image/njavan.ir/programming/programming9.JPG

همانطور که قبلا نيز گفته شد مقدار بازگشتي اين عملگرها، درست (1) يانادرست (0) مي باشد. اولويت اين عملگرها بترتيب عبارتست از :

1- عملگر !
2- عملگر &&
3- عملگر ||

عملگر شرطي
گاهي لازم است که ابتدا يک شرط بررسي شده و سپس برمبناي نتيجه (درستيا نادرست بودن آن) يکي از دو عبارت ممکن بازگردانده شود. گرچه معمولا براي اينکاراز دستور if (که در فصل بعدي بحث شده است) استفاده مي شود، اما يک عملگر 3تايي (با 3 عملوند) نيز براي آن وجود دارد. شکل کلي اين عملگر بصورت زير است:

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

نحوه کار بدينصورت است که درصورت درست بودن شرط عبارت1 ودر غيراينصورت عبارت 2 بازگردانده مي شود. مثال :


a = (k<10) ? 100 : 50;

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

if(k<10) a=100;
else a=50;

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


c += (a>0 &&a<10) ? ++a : a/b;
که معادل است با :

a= a + 1;
c = c + a;
}
else c = c + a/b;

if (a>0 &&a<10) {
که البته توصيه مي شود از اين عبارات پيچيده استفاده نشود.
چند نکته درمورد عملگرها

در يک عبارت مي توان بين عملوندها و عملگرها از فضاهاي خالي بهميزان دلخواه استفاده کرد. گرچه استفاده از فضاي خالي اجباري نيست اما معمولا باعثبالا رفتن خوانايي عبارت مي گردد. علاوه براين در عبارات پيچيده مي توان از پرانتزبراي نشان دادن ترتيب اجراي عملگرها، حتي درمواردي که مورد نياز نباشد استفاده کرد. بعنوان مثال به مورد زير توجه کنيد:
شکل نامناسب

result=a-b*c/d+f*g;

شکل بهتر

result = a – b * c / d + f * g

شکل کاملا مناسب

result = a – ( b * c / d) + (f * g)


مورد ديگري که بايد به آن اشاره کرد، نحوه محاسبه عبارات پيچيدهاي است که عملگرهاي مختلفي در آنها استفاده شده

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

http://alladin.persiangig.com/image/njavan.ir/programming/programming10.JPG

Admin
23rd September 2008, 07:17 AM
خواندن و نمايش اطلاعات
همانطور كه قبلا نيز گفته شد، يكي از اهداف زبان C قابل حمل بودن آناست. بهمين منظور سعي شده است كه از دستوراتي كه ممكن است وابسته به ماشين خاصيباشد، اجتناب گردد. بهمين دليلي زبان C برخلاف ساير زبانها داراي هيچ دستوري برايخواندن از ورودي و يا نوشتن در خروجي نيست.
اما در عوض داراي تعدادي تابع (زيربرنامه) استاندارد مي باشد كهتقريبا تمامي كامپايلرها از آنها حمايت مي كنند. اين كار به كامپايلر اين امكان رامي دهد كه بر حسب نوع سخت افزار موردنظر، توابع ورودي و خروجي را طراحي نمايد. اينتوابع در يك فايل سرآمد بنام stdio.h تعريف شده اند و بنابراين قبل ازاينكه بتوانيداز اين توابع استفاده نماييد، بايد اين فايل را نيز با استفاده از #include دربرنامه خود بگنجانيد.
تابع نمايش در خروجي
براي نمايش اطلاعات در خروجي از تابع printf استفاده مي شود. اينتابع رشته موردنظر شما را به خروجي استاندارد (كه در حالت عادي همان صفحه نمايش يامانيتور است) مي فرستد. شكل كلي اين تابع بصورت زير است:

printf(< ليست متغيرها > , < رشته کنترلي >) ;

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





http://alladin.persiangig.com/image/njavan.ir/programming/programming11.JPG

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

: #include <stdio.h>
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}


You are 20 years old and your average is 18.230000

دقت كنيد كه علامت \n انتهاي رشته كنترلي باعث مي شود كه خروجي بعديبرنامه (در صورت وجود) در خط بعد چاپ شود. البته ممكن است نحوه چاپ عدد اعشاري بهشكل فوق چندان براي شما دلخواه نباشد و بخواهيد تعداد ارقام اعشاري قابل نمايش رامحدود كنيد. براي اينكار بايد از مشخصه طول ميدان استفاده كنيد. مشخصه طول ميدانبراي اعداد به شكل زير استفاده مي شود:
براي اعداد صحيح از %nd استفاده مي كنيم كه n تعداد ارقام را نشان ميدهد (مثلا %3d). در اينصورت براي هر متغير n رقم درنظر گرفته مي شود. اگر اندازهعدد از n كوچكتر باشد، به سمت چپ آن فضاي خالي اضافه مي شود و اگر اندازه عدد بيشاز n رقم باشد، طول ميدان ناديده گرفته شده و عدد بطور كامل چاپ مي شود.
براي اعداد اعشاري از %n.mf استفاده مي كنيم كه n اندازه كل عدد (شامل علامت مميز) و m تعداد ارقام اعشار است (مثلا %5.2f). در صورتيكه تعداد ارقاماعشاري عدد موردنظر از m بيشتر باشد، عدد به m عدد اعشار گرد مي شود و در صورتيكهاز m كمتر باشد، در سمت راست آن 0 قرار داده مي شود.
البته موارد ديگري نيز در مورد نحوه چاپ وجود دارد كه براي اطلاع ازآنها مي توانيد به قسمت Help كامپايلر خود مراجعه نماييد.

آخرين نكته درمورد تابع printf اينكه اين تابع مقدار بازگشتي نيزدارد كه درصورت موفقيت عمل چاپ، تعداد كاراكترهاي چاپ شده و درصورت عدم موفقيتمقدار -1 را باز مي گرداند. البته معمولا از اين مقدار بازگشتي صرفنظر مي گردد.
تابع خواندن از ورودي
براي خواندن اطلاعات از ورودي از تابع scanf استفاده مي شود. اينتابع اطلاعات را ازورودي استاندارد (معمولا صفحه كليد) خوانده و در متغيرهاي تعيينشده قرار مي دهد. شكل كلي اين تابع بصورت زير است:

scanf(< ليست متغيرها > , < رشته کنترلي >) ;

همانطور كه مي بينيد نحوه احضار تابع scanf نيز مشابه printf است. تنها تفاوت در آن است كه در scanf بايد ليست آدرسهاي متغيرها ارسالشود. مبحث مربوطبه آدرسها در فصول بعدي بررسي خواهد شد ولي در حال حاضر بخاطر بسپاريد كه براي بدستآوردن آدرس يك متغير از علامت & استفاده مي كنيم. بعنوان مثال &age بمعنايآدرس متغير age است. بطور كلي در C قديمي هرگاه كه يك تابع داراي پارامترهاي خروجيبود (يعني پارامترهايي كه يك مقدار را باز مي گرداندند) از آدرس متغيرها استفاده ميشد كه امروزه اين مسئله وجود ندارد.
رشته كنترلي حاوي تعداد و نوع متغيرهايي است كه بايد دريافت شوند واز همان مشخصه هاي تبديل مربوط به printf استفاده مي كند. به مثال زير توجه كنيد:

#include <stdio.h>
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}



Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

لازم به ذكر است كه هنگامي كه قصد وارد كردن دو عدد فوق را داريد، هممي توانيد اين دو عدد را با يك فاصله (فضاي خالي يا tab) نوشته و سپس كليد enter رافشار دهيد و يا پس از نوشتن هر عدد كليد enter را فشار دهيد.
توجه كنيد كه معمولا رشته كنترلي فقط حاوي مشخصه هاي تبديل است و هيچمتني در آن نوشته نشده است. ازنظر منطقي نيز اين كار درست است ولي چنانچه متني درآن نوشته شود بدين معنا است كه كاربر بايد علاوه بر داده هاي مورد نظر، عين آن متنرا نيز وارد كند. بعنوان مثال عبارت زير:

scanf("level=%d", &a) ;


بدين معناست كه كاربر بايد ابتدا كلمه level= را عينا تايپ كرده وسپس عدد موردنظر را وارد نمايد. معمولا از چنين حالاتي استفاده نمي گردد.
نكته آخر اينكه در scanf نيز مي توان از مواردي همچون طول ميدان برايكنترل نحوه ورود اطلاعات استفاده كرد كه از حوصله بحث ما خارج است. براي اطلاعاتبيشتر به Help كامپايلر خود مراجعه نماييد.
نکته مهم: توابع printf و scanf از رنگ استاندارد يعني سفيد بررويزمينه مشکي استفاده مي کنند، اما مي توانيد براي تغيير رنگ از توابع textcolor و textbackground نيز استفاده کنيد. البته دراينصورت براي دريافت و نمايش اطلاعات نيزبايد از توابع cprintf و cscanf استفاده نماييد. براي توضيحات بيشتر به Help کامپايلر خود مراجعه کنيد.
ورودي و خروجي اطلاعات در CPP
زبان C++ يک زبان شي گرا است، بهمين دليل در اين زبان براي ورودي وخروجي از اشياء بجاي توابع استفاده مي گردد. از آنجا که امروزه معمولا برنامهنويسان C از کامپايلرهاي C++ استفاده مي کنند، مي توانند از اشياي ورودي و خروجي آننيز استفاده کنند. اينکار در بين بسياري از برنامه نويسان C متداول است، بهمين دليلما در اينجا نحوه کار با اشياي خواندن و نوشتن در C++ را بطور مقدماتي توضيح ميدهيم؛ گرچه توضيح کامل اين موارد نياز به آشنايي با شي گرايي و زبان C++ دارد. قبلاز هرچيز لازم به ذکر است که کليه اشياي مربوط به ورودي و خروجي در فايل سرآمديبنام iostream.h تعيريف شده اند، بنابراين ابتدا بايد اين فايل به برنامه توسطديتور #include الحاق گردد.
زبان C++ براي نمايش اطلاعات از يک شيئ بنام cout استفاده مي نمايد. براي ارسال اطلاعات مورد نظر براي چاپ به cout بايد از عملگر درج در جريان يا >> استفاده نماييم. بعنوان مثال :

cout << “Please enter your name: ” ;

و يا مثال ديگر :

int a = 10;
float b = 2.86;
cout << a;
cout << b;

نکته جالبي که در اين مثالها ديده مي شود، آنستکه برخلاف تابع printf هيچ نيازي به مشخص کردن نوع متغيري که قصد چاپ آن را داريم نيست و خود شئ cout نوعآن را تشخيص مي دهد. علاوه براين مي توان چندين عملگر درج در جريان را با يکديگرالحاق کرد و چندين متغير را با يک دستور چاپ کرد. بعنوان مثال به برنامه زير دقتکنيد:

#include < iostream.h >
void main() {
int age = 20;
floate average = 18.23;
cout << “You are ” << age << “ years old and your average is ” << average ;
}



You are 20 years old and your average is 18.230000

براي دريافت اطلاعات از کاربر، از شئ ديگري بنام cin استفاده مي شود. براي ارسال متغير مورد نظر به cin بايد از عملگر استخراج از جريان يا << استفاده نماييم. بعنوان مثال:

int a;
cin >> a;

بازهم همانطور که مي بينيد نيازي به تعيين نوع متغير موردنظر نيست وخود شئ cin نوع متغير را بطور اتوماتيک تشخيص داده و داده اي از همان نوع را ازکاربر دريافت و در متغير مورد نظر قرار مي دهد. عملگرهاي استخراج از جريان را نيزمي توان با يکديگر الحاق کرد. اکنون به يک برنامه کاملتر توجه کنيد:

#include < iostream.h >
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}



Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

براي رفتن به خط بعد در شئ cout مي توان از دستکاري کننده endl استفاده کرد. مثلا در دستور زير پس از چاپ پيغام، مکان نما به خط بعد منتقل مي شود:

cout << “List of students : “ << endl;

البته دستکاري کننده هاي متعدد ديگري نيز ازجمله موارد مربوط بهتعيين طول ميدان و نحوه چاپ مقادير وجود دارد که توضيح آنها نياز به يک مبحث مستقلدارد.
توابع کتابخانه اي
همانطور که قبلا نيز گفته شد، زبان C از زير برنامه ها نيز حمايت ميکند. هر زير برنامه در C يک تابع ناميده مي شود که آن را بطور مفصل در فصول بعديبررسي خواهيم کرد. تا کنون با توابعي همچون main و يا printf و scanf آشـــنا شده ايم.
معمولا عرضه کنندگان کامپايلرها و يا ساير فروشندگان نرم افزار، برخياز توابع عمومي را که ممکن است مورد نياز جمع کثيري از برنامه نويسان مختلف باشد رادر قالب کتابخانه اي از توابع در اختيار برنامه نويسان مي گذارند (اين کتابخانه ها

ممکن است مجاني باشند و يا نياز به پرداخت مبلغي داشته باشند). بعضي از اين توابعکتابخانه اي مانند printf و scanf بصورت استاندارد درآمده و توسط عرضه کنندگانمختلف ارائه مي شوند.
در کامپايلر عرضه شده توسط شرکت بورلند (Borland C++ 3.1) نيزکتابخانه هاي متعددي از توابع براي شما عرضه شده اند که بتدريج با آنها و کاربردشانآشنا خواهيد شد. نکته مهم آنستکه براي استفاده از اين توابع ابتدا بايد فايل سرآمدمربوط به آنها را نيز در ابتداي برنامه خود اضافه نماييد ( با استفاده از #include). هر فايل سرآمد شامل تعاريف اوليه گروهي از توابع مرتبط با هم و داده هايمربوط به آنها بوده و در استاندارد قديمي تر داراي پسوند .h مي باشد(در استانداردجديد پسوند اين فايلها حذف شده است). برخي از اين فايلهاي سرآمد عبارتند از:

stdio.h : توابع ورودي و خروجي استاندارد




math.h : توابع رياضي graphics.h : توابع مربوط به عمليات گرافيکي string.h : توابع مربوط به کار با رشته ها البته تعداد اين فايلها و توابع مربوطه بسيار زياد است و در آينده باهريک از آنها بنا به کاربرد، آشنا خواهيد شد.

Admin
23rd September 2008, 07:20 AM
ساختارهاي کنترلي

ا زبان C داراي 3 نوع ساختار انتخاب مي باشد که عبا رتند از : ساختار if يا ساختار تک انتخابي، ساختار if / else يا ساختار دو انتخابي و ساختار switch يا ساختار چند انتخابي. علاوه براين، اين زبان داراي 3 نوع ساختار تکرار بنامهاي while، for و do / while نيز مي باشد که هريک را بطور کامل شرح خواهيم داد.

ساختار انتخاب if

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

if (<expresion>) <statement>;


نحوه کار بدينصورت است که ابتدا عبارت موجود در قسمت <expression> ارزيابي مي شود. در صورتيکه درست ارزيابي گردد، دستور قسمت <statement> اجرا خواهد شد و در صورتيکه نادرست باشد، بدون اينکه دستور قسمت <statement> را اجرا کند به دستور بعدي خواهد رفت. اين دستور مي تواند بصورت زير نيز استفاده گردد:

if (<expresion>) <statement 1>;
else <statement 2>;


در اينصورت ابتدا عبارت موجود در قسمت <expression> ارزيابي مي شود. در صورتيکه درست ارزيابي گردد، دستور قسمت <statement 1> اجرا خواهد شد، و در صورتيکه نادرست باشد، دستور قسمت <statement 2> اجرا خواهد شد. در هر حال فقط يکي از اين دو قسمت اجرا خواهد گرديد.

دقت کنيد که پرانتز استفاده شده پس از دستور if برخلاف برخي زبانهاي ديگر، اجباري است. علاوه براين، در اين دستور نيازي به استفاده از then نمي باشد.

بعنوان مثال چنانچه متغير grade حاوي نمره دانشجو باشد و بخواهيم بر مبناي نمره وي، پيغام مناسبي چاپ کنيم، مي توانيم از دستور زير استفاده کنيم:

if (grade> = 10) printf(“Passed !”);
else printf(“Failed!”);


در حالت عادي دستور if منتظر يک دستور در بدنه خود مي باشد، اما چنانچه مي خواهيد چندين دستور را در بدنه يک دستور if دهيد، بايد آنها را در داخل آکولاد باز وبسته { } قرار دهيد. اين مجموع دستورات را يک دستور مرکب مي گويند. بطور کلي در زبان C هرجا که مي توان يک دستور قرار داد، مي توان از يک دستور مرکب نيز استفاده کرد. به يک دستور مرکب، بلوک نيز گفته مي شود. بنابراين صورت کلي دستور if به شکل زير است:

if (<expression>) {
<statement 1> ;
<statement 2> ;
….
<statement n> ;
}
else {
<statement 1> ;
<statement 2> ;
…….
<statement m> ;
}


توجه کنيد که وجود قسمت else اختياري است و در ضمن ممکن است يکي از دو قسمت داراي دستور ساده و ديگري داراي دستور مرکب باشد. بعنوان يک مثال کاملتر به برنامه زير توجه کنيد:

برنامه 1) برنامه اي بنويسيد که ضرايب يک معادله درجه 2 را دريافت و ريشه هاي آن را محاسبه و چاپ نمايد.


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
void main() {
int a, b, c;
float x1, x2, delta;
clrscr();
printf(“Please enter a, b and c : “);
scanf(“%d %d %d”, &a, &b, &c);
if (a==0) {
printf(“wrong equation!”);
exit(1) ;
}
delta = b*b – 4*a*c;
if (delta <0)
printf(“No answer !”);
else if (delta == 0) {
x1 = -b / (2*a);
printf(“There is one answer, x = %f”,x1);
}
else {
delta = sqrt(delta);
x1 = (-b+delta) / (2*a);
x2 = (-b-delta) / (2*a);
printf(“There are two answers, x1= %4.2f and x2= %4.2f”, x1, x2);
}
}
Please enter a, b and c : 3 -7 2
There is two answers, x1 = 2.00 and x2 = 0.33


چندين نكته درمورد برنامه بالا قابل ذكر است.

1- در اين برنامه از2 تابع جديد استفاده شده است.اولي تابع sqrt كه يك عدد را به عنوان ورودي دريافت و جذر آن را باز مي گرداند. اين تابع در فايل math.h تعريف شده است. و ديگري تابع exit كه باعث مي شود اجراي برنامه خاتمه يابد. اين تابع نيز در فايل stdlib.h تعريف شده است.

2- به نحوه دندانه گذاري در برنامه دقت كنيد، هرجا كه بلوك جديدي ايجاد شده است، دستورات آن حدود 3 كاراكتر جلوتر نوشته شده اند. اينكار باعث مي شود كه خوانايي برنامه افزايش يابد.

3- توجه كنيد كه همانطور كه قبلا نيز گفته شد، خروجي يك عبارت مقايسه اي، يك عدد است كه 0 نشانه نادرست و هر عدد ديگر نشانه درست است. بنابراين در قسمت شرط يك دستور if مي توان بجاي يك عبارت مقايسه اي، هر عبارت ديگري كه يك مقدار عددي بازگرداند نيز قرار داد! بعنوان مثال مي توان بجاي دستور

if (a==0) …


از دستور زير استفاده كرد:

if (!a) …


دراينصورت چنانچه a برابر صفر باشد، نادرست تلقي خواهد شد و در نتيجه نقيض آن يعني ! ، درست محسوب مي گردد.
يك روش متداول استفاده از دستور if، استفاده از if هاي تودرتو مي باشد كه در مثال بالا نيز ديده مي شود. دراينحالت مجموعه اي از عبارات if-else-if بصورت متداخل قرار داده مي شوند. بعنوان نمونه به مثال زير توجه كنيد:

if (grade> = 18) printf("good!");
else if (grade> = 15) printf("medium!");
else if (grade> = 12) printf("rather weak!");
else if (grade> = 10) printf("weak");
else printf("failed!");


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

مشكلي كه در مورد if هاي تودرتو پيش مي آيد، مسئله تعيين if مربوط به هر else است. بعنوان مثال در مورد دستور زير، else به كدام if تعلق دارد؟

if (a <b)
if (c <d) <statement1>;
else <statement2>;


همانطور كه از دندانه گذاري نيز مشخص است، else مربوط به دومين if مي باشد. يعني <statement 2> درصــــورتي اجرا خواهد شد كه a<b درست باشد، اما c<d درست نباشد. بطور كلي طبق قوانين گرامري، هر else مربوط به نزديكترين if قبل از خود مي باشد. اما سوال اين است كه اگر بخواهيم else به if اول بازگردد از چه روشي استفاده نماييم. دراينــصورت مي توان از يكي از دو روش زير استفاده كرد:

if (a < b) if (a <b) {
if (c <d) <statement 1> ; if (c <d) <statement1>;
else ; }
else <statement2>; else <statement2>;


بعنوان يك مثال ديگر، به نمونه زير دقت كنيد:

if (<c1>) {
if (<c2>)
if (<c3>) <statement2>;
else <statement 3>; // this refer to if (<c3>)
}
else <statement 4>;//this refer to if <c1>


برنامه 2) برنامه اي بنويسيد كه 3 عدد را دريافت و حداكثر آنها را چاپ كند.

#include <stdio.h>
void main() {
int a, b, c, max;
printf("Please enter 3 numbers :");
scanf("%d %d %d",&a, &b, &c);
if (a> b)
if (a> c) max = a;
else max= c;
else if (b> c) max = b;
else max = c;
printf("Maximum is %d",max);
}

Admin
23rd September 2008, 07:23 AM
ساختار تكرار while

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

while (<expression>) <statement>;


اين دستور باعث مي شود تا زمانيكه شرط موجود در قسمت <expression> درست است، دستور قسمت <statement> تكرار شود، و به محض اينكه شرط نادرست گردد، كنترل اجرا به دستور بعد از حلقه مي رود.

بازهم دستور موجود در قسمت <statement> مي تواند يك دستور مركب باشد، دراينصورت دستور بصورت زير درخواهد آمد:

while (<expression>) {
<statement1>;
<statement2>;
…….
<statementn>;
}


برنامه 3) برنامه اي بنويسيد كه يك عدد را دريافت و فاكتوريال آن را محاسبه و چاپ نمايد.

#include <stdio.h>
void main() {
int i,number;
long int factorial;
printf("Please enter number :");
scanf("%d",&number);
factorial = 1;
i = 1;
while (i <= number) {
factorial *= i;
i ++;
}
printf("Factorial of %d is %ld"number,factorial);
}


برنامه 4) برنامه اي بنويسيد كه يك متن را از كاربر دريافت و آن را با حروف بزرگ چاپ كند.

#include <stdio.h>
void main() {
char ch;
ch = getch() ;
while (ch != 13) {
if (ch>= 'a' && ch <= 'z')
ch -= 32;
putch(ch);
ch = getch();
}
}


ساختار تكرار for

همانگونه كه در مثال مربوط به حل مسئله فاكتوريال ديده مي شود، گاهي نياز به حلقه تكراري داريم كه به تعداد دفعات مشخصي تكرار گردد. در چنين مواقعي با استفاده از يك متغير شمارنده، تعداد تكرارها را تا رسيدن به مقدار مورد نظر مي شماريم و سپس به حلقه پايان مي دهيم. به چنين حلقه هايي، تکرار تحت کنترل شمارنده يا تکرار معين مي گوييم، چرا که تعداد تکرار ها از قبل مشخص است. چنين حلقه اي داراي 3 جزء اصلي مي باشد:

1- مقداردهي اوليه به متغير شمارنده حلقه
2- شرط پايان حلقه (پايان شمارش)
3- نحوه افزايش متغير شمارنده

از آنجا که در تمام حلقه هايي که تکرار معين دارند، همين ساختار استفاده مي شود؛ در اکثر زبانهاي برنامه سازي يک ساختار تکرار ويژه، بنام حلقه for، براي اينکار در نظر گرفته شده است. اما در اين بين، حلقه تکرار for در زبان C داراي ويژگيهاي خاصي است که آنرا از ساير زبانها متمايز کرده و به آن قدرت بسيار بالايي داده است. شکل کلي اين دستور بصورت زير است:

for (<exp1> ; <exp2> ; <exp3> ) <statement>;


وظايف عبارات فوق بشرح زير است :

1- <exp1>، مقداردهي اوليه به متغير حلقه

2- <exp2>، شرط اجراي حلقه

3- <exp3>،نحوه افزايش متغير حلقه

البته همانندموارد قبل بازهم قسمت <statement> مي تواند يک دستور مرکب باشد. نحوه کار حلقه بدينصورت است که در ابتداي شروع حلقه <exp1> فقط براي يکبار اجرا مي شود. سپس عبارت <exp2> بررسي مي گردد و در صورتيکه درست ارزيابي شود (≠ 0)، آنگاه دستور <statement> اجرا شده و سپس به ابتداي حلقه باز مي گردد. از اجراي دوم به بعد، ابتدا عبارت <exp3> اجرا مي گردد (يعني متغير حلقه افزايش مي يابد) و سپس عبارت <exp2> بررسي مي گردد و مجددا درصورت درست بودن، حلقه تکرار مي شود. اينکار تا زمانيکه مقدار عبارت <exp2> نادرست ( = 0) ارزيابي شود، تکرار مي گردد. به محض اينکه اين اتفاق بيفتد، کنترل اجرا به دستور پس از حلقه انتقال مي يابد.
درحقيقت هر حلقه for معادل با حلقه while زير است:

<exp1> ;
while (<exp2>) {
<statement>;
<exp3>;
}


بعنوان يک مثال ساده، تکه برنامه زير اعداد بين 0 تا 100 را چاپ مي نمايد:

int count;
for (count = 0; count <= 100; count ++)
printf(“%d “,count);


اگر بخواهيم تنها مضارب 5 چاپ شوند، حلقه را به شكل زير تغيير مي دهيم:

for (count = 0; count <= 100; count += 5)


حتي مي توان مضارب 5 را از آخر به اول چاپ كرد:

for (count = 100; count> = 0; count -= 5)


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

for (count = 0; count <100 && sw==1; count ++)


كه در اينصورت در هربار اجراي حلقه، علاوه بر مقدار شمارنده، مقدار متغير sw نيز بررسي مي گردد.

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

for (a = 0, b = 100; b – a> 50; a++, b--)


در ادامه يک مثال کاملتر براي تشريح اين حلقه آمده است:

برنامه 5) برنامه اي بنويسيد که تعدادي عدد را از کاربر دريافت و 2 عدد بزرگتر و مجموع آنها را محاسبه و چاپ نمايد.

#include <stdio.h>
void main() {
int i, n, number;
int sum, max1, max2;
printf(“please enter n : “);
scanf(“%d”,&n);
sum = 0;
max1 = max2 = -1;
for (i=1 ; i<n ; i++) {
printf(“enter number : “);
scanf(“%d”,&number);
sum += number;
if (number> max1) {
max2 = max1;
max1 = number;
}
else if (number> max2)
max2 = number;
} //end for
printf(“Sum = %d, Maximum 1=%d, Maximum 2= d”, sum, max1, max2);
}


نكته جالب در مورد حلقه for آنستكه مي توان هريك از 3 عبارت فوق را حذف كرد. به مثالهاي زير توجه كنيد:

for (;i<100; i++)


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

for (i= 0;i<100;)


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

for (;i<100;)


هر دو مورد فوق حذف شده است.

for (i=0; ;i++)


شرط ادامه حلقه حذف شده است. اين مورد زياد متداول نيست و ممكن است باعث شود حلقه براي هميشه اجرا شود. در چنين مواردي حتما بايد در داخل حلقه با استفاده از دستور break (كه در قسمتهاي بعدي توضيح داده خواهد شد)، راهي براي خروج از حلقه قرار داده شود.

حلقه do / while

همانگونه كه در قسمت الگوريتمها توضيح داده شد، در بعضي مواقع لازم است كه شرط ، در انتهاي حلقه بررسي گردد. دستور do / while از نوع حلقه هايي است كه ابتدا دستورات را اجرا كرده و سپس شرط ادامه حلقه را بررسي مي نمايد. شكل كلي اين دستور بصورت زير است:

do
<statement> ;
while (<expression>) ;


نحوه كار اين حلقه به اين صورت است كه ابتدا دستور <statement> اجرا مي گردد، سپس شرط حلقه بررسي شده و درصورتيكه درست بود، به ابتداي حلقه باز گشته و آن را مجددا اجرا مي كند. البته دستور <statement> مي تواند يك دستور مركب باشد.

بعنوان يك مثال كوچك، ممكن است شما از كاربر خواسته ايد كه اعلام كند آيا مايل به ادامه هست يا خير؟ وي بايد پاسخ y يا n بدهد، اما ممكن است يك حرف اشتباه (مانند m) وارد كند. قصد داريم تكه برنامه اي بنويسيم كه عمل دريافت پاسخ را تا زمانيكه يك حرف درست وارد شود، تكرار كند. مسلم است كه بايد ابتدا يك پاسخ وارد شود و سپس درستي آن بررسي گردد.

char answer;
do {
printf("Do you want to continue (y/n) ?");
answer = getch();
} while (answer != 'y' && answer != 'n') ;


بعنوان يك نمونه كاملتر به مثال زير توجه كنيد.

برنامه 6) فرض كنيد نمرات يك گروه از دانشجويان بصورت درجه بندي (A, B, C and D) آماده شده است. برنامه اي بنويسيد كه نمرات دانشجويان را دريافت و در پايان درصد هريك از نمرات را محاسبه و چاپ نمايد. در ضمن از آنجا كه تعداد دانشجويان از قبل مشخص نيست، كاربر در انتهاي نمرات، حرف Q (مخفف Quit) را وارد مي نمايد.


#include <stdio.h>
void main() {
int aCount, bCount, cCount, dCount, n;
char grade;
aCount = bCount = cCount = dCount = n = 0;
do {
printf("Enter grade (Q for Quit) : ");
grade = getch() ;
n ++;
if (grade == 'A') aCount ++;
else if (grade == 'B') bCount ++;
else if (grade == 'C') cCount ++;
else if (grade == 'D') dCount ++;
else if (grade == 'Q') n --;
else {
printf("Wrong grade, try again.\n");
n --;
}
} while (grade != 'Q' ) ;
printf("Statistics :\n");
printf("Grade A : %f percent\n", float(aCount)/float(n));
printf("Grade B : %f percent\n", float(bCount)/float(n));
printf("Grade C : %f percent\n", float(cCount)/float(n));
printf("Grade D : %f percent\n", float(dCount)/float(n));
} // end main


ساختار switch / case


اگر مجددا به برنامه 6 دقت كنيد، خواهيد ديد كه در بعضي موارد قصد داريم برحسب مقادير مختلف يك عبارت (در اينـــجا مقدار متغير grade)، عمليات متفاوتي را انجام دهيم. گرچه اينكار با استفاده از دستورات if / else متداخل قابل انجــــام است، اما ساختار مناسبتري نيز براي اينكار وجود دارد، كه به آن ساختار چندانتخابي مي گوييم. شكل كلي ان ساختار بصورت زير است:

switch (<expression>) {
case <exp1> : <statement 1> ;
<statement 2> ;

<statementn>;
case <exp2> : <statement 1> ;
<statement 2> ;

<statementn>;

default : <statement 1> ;
<statement 2> ;

<statementn>;
}


برنامه 7) برنامه 6 را با استفاده از دستور switch / case بازنويسي نماييد. برنامه را بگونه اي بنويسيد كه حروف بزرگ و كوچك هردو مورد قبول واقع شود.


#include <stdio.h>
void main() {
int aCount, bCount, cCount, dCount, n;
char grade;
aCount = bCount = cCount = dCount = n = 0;
do {
printf("Enter grade (Q for Quit) : ");
grade = getch() ;
n ++;
switch (grade) {
case 'A' :
case 'a' : aCount ++; break ;
case 'B' :
case 'b' : bCount ++; break ;
case 'C' :
case 'c' : cCount ++; break ;
case 'D' :
case 'd' : dCount ++; break ;
case 'Q' :
case 'q' : n--; break ;
default : printf("Wrong grade, try again.\n");
n --;
} //end switch
} while (grade != 'Q' ) ;
printf("Statistics :\n");
printf("Grade A : %f percent\n", float(aCount)/float(n));
printf("Grade B : %f percent\n", float(bCount)/float(n));
printf("Grade C : %f percent\n", float(cCount)/float(n));
printf("Grade D : %f percent\n", float(dCount)/float(n));
} // end main





برنامه 8) برنامه اي بنويسيد كه يك عدد، يك عملگر و يك عدد ديگر را از كاربر دريافت و پس از اعمال عملگر برروي دو عدد، حاصل را چاپ نمايد.




#include <stdio.h>
void main() {
int number2, number2, result;
char op ;
printf("Please enter number1 operator number2 : ");
scanf("%d %c %d",&number1, &number2, &op, &number3);
result = 0;
switch (op) {
case '+' : result = number1 + number2 ; break;
case '-' : result = number1 - number2 ; break;
case '*' : result = number1 * number2 ; break;
case '/' : if (number2 != 0) result = number1 / number2 ;
else printf("There is no answer!\n");
break;
case '%' : if (number2 != 0) result = number1 % number2 ;
else printf("There is no answer!\n");
break;
default : printf("invalid operator!\n");
}
printf("Result = %d",&result);
}

Admin
23rd September 2008, 07:26 AM
دستورات break و continue

اين دستورات قادرند مسير اجراي برنامه را در يك حلقه تكرار تغيير دهند. البته اين تغيير مسير بصورت كنترل شده بوده و همانند دستور goto نمي توان به هرجاي دلخواه پرش كرد.

چنانچه دستور break در يك ساختار while، for، do/while ويا switch بكار رود، باعث مي شود كه بلافاصله كنترل اجراي برنامه از ساختار خارج شده و به اولين دستور پس از ساختار برود. قبلا كاربرد اين دستور را در switch ديده ايد. در اينجا به مثال زير دقت كنيد:





برنامه 9) برنامه 5 را بگونه اي تغيير دهيد كه فقط اعداد مثبت را بپذيرد، و درصورتيكه عدد منفي وارد شد، بلافاصله به عمليات خاتمه داده و نتايج تا همين نقطه را چاپ نمايد.







#include <stdio.h>
void main() {
int i, n, number;
int sum, max1, max2;
printf(“please enter n : “);
scanf(“%d”,&n);
sum = 0;
max1 = max2 = -1;
for (i=1 ; i<n ; i++) {
printf(“enter number : “);
scanf(“%d”,&number);
if (number <0) break; // this is the difference
sum += number;
if (number> max1) {
max2 = max1;
max1 = number;
}
else if (number> max2)
max2 = number;
} //end for
printf(“Sum = %d, Maximum 1=%d, Maximum 2= d”, sum, max1, max2);
}


اما دستور continue فقط در حلقه هاي while، for و do/while بكار مي رود. نحوه عمل آن بدين صورت است كه به محض آنكه كنترل اجرا به اين دستور برسد، بلافاصله از باقيمانده حلقه صرفنظر كرده و مجددا به ابتداي حلقه باز مي گردد و اجراي آن را از سر مي گيرد. در مورد حلقه for، پس از بازگشت به ابتداي حلقه، عمل افزايش مقدار متغير حلقه نيز صورت مي پذيرد.

بعنوان مثال، چنانچه بخواهيم برنامه 9 را بگونه اي تغيير دهيم كه از اعداد منفي صرفنظر كند و آنها را در محاسبات لحاظ نكند، كافيست دستور

if (number <0) break;


را به دستور زير تبديل كنيم:

if (number <0) continue;


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



خواندن يك كاراكتر از ورودي

براي خواندن يك كاراكتر از ورودي ، علاوه بر تابع scanf از توابع ديگري نيز استفاده ميشود كه قبل از بررسي آنها به مثالي ازscanf جهت خواندن يك كاراكتر توجه كنيد :
مثال
1: main()
{
char ch ;
printf("enter a character : " );
scanf("%c"/&ch );
printf(" you typed the character");
printf(": %c"/ch );
}

نمونه اي از خروجي حاصل از مثال 1 بصورت زير است enter a character: j
you typed the character:j



تابع getch()
اين تابع براي خواندن يك كاراكتر از ورودي بكار مي رود و بصورت زير استفاده مي شود :

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



مثال 2: main()
{
char ch ;
int x ;
printf("\n enter a character : " );
ch=getch ();
printf("\n enter this character" );
printf(" second time :" );
ch=getch ();
printf("\n character is:" );
printf("%c/%c/%d/%d/ch/x/ch/x );
}

فرض كنيد در پاسخ به اجراي اين برنامه كليد s را دوبار وارد كنيم . در اين صورت خروجي حاصل از اجراي برنامه بصورت زير خواهد بود
enter a character:
enter this character second time:
character is:s/s/115/115





اگر در مثال 2 به تابع printf توجه كنيد ، متغير chو xو را يكبار با فرمت %cو بار ديگر با فرمت %d نوشته ايم كه در هر دو حالت عدد 115 كه كد اسكي s است چاپ شده است . وقتي متغير عددي x را با فرمت %d نوشته ايم آنچه كه در آن قرار گرفته ( كد اسكي كليد s ) نوشته شده است و زماني كه اين متغير را با فرمت %c نوشته ايم كد اسكي به كاراكتر s تبديل شده و سپس در خروجي چاپ مي شود .

تابع getche
اين تابع همانند تابع getch براي خواندن يك كاراكتر از ورودي بكار مي رود و بصورت زير استفاده مي شود :
= getche متغير
نوع عمل اين تابع مثل ()getch است . با اين تفاوت كه اين تابع پس از اخذ ورودي ، آن را روي صفحه نمايش چاپ مي كند . حرف e در انتهاي تابع به معني echo عكس العمل است .

تابع getchar اين تابع همانند توابع ()getch و ()getche براي خواندن يك كاراكتر از ورودي بكار رفته و بصورت زير استفاده مي شود :
= getchar متغير
نوع عمل اين تابع همانند دو تابع فوق الذكر است .

Admin
23rd September 2008, 07:29 AM
آرايه ها در برنامه نويسي c

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

<type> <var-name>[<size>] ;

بعنوان مثال:

int A[10];

خط بالا يك آرايه 10 تايي از اعداد صحيح بنام A ايجاد مي نمايد. هر كدام از عناصر اين آرايه مي توانند بعنوان يك متغير مستقل مورد استفاده قرار گيرد. براي دسترسي به عناصر اين آرايه بايد از انديس استفاده نمود. در زبان C انديسها در داخل كروشه [] قرار مي گيرند. نكته بسيار مهمي كه بايد بدان توجه كرد آنستكه در C انديس يك عدد صحيح است كه از 0 آغاز مي گردد. به مثال زير توجه نماييد:

int A[10] ;
A[2] = 8;

و يا چنانچه بخواهيم مقدار خانه سوم را بر 2 تقسيم و در متغير x بريزيم، داريم:

x = A[3] / 2;

اكنون به يك مثال دقت كنيد.
برنامه 1) برنامه اي بنويسيد كه شماره دانشجويي و معدل تعدادي دانشجو را دريافت، و سپس چنانچه معدل دانشجو از ميانگين كلاس :

-بيش از يك نمره بيشتر باشد، چاپ كند : عالي
- حداكثر يك نمره بيشتر يا كمتر باشد، چاپ كند : خوب
- بيش از يك نمره كمتر باشد، چاپ كند : ضعيف

#include <stdio.h>
void main() {
float average[100] ;
long int id[100] ;
int i, n ;
float totalAverage;
printf("enter number of students : ");
scanf("%d", &n);
for (i = 0; i < n ; i ++) {
printf("enter id and average : ");
scanf("%ld %f", &id[i], &average[i]);
totalAverage += average[i];
}
totalAverage /= n;
for (i = 0; i < n ; i ++) {
if (average[i] > = totalAverage + 1)
printf("%ld : excellent !\n", id[i]);
else if (average[i] > = totalAverage – 1)
printf("%ld : good !\n", id[i]);
else printf("%ld : weak !\n", id[i]);
}
}


چند نكته مهم راجع به آرايه در C وجود دارد كه حتما بايد به آنها دقت كنيد:
1- اندازه آرايه ها در C ثابت بوده و حتما بايد توسط يك مقدار ثابت صحيح تعيين گردد. بعنوان مثال اعلان زير خطاي نحوي محسوب مي گردد:

int n ;
n=100 ;
int A[n];

اما مي توان با استفاده از متغير هاي ثابت (ثابتهاي داراي نام)، اندازه آرايه را تعيين كرد، كه در قسمتهاي بعدي به آن اشاره خواهد شد.
2- انديس آرايه ها در C عدد صحيح بوده و هميشه از 0 شروع مي شود. لذا به تفاوت "عنصر چهار آرايه" يعني A[4] و "چهارمين عنصر آرايه" يعني A[3] دقت كنيد. اين مسئله معمولا باعث بروز خطاهاي منطقي مي گردد.
3- در C مرز آرايه ها بررسي نمي گردد. بدين معنا كه چنانچه انديسي خارج از محدوده مجاز يك آرايه استفاده شود، باعث ايجاد خطا توسط كامپايلر نمي گردد، اما مسلما برنامه را دچار يك خطاي منطقي خواهد كرد. بعنوان مثال:

int A[10] ;
A[12] = 20 ; //this is not a syntax error but a logical error


لذا بررسي مرزهاي آرايه بعهده خود برنامه نويس است و بايد از درستي برنامه خود و خارج نشدن از محدوده مجاز مطمئن گردد.
4- مقداردهي اوليه به آرايه هاي يك بعدي بصورت زير انجام مي پذيرد:

int A[3] = {5, 2, 8};



كه در اينجا A[0] برابر 5 ، A[1] برابر 2 و A[2] برابر 8 خواهد شد.
علاوه براين مي توان فقط به تعدادي از عناصر آرايه مقدار داد، دراينصورت مقدار عناصر باقيمانده آرايه اتوماتيك 0 خواهد شد.

int B[10] = {5, 8} ;

در اينجا عناصر B[2] به بعد مقدار 0 خواهند گرفت. بنابراين مي توان براي 0 كردن كليه عناصر يك آرايه به شكل زير عمل كرد :

int C[10] = {0};

چنانچه به آرايه مقدار دهي اوليه كرده باشيم، مي توان تعداد عناصر آرايه را نيز ذكر نكرد، دراينصورت اندازه آرايه بطور اتوماتيك برابر تعداد مقادير مشخص شده خواهد شد.

int C[] = {10, 15, 20};

در مثال فوق آرايه C با 3 عضو درنظر گرفته مي شود.


متغيرهاي ثابت

همانطور كه در قسمت قبل گفته شد، گرچه اندازه يك آرايه بايد ثابت صحيح باشد؛ اما مي توان از متغيرهاي ثابت نيز استفاده كرد. يك متغير ثابت، متغيري است كه فقط مي تواند در هنگام اعلان مقدار اوليه بگيرد و اين مقدار ديگر قابل تغيير نيست. براي اعلان متغيرهاي ثابت، از كلمه كليدي const قبل از نوع متغير استفاده مي گردد. بعنوان مثال:

const int k = 10;

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

const float pi = 3.14;

اين کار نه تنها خوانايي برنامه را بالا مي برد (بدليل استفاده از کلمه pi که براي همه شناخته شده است)، بلکه باعث مي شود تغيير پذيري برنامه نيز بالا برود. بدين معنا که در صورتيکه برنامه نويس تصميم گرفت مقدار ثابت را عوض کند،
نيازي به تغيير کل برنامه نيست و فقط کافي است مقدار اوليه متغير را عوض نمايد. بعنوان مثال اگر برنامه نويس بخواهد عدد pi را با 4 رقم اعشار در محاسبات شرکت دهد، فقط بايد در تعريف اوليه آن، مقدار را عوض کرده و از 4 رقم اعشار استفاده نمايد.
از اين مسئله مي توان در تعريف آرايه ها نيز استفاده کرد. بدين صورت که بجاي آنکه اندازه آرايه را با يک ثابت صحيح مشخص نماييم، آن را با يک متغير ثابت تعريف مي کنيم. با اينکار، درصورتيکه نيازي به تغيير اندازه آرايه (يا آرايه ها) گردد، فقط کافي است مقدار اوليه متغير ثابت خود را تغيير دهيم. براي نمونه به مثال زير دقت کنيد:
برنامه 2) برنامه اي بنويسيد كه سال ورود تعدادي دانشجو را دريافت و سپس تعداد ورودي هاي سالهاي 75 تا 84 را محاسبه و چاپ نمايد.

void main() {
const int startYear = 75;
const int yearNo = 10;
int count[yearNo] = {0};
int i, n, year;
printf("enter student no :");
scanf("%d",&n);
for (i= 0;i<n; i++) {
printf("enter entrance year :");
scanf("%d",&year);
count [year – startYear] ++;
}
for (i= 0; i<yearNo ; i++) {
printf("year = %d count = %d \n",startYear + i , count[i]);
}



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


آرايه ها مي توانند داراي ابعاد بيشتري نيز باشند. در زبان C نيز مي توان يك آرايه چند بعدي را بصورت زير اعلان كرد:

<type> <var-name> [<size 1>][<size 2>] … [<size n>] ;

بعنوان مثال، اعلان زير يك آرايه دوبعدي را معرفي مي نمايد:

int A[5][8] ;

براي دسترسي به هر عنصر از اين آرايه بايد از دو علامت [] استفاده كرد. توجه كنيد كه انديس سطرها و ستونها هر دو از 0 آغاز مي گردند. بعنوان مثال:

int A[5][8] ;
A[3][1] = 24;

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


int B[5][8][6] ;
B[2][4][0] = 12;



برنامه 3) برنامه اي بنويسيد كه نمرات تعدادي دانشجو را براي 5 درس دريافت و آنها را بهمراه معدل دانشجو ذخيره نمايد، سپس براي هر دانشجو معدل وي را چاپ نمايد.


void main() {
const int maxStudent = 100;
float grades[maxStudent][5] ;
float average[maxStudent];
int i, j, n;
printf("enter student number:");
scanf("%d",&n);
for (i=0 ; i< n ; i++) {
printf("student no %d:\n",i+1);
sum = 0;
for (j= 0 ;j<5 ; j++) {
printf("enter grade : ");
scanf("%f", &grades[i][j]);
sum += grades[i][j] ;
}
average[i] = sum / 5 ;
}
for (i=0 ; i< n ; i++)
printf("average of student %d is %f \n",i+1, average[i]);
}


و نكته آخر اينكه مقداردهي اوليه به آرايه هاي چندبعدي امكان پذير است و بصورت زير انجام مي پذيرد:

int A[3][4] = { {12, 5, 3, 8} , {-3, 7, -9, 2}, {4, 22, 18, 6} };
يعني يك علامت {} براي كل مقداردهي قرار مي گيرد، سپس هر رديف از آرايه در داخل يك {} مجزا قرار مي گيرد. براي ابعاد بالاتر نيز به روش مشابهي عمل مي گردد. بعنوان مثال براي آرايه هاي سه بعدي داريم:

int A[2][3][4] = { { {12, 5, 3, 8} , {-3, 7, -9, 2}, {4, 22, 18, 6} } , { {8, 1, -3, 4} , {-2, 8, 11, 21} , {7, 3, -15, -8} } };

ziczag
1st October 2008, 05:39 AM
خیلی خیلی مفید بود :-bd
البته اینرو بهتره بصورت یک کتاب PDF در بیارید.

Amir
2nd October 2008, 05:47 AM
خیلی خوب بود اولین سوالم اینکه تفاوت این برنامه با نوع دبل پلاسش چیه ؟ c++ ,و اینکه چند تا برنامه معرفی کنید که با این برنامه نوشته شده باشند چون زبان سی رو برنامه مادر میدونند
ممنون

ziczag
2nd October 2008, 06:54 AM
خیلی خوب بود اولین سوالم اینکه تفاوت این برنامه با نوع دبل پلاسش چیه ؟ c++ ,و اینکه چند تا برنامه معرفی کنید که با این برنامه نوشته شده باشند چون زبان سی رو برنامه مادر میدونند
ممنون

++C نوع پیشرفته شده ی C هست که البته باید اول C رو بلد باشی چون تقریبا 99% کتاب های ++C از وسط کار شروع کردند. و تفاوت هاش هم اینه که در ++C دقت بیشتری به ماژول نویسی و چند مورد دیگه شده و یک سری توابع جدید هم به اون اضافه شده.

نرم افزار های زیادی هست ولی بیشترین استفاده رو برای پلاگین ها دارن و یا بوتیبل ها/ ولی از این دوتا بهتر #C هست که داخل تمامی پلتفرم های OS/Web/Mobile قابل اجراست. همچنین در صنعت روبوت سازی در 90% مواقع از این برنامه نویسی استفاده می کنند. و یکی از خوبی های دیگش هم قابلیت ساخت ActiveX های فوق العاده قویه.
در ضمن هر کسی که C رو برنامه نویسی مادر میدونه من به شما قول میدم اصلا نمیدونه C چیه. تنها برنامه نویسی مادر Assembly هست و زبان Binary (دودویی) یا همون زبان ماشین.;)

استفاده از تمامی مطالب سایت تنها با ذکر منبع آن به نام سایت علمی نخبگان جوان و ذکر آدرس سایت مجاز است

استفاده از نام و برند نخبگان جوان به هر نحو توسط سایر سایت ها ممنوع بوده و پیگرد قانونی دارد