نکات مهم در ++C

میتا

کاربر بیش فعال
به نظر میرسه دانستن یه سری نکات برای کسی که میخواد تازه با c++ کار کنه، ضروریه
البته من میخوام نکات رو به زبان خیلی ساده بگم (تا جایی که ممکنه!)
مثلاٌ اینکه اصلاٌ چرا میخواد با c++ کار کنه؟! یا فرق های این زبان با زبانی مثل c چیه؟
همه ما میدونیم c++ زبان شی گرا یا به اصطلاح object-oriented هست.
خب این یه فرق اساسی با زبان c بود ولی چرا نیاز بود که یک زبان برنامه نویسی شی گرا بشه ؟ یا شی گرایی چیه؟
زبان c++ شی گراست یعنی در اون اگه میخوایم مثلاٌ درباره یه دستگیره در (!) کد بنویسیم، کاربر استفاده کننده از برنامه ما نباید از مکانیسم داخلی این دستگیره چیزی بفهمه ؛
اینکه به طور مثال یه میله داخل یه حلقه باید بچرخه یا چیزای دیگه و طبیعتاٌ وقتی که اندازه این میله هم تغییر کنه و کوچیک و بزرگ شه هم کاربر از وجود اون مطلع نمیشه.
پس با این کار ما به طریقی داریم دسترسی کاربر رو به برنامه کمتر می کنیم. در مورد کد هایی که میخوان فروخته بشن خب این یه اصله.یعنی در کدهای خیلی مهم پیاده سازی (implement) باید از اطلاعات اصلی کد جدا بشه.
 
آخرین ویرایش:

میتا

کاربر بیش فعال
شی گرایی با کلاس بندی هر موضوع به پیاده سازی راحتتر کد هم کمک میکنه. اگه میخوایید در مورد یه بازی کد بنویسین که اعضای اصلی (!) اون تخته و مهره است، باید چند تا کلاس مثل کلاس تخته، مهره (که در این کلاس میتونیم مهره هایی با رنگ های مختلف داشته باشیم)، نحوه کار بازی و ... داشته باشید.
چرا؟
چون اینجوری اگه یه تغییر در کدتون ایجاد بشه و مثلاٌ بخواین به بازی یه مهره زرد رو هم اضافه کنین دیگه لازم نیست رو کل کد دست ببرین و فقط کافیه به کلاس مربوطه (در اینجا مهره) رنگ زرد رو هم اضافه کنین. این یکی از مزیتهای اصلی شی گرایی بود و c این امکان رو نداشت.



 

میتا

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

 

میتا

کاربر بیش فعال
همون طور که گفتم کلمات کلیدی در زبان های برنامه نویسی خیلی مهمند
چرا؟
چون حتی برنامه نویس های حرفه ای هم ممکنه روزی یکی از این کلمات رو فراموش کنن! مثل خود کلمه key.
و نتیجه چیه؟
اینکه ممکنه به اشتباه اونها رو به عنوان نام متغیرهاتون بذارید و بقیه کار به شانس شما بستگی داره چون ممکنه برنامتون حتی به کامپایل هم نرسه....
اما خب اگه خوش شانس باشید شاید با اجرای برنامه کد به یکی از کدهای ذخیره شده در کامپایلرتون هدایت بشه و شما متوجه بشید که یه جای کار اشکال داشته
در هر صورت ممکنه الان به این فکر افتاده باشیم که:
چطوری میشه این همه کلمه رو از کتابخونه عظیم++ c حفظ کرد؟
باید گفت بعداٌ در برنامه ها شما قادرید در ابتدای کد کلمات کلیدی که در اون کد استفاده کردید رو مشخص کنید ، اینجوری دیگه کد از همه کتابخونه استفاده نخواهد کرد.
 

میتا

کاربر بیش فعال
اساس کار در محیط ++c
1)ویرایش کد
2)پیش پردازش
3)کامپایل
4)ارتباط
5)بار گذاری
6)اجرا
البته شاید زیاد مهم به نظر نرسه که ++c دقیقاٌ چی کار میکنه !
اما خب برای یه برنامه نویس حرفه ای این مهمهhttp://www.www.www.iran-eng.ir/images/icons/graduated.gif
شکل پایینو نگاه کنین خیلی خوب توضیح داده
البته من ترجمه فارسی این قسمت رو هم میذارم





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

