تبلیغات
وبلاگ انجمن علوم کامپیوتر دانشگاه پیام نور فریمان - آموزش جامع و مرحله به مرحله زبان برنامه نویسی ++c
 
وبلاگ انجمن علوم کامپیوتر دانشگاه پیام نور فریمان

زبان C(سی)
C یک زبان برنامه نویسی کامپیوتری هست که در سال 1972 توسط Dennis Ritchie برای سیستم عامل Unix نوشته شد.

C تکامل یافته زبان برنامه نویسی B می باشد و نامگذاری C که بعد از B بوجود آمد همین است.

C یک زبان برنامه نویسی سطح میانی و ساخت یافته می باشد. در علوم کامپوتری، سطوح زبانهای برنامه نویسی را به سه دسته اصلی تقسیم می کنند:
1- سطح بالا.
2- سطح میانیC و ++C
3- سطح پایین.

زبان C جزو دسته دوم می باشد. به این دلیل که قادر است مانند زبان اسمبلی مستقیماً با حافظه(بیت، بایت، آدرس و...) کار کند و از طرف دیگر نوشتن و خواندنش راحت می باشد(مانند زبان Pascal).

از جمله ویژگی های زبان C می توان به:
قابلیت انعطاف، زبان سیستمی، سطح میانی، قابل حمل، کامل و کوچک، سبک، سریع و قدرتمند بودنش اشاره کرد.

زبان ++C(سی پلاس پلاس)
در سالهای بین 1979 و 1983، زبان C توسط Stroustrup تکامل یافت. توانایی و قدرت این زبان چند برابر شد و زبان C جدید و بعد C کلاسدار و بعد ++C بوجود آمد. که اولین نگارش ++C در سال 1985 روانه بازار شد. C++ - Wikipedia, the free encyclopedia

زبان ++C یک زبان برنامه‌نویسی کامپیوتری همه منظوره، شی گرا، سطح بالا و چندرگه، عمومی و با قابلیت‌های سطح بالا و سطح پایین می‌باشد.

ساختار این زبان شامل: دستورات پیش پردازنده(Preprocessor)، اعلانات سراسری(توابع، ماکروها، متغیر ها، ثوابت و...)(Global declaration)، تابع main و توابع تعریفی کاربر(user-defined function) می باشد.

 

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

در حالت کلی الگوریتم ها باید ویژگی های زیر را داشته باشند:
الف) الگوریتم باید ما را به نتیجه مورد نظر برساند.
ب) در زمان محدود پایان یابد.
ج) دستورالعملها باید به ترتیب منطقی پشت سرهم قرار گیرند.
د) جملات الگوریتم ها باید به صورت امری ، سؤالی باشند.
ه) هر الگوریتم باید نقطه آغاز و پایان داشته باشد.

یکی از توانایی هایی که در کامپیوتر وجود دارد استفاده از خانه های حافظه است که می توان در آن اطلاعات را قرار داد و در هر لحظه از اجرای الگوریتم می توان محتویات آن را تغییر داده و مقدار جدیدی را در آن قرار دهیم این ویژگی کارایی ما را برای حل مسائل پیچیده تر افزایش می دهد


مثال : الگوریتم تعویض چرخ پنچر شده یک اتومبیل.


0- شروع.
1- جک را زیر اتومبیل بگذارید.
2- پیچهای چرخ پنچر شده را باز کنید.
3- چرخ را خارج کنید.
4- چرخ یدک را به جای چرخ پنچر شده بگذارید.
5- پیچها را ببندید.
6- اگر پیچها سفت نشده اند به مرحله 5 برو.
7- جک را پایین بیاورید.
8- چرخ پنچر شده را در صندوق عقب اتومبیل بگذارید.
9- پایان.
مثال : الگوریتمی بنویسید که دو عدد از ورودی دریافت شود و سپس تعیین شود که مجموع دو عدد بزرگتر از 20 است یا نه.


0- شروع .
1- دو عدد a و b را از ورودی در یافت کن.
2- a+b را محاسبه کن.
3- آیا a+b>20 است؟ اگر بلی به مرحله 6 برو.
4- بنویس خیر.
5- به مرحله 7 برو.
6- بنویس بلی.
7- پایان.
با برنامه ریزی و ساماندهی دقیق می توان به راه حلی مناسب جهت حل یک مسئله به کمک کامپیوتر رسید. هرگونه کم توجهی و بی دقتی در نوشتن الگوریتم ضمن بروز مشکلات بسیار، برنامه نویس را نیز از هدف خود دور خواهد کرد؛ لذا برای به هدف رسیدن باید درک صحیح و کاملی از صورت مسئله داشت و سپس راه حل مورد نظر را به صورت الگوریتم بنویسیم. و در نهایت الگوریتم مورد نظر را به زبان برنامه نویسی مورد نظر تبدیل کنیم. برای درک بهتر شیوه حل مسائل و نوشتن الگوریتم به مثالهای زیر توجه کنید:


مثال : الگوریتمی بنویسید که مجموع اعداد طبیعی مضرب 7 و کوچکتر از 50 را حساب کند.
برای نوشتن این الگوریتم به دو خانه حافظه نیاز داریم.


0- شروع.
1- در خانه حافظه sum عدد صفر را قرار بده.
2- در خانه حافظه index عدد 7 را قرار بده.
3- مقدار index را با مقدارsum جمع کن
و حاصل را در sum قرار بده.
4- مقدار 7 را با مقدار index جمع کن
و حاصل را در index قرار بده.
5- آیاindex بزگتراز 50 است،اگر خیر به مرحله 3 برو.
6- محتوای sum را چاپ کن.
7- پایان.
در الگوریتم فوق مقادیر حافظه sum و index تغییر می کند، تا اینکه سرانجام شرط " آیا index بزرگتر از 50 است " بلی می شود لذا محتوای sum در خروجی چاپ خواهد شد و الگوریتم به پایان می رسد. اما در مراحل قبلی شرط فوق خیر می باشد، لذا الگوریتم ادامه پیدا می کند.


مثال : الگوریتمی بنویسید که 1000 عدد را از ورودی دریافت کرده و کوچکترین را چاپ کند.
فرض کنید که به شما لیستی از اعداد را می دهند، برای پیدا کردن کوچکترین عدد در لیست اولین عدد را به عنوان کوچکترین در نظر می گیرید سپس عدد بعدی را با آن مقایسه می کنید، اگر عدد جدید از عدد قبلی کوچکتر بود عدد جدید را به عنوان کوچکترین در نظر می گیرید و گر نه همان عدد قبلی کوچکترین خواهد بود. این روند را تا انتهای لیست ادامه می دهید؛ در پایان عددی که در هر بررسی به عنوان کوچکترین عدد بود، جواب مورد نظر ما خواهد بود. توجه کنید که در این روال شما همواره یک عدد را در ذهن خود در نظر گرفته بودید، برای نوشتن الگوریتم مورد نظر ما یک خانه حافظه را به کوچکترین عدد درهر مرحله اختصاص می دهیم.



0- شروع.
1- min را دریافت کن.
2- i =1 .
3- a را دریافت کن.
4- اگر a<min آنگاه min = a .
5- i = i + 1 .
6- اگر i>=1000 به مرحله 8 برو.
7- به مرحله 3 برو.
8- min را چاپ کن.
9- پایان.
الگوریتم های قبلی به صورت جملات فارسی بودند که سبب طولانی و حجیم شدن الگوریتم می شدند. ولی الگوریتم اخیر بیشتر به صورت جملات ریاضی بود. این شیوه سبب راحتی درک الگوریتم و ساده شدن نگارش آن می شود. از این به بعد نیز الگوریتم ها را به شیوه جدید نگارش خواهیم کرد. شما نیز سعی کنید از این شیوه استفاده کنید.


مثال : الگوریتمی بنویسید که سه عدد از ورودی دریافت شود و تعیین شود که این اعداد می توانند اضلاع مثلث باشند یا خیر.


0- شروع.
1- a وb وc را از ورودی بگیر.
2- اگر a>b+c به 7 برو.
3- اگر b>a+c به 7 برو.
4- اگرc>a+b به 7 برو.
5- بنویس " بلی ".
6- به 8 برو.
7- بنویس " خیر ".
8- پایان.
فلوچارت
در عمل برای نمایش الگوریتم از یک فلوچارت ( شمای جریان عملیات ) استفاده می شود. در حقیقت فلوچارت روش تصویری و استاندارد نمایش الگوریتم است.
در رسم فلوچارت علائم و نمادهای استانداردی به کار می رود که هر کدام دارای معانی ویژه ای هستند.
از شکل بیضی افقی برای شروع و پایان عملیات استفاده می شود.
از شکل مستطیل برای نمایش مراحل پردازشی استفاده می شود و در داخل آن عمل مورد نظر نوشته می شود. این نماد ممکن است چندین ورودی داشته باشد ولی تنها یک خروجی دارد.


از نماد لوزی برای نشان دادن مراحل تصمیم گیری استفاده می گردد و شرط یا سؤال مورد نظر در داخل لوزی نوشته می شود.

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

اولین باری که به یک برنامه ++C نگاه می کنید، بنظر پیچیده می آید. شکل گرامری زبان ++C مختصر می باشد و همین مختصر بودن دلیل قدرت و انعطاف این زبان می باشد.

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

تمام برنامه های ++C از ساختار کلی/اساسی یکسانی پیروی می کنند. یعنی ساختار یک نرم افزار بزرگ و پیچیده برابر ساختار یک برنامه کوچک و ساده می باشد. که این اصل رو خودتون هم متوجه خواهید شد.

یک برنامه C/C++:
1- دستورات پیش پردازنده: شرطها، ضمیمه ها(include)، ماکروها...
2- اعلانات سراسری: متغیر ها، توابع، ثوابت...
3- main()
4- توابع تعریفی کاربر/برنامه نویس

برای درک بهتر این مسله به مثال زیر توجه کنید(تمامی دستورات بعداً مفصل شرح داده می شود):


Test comment. Hello.
#ifndef _XXXXX_H
#define _XXXXX_H
#else
#define _ZZZZZ_H
#endif

#if !defined _YYYYY_H
#define _YYYYY_H
#endif

#include <MyLibrary.h>
#include <MyClass.h>

#define false -1
#define number1 5
#define number2 10
#define MyDefine "test"
#define sum number1 + number2
#define MyMacroFunction(xxx) xxx * 22
//////////////////////////////////////////////////
int i= 0, j= 1000;
char c;
float f= 1;

void MyFunction(void);
int MyFunction2(int zzzzz);
//////////////////////////////////////////////////
main()
**
//...
MyFunction();
#undef MyDefine
//...
**
//////////////////////////////////////////////////
void MyFunction(void)
**
//...
**

int MyFunction2(int zzzzz)
**
//...
return(zzzzz);
**

خط 1 توضیحات/نظرات می باشد. که در مورد برنامه/خط بعدی مطالبی رو مطرح می کند. توضیحات اجباری نمی باشد و هیچگونه کار و عملیات برنامه نویسی انجام نمی دهد. فقط برای فهم و یادآوری استفاده می شود.

در هر برنامه C/C++ اولین قسمتی که کار/عملیات انجام می دهد، دستورات پیش پردازنده می باشد. که با علامت # شروع می شوند.

1- دستورات پیش پردازنده
از خط 2 تا 10 دستورات ضمیمه شرطی(منطقی)(Conditional inclusion directive) قرار دارند(پیش پردازنده هستند). عبارت ndef و عبارت !defined هر دو یکی هستند. این دستورات قبل از انجام کامپایل، بررسی و اعمال می شوند. وظیفشون این هست که موضوعاتی رو چندین بار اعلام می کنند و یا از اعلام مجدد موضوعات جلوگیری می کنند. علامت ! به معنای Not منطقی می باشد و می تواند بطور دلخواه در عبارات استفاده شود.

خط 12 و 13 شامل فایل های Header(منبع) ضمیمه شده می باشد که به کامپایلر(Compiler) می گوید قبل از شروع کامپایل آنرا در برنامه ضمیمه کن. فایل های Header معمولاً شامل توابع تعریفی کاربر، تعاریف ماکروها و API ها می باشد. هر دستور include باعث یک توقف/Pause برای کامپایلر می شود تا زمانی که محتوای فایل ضمیمه شده بدقت خوانده و پردازش شود.

خط 15 تا 18 شامل تعاریف ماکرو های ثابت و خط 19 و 20 شامل تعاریف ماکروهای تابع می باشند. هر کجا که فراخوانی شوند، محتوای ماکرو جایگزین نام ماکرو در محل فراخوانی می شود.

2- اعلانات سراسری
خط 22 تا 27 شامل اعلانات سراسری می باشد. خط 22 تا 24 اعلانات متغیر های سراسری(Global) می باشد که در سرتاسر برنامه قابل دسترسی هستند(استفاده از متغیر های سراسری پیشنهاد نمی شود).
خط 26 و 27 هم شامل اعلانات توابع سراسری می باشد که در سرتاسر برنامه قابل دسترسی هستند. تابع اولی هیچ(void) مقداری را نمی گرداند و هیچ آرماگونی را هم نمی گیرد. ولی تابع دومی(MyFunction2) مقدار عددی صحیح برمیگرداند و آرماگون عددی بلند هم می گیرد.
کامپایلر ار اطلاعاتی در اعلان تابع استفاده می کند تا درستی فراخوانی(اعلان)های تابع را کنترل نماید. بعد از اینکه آنها را Pass کرد، آنهارا فراخوانی می کند تا صحت نوع داده ها را مشخص کند. در ضمن آرماگونها و مقدار اولیه و خروجی رو هم بررسی می کند.

3- ()main
سومین قسمت اصلی هر برنامه، تابع main() است(همه برنامه ها این تابع رو دارن). اجرای برنامه از این تابع شروع می شود و معمولاً در همین تابع هم پایان می یابد(خط 29).
برخی برنامه ها ممکن است فقط یک تابع main() داشته باشند و این چیز طبیعیست. این تابع می تواند شامل فراخوانی ها، دستورات، شرط ها، حلقه ها، API ها و هر چیز ممکن در ++C باشد. در خط 33 همین تابع، یک دستور #undef قرار دارد. این دستور می تواند ماکروی تعریف شده را خنثی/نابود سازد.

4- توابع تعریفی کاربر
چهارمین قسمت اصلی هر برنامه، توابع تعریفی کاربر(user-defined function) می باشد. این توابع می توانند شامل هر دستوری باشد(مانند تابع main) و هر کاری انجام دهد.
در این مثال از خط 36 به بعد شامل این توابع می باشد. ابتدا نوع برگشتی(Return) تابع مشخص می شود. بعد نام تابع مشخص می شود. و بدنبالش آرماگون ها و آخر بدنه تابع مشخص می شود(میان دو آکولاد ****).
 
 
روند ورود متن و خروج(کامپایل) برنامه
وقتی برنامه ای را تایپ می کنید، یک فایل منبع(Source) ایجاد می کنید. یعنی صفحه ای با متونی شبیه به زبان لاتین که فقط برنامه نویس متوجه آن خواهد شد. این صفحه کاری نمی کند و کامپیوتر هم متوجه آن زبان نمی شود. باید پردازش و عملیاتی(ترجمه) انجام گیرد تا این صفحه تبدیل به زبانی شود که کامپیوتر بتواند آنرا درک کند و برنامه قابل اجرایی را تولید کند(مانند فایلهای سیستم تون).

اولین مرحله در پردازش(ایجاد برنامه)، استفاده از ویرایشگر متنی برای نوشتن کدهای ++C می باشد. شما فایل منبع(Source) را به زبان ++C که شبیه به معماری کامپیوتر هست را می نویسید(به لاتین). بعد باید آنرا به زبان و دستورالعمل های ماشینی(Machine language) تبدیل کنید. این کار بعهده کامپایلر می باشد. کامپایلر برای اینکار عملیات زیر را انجام می دهد:
(برای درک بهتر این موضوع، بر روی یک کامپایلر Open source(منبع باز/متن باز) کار کنید)

ابتدا فایل منبع(Source) خوانده می شود و به تعدادی علایم پیش پرازش(Preprocessor token)(عناصری که کامپایر می تواند با آنها کار کند. مثل عمگر ها، ثابتها، کلمات کلیدی و...) و کاراکتر های سفید(Blank)(شامل فضاهای خالی، Tab ها و Comment ها) تبدیل می شود. در این مرحله کاراکتر های ویژه(Special) تبدیل می شوند و دستورات جدا که دو یا چند خط اشغال نمودند به یکدیگر پیوند می خورند.

سپس دستورات پیش پردازنده(# دار ها) اجرا می گردند. این دستورات شامل include, define if و... می باشند. در این مرحله تمامی دستوات و ماکروها Expand می شوند و عملیات و ضمیمه های لازم انجام می گیرد.

بعد پردازش کاراکترها و رشته ها انجام می گیرد. در این مرحله برنامه برای صحت شکل گرامری(Syntax) و لغات، تجریه و تحلیل می شود(خطاها و هشدارهای Syntax در این مرحله نمایان می شود). اگر اشتباهات جدی(Fatal) پیدا نشود، یک فایل تجزیه/تحلیل شده(معمولاً با پسوند obj) تولید می گردد(تا با بقیه فایل ها ترکیب شود).

دستور پیش پردازنده include# در هر لحظه می تواند چندین فایل را داخل برنامه ادغام(Merge) کند. و هر بار که کامپایلر به این دستور برخورد می کند، به اندازه محتوایش موقتاً پردازش را متوقف(Halt) می کند(همینکار رو زبان های دیگه مثل PHP, ASP Net , Python, PERL و... انجام می دهند!).

در آخرین مرحله(ایجاد برنامه فابل اجرا)، پردازش فایل تولید شده(obj) توسط یک پیوند دهنده(Linker یا Link) انجام می شود. اکثر برنامه ها دارای رجوعاتی به روال(Routine) می باشند که در خارج از برنامه جاری وجود دارند. این روال ها باید آدرس یابی و به برنامه شما اتصال داده شوند تا بتوان با آنها کار کرد.
پیوند دهنده(Linker) تمامی فایلها را با هم ترکیب می کند و در نتیجه یک برنامه قابل اجرا تولید می شود.

تمامی این مراحل توسط کامپایلر انجام می شود. و شما فقط کد می نویسید و بعد با یک کلیک بر روی Build/Make برنامه تان را تولید می کنید(در کامپایلرهای GUI).
 
 
متغییر
ما در برنامه نویسی نیاز به خانه های حافظه داریم. كه به ان هر یك از خانه های حافظه های متغییر گفته می شود در تعریف خانه حافظه یا متغیر باید نام و نوع اطلاعاتی که در آن قرار می گیرد معین شود.




دستور فوق سه خانه حافظه با نامهای i1 وi2 وindex از نوع اعداد صحیح تعیین می کند، یعنی در هر کدام از خانه های حافظه فوق می توان یک عدد صحیح در بازه 32767 تا 32768- قرار داد. نوع داده int به دو بایت حافظه نیاز دارد.
نکته :
·هر خط دستور زبان ++C به ; ختم می شود.
·برای نام گذاری خانه های حافظه فقط می توان از حروف، اعداد و ... استفاده کرد و نیز حرف اول نام یک متغیر باید یک حرف باشد. به عنوان مثال نامهای 1test و test!num و mark.1 اسامی غیر مجاز می باشند.
·بین حروف نام متغیر نمی توان از کاراکتر فاصله استفاده کرد.
·زبان ++C دارای تعدادی کلمات کلیدی است که نمی توان از این کلمات به عنوان نام متغیر استفاده کرد. کلمات کلیدی زبان ++C عبارتند از:





·زبان ++C نسبت به حروف حساس است یعنی بین حروف کوچک و بزرگ تفاوت قائل می شود. در این زبان تمام کلمات کلیدی با حروف کوچک نوشته می شوند، به عنوان مثال short یک کلمه کلیدی می باشد ولی SHORT یا shoRT کلمات کلیدی نیستند. توصیه می شود که تمام برنامه های این زبان با حروف کوچک نوشته شوند.
در زبان ++C چهار نوع داده اصلی وجود دارد که عبارتند از :

1- char : این نوع داده برای ذخیره داده های کاراکتری مانند 'a' ، '1' ، '.' به کار می رود و بازه قابل قبول آن از 128- تا 127 می باشد. در حقیقت خانه های char نیز از نوع اعداد صحیح می باشند که یک بایت طول دارند و کد اسکی کاراکتر مورد نظر را در خود حفظ می کنند. به عنوان مثال کد اسکی کاراکتر A عدد 65 می باشد.
2- int : این نوع داده برای ذخیره اعداد صحیح مانند 1300، 32000 ، 850- به کار می رود و بازه قابل قبول آن 32768- تا 32767 می باشد.
3- float : این نوع داده برای ذخیره اعداد اعشاری مانند 12.5241 ، 1501.3- ، 1415.1234 به کار می رود و دقت آن تا 7 رقم اعشاری می باشد.
4- double : این نوع داده برای ذخیره سازی اعداد اعشاری بزرگ به کار می رود و دقت آن از float بیشتر می باشد.

باکلماتی مانند signed ( علامت دار) ، unsigned ( بدون علامت)، short (کوتاه) و long ( بلند) انواع داده های جدیدی می توان ایجاد کرد. نوع int با هر چهار کلمه فوق می تواند مورد استفاده قرار گیرد. نوع char می تواند با signed و unsigned به کار رود و نوع double می تواند با long به کار رود
 
 


درباره وبلاگ

وبلاگ انجمن علوم کامپیوتر دانشگاه پیام نور فریمان

ع :علم
ل: لیاقت
و :وقار
م : متانت

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




مدیر وبلاگ : ارغوان جلال زاده
پیوندهای روزانه
جستجو

آمار وبلاگ
کل بازدید :
بازدید امروز :
بازدید دیروز :
بازدید این ماه :
بازدید ماه قبل :
تعداد نویسندگان :
تعداد کل پست ها :
آخرین بازدید :
آخرین بروز رسانی :
p30java
ابزار وبلاگنویسان ابزار وبلاگنویسان