تبليغاتX
C++ آموزش
خب بالاخره این جلسه هم اماده شد. اما دیدم حجمش زیاد میشه دو قسمتش کردم. تازه خب بد تر اینه که ازاین به بعد دیر به دیر تر اپدیت می کنم مثلا دو ماهی به یه بار بالاخره یواش یواش درسا سختر می شه و مسئولیت ها بیشتر می شه کارا بیشتر میشه و.... حالا فعلا اینو داشته باشین ببینم چی میشه.

مثال 1: سیستم پنجره ای:

اهداف مثال:

1.آشنایی با نحوه ی حل مساله و پیاده سازی کلاس ها ی لازم.

2.آشنایی عملی با مفهوم کلاس و اشیاء

جلسه ی قبل گفتیم که سیستم پنجره ای یعنی چه اگر به یاد ندارید حتما همین الان انتهای جلسه هجدهم را بخوانید.

 

اهداف کلاس:

گفتیم که در یک چنین سیستمی باید در هر لحظه

1.به پنجره ی فعال دسترسی داشته باشیم.

2.تعداد پنجره های موجود را بدانیم.

3.بتوانیم پنجره های دیگر را فعال کنیم(بین پنجره ها حرکت کنیم)

 

اهداف اشیاء نمونه سازی شده از کلاس(هر پنجره):

لازمه ی اینها این است که

4.هر پنجره بتواند خودش را رسم کند(ایجاد نمود گرا فیکی)

5. ویژگی های اساسی خود را مانند موقعیت قرار گیری در صفحه نمایش(left,top) , طول و عرض و رنگبندی را بداند.

6.بداند آیا پنجره ی فعال خودش است یا خیر.

و احتمالا یک سری امکانات اضاف که مایلیم هر یک از پنجره هایمان داشته باشند مانند عنوان یا محتوای متنی.

دانلود این جلسه

دانلود سورس کد این جلسه

ادامه ی مطلب فرا موش نشود.


ادامه مطلب
+ نوشته شده توسط سجاد مهدی بیرقدار در یکشنبه هشتم اردیبهشت 1387 و ساعت 1:8 |

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

 

اشاره گر اشیا:

تمامی مفاهیم اشاره گر اشیا مانند اشاره گر استراکچر ها یا همان ساختمان هاست

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

MyClass *ptrMyObject;

همانطور که می بینید این تعریف هیچ فرقی با تعریف یک اشاره گر استراکچر و یا حتی یک نوع اولیه مثلا intندارد

int *ptrMyInt;

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

ادامه ی مطلب یادتون نره

 دانلود این پست به صورت پی دی افدانلود این پست به صورت پی دی اف


ادامه مطلب
+ نوشته شده توسط سجاد مهدی بیرقدار در یکشنبه پنجم اسفند 1386 و ساعت 23:3 |

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


جلسه ی قبل با نحوه ی ساخت یک کلاس ساده و نمونه سازی(ساخت اشیاء) از آن کلاس آشنا شدیم و کلاسی با نام MyClass  برای کار با اعداد کسری ساختیم و در مورد توابع سازنده و مقدار دهی اولیه به فیلدها از طریق توابع سازنده و مفهوم اشاره گر this را بررسی کردیم.

در ادامه به بررسی تابع سازنده ی کپی می پردازیم.

هنگامی که دستور انتساب را بین دو شی اجرا می کنیم

 

تعریف و مقدار دهی اولیهMyClass n1(1,2) , n2(1,4);

دستور انتساب n1=n2;

 

تابعی به نام تابع سازنده ی کپی اجرا میشود در صورتی که این تابع توسط برنامه نویس تعریف نشده باشد کامپایلر شئ سمت راست را به صورت بیت به بیت در شئ سمت چپ کپی می کند که این کار در مواردی نتایج نامناسبی دارد مثلا اگر کلاسمان یک فیلد اشاره گر داشته باشد که به محلی از حافظه اشاره می کند این نوع کپی شدن باعث می شود که فیلد اشاره گر در شئ n1 به همان چیزی اشاره کند که شئ n2 اشاره می کند در واقع به این معنی خواهد بود که یک کپی کامل از شئ n2ایجاد نمی شود در چنین مواردی بسته به نیاز تابع سازنده ی کپی طراحی میشود این تابع به صورت زیر می باشد.

MyClass::MyClass( MyClass& tmp )

{

اعمال لازم برای ایجاد کپی

}

 دانلود این جلسه به صورت pdf در یافت این پست به صورت پی.دی.اف

دانلود سورس کد های این جلسهدریافت سورس کد های این جلسه

ادامه ی مطلب را می توانید در لینک ادامه مطلب بخوانید

به امید موفقیت همگی دوستان فعلا خدا نگهدار


ادامه مطلب
+ نوشته شده توسط سجاد مهدی بیرقدار در سه شنبه شانزدهم بهمن 1386 و ساعت 1:38 |

سلام

خب دیگه برگشتم گفتم بیام این کپک های وبلاگ رو یکمی پاک کنم زشته!

جدا از شوخی امتحاناتو که دادیم حالا باید دعا کنیم مشروط نشیم تازه چی چند روز تعطیلی بین دو ترمون هم که با این برفی که اومد خراب شد!! آخه یازدهم همین ماه بازم امتحان دارمبی خیال چیکار می شه کرد دیگه


جلسه ی شانزدهم

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

اما برای تعریف یک کلاس باید تمام قطعات مورد نیاز و روابط آنها را باهم مشخص کنیم تا اشیا ساخته شده از کلاس مذکور بتوانند به درستی وظایف خود را انجام دهند. اما قطعات درون کلاس چه چیز هایی هستند ؟

خیلی ساده! توابع و متغیر ها قطعات یک کلاس یا یک شي هستند که در اصطلاح به عنوان اعضا کلاس شناخته می شوند. مثلا تابع عضو  که البته برای متغیر های عضو بیشتر می گویند فیلد.

 به طریقه تعریف یک کلاس توجه کنید

 دانلود این جلسهدانلود این پست به صورت پی دی اف

دانلود سورس کد های  برنامه ی این جلسه دانلود برنامه ی این جلسه

ادامه ی مطلب را می توانید در لینک ادامه مطلب بخوانید

خب فعلا  سعی می کنم در اسرع وقت آپدیت کنم


ادامه مطلب
+ نوشته شده توسط سجاد مهدی بیرقدار در دوشنبه یکم بهمن 1386 و ساعت 1:13 |

سلام

مطالب این جلسه رو خوب مطالعه کنید پست های قبل رو هم یه دوری بزنید

جلسه بعد به بررسی یه مثال خفن می پردازیم تا بالا خره مباحث شی گرایی رو شروع کنیم


استراکچر ها به سادگی مانند تمام متغیر های انواع اولیه می توانند آرگمان توابع باشند یعنی در واقع هیچ تفاوتی یا يكديگر ندارند جلسه ی قبل استراکچری به نامpersonتعریف کردیم حال به  نحوه ی تعریف آرگمان توابع از این نوع توجه کنید.

void print_person(person arg){

 cout<

 cout<

}

به همین راحتی! می بینید که هیچ فرقی با دیگر انواع ندارد.

 

نکته:

در برخی کامپایلرهای قدیمی نوشتن عبارت struct قبل از نام استراکچر در آرگمان تابع الزامیست.