میتا

کاربر بیش فعال
سیستم IO چیست؟
برنامه نویسا اصطلاحاٌ به سیستم ورودی و خروجی IO میگویند
IO ابتدای کلمات Input و Output است.
و شامل کلمات کلیدی پایین میشه
cin
که جریان ورودی استاندارد است و از طریق کیبورد وارد میشود.
cout جریان استاندارد خروجی است و در صفحه نمایش این جریان را داریم .
cerr جریان استاندارد ارورهاست.
 
آخرین ویرایش:

میتا

کاربر بیش فعال
نکته مهم در مورد فایل های سرآمد (header files) در زبان ++C اینه که فقط دونوع پسوند داریم
یکی cpp و دیگری .h
اما در پیش نویس های جدیدتر ++C پسوند .h کاربردی نداره.
خط using namespace std; در کدها نشون میده برنامه نویس داره از کتابخونه استاندارد ++C استفاده میکنه.
ولی باید یادمون باشه برای اعلان کتابخونه ای که خودمون ساختیم دیگه نمیتونیم از اسم std استفاده کنیم و مثلاٌ میتونیم اسم necessary رو به اون بدیم.
توصیه میشه در کدها یه کتابخونه برای خودتون بسازید تا مجبور نباشید از کل کلمات کلیدی با خبر باشید!
راستی اگه کد به صورت std::cout نوشته بشه دیگه لازم نیس از دستور بالا استفاده کنین یعنی از دستور using.
 

میتا

کاربر بیش فعال
تابع Inline:
تابع Inline در زبان c هم وجود داشت. اما کار اون چیه؟
شاید در مقاله ها زیاد دیده باشید که اگه از یک عبارت زیاد استفاده بشه نام مختصری به اون میدیم و در نتیجه از اون به بعد به جای عبارت طولانی این نام رو میاریم.
خب، طرز کار Inline هم همین طوره. کلاٌ Inline یعنی توصیه کردن . پس ما داریم به صورتی به کامپایلر توصیه کاهش کد رو میدیم .

این روش مثل فراخوانی یک تابعه، اما سریعتر از اونه
ولی عیب هایی هم داره که بعداٌ راجبش بیشتر میگم.
class Fred {
public:
void f(int i, char c);
};

حالا با استفاده از inline کد به این صورت درمیاد:
inline
void Fred::f(int i, char c)
{
...
}

درست مثل یه تعریف
 

میتا

کاربر بیش فعال
++C مثل C زبانی حساس به حروفه یعنی همون Case Sensitive

return 0; نشان میدهد برنامه با موفقیت ایجاد شده

در مورد عملگر تقسیم یا / : در اون گرد کردن اتفاق نمی افته پس حاصل 7 تقسیم بر 4 1 خواهد بود.
% باقی مانده تقسیم دو عدد رو بر هم نشون میده

ترتیب ارزیابی عملگرها:
پرانتز-باقی مانده تقسیم دو عدد بر هم-ضرب و تقسیم-جمع و تفریق
در ضمن ترتیب ارزیابی از چپ به راسته ولی مثلاٌ اگه در یه عبارت دوتا پرانتز داشته باشیم پرانتز سمت راستی زودتر از پرانتز سمت چپ زودتر اجرا میشه

و نکته آخر این پست:
در مورد شرطها است و عملگر == که در شرطها و برای ارزیابی دو عبارت به کار میره اینکه عبارت اول مساوی عبارت دوم هست یا نه؟
پس اون رو با عملگر = اشتباه نکنیم:warn:
 

میتا

کاربر بیش فعال
یه چند تا نکته که به نظرم میرسه خوبه در کدها رعایت بشه:
استفاده از عملگرهای انتسابه، مثلاٌ به جای نوشتن C=C+3 میتونیم از عملگر =+استفاده کنیم
و کد به این صورت درمیاد:
C+=3
راستی توضیحه تفاوت a++ و ++a رو هم همین جا میگم
وقتی عملگر ++ قبل از متغیر میاد یک واحد به متغیر اضافه میشه و بعد اگه تغییراتی داشته باشیم صورت میگیره
اما اگه بعد از اون بیاد اول عملیات اجرا میشه و بعد مقدار یه واحد اضافه میشه
 

میتا

کاربر بیش فعال
توابع:
اول باید بگم همه متغیرهایی رو که درون تابع تعریف میکنیم، محلی اند.
کد:
 [B]شکل کلی تابع هم این طوره:[/B] } ( فهرست پارامترها )   نام تابع    نوع مقدار بازگردانده شده
اعلانها و دستورها
}
یه مثال میزنم تابع میانگین یا average رو در نظر بگیریم :
کد:
int average ( int a , int b )
return (a+b) / 2;
}
تابع بالا میانگین دو عدد رو حساب میکنه و همون که می بینید، دو عدد رو از کاربر میگیره که در واقع همون آرگومانهای فرستاده شده است(function prototype). و آرگومانی رو هم که برمیگردونه از نوع صحیحه، چرا؟
به خاطر int قبل از نام تابع.
 

میتا

کاربر بیش فعال
نمونه اولیه و امضا یه تابع چیه؟

اول این مثال رو ببینید:
کد:
[B]int average(int,int,int);[/B]
این یه نمونه اولیه تابعه.
مزیت هاش اینه که به وسیله اون میتونیم نام تابع، نوع داده ای که برمیگردونه، تعداد پارامترهایی که تابع انتظار دریافت اونا رو داره و نوع و ترتیبشون رو بفهمیم.
در ضمن همین جا اینم به یاد داشته باشین که
امضا یه تابع نامش هست + نوع آرگومان هاش
 

sara.mortazavi

کاربر حرفه ای
سلام خسته نباشی
من دستورو مینویسم ولی کامپایل نمیشه درنتیجه ران هم نمیشه
دستورزیرومینویسم
#includ<iostream>
int main()
{
cin<<A<<B<<C;
float avg=(A+b+c)/3;
cout<<"avg is:<<avg;
return0;
}
مشکل از قسمت قرمزه
درستش چیه
 

A.S.Roma

عضو جدید
کاربر ممتاز
شما بایستی ابتدا متغییر تغییر کنید بعد از دستور cin استفاده کنید.
مثلا" :
کد:
int a,b,c;
cin >>a>>b>>c;
ضمنا" برای محاسبه میانگین Type Casting فراموش نشود.
کد:
float avg = (float)(a+b+c)/3;
 

میتا

کاربر بیش فعال
سلام خسته نباشی
من دستورو مینویسم ولی کامپایل نمیشه درنتیجه ران هم نمیشه
دستورزیرومینویسم
#includ<iostream>
int main()
{
cin<<A<<B<<C;
float avg=(A+b+c)/3;
cout<<"avg is:<<avg;
return0;
}
مشکل از قسمت قرمزه
درستش چیه

خب من یکی یکی اشکالاتون رو مینویسم
:1) در قسمت اول include رو درست ننوشتید؛ گرچه احتمالا موقع کامپایل درست نوشته بودین که خطا نداده!
2)همون طور که دوستمون گفتن باید متغیرهای a و b و c تعریف بشن؛ شما در اعلان هر چیزی باید type یا نوعش رو بگید.
3) دستور cin درست نوشته نشده چون بعد cin علامت << میاد نه >> :smile:
4)در قسمتی که دارید میانگین رو حساب میکنین دقت داشته باشید که زبان ++C حساس به حروفه ؛ در نتیجه متغیر A رو که با حرف بزرگ نوشتیم نمیشناسه ! یه متغیر اگه با حرف بزرگ نوشته میشه تا آخر باید همینجوری پیش بره
5) یه دونه " هم کنار avg is بذارید حله !!! :D
 

sara.mortazavi

کاربر حرفه ای
:confused::cry:#include<iostream>
int main()
{
int a,b,c;
cin>>a>>b>>c;
float avg = (float)(a+b+c)/3;
cout<<"avg is"<<avg;
return0;
}
 

میتا

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

کد:
#include<iostream.h>
#include<conio.h>
int main()
{
int a;
int b;
int c;
cout<<"plz enter 3 numbers";
cin>>a>>b>>c;
float avg=float(a+b+c)/3;
cout<<"avg is:"<<avg;
getch();
}
 

میتا

کاربر بیش فعال
روشهای فراخوانی تابع:
1)فراخوانی با مقدار
2)فراخوانی با ارجاع

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

میتا

کاربر بیش فعال
قالب فراخوانی با ارجاع به این صورت نشون داده میشه:
int &counter
یا
int& counter
و معنیش هم اینه:
counter یه ارجاع به int است.
یادتون باشه کلاٌ فراخوانی با مقدار و فراخوانی با ارجاع مثل هم نوشته میشن، یعنی از نظر تابع یه قالب دارند.
خب، پس از کجا بفهمیم کدوم فراخوانی مد نظر بوده؟
از نوع آرگومانی که گرفته و در واقع نمونه اولیه تابع میشه اینو فهمید.
همون طور که گفتم قبل از متغیر فراخوانی شده توسط ارجاع یه & میاد
یه نکته مهم دیگه هم اینه که در داده های بزرگ همیشه از فراخوانی توسط ارجاع استفاده کنین که دیگه زمان برای کپی شدن حجم زیاد داده مصرف نشه
 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
با اجازه صاحب تاپیک

این باید کار کنه 100 %

کد:
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
int a,b,c;
float avg;
cin >>a>>b>>c;
avg =(a+b+c)/3;
cout<<"avg is : "<<avg <<"\n";
system("PAUSE");
return EXIT_SUCCESS;
}

با سلام،
بخش هایی از کدی که نوشتید مربوط به ++VC بنابراین ممکنه مشکل رو بیشتر کنه!
 

میتا

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

دوست من فک کنم یکی از مشکلای run نشدن برنامه شما در اینجا بود که از getch() استفاده نکردید!
آخه این دستور باعث میشه شما برنامتون رو تا آخرین مرحله ببینید.

غیر از اون حتما اشکالی که در run برنامه هست رو بنویسید تا بفهمیم مشکل کجاست:)
با سلام،
البته نمی دونم می شه منم تو این بحث شرکت کنم یا نه، ولی اگه امکان داره برنامه رو عیناً این جا بزارید. دقیقاً اون چیزی که تو کتاب نوشته.
در ضمن کامپایلری رو هم که ازش استفاده می کنید، بنویسید.

خواهش میکنم؛ خوشحال میشیم از نظراتون استفاده کنیم:gol:
 

میتا

کاربر بیش فعال
عملگر یگانی تفکیک حوزه ( :: )

به کمک این عملگر میتونیم متغیرای سراسری و محلی با نامهای یکسانی داشته باشیم.
و بنابراین در حوزه متغیر محلی میشه به متغیر سراسری هم دسترسی داشت
.
البته عکس این مطلب درست نیست،
یعنی نمیشه در حوزه متغیر سراسری به متغیر محلی دسترسی پیدا کنیم
.
 

میتا

کاربر بیش فعال
گرانبار کردن توابع چیه؟ و چه فایده ای داره؟

در ++C میتونیم چند تا تابع با نامهای یکسانی داشته باشیم که البته پارامترهای اونا متفاوت باشه، به این میگیم گرانبار کردن توابع !

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

zohre7

عضو جدید
سلام من هرچی یه برنامه ای مینویسم که اگر سمت راست ترین رقم عددی با چپترین برابره چاپ کنه نمیشه....
و ایا return و getch نباید هر دو با هم تو برنامه باشه؟
 

میتا

کاربر بیش فعال
سلام من هرچی یه برنامه ای مینویسم که اگر سمت راست ترین رقم عددی با چپترین برابره چاپ کنه نمیشه....
و ایا return و getch نباید هر دو با هم تو برنامه باشه؟

در مورد سوال اولتون، برنامه ای رو که نوشتید اینجا بذارید تا مشکلشو پیدا کنم
اما سوال دومتون : اشکالی نداره getch و return با هم باشند، چون ربطی به هم ندارند.
 
بالا