void print_person(struct person arg){

 cout<

 cout<

}

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

برای ارسال با ارجاع خوشبختانه استفاده از رفرنس ها هم به همان سادگی روش قبل است فقط باید یک علامت & قبل از نام متغییر درج شود

void print_person(person &arg){

 cout<

 cout<

}

حال هر تغیری بر آرگمان ها از درون تابع به برنامه اصلی نیز منتقل می شود.

اما روش دیگر ارسال با ارجاع استفاده از اشاره گرهاست به نحوه تعریف توجه نمایید.

void print_person(person *arg){

 cout<<*arg.name;

 cout<<*arg.grade;

}

 

  دانلود این پست در یافت این پست به صورت پی.دی.اف

 ادامه مطلب یادتون نره

 


ادامه مطلب
+ نوشته شده توسط سجاد مهدی بیرقدار در پنجشنبه سوم آبان 1386 و ساعت 0:18 |

اصولا رشته ها در زبان های برنامه نویسی به دو دسته تقسیم می شوند.

1.رشته های ایستا:

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

2.رشته های پویا:

  این رشته ها بسته به نیاز, طولشان تغییر میکند و مقدار حافظه ای که اشغال میکنند بسته به نیاز تغییر میکند و تمام این عملیات تخصیص حافظه بدون دخالت برنامه نویس انجام میشود.عملیات روی این نوع از رشته ها سرعت کمتری نسبت به نوع قبل دارد.اما کار با آنها بسیار ساده تر است.

 

رشته های استاندارد زبان Cاز نوع اول هستند در این مبحث به بررسی این نوع رشته می پردازیم نوع دوم رشته های پویا در زبان C++تحت عنوان کلاسstring در هدر فایل string.hارائه شده که برای درک بیشتر در مباحث شی گرایی مطرح می شود.

 

رشته های استاندارد زبان C:

این رشته ها دقیقا به صورت آرایه ای از نوع کاراکتر(char) هستند اصولا برای انجام بیشتر عملیات برروی رشته ها باید روشی برای تعیین طول رشته ها داشته باشیم برای این کار دو روش وجود دارد

1.قرار دادن کاراکترNULLبا کد اسکی صفر در اولین خانه بعد از آخرین کاراکتر رشته که این دقیقاً روش مورد استفاده Cاست

2.استفاده از خانه شماره صفر آریه مورد استفاده رشته برای ذخیره طول رشته به صورت عدد که در زبان های BasicوPascalاستفاده میشود.

 

که به نظر من روش اول انعطاف بیشتری دارد هر چند کار کردن با رشته ها را مشکل تر میکند.

 

روش تعریف رشته ها :

];حداکثر طول رشته+1char str1[

این همان تعریف آرایه از نوع کاراکتر است

 

نکته:

بدلیل استفاده از آخرین خانه برای کاراکتر NULL طول آرایه همیشه باید یک واحد بیشتر از طول رشته باشد.

 

این مطلب هشت صفحه شده ادامش رو می تونید در ادمه مطلب البته بدون عکس هاش بخونید لینک دانلود پی.دی.اف هم همین جاست کامله ها


ادامه مطلب
+ نوشته شده توسط سجاد مهدی بیرقدار در چهارشنبه چهارم مهر 1386 و ساعت 0:10 |
سلام

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


مطلب خیلی ساده است در هر عبارت انتساب عبارتی که می تواند سمت چپ قرار گیرد یک چپ مقدار است و عبارتی که می تو اند سمت را ست  قرار گیرد راست مقدار است و ای توانای بدین معناست که صحت عبارت را از بین نبرد در این مثال xچپ مقدار وyراست مقدار است

x = y;

در حالت کلی تمام متغیر ها و به عبارتی از دید شئ گرایی تمام اشیا چپ مقدارند

و تمام ثوابت رشته ای ,کاراکتری و عددی چه به صورت شناسه و چه به صورت تایپ مستقیم راست مقدارند. توجه داشته باشید که یک عبارت می تواند هم چپ مقدار و هم راست مقدار باشد

 

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

 

تمام متغیر ها هم می توانند چپ مقدار باشند هم راشت مقدار

 

هدف از بیان این اصطلاحات خسته کننده دونکته مهم است

اول

رفرنس ها برای گرفتن مقدار اولیه نیاز به چپ مقدار دارند

به مثال توجه کنید

;چپ مقدار =نام متغیر  &نوع داده ای

 

int& x= a++;

int& x= 78;

int& x=a/2;

هیچ یک از سه مثال فوق صحیص نمی باشند زیرا هیچ یک از عبارات سمت راست چپ مقدار نیستند

اما مثال های زیر صحیح می باشند

int& x=a;

int& x=++a;

توابع دارای نوع بازگشتی راست مقدارند و نمی توانند در سمت چپ عبارات قرار گیرند

مثل myfunc()=4; اما راه حلی برای این کار وجود دارد حقیقت این است که برخی مواقع استفاده این چنینی از یک تابع می تواند خیلی مفید باشد برای انجام این کار باید نوع باز گشتی تابع را به عنوان رفرنس تعریف نمود

مثال معروف این مبحث

int& max(int& a,int& b){

   if(a>b)

       return a;

  else

    return b;

}

 

void main(){

   int x=3,y=4;

 max(x,y)=100;

cout<

}

دراین مثال بدون دانستن اینکه xبزرگتر است یا yمتغییر بزرگتر را تغییر دادیم و چاپ نمودیم!

      چگونه کار میکند؟

برای اجرا چنین توابعی خود را گیج نکنید مثل توابع معمولی ابتدا تابع را اجرا نمایید بعد بجای عبارت فرا خوانی تابع یک رفرنس معمولی در نظر بگیرید که این رفرنس دقیقاً رفرنس عبارت باز گشت داده شده توسط دستور returnدرون تابع است به همین سادگی

پس مسیر عکس این را در پیش نگیرید مثل این که عدد 100را بخواهید در تابع کپی کنید!!!

 

 

نکته:

اگر به مثال بالا دقیق تر نگاه کنید می بیند که آرگمان های تابع هم از نوع رفرنس هستن این نکته هیچ ربطی به رفرنس بودن نوع باز گشتی نداره یعنی اینکه می توان

توابعی ایجاد کرد که نوع بازگشتی رفرنس داشته باشن و آرکمان ها شون رفرنس نباشن پس این دو هیچ ربطی بهم ندارن اما دلیل این کار اینه که اگر آرگمان ها آرگمان معمولی باشند متغییر محلی محسوب میشوند و بعد از پایان اجرا تابع از بین میروند حالا اگر قرار باشد تابع رفرنسی به یکی از این متغییرها برگرداند مقدار باز گشتی تابع رفرنسی خواهد بود به محل نامعلومی از حافظه از آن فراتر تابع کار نخواهد کرد اما باتعریف اینگونه آرگمان ها پارامتر ها خود رفرنسی به متغیر های برنامه اصلی است و از حا فظه آنها (x,y)استفاده میکنند بنابر این بعد از پایان اجرا تابع حا فظه مربوط به آنها آزاد نخواهد شد. پس همیشه باید رفرنس باز گشتی تابع رفرنسی به متغیری باشد که بعد از پایان اجرا تابع حافظه اش  آزاد نشود(به سیستم برگردانده نشود).

 

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

 x[index]وfunc(index) هم معنی می شوند و کاملا یکسان عمل میکنند این مثال را در مباحث شی گرایی مطرح می کنیم.

 

    در یافت این پست به صورت پی دی اف

جلسه ی آینده در مورد رشته ها بحث می کنیم

+ نوشته شده توسط سجاد مهدی بیرقدار در چهارشنبه بیست و هشتم شهریور 1386 و ساعت 0:3 |

سلام

امید وارم همه خوب وخوش وخرم باشید

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

پرسش از شما پاسخ ازمن!

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

در ضمن به تاریخ آخرین آپدیت توجه نکنید من همیشه هستم اما ممکنه آپدیت نکنم!!!

 


جلسه هشتم(توابع واشاره گرها)

در این مبحث به روشهای ارسال نتایج توابع به برنامه اصلی با استفاده از اشاره گرها و رفرنس ها می پردازیم.

اشاره

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

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

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

خب چاره چیست می خواهیم بوسیله اشاره گر ها کاری کنیم که متغییر های مذکور خارج از حافظه تخصیصی به تابع باشند تا بعد از پایان کار تابع از بین نروند اما خارج از حافظه تخصیصی تابع یعنی کجا دقیقا!!؟ خب منظو همان حافظه ی تخصیصی تابعی

 که تابع مد نظر رو فرا خوانی می کنه.

 

این پست چهار صفحه شده که چند تا عکس هم داره براهمین پی.دی.اف رو برای دانلود میگذارم ۸۲ کیلوبایت

 

+ نوشته شده توسط سجاد مهدی بیرقدار در جمعه بیست و سوم شهریور 1386 و ساعت 0:24 |

نام آرایه ها یک اشاره گر ثابت است.

اشاره گر ثابت یعنی اشاره گری که نمی توان محتویات آن یا محلی را که به آن اشاره می کند تغییر داد.

نام آرایه یک اشاره گر است یعنی نام آرایه به اولین خانه ی آرایه اشاره می کند.

به شکل توجه کنید.بافرض دو بایتی بودن طول نوعint(یعنی هر متغیر از این نوع دوبایت حافظه اشغال می کند)

چنین نگرشی به آرایه انعطاف بشتری می دهد.

 

مزایای این نگرش:

1.دسترسی به خانه های آرایه با استفاده از انجام اعمال جمع و تفریق روی اشاره گر ها:

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

 

توجه کنید تصویری که می بینید این که اشاره گر a واقعا در حافظه به این صورت قرار میگیره یانه مطمئن نیستم فقط برای تصور ذهنی و فهم بهتر اینطور به تصویر کشیدم.چراکه رفتارش رو کاملا روشن میکنه.

 

 نکته:

بدلیل ثابت بودن اشاره گر نام آرایه, نمی توان روی آن جمع وتفریق انجام داد.لذا باید اشاره گری تعرف نمود و نام آرایه را به آن انتساب داد وسپس روی این اشاره گر جدید اعمال محاسباتی انجام داد.

 

با اجرا این دستور ها

int a[5];

int pa=a;

می توان تصور کرد  این عبارات در هر سطر یک چیزند.

*pa         a[0]  *a

*(pa+1)  a[1]  *(a+1)

*(pa+2)  a[2]  *(a+2)

.

.

.

*(pa+4)  a[4]  *(a+4)

توجه کنید که در این عبارات paوaتفاوتی ندارند.فرق paدراین است که می تواند به هر نقطه دلخواه اشاره کند.به عبارتی میتوان محتویاتش را تغیر داد لذا نسبت به aانعطاف بیشتری دارد.مثلا می توان با اعمال عملگر++ بر آن به خانه بعدی آرایه اشاره کرد.

Cout<< *pa++;

اجرای متوالی این دستور موجب چاپ تمام خانه های آرایه می شود این در حالیست که همین دستور با اشاره گر aغیر مجاز است.

 

2.تخصیص حافظه پویا:

سیستم عامل زمان اجرای برنامه حافظه محدودی در اختیار برنامه قرار میدهد و برنامه نمی تواند بیش از مقدار این حافظه متغییر ایجاد کند حال فرض کنید حافظه مذکور برای برنامه نا کافی بود در این حالت میتوانید مدل حا فظه بزرگتری برای برنامه انتخاب کنید و این مشکل را حل کنید اما بازهم محدودیت هایی وجود دارد. شاید بازهم باتمام این کارها نیاز برنامه رفع نشد.

به این شیوه ی تعریف صریح متغیرها در برنامه تخصیص حافظه استاتیک میگویند که دارای محدودیت های فوق است این محدودیت ها مخصوصا زمانی خود نمایی می کنند که ندانیم چه تعداد متغییر نیاز داریم .

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

اول این که نمیدانیم باید چند متغییر تعریف کنیم .

دوم شاید تعداد داده ها آنقدر باشد که تخصیص حافظه استاتیک کفاف ندهد.

اینجاست که تخصیص حافظه ی پویا وارد عمل می شود.

می توان فرض کرد حافظه ی پویا منبع بزرگی از حافظه است که می توانیم مقدار دلخواهی از آن را در حال اجرا برنامه از سیستم بگیریم استفاده کنیم وبه سیستم بر گردانیم.

در زبان C++با عملگر newاز سیستم حافظه می گیرد و عملگر deleteحافظه را آزاد می کند یا به عبارتی به سیستم بر می گر داند .

عملگر newدر صورت موفقیت آدرس حافظه گرفته شده را بر می گرداند در غیر این صورت مقدار NULL را بر میگرداند. خب نتیجه این که باید یک اشاره گر داشته باشیم تا بتوانیم مقدار بازگشتی این عملگر را ذخیره کنیم بعد باید چک کنیم که آیا حا فظه ای در اختیار برنامه قرار گرفته یا نه

به مثال توجه کنید

برنامه در یافت n عدد صحیح از کاربر:

#include

#include

int main(){

int n,*arr;

cout<<"Enter number of records?"

cin>>n;

arr=new int[n];

if(!arr)

  cout<<"can not allocate memory";

else{

  for(int i=0;i>arr[i];

  delete[] arr;

{

}

 

شرط!arrزمانی صحیح می شود که arrنادرست باشد.به عبارتی حافظه تخصیص نیافته باشد. در پایان حافظه تخصیص یافته آزاد می شود. در صورتی که فقط بخواهیم یک متغیر بسازیم عبارت [n]را جلوی new intنمینویسیم وبرای آزاد سازی آن عبارت []را جلوی deleteنمی نویسیم.

برای نوشتن معادل این برنامه در زبان Cباید به جای خطوط هفتم و هشتم به ترتیب نوشت :

arr=(int*) malloc(sizeof(int)*n);

free(arr);

این توابع در هدر فایل stdlib.hتعریف شده اند و عملکردی کاملا مشابه عملگر های new,deleteدارند.

عبارت (int*)تبدیل نوع است و تابع sizeofطول نوع intرا بدست آورده و در نهایت در nضرب می کنیم تا به تابعmalloc بگوییم چند بایت حافظه از سیستم بگیرد.

 

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

+ نوشته شده توسط سجاد مهدی بیرقدار در دوشنبه پنجم شهریور 1386 و ساعت 0:1 |

آرایه ها تعدادی متغییر هم نوع هستند که با یک نام مشترک ویک عدد بنام اندکس

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

];تعداد[نام   نوع دادهای

تعریف می شوند.

مثال:

int x[10];

float y[4];

char z[30];

نکته:

1.اندکس اولین خانه از صفر شروع می شود.

2.در صورت دستیابی به خانه های تعریف نشده از یک آرایه مثلاx[10]پیغام خطایی دریافت نخواهید کرد. لذا همیشه مراقب بازه اندکس ها باشید چرا که چنین دستیابی های غیر مجازی می تواند نتایج عجیب و غیر قابل پیش بینی داشته باشد مثل تغییر مقادیر سایر متغیرها.

 

بعد از تعریف یک آرایه شما می توانید با عباراتی مثل x[0]  x[1]  …x[n-1] به عناصر یا همان متغییر ها ی آرایه دسترسی داشته باشید در واقع عبارات فوق کاملا مشابه

متغییر های معمولی دیگر عمل میکنند.

 

برای مثال می توانید بنویسید:

cin>>x[0];

با این دستور می توانید اولین عنصر آرایه را بخوانید.یا با قرار دادن این دستور در یک حلقه forواستفاده از اندکس حلقه بجای عدد صفر تمام عناصر آرایه را بخوانید.

for(int i=0;i<10;i++)

  cin>>x[i];

نکته:

1.انتساب آرایه ها به یکدیگر غیر مجاز است و سبب بروز خطای کامپایلری می شود.

int x[10];

int y[10];

خطا        x=y;

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

 

3.آرایه ها می توانند چند بعدی باشند مثل یک ماتریس دو بعدی  یا یک مکعب سه بعدی که تجسمش کمی مشکل است.معمولا برنامه نویسان از آرایه های بیشتر از دوبعدی استفاده نمی کنند.

int a[3][4][5];

مقدار اولیه در آرایه ها:

آرایه ها مانند سایر انواع مقدار اولیه ندارند لذا باید در صورت لزوم به آنها مقدار اولیه داد.

به مثال ها توجه کنید.

int x[5]={2,56,4,8,4};

پنج خانه آرایه بترتیب با اعداد ذکر شده مقدار دهی میشوند.

int y[2][3]={1,4,5,9,54,21,97};

int y[2][3]={{1,4,5},{54,21,97};

دو دستور بالا یک کار برد دارند ام خوانایی دستور دوم بیشتر است.

Int y3d[2][3][4]={{{1,2,3,4},{5,6,7,8},{9,10,11,12}},

                           {{13,14,15,16},{17,18,19,20},{21,22,23,24}}};

برای آرایه های چند بعدی بهتر است برای خوانایی بیشتر مقادیر هر سطر را در یک آکولاد قرار دهید.

int z[]={1,2,3};

در صورتی که اندازه آرایه ذکر نشودبرابر تعداد مقادیر ذکر شده در نظر گرفته می شود.

int x[5]={1,2};

int y[2][3]={1,4,5,9};

int y3d[2][3][4]={};

در صورتی که تعداد مقادیر کمتر از تعداد خانه ها باشد سایر خانه ها مقدار صفر میگیرند.

 

نکته:

آرایه ی عمومی همیشه مقدار اولیه صفر دارد.یعنی تمام خانه های آن صفر اند.

 

دریافت این پست به صورت پی.دی.اف

به زودی لینک پی.دی.اف پست های قبلی رو هم درست می کنم.

تابعد

+ نوشته شده توسط سجاد مهدی بیرقدار در یکشنبه هفدهم تیر 1386 و ساعت 18:7 |

اوایلی که برنامه نویسی به وجود آمد باید برنامه به صورت یک قطعه بزرگ

نوشته میشد که باعث میشد بعضی مجموع دستورات چندین بار تکرار بشوند

بعلاوه خطا یابی وتغییر وفهم برنامه خیلی مشکل بود.

بنابراین قرار بر این شد که بجای تعداد زیادی(چند ده هزار)خط دستور پشت

سرهم برنامه را به تعدادی برنامه های کوچک مجزا با ورودی خروجی های

مشخص ایجاد نمایند تا برنامه اصلی با توجه به نیازها با دادن ورودی مناسب

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

کوچک داریم که خطا یابی و فهمشان بدلیل کوچک بودنشان آسان است.

}(لیست پارامترها)نام تابع    نوع مقدار بازگشتی تابع

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

{

شکل کلی توابع بصورت بالا می باشد حالا یه مثال می زنم که هیچی مثل

مثال شفاف کننده نیست

#include

#include

void star(){

cout<<"*******";

}

int main(){

cout<<"this is main"<

star();

getch();

return 0;

}

در این مثال نوع باز گشتی تابع star  بدون نوع یعنی void  تعریف شده  چرا که

این تابع قرار نیست چیزی بعنوان خروجی به برنامه بر گرداند لیست پارامتر ها

هم خالیست چرا که این تابع نیازی به ورودی هم ندارد.

خب حالا می خوایم برنامه رو کامپایل کنیم

اول تابع main رو پیدا میکنبم بعد اجراش می کنیم خط اول روی مانیتور عبارت

This is main را چاپ می کنیم و نشانه گر مانیتور رو به خط بعد می بریم

بعد خط بعد رو اجرا می کنیم که برای این کارمجبوریم تابع star را پیدا کنیم

و اجرا کنیم بعد از اجرا آن به خط بعدی تابع main برمیگردیم یعنی خط

سوم بقیش را هم خودتان میدانید

خب حالا فرض کنید می خواهیم تابع star تعداد مشخصی ستاره چاپ کند

پس تابع ما ورودی می خواهد. یعنی پارامتر می خواهد حالا مثال را با دقت

بخوانید.

#include

#include

void star(int n){

int i;

for(i=0;i

cout<<"*";

}

int main(){

int a;

star(3);

cin>>a;

star(a);

getch();

return 0;

}

یک تابع می تواند چند پارامتر داشته باشد

void star(int a,int b,float a)

تابع در صورتی که نوع بازگشتی داشته باشد به صورت زیر استفاده می شود

#include

#include

int fabs(int a){

if(a<0)a=-a;

return a;

}

int main(){

int n;

cin>>n;

n=fabs(n);

cout<

getch();

return 0;

}

در این مثال تابع قدر مطلق تعریف شده می بینید که مقدار باز گشتی با دستور

returnبه برنامه بر گردانده شده برای گرفتن این مقدار باز گشتی باید عبارت

فراخوانی کننده تابع را برابر یک متغیر مناسب قرارداد در واقع نام تابع حاوی

مقدار باز گشتی است. با این روش باز گشت مقادیر از تابع فقط می توان یک

مقدار را بعنوان نتیجه از تابع گرفت اما روش هایی برای بازگشت چند مقدار از

تابع وجود دارد که بعدا ذکر خواهد شد.

اما در مورد متغیرهای عمومی و محلی. به متغیر هایی که درون لیست پارامترها

یا درون توابع تعریف می شوند متغیر های محلی گویند این متغیر ها فقط از

درون توابع خودشان قابل دسترسی هستند و توابع دیگر نمی توانند مقادیر متغیر

های محلی تابع دیگری را تغییر دهند.البته میشود موقع فراخوانی تابع به متغییرهایی

که در لیست پارامترها تعریف شده اند مقدار اولیه داد. با توجه به مفاهیم ذکر شده

توابع مختلف می توانند متغییر های محلی هم نام داشته باشند که هیچ دخلی هم با

هم ندارند و هر کدام کار خود را می کنند. متغییر های محلی بعد از پایان اجرای

تابع از حافظه حذف می شوند.

اما متغییر های عمومی متغیر هایی هستند که خارج از توابع ومعموما قبل از تعریف

تابع mainتعریف می شوند این متغیر ها در سراسر برنامه قابل دسترسی اند

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

باروش های معمولی قابل دسترس نخواهد بود و از آن به بعد متغییر محلی بدون

هیچ گونه دخالتی از جانب متغییر عمومی کار خود را می کند برای دست یابی به

متغییر عمومی در تابع مذکور در چنین وضعی اگر فرض کنیم نام متغییر aباشد

باید بجای aبنویسیم ::aدر واقع a به تنهایی یعنی متغییر محلی و::aیعنی متغییر

عمومی

کلاسهای حافظه

تمام متغیر ها دارای دو ویژگی هستند

1.حوزه ی متغیر

2.طول عمر متغیر

 

حوزه ی متغییر می گوید که متغییر در چه جاهایی از برنامه قابل دسترسی است

مثلا متغیر های محلی فقط درون تابعی که درآن تعریف شده اند قابل دست یابی اند

همچنین طول عمر یک متغیر محلی از زمان اجرا تابع شروع می شود و با خاتمه

اجرا تابع تمام میشود

 

انواع کلاسهای حافظه

 

کلاس حافظهautomatic

تمام متغیر های محلی که تا کنون تعریف می کردیم از این کلاس میباشند

کلاس حافظهstatic

این کلاس دارای دونوع استاتیک محلی واستاتیک عمومی می باشد

تفاوت متغیر های استاتیک محلی با متغیرمحلی معمولی در این است که بعد از

پایان اجرا تابع از بین نمیروند و مقدار خود را برای اجرا بعدی تابع حفظ میکنند

تفاوت متغیر استاتیک عمومی با متغیر عمومی در حوزه ی متغییر است

متغییر عمومی در تمام برنامه قابل دستیابی است اما متغیر استاتیک عمومی

فقط در توابعی که بعد از تعریف متغیر مذکور تعریف شده اند قابل دستیابی اند

نکته مهم دیگر این که متغیر های استاتیک چه عمومی وچه محلی مقدار اولیه ی

صفر دارند بر خلاف دیگر متغیر ها.

کلاس حافظه یextern

تمام متغیر های عمومی(متغیر هایی که خارج از توابع تعریف می شوند) عضو

این کلاس اند

این متغیر ها در تمام زمان اجرا برنامه وجود دارند و در تمام برنامه قابل

دستیابی اند

 

کلاس حافظه register

این کلاس حافظه به کامپایلر پیشنهاد می کند متغیر در ثبات های CPUایجاد

شوند این کار باعث افزایش سرعت کار بامتغیر مذکور میشود چرا که سیستم

عامل مجبور نیست برای کار با آن به ثبات ها منتقلش کند ودوباره نتایج

را به RAMبرگرداند.

از آنجا که CPUثبات های کوچک ومحدودی دارد این کلاس حافظه محدودیت

هایی دارد

1.فقط برای متغیر های محلی قابل استفاده است

2.فقط برای انوع صحیح و کاراکتری واشاره گرها قابل تعریف است

3.نمی توان اشاره گری به متغیری با این کلاس تعریف کرد

4.دستور استفاده از این کلاس حالت پیشنهاد داردو اگر CPUنتواند ثباتی

در اختیار برنامه قرار دهد متغیر در RAMایجاد می شود.

 

register int a;

static char c;

معمولا کلاس هایautomatic وextern را برای تعریف متغیر نمی نویسند

البته نوشتنشان خوانایی برنامه را افزایش میدهد

 خب فقط یک نکته مانده که چون خارج از کتاب هست و بیانش هم مشکل

هست بی خیال میشم

 

تا به حال توبع را قبل از تابع mainتعریف می کردیم اما می توانیم الگوی

توابع را قبل از تابع mainتعریف کنیم وبعد از تابع mainخود توابع را تعریف

کنیم به مثال دقت کنید

#include

#include

الگوی تابع     int fabs(int a);

int main(){

int n;

cin>>n;

n=fabs(n);

cout<

getch();

return 0;

}

 خود تابع    int fabs(int a){

if(a<0)a=-a;

return a;

}

همچنین در الگوی توابع برای پارامترها می توانید نام پارامتر را ننویسید و فقط

نوع آن را ذکر کنید چرا که در الگوی تابع کامپایلر فقط می خواهد بداند تابع

چند پارامتر واز چه نوعی دارد.

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

 تابعی میتواند از طریق پارامتر ها مقادیری به برنامه بر گرداند.

 

در یافت این پست به صورت پی.دی.اف

+ نوشته شده توسط سجاد مهدی بیرقدار در پنجشنبه ششم اردیبهشت 1386 و ساعت 1:42 |

عملگر های رابطه ای

این عملگر ها دو مقدار را به هم مقایسه نموده و حاصل را به صورت true یا false

برمی گردانند

 

مساوی ==

مخالف =!

بزرگتر >

بزرگتر یا مساوی >=

کوچکتر <

کوچکتر یا مساوی<=

 

عملگر شرطی

دستورات…درست نبودن شرط;  دستورات اجرایی در صورت درست بودن شرط?   عبارت مورد ارزیابی

(3>1)?0:1;

برای مثال حاصل عبارت بالا صفر است

میتوان بجای صفر ویک متغییر یا عبارت محاسباتی قرارداد

یا دستور دیگری مثل چاپ یک عبارت قرار داد که در این صورت این عملگر

دیگر مقداری را بر نمی گرداند.البته بازم می تونه مقداربر گردونه ....

 

عملگر کاما

این عملگر ربطی به این مبحث نداره اینجا میگم چون خیلی جا ها می شه استفادش

کرد واگه بلدش نباشید حسابی گیج می شید.منم حالش رو ندارم ده بار جاهای مختلف

توضیح بدم .خیلی سادس اما توی دستورات مختلف می تونه گیج کننده باشه.

);عبارت n ,…,عبارت2,عبارت1)

این دستور تمام عبارات را اجرا نموده وارزش عبارت یعنی مقدار بازگشتی آن

برابر با سمت راست ترین عبارت است.

(a++,b=a,a);

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

کرد هم مقدار بر گرداند

بلاک های دستور

هر بلاک دستور قسمتی از برنامه است که کامپایلر آنها را با هم فرض می کند

دو نوع بلاک داریم نوع اول بلاک تک دستوری است که فقط یک دستور است

وبه یک سمیکالن ختم می شود نوع دوم بلاک با بیش از یک دستور است که با }

شروع وبه} ختم می شود وتمام دستور های مد نظر بین این دو قرار می گیرند

 

دستور if

این دستور ارزش یک عبارت را ارزیابی نموده بر اساس آن دستوراتی را

اجرا می نماید

(عبارتIf(

; دستور در صورت صحیح بودن ارزش عبارت

else

; دستور در صورت  نادرست بودن ارزش عبارت

 

این حالت بلاک ها تک دستوری میباشد هر کدام از این بلاک ها می توانند

چند دستوری باشند

{(عبارتIf(

.

.

.

{

else

}

.

.

.

{

 

همچنین بلاک else می تواند وجود نداشته باشد عبارت مورد ارزیابی هم

میتواند یک عدد یک مقایسه ساده یا یک مقایسه ی مرکب از عملگر های

رابطه ای و منطقی باشد

 

نکته

ارزش اعداد بزرگتراز صفر صحیح است  

 

نکته

ارزش عبارت b=a برابر به مقدار متغییر aاست

 

مثال چاپ قدر مطلق

if(a>0)

cout<

else

cout<<-a;

مثال چاپ و محاسبه ی قدر مطلق

If(a>0)

cout<

else{

cout<<-a;

{a=-a;

حلقه ی for

حلقه ای با یک یا چند اندیس.

(گام حلقه: شرط حلقه:مقدار اولیهfor(

بلاک دستور تک دستوری یا چند دستوری

 

شرط حلقه تا زمانی که درست هست حلقه اجرا میشه شرط حلقه را

میتوان به هر صورت تعریف کر حتی می شود شرطی استفاده کرد که

هیچ ربطی به اندیس حلقه نداشته باشه در حالی که پاسکال شرط حلقه را

خودش در نظر میگیرد و شما حتی نمی توانید شرط را ببینید مبتد ی ها

 هم که متوجه وجود چیزی به نام شرط نمی شوند بعد از شرط حلقه

می رسیم به گام حلقه شما می توانی با دستورات محاسباتی تعریف کنید

که اندیس حلقه چه مقدار تغییر کند حال آنکه در پاسکال مقدار پیش فرض

یک داره!!! هیچ کسی هم نمیبیندش تا زه گام حلقه و مقدار اولیه می توانند

با استفاده از عملگر کاما چند تا یی باشند مثلا می شه دوتا متغییر رو مقدار

اولیه داد بعد دو تا گام حلقه تعریف کرد و در نتیجه حلقه دو اندیسی تولید

کرد!!! کف کردید تازه میشه مقدار اولیه نداد شاید برنامه جوری بود که

حلقه باید از مقدار فعلی متغییر اندیس حلقه شروع به کار کند.حالا مثال ها

رو ببینید و بازم کف کنید.

for(i=0;i<10;i++)

cout<

 

for(int i=0;i>-10;i--)

cout<

 

for(i=0,j=32;j>=0;j/=2,i+=j){

cout<

cout<

{

 

for(;i>-10;i--)

cout<

 

}for(int i=0;i>-10;)

cout<

i--;

}

حتی می شود حلقه while را با forشبیه سازی کرد

 

حلقه ی while

شرط این حلقه در ابتدای هر بار رجوع به ابتدای حلقه بررسی می شود

هر گاه شرط نا درست شود اجرا حلقه خاتمه می یابد

(شرط حلقهwhile(

بلاک دستور تک دستوری یا چند دستوری

 

while(a>0){

a--;

cout<

}

 

حلقه بینهابت به همراه بوق متد و مانیتوری پر از پیغام خطا برای خروج از کنترل پاوز استفاده کنید.

while(1)           

cout<<''Error!"<<'\a';

حلقه ی do while

شرط این حلقه در ابتدای هر بار رجوع به انتهای حلقه بررسی می شود

محتویات بلاک دستور این حلقه حداقل یک با اجرا می شود.

هر گاه شرط نا درست شود اجرا حلقه خاتمه می یابد.

do

بلاک دستور تک دستوری یا چند دستوری

;(شرط حلقهwhile(

دستورbreak

این دستور برای پرش به بیرون از حلقه ها استفاده می شود بدلایلی بهتر است

استفاده نشود و بجایش شرط حلقه را نادرست کرد اساسا دستورات پرش دار

باعث کاهش سرعت اجرا می شوند.

 

دستور continue

این دستور باعث پرش به ابتدای حلقه می شود بجای این دستور هم بهتر است

بلاک های برنامه را بگونه ای نوشت که نیاز به استفاده این دستور نباشد.

 

دودستور اخیر اگر درون حلقه های تودر تو استفاده شوند روی همان حلقه ای

عمل می کنند که درون بلاک دستور آن حلقه استفاده شده اند.

 

دستور switch

گاهی اوقات لازم است برای مقادیر مختلف یک عبارت تصمیمات مختلفی

گرفته شود در این موارد استفاده از ifمی تواند سر در گم کننده باشد.

){عبارتswitch(

:مقدار1          case

یک یا چند دستور

          break;

:مقدار2          case

یک یا چند دستور

          break;

            .

           .

           .

         default:

یک یا چند دستور

}

این ساختار می تواند فاقد defaultباشد  دستورات این بخش در صورت درست

نبودن هیچ یک از مقادیر قبلی اجرا می شود

 

مقادیر  موجود در caseها نمی توانند برابر باشند(دو یا چند caseبا یک مقدار)

 

این دستور فقط  تساوی عبارت با مقادیررا مور بررسی قرار میدهد.

اگر در یک caseدستورbreak استفاده نشود با caseبعدی orمی شود.

در هر case  می توان ساختار switchدیگری ایجاد کرد

 

عملگرهای منطقی

می توانید با عمگرهای منطقی عبارات شرطی پیچیده تری ایجاد کنید

این عملگرها شامل and or not هستند که در C++ معادلشان

! || && میباشد

به مثال توجه کنید

a>0)))&&if((3>a)

اگر aبین 3و0 باشد عبارت صحیح می شود و دستورات درون بلاک

ifاجرا میشود

 

در یافت این پست به صورت پی.دی.اف

+ نوشته شده توسط سجاد مهدی بیرقدار در چهارشنبه بیست و نهم فروردین 1386 و ساعت 1:33 |

سلام

زبان C++ یک زبان ساختیافته شئ گراست (ساختیافته یعنی از توابع یا قطعه

برنامه های مختلف در کنار یکدیگر استفاده می کند و شئ گرا یعنی از توابع

بسته بندی شده استفاده میکند بعدا توضیحات بیشتری ارائه می شود)

این زبان تعدادی توابع و اشیا پیش ساخته دارد که درون فایل های سرآیند

تعریف شده اند برای استفاده از این امکانات پیش ساخته باید نام این فایل ها با

استفاده از دستور#include به برنامه اضافه نمود

>نام فایل#include<

فایل های سرآیند فایلهایی هستند با پسوند h شما میتوانید این فایلهارادر پوشه ی

کامپایلر پوشه ی lnclude بیابید.

ساختار کلی برنامه در C++

>فایل سرآیند#include<

 

int main()

{

     اعلان متغییرهای محلی

دستورات اجرایی

return 0;

}

 

در این ساختار تابع main تعریف شده. نقطه ی شروع اجرا برنامه همین تابع

است برای شروع اجرای برنامه سیستم عامل این تابع را اجرامیکند سیستم عامل

پس از خاتمه ی اجرا برنامه می خواهد بداند که برنامه درست اجرا شده یانه خاتمه

ی برنامه دقیقا وقتی است که اجرا تابع main خاتمه می یابد میدانیم که هر تابع

می توان مقداری را به برنامه اجرا کنند باز گرداند پس تابع main می تواند

مقداری را به سیتم عامل برگرداند درساختار بالا نوع مقدار باز گشتی تابع مذکور

صحیح اعلام شده آخرین دستور آن نیز دستور returnاست که اجرای تابع راخاتمه

داده و مقدار صفر را به برنامه ی اجرا کننده(در اینجا سیستم عامل) بازمی گرداند

بااین کار سیستم عامل از اجرا درست برنامه اطمینان می یابد.

 

توجه داشته باشید که دستوراتی که با # شروع می شوند دستورات پیش پردازشی

هستند وبه سمیکالن ختم نمی شوند این دستورات قبل از ترجمه برنامه به زبان

ماشین تغییراتی در برنامه ایجاد میکنند.

 

ورودی و خروجی

اشیا cinو cout از اشیا پیش ساخته می باشند که توابع مختلفی برای مقاصد ورودی

خروجی در اختیار برنامه نویس قرار می دهند اشیا مذکور در فایل سرآیند

iostream.h تعریف شده اند بنابراین برای استفاده از آنها باید این فایل را با استفاده

 از دستور include#به برنامه اضافه نمود.

چند مثال

#include

 

int main(){

int a;

cout<<a;

cin>>a;

cout<<a*a;

return 0;

}

قبلا گفتم که C++ به متغییرها مقدار اولیه نمی دهد اگه این برنامه رو اجرا

کنید اول محتویات متغییر aچاپ میشه یعنی همان چیزی که تو حا فظه به

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

انتظاری غیر از چاپ شدن صفر داشت پس همیشه باید دقت داشته باشید که

یه وقتی متغییری بدون مقدار اولیه توی شرطها  قرار نگیره چرا که نتیجه

نا معلوم یا در اصطلاح نا معتبر است

 

بعد از چاپ محتویات متغییرa با دستور cin مقدار متغییر مذکور از کیبرد

خوانده شده و دستور بعد توان دو آن را محاسبه نموده و چاپ میکند

 

 کاراکترهای خاص

کاراکترهای خاصی به نام کاراکتر های کنترلی وجود دارند که یا کاراکتر خاصی

راچاپ می کنند یا عمل خاصی انجام میدهند این کاراکترها با \ شروع می شوند

اگر چه با بیش از یک کاراکتر نوشته می شوند اما یک کاراکتر محسوب می شوند

بنابراین برای چاپ یا انتساب این کاراترها به متغییر ها باید آنهارا بین دو کوتیشن

تکی (')قرار داد.البته از کتیشن دوتایی هم میتوان استفاده نمود با این تفاوت که

که عبارت حاصل یک رشته ی یک کارکتری است ونه یک کاراکتر

 

                             کاراکتر                           عمل

                 \f                                      انتقال کنترل به صفحه جدید

                \n                                     انتقال کنترل به خط جدید

                \t                                     انتقال به 8 کاراکتر بعد از موقعیت جاری

                \a                                     به صدا در آمدن بوق سیستم

                \b                                     Backspace

                \"                                     چاپ کوتیشن دوتایی

                 \'                                     چاپ کوتیشن تک

                 \\                                      چاپ بک اسلش

                \0                                     NULL

               \v                                      انتقال کنترل به 8 سطر بعد

                \:                                     چاپ دو نقطه

              \?                                       چاپ علامت سوال

مثال

cin>>a>>b;

cout<<a<<'\n';

cout<<b<<'\n';

cout<<'\a';

دراین مثال ابتدا مقادیر با  cin خوانده می شوند وبعد در خطوط جدا چاپ می شوند

در پایان سیستم بوق می زند

بجای '\n' می توان از endl استفاده نمود                   

 cout<

در C++ رشته ها را بین کتیشن دوتایی قرار می دهند پس برای چاپ رشته باید

بنویسیم

cout<<''C++ is a powerful language";

C++ & سالاد ونوشابه

نوبت رسیده به چند تا دستور با حال تا راحت تر بتونیم برنامه بنویسیم

اولیش تابع getch() برنامه وقتی به این تابع می رسه منتظر می مونه تا کاربر

یک کلید رو فشار بده تازه کد کلیدی که فشرده شده رو هم بر میگردونه می تونید

از این تابع در انتهای برنامه استفاده کنید تا بتونید خروجی برنامه رو قبل از

خروج از صفحه ببینید.

دومیش تابع clrscr() که خیلیم تابلو که صفحه نمایش رو پاک میکنه

سومیش تابع  ( gotoxy(int x,int y که موقعیت جاری مکان نمارو تغییر می ده

تمامی این توابع در فایل سرآیندconio.h  قرار دارند. می دونید که معنیش چیه؟

اگه نمیدونید!!!! این جلسه رو از اول بخونید.

#include

#include

 

int main(){

char kb;

cout<<"ye mesal";

gotoxy(10,5);

cout<<''**********";

 kb=getch();

cout<<''You Pressed "<

cout<<'' Press any key to clear screen";

getch();

clrscr();

 cout<<'' Press any key to Exit";

getch();

return 0;

}

یک مثال محاسباتی نکته دار

می خواهیم یک عدد ارز کاربر بگیریم نصفش را محاسبه و چاپ کنیم

#include

#include

int main(){

int a;

float b;

cin>>a;

b=a/2;

cout<

getch();

return 0;

}

حالا اگه کاربر یک عدد فرد مثلا سه وارد کند خروجی برنامه یک خواهد بود

بدلیل این که دو عدد صحیح بر یکدیگر تقسیم شده اند جواب نیز عددی صحیح

است در این مثال میبینید که حتی با تعریف متغییر b بعنوان ممیز شناور

مشکل همچنان پا بر جاست زیراکه حاصل تقسیم صحیح است وبه نوع متغییر

مربوط نمی شود برای حل مشکل باید بنویسید b=static_cast(a/2);

به این عمل تغییر نوع  یا type casting میگویند که برای کامپایلر نوع عبارت

را تعریف میکند. من از این دستور استفاده کردم اما در توربو سی سه کار نکرد

 بجای آن از دستور

b=(float)a/2;استفاده کردم که از دستور های زبان cاست . این کامپایلر زیادی قدیمی بهتر یه بهتر شو گیر بیارید. مثلا Borland C++ 5.02یا visual c++ 6 که البته

این مورد آخر دستور های مد گرافیک رو اجرا نمی کنه.

در یافت این پست به صورت پی.دی.اف

+ نوشته شده توسط سجاد مهدی بیرقدار در پنجشنبه بیست و سوم فروردین 1386 و ساعت 11:45 |

سلام

همه جا اول از شناسه ها متغییر ها و... شروع می کنن اما من میگم اول باید

یه Compiler خوب پیدا کنیم بعد باید باهاش دوست بشیم ورفتاراش و

منظورهاش رو بفهمیم.

خب لینک کامپایلر رو براتون گذاشتم که می تونید دانلود کنید.

بدیش این که ورژنش یکم پایین و محیطش داس اگه ویندوز 98 یا ME دارید

از سیستم عامل های ذکر شده استفاده کنید چون ویندوز ایکس پی با برنامه

های داسی قدیمی یکمی مشکل داره وسرعت سیستم عامل رو میاره پایین.

دانلود ونصب

بعد ازدانلود با استفاده از برنامه فشرده سازی WinRAR کامپایلر را از حالت

فشرده خارج کنید فایل install.bat را اجرا کنید کامپایلر در پارتیشن C نصب

خواهد شد.

برای ورود به محیط کامپایلر C:\TC\BIN\TC.EXEرا اجرا نمایید

 

به نظر من این کامپایلر کامل هستش وتمام دستورات از جمله وقفه ها و دستورات مد گرافیک

رو اجرا می کنه.

 

نکاتی مهم:

 

لازم بگم که کامپایلر های بور لند خطاها ی برنام رو یه خط بالا و پایین نشون می ده!!!

 

این زبان به حروف کوچک و بزرگ حساس است معنیش این که اگه بجای تابع

coutبنویسید Cout  کامپایلر خطا می گیره وبعد چند ساعت تازه می فهمید که

مشکل چیه خب البته کامپایلر هم حق داره چون این زبان این دو عبارت رو دو

شناسه و در نتیجه دو تابع مختلف شناسایی می کنه در حالی که Cout وجود

نداره وبرنامه این تابع رو نمی شناسه.

 

وجود خطا در برنامه طبیعی و لازم است (البته تا وقتی که بدست کاربر نهایی

نرسیده) پس با دیدن حتی چهلتا خطا هم نباید ناراحت شد باید پیغامها رو خواند

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

فراموش شده ممکن سه تا خطای نامربوط ایجاد بشه و پیغامهای عجیبی ببینید

که بعد از یه مدت بهش عادت میکنید و پیغام ها و معانیشون رو دستون میاد.

 

بخوانیم یا بنویسیم؟       جونم !!!   بخوانید و بنویسید.

بعضی ها کتاب می خواند بعد دوباره می خوا نند وبازهم میخوانند آخ که چقدر

زحمت می کشند جدی می گم ها اگه فقط نصف وقتی که برای خواندن صرف

میکنن رو روی برنامه نویسی عملی روی کامپیوتر صرف کنن با زحمتی کمتر

بیشتر یاد میگیرن می دونید برنامه نویسی هم مثل ریاضی هر چقدر بخوانید

بازهم نمی تونید تمرین حل کنید مگر اینکه.... تمرین زیاد حل کنید.

 

چه کتابی بخوانیم:

الان که دارم اینو تایپ میکنم کتاب برنامه نویسی پیشرفته نوشته ی داریوش

نیک مهر دستم اما کتاب دکتر فراهی رو هنوز ندیدم کتابی که در دست دارم

نیاز به یک استاد برای تدریس دارد و مطالب مبحث فایل ها درآن ذکر نشده

احتمالا با خواندن کتاب دکتر فراهی و این کتاب می توان تمام مطالب رو یاد

گرفت.اما اگه دنبال منابع دیگری هم می گردید من کتاب های CوC++

مهندس عین الله جعفر نژادقمی رو به شما معرفی میکنم اولیش آموزش C

هست بعلاوه گرافیک و وقفه ها برنامه نوبسی سیستمی که این قسمتش بیشتر

برای ترم بعد مفید ودومیش کتاب آموزشی C++ هست که خیلی جامع هست

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

زبان بسیار مطرح مهم( البته C++ داره جا ش رو به C# می ده اما نه کاملا)هست

لازم بگم که مطالب این کتاب اگر چه راجع بهC++ اما مفاهیم مهمی داره

که در بیشتر زبانها وجود داره آخرش این که اگه C++رو فهمیدید یادگیری

بقیه زبان ها براتون خیلی کاری نداره.

 

پیش به سوی C++

 

شناسه ها

تمام کلمات شامل نام توابع نام متغیر ها و... شناسه هستند نام گذاری این

شناسه ها قوانینی دارد

1.شامل کرکترها A-Z a-z اعداد و زیر خط _میباشند

2.بااعداد شروع نمی شوند و بهتر است به _ نیز شروع نشوند

 

انواع متغیرها

انواع پایه (یعنی انواعی که انواع داده ای جدید از آنها ساخته میشوند)در C++

در این جدول معرفی شده نوع bool نیز در برخی کامپایلرها با قا بلیت ذخیره

مقادیر  falseو trueقرار داده شده

 

با استفاده از کلمات

         signed unsigned short long

می توانید انواع جدیدی ایجاد کنید

long بازه مقادیر را بزرگتر می کند و unsigned با در نظر نگرفتن مقادیر

منفی بازه مقادیر را دو برابر می کند.قبل از استفاده از این پیشوندها باید کمی

فکر کرد تا عبارات بی مورد یا خطا ساز بکار نرود مثلا

signed int  بی مورد است چون با توجه به جدول بالا همان int است

یا long char بی معناست زیرا کاراکتری با کد بزرگتر از 255 نداریم

 

نکته :

بازه ی مقدار char عددی اعلام شده زیرا فقط عدد است که در حافظه ذخیره

می شود واین برنامه است که این اعداد را به صورت کاراکتر نمایش میدهد

همجنین نوع unsigned char  مقادیر 0 تا 255 را که همان کد های کاراکتر

ها میباشد را ذخیره می کند از نظر کار با کاراکترها دو نوع مذکور تفاوتی

ندارند اما اگر بخواهیم با کد کاراکترها کارکنیم اهمیت محاسباتی می یابد.

 

اعلان متغیر ها

; نام متغیر  نوع داده ای

int a;

long int b,c;

char d;

در C++ متغییر ها مقدار اولیه ندارند یعنی محتویات متغیر های تعریف شده

در بالا بلافاصله بعد ازتعریف هر چیزی میتواند باشد در حالی که پاسکال

خودش بلا فاصله بعد از تعریف متغییر به همه آنها مقدار اولیه ی صفر می دهد

توجه کنید که مقدار اولیه ی صفر برای متغییر کاراکتری یعنی کاراکتی با کد

صفر و منظور کاراکتری که نمایانگر صفر عددی است وکد آن 48 است نیست

منظور یک بایت حافظه است که هر 8 بیت آن صفر شده به این کاراکتر با کد

صفر NULL می گویند.

برای مقدار اولیه دادن به متغیر ها می توانید به صورت زیر عمل کنید

int a=0;

long int b=0,c=135;

char d=’A’,e=65;

برای مقدار دهی به متغییر های کاراکتری یا باید کاراکتر مد نظر را بین’’

قرار بدید یا مستقیما کد کاراکتر را به متغییر انتساب بدید.

در مورد رشته ها هم فعلا فقط یه اشاره می کنم که آرایه ای از کاراکترهاست

مثل پاسکال اما در پاسکال طول رشته در خانه ی صفر آرایه ذخیره میشد

C++ برای تعیین طول رشته انتهای رشته را با کاراکتر NULL می بنده

و تعیین میکند.

چرا باید طول رشته تعیین شه؟

برای چاپ رشته روی مانیتور نمی شه که همین جوری محتوای حافظه رو

چاپ کرد برنامه باید بدون چند کاراکتر رو چاپ کنه تا کار بر با مانیتوری

پر از چیزهای عجیب وناخوانا(محتویات حافظه به زبان ماشین)روبرو نشه

که البته این فقط یکی از جواب های این سوال

 

لطفا خودتون انواع عملگر ها و ترتیب اجراشون ورو مطالعه کنید بهتر حفظ

هم کنید من که حفظ نیستم حفظمم نمیشه

 

دانلود کامپایلر

 

نظر یادتون نره  سوال جواب مشکل ... در خدمتیم

+ نوشته شده توسط سجاد مهدی بیرقدار در سه شنبه چهاردهم فروردین 1386 و ساعت 23:29 |