# Native Code > برنامه نویسی با C > برنامه نویسی با زبان C و ++C > سوال: مشكلات من با ++C

## majmaji

سلام دوستان من دارم برنامه نويسي ++C كار ميكنم براي همين وقتي به مشكل بر مي‌خورم كسي نيست كه ازش سوال كنم بهم جواب بده
حالا اگه ممكنه شما دوستان كمك كنيد به بنده (البته ناراحت نشيد من يكم گيراييم كمه :لبخند گشاده!: ) باسه همين ممنون ميشم با صبر و شكيبايي كمك كنيد به بنده تا شايد حرفه اي شم مرسي ممنون

----------


## majmaji

خوب دوستان شروع ميكنيم من خوندم و رسيدم به ساختار تكرار do......while
در مثالي ميخواهيم كه برنامه اي بنويسيم كه تعدادي عدد از ورودي خوانده وارون آنها را به خروجي مي‌برد مثلا يه عدد مثل 1357 بگيره و 7531 رو در خروجي نمايش بده
 #include <iostream.h>
#include <conio.h>
int main()
{
int num, digit;
clrscr();
while(1){
cout<<"\nEnter a number:"
cin>>num;
cout<<"inverse=";
do{
digit= num%10;
cout<<digit;
num/=10;
} while(num !=0);
}//end of while(1)
//return 0;
}


خوب دوستان سوالات من
1- مگر ساختار do........while  به اين صورت نيست:
}do
دستور 1
دستور 2
..........
دستور n
;(شرط) while{
پس اگر اينطوره چرا در تمرين بالا اول while اومده بعدش do ؟
2- مگر در while نبايد يه متغير رو مقدار بديم مثلا بگيم while(r=2)پس چرا اينجا گفته while (1) اصلا اين يعني چي؟
3- چرا برنامه داراي تابع ()getch نيست و چرا تابع return 0 در توضيحات اومده؟
ممنون ميشم اينو حسابي توضيح بديد

----------


## Yasersadegh

سلام دوست عزيز
خوب دوست عزيز من تبريك ميگم بهتون كه به سي ++ علاقه مند شديد و شروع به ياد گيري كرديد!! مطمئن باشيد كه بنده و دوستان و اساتيد محترم هر چقدر كه بتونيم كمكتون خواهيم كرد!!
حالا در مورد اين مسئله بنده توضيحاتي عرض مي كنم كه اميدوارم جواب سوالاتتون رو بگيريد!!

**** كاري كه اين برنامه انجام ميده اينه كه يه عدد رو از كاربر ميگيره و اون رو به طور برعكس چاپ مي كنه و *اين كار رو تا بينهايت انجام ميده!!* يعني چي!؟ يعني بعد از نمايش عكس يك عدد، عدد بعدي رو ميگيره و همين كار رو تكرار مي كنه!! در واقع يعني برنامه پاياني نداره!! :لبخند:  ( مگر اينكه كاربر دستي برنامه رو ببنده!! :لبخند گشاده!: )
**** بنابراين در اين برنامه از دو حلقه استفاده شده كه *يكي برايه تكرار برنامه مي باشد* كه همان حلقه 

while(1){


}//end of while(1)
مي باشد! اين حلقه دارايه يك شرط شروع مي باشد كه در اينجا برابر 1 مي باشد!! اين بدين معني است كه هميشه شرط حلقه true مي باشد و حلقه هميشه اجرا مي شود!!( در اصطلاح حلقه بينهايت مي باشد!!) 
و *حلقه ديگر برايه انجام عمل مربوط به برنامه مي باشد* كه همان حلقه 

do{


}while(num!=0)
مي باشد!! اين حلقه نيز دارايه يك شرط خاتمه مي باشد كه در اينجا num!=0 مي باشد!!
***ت**فاوت اين دو نوع while* تنها در اين مي باشد كه حلقه do...while هميشه حداقل يكبار اجرا ميشود!! يعني حتي اگر شرط حلقه false باشد اين حلقه يكبار اجرا مي شود ولي حلقه while در صورت غلط بودن شرط اجرا نخواهد شد!! :لبخند: 
****در مورد تابع getch هم بايد بگم كه دليل استفاده آن در پايان هر برنامه تنها برايه آن است كه برنامه بشته نشده و بتوان خروجي را مشهاده كرد!! اما در اين برنامه چون بعد از اتمام عمليات عدد بعدي گرفته مي شود و برنامه بشته نمي شود مي توان خروجي را ديد پس نيازي به اين تابع نمي باشد!!  :لبخند گشاده!: 
**** در مورد return 0 هم احتمالا چون برنامه خاتمه نخواهد يافت آن را در توضيحات آورده اند!!  :لبخند گشاده!: ولي منطقي نيست و احتمالا برنامه موقع كامپايل يه warning در اين مورد نشان ميدهد!! :خجالت: 

موفق باشيد :چشمک:

----------


## majmaji

دوست من دستت درد نكنه خيلي خوب توضيح دادي فهميدم ولي برنامه بدون ارور كار كرد
يعني وقتي return 0 رو در // زدم هيچ اروري نداد احتمالا بخاطر اين بوده كه برنامه خاتمه پيدا نميكرده
البته بگم من بدون// هم برنامه رو اجرا كردم ارور داد
و اصلا return 0 رو هم حذف كردم بازم ارور داد

----------


## afi_program

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

----------


## majmaji

درسته منظور من هم همون warning بود اما چرا هميشه return 0 جزء خطوط اجرايي بود و اجرا مي‌شد اما الان تو اين برنامه نبايد جزء خطوط اجرايي باشه و بايد تو توضيحات بياد.
تازه وقتي هم كه از خطوط اجرايي پاكش كردم باز هم warning داد
يعني بخاطر همون(1)while هست كه return 0 جزء خطوط اجرايي نيست؟

----------


## clover

> درسته منظور من هم همون warning بود اما چرا هميشه return 0 جزء خطوط اجرايي بود و اجرا مي‌شد اما الان تو اين برنامه نبايد جزء خطوط اجرايي باشه و بايد تو توضيحات بياد.
> تازه وقتي هم كه از خطوط اجرايي پاكش كردم باز هم warning داد
> يعني بخاطر همون(1)while هست كه return 0 جزء خطوط اجرايي نيست؟


شما تابع main را از نوع int تعریف کردید و معناش این هست که تابع یک مقدار برگشتی از نوع int داره . کامپایلر کاری به این که حلقه تا بی نهایت تکرار میشه نداره . مهم اینه که main یک تابع از نوع int هست و وقتی دستور ;return 0 را از برنامه حذف کنی کامپایلر اخطار میده که تابع شما نوع مورد نظر را برگشت نداد ، همین .

----------


## majmaji

> شما تابع main را از نوع int تعریف کردید و معناش این هست که تابع یک مقدار برگشتی از نوع int داره . کامپایلر کاری به این که حلقه تا بی نهایت تکرار میشه نداره . مهم اینه که main یک تابع از نوع int هست و وقتی دستور ;return 0 را از برنامه حذف کنی کامپایلر اخطار میده که تابع شما نوع مورد نظر را برگشت نداد ، همین .


خوب پس چرا در مثال بالا تو توضيحات نوشته شده؟

----------


## clover

> خوب پس چرا در مثال بالا تو توضيحات نوشته شده؟


خیلی ساده باید بگم که این کار اشتباه بوده . می تونست تابع main را از نوع void تعریف کنه ، اما به نظر من تعریف تابع main به صورت int و بعد قید ;return 0 به عنوان توضیح کار اشتباهی بوده ، به همین سادگی .

----------


## afi_program

با نظر دوستمون موافقم بهتر بود ازنوع void تعریف می شد اما چون هرگز اجرا نمیشد(تو برنامه مورد نظر)به عنوان توضیحات اومده بود تا بگه که این خط جز برنامه است البته من اینجوری فکر میکنم ولی بهتر بود این کارو نمیکرد

----------


## majmaji

دوستان عزيز راهنمايياتون بسيار عالي بود. خيلي ممنون كه به بنده اهميت ميديد و باعث رشد بنده در امر برنامه نويسي ميشيد.
در ادامه به ساختار هاي تصميم ميرسيم
ساختار تصميم if
در تمريني كه داريم ميخواهيم برنامه اي بنويسيم كه يك جمله از ورودي بگيره و تعداد كاركتر و كلمه جمله رو به خروجي ببره و نمايش بده.
 #include <iostream.h>
#include <conio.h>
int main()
{
int charcount=0, wordcount=0;
char ch;
clrscr();
cout<<"\nEnter a statement(and press Enter):";
while((ch=getch()) != '\r'){
if(ch==' ')
wordcount++;
}//end of while
cout<<"\nChar count="<<charcount<<",Wordcount="<<wordcount+1;
getch();
return 0;
}

خوب دوستان من اين مثال رو قشنگ فهميدم بجز اينجا while((ch=getch()) != '\r')
اين رو ميتونيد توضيح بديد.
بعد يه سوال ديگه چرا ساختار تصميم if در ساختار كنترلي while قرار داره؟

----------


## Yasersadegh

با عرض سلام دوباره به دوستان
خوب دوست عزيز در مورد اين مثالي كه نوشتي اول يه مسئله رو بگم و اون اينكه يك خط تويه كدت جا افتاده!! شما بايد بعد از حلقه while و قبل از شرط if كد زير رو بنويسيد!!

charcount++;
خوب اگه اجازه بديد حالا من توضيحي راجع به اين برنامه بدم!!
اين برنامه قراره يك جمله رو از كاربر بگيره و تعداد كاراكترها و كلمات اين جمله رو به كاربر نمايش بده!! :لبخند گشاده!: 
حالا اين برنامه به اين روش عمل مي كنه كه در يك حلقه كاركتر به كاركتر از ورودي مي خونه و هربار به متغير charcount يك واحد اضافه مي كنه، و با استفاده از if بررسي ميكنه كه اگه كاراكتر وارد شده جايخالي باشد، به معني يه كلمه مي باشد، و يك واحد به متغير wordcount اضافه ميكند!!
*نكته اينجاست* كه اين حلقه تا وارد كردن كاركتر سطر بعد ('r\') ادامه پيدا ميكند!! كه اين كاراكتر با زدن كليد Enter وارد مي شود!! :لبخند: 
***** البته به نظر بنده بايد به جايه كاركتر 'r\' از كاركتر 'n\' استفاده شود!! :متفکر: 
پس بنابراين حلقه اي كه اشاره كرديد براي تشخيص كليد enter يا همان پايان جمله مي باشد كه شرط اتمام حلقه است!! :لبخند گشاده!: 
ضمنا فكر ميكنم جواب اينكه چرا شرط if در داخل حلقه استفاده شده است، را هم گرفتيد!!! :متفکر: 

اميدوارم كه توضيحات كافي باشه!! :خجالت: 
موفق باشيد :چشمک:

----------


## majmaji

درسته من اون خط رو جا انداختم ممنون از تذكرتون
خوب اينكه بفهمه آخر جمله كجاست ميتونست يطور ديگه بگه بدون استفاده از  ch=getch() !='\n
مثلا اينطوري
 for(count=0; cin.get() !='.'; count++);

يه سوال ديگه من نفهميدم چرا if رو تو while به كار برد.

----------


## Yasersadegh

خوب دوست عزيز مي دونيد فرق اين كدي كه گفتيد با getch چيه!!؟ :متفکر: 
ببينيد تابع زير هر بار تنها يك كاراكتر مي خونه و به محض وارد كردن يك كاراكتر به دستور بعدي ميره!!

c=getch();
 ولي دستور زير با خوندن يك يا چند كاراكتر كنترل برنامه رو به دستور بعدي نمي بره، و كاربر تا كليد enter رو نزنه به دستور بعدي نميره!!

cin.get();
حالا در اين برنامه تنها هدف تعداد كاركترها نيست. بلكه بايد تعداد كلمات را هم پيدا كرد، كه برايه اين كار با استفاده از دستوري كه شما گفتيد ،بايد كاركتري كه با دستور cin.get كاربر وارد مي كنه را در يك متغير ذخيره كنيد، و سپس در داخل حلقه آن مقدار را با جايخالي مقايسه كنيد (مانند مثال قبل) و اگر برابر بود، مقدار wordcount رو هم يك واحد اضافه كنيد!!!
****اما* اگر اين كد را پياده سازي كنيد در اين حالت كاربر بايد *بعد از هر كاركتر يك بار كليد Enter را فشار دهد!!*  دليل اين هم همان است كه در بالا عرض كردم!!!
*دليل استفاده از getch*   فقط و فقط برايه اين است كه *به محض ورود هر كاراكتر* به خط بعد و دستور بعد ميرود و ديگر نيازي به زدن Enter بعد از هر كاراكتر نمي باشد!! :لبخند گشاده!: 

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

while(c=getch() !='.')

*اما در مورد استفاده دستور if* *در داخل حلقه*!! چون بعد از خواندن هر كاركتر با دستور getch و بررسيه اون اگر مخالف 'n\' باشه كنترل برنامه داخل حلقه وارد ميشود بنابراين در داخل حلقه بايد بررسي نمود كه* آيا كاراكتر وارد شده برابر جايخالي است يا خير!!!؟*  كه اين عبارت همان دستور if است، پس بايد در داخل حلقه بررسي شود!! :لبخند گشاده!: 

موفق باشي دوست عزيز :چشمک:

----------


## majmaji

ممنون از همه دوستاي خوبم
خوب دوستان اميدوارم طاعات و عبادات شما در اين ماه مبارك قبول باشه ما رو هم دعا كنيد ممنون
در ادامه ميرسيم به برنامه اي براي جدول كد اسكي
 #Include <iostream.h>
#include <conio.h>
int main()
{
int i;
char ch;
clrscr();
for(i=41; i<=120; i++){
ch= i;
cout<<i<<"="<<" "<<ch<<" ";
if(i% 5==0)
cout<<"\n"
}//end of for
getch();
return 0;
}
خوب دوستان من فقط دو تا سوال دارم در اونجا كه كاركتر ch را با عدد صحيح i برابر كرده ميتونست بر عكس بنويسه يعني بنويسه i=ch;
و سوال بعدي در cout هست اون فاصله هايي كه خالي گذاشته براي چيه؟

----------


## afi_program

سلام جواب سوال اولت منفیه چون قراره مقدار i را بریزه توی ch و نه برعکس(مقدار متغیر سمت راست در متغیر سمت چپ ریخته میشه)
جواب سوال 2:صرفا برای اینه که وقتی میخواد بعدی رو چاپ کنه با قبلی قاتی نشه.امیدوارم کافی و مفید بوده باشه.
موفق باشی

----------


## sia abedi

> ممنون از همه دوستاي خوبم
> خوب دوستان اميدوارم طاعات و عبادات شما در اين ماه مبارك قبول باشه ما رو هم دعا كنيد ممنون
> در ادامه ميرسيم به برنامه اي براي جدول كد اسكي
>  #Include <iostream.h>
> #include <conio.h>
> int main()
> {
> int i;
> char ch;
> ...


سلام دوستان ما هم در بحثتون قبول كنيد
اول از همه چرا در coutاون فاصله ها را زده بايد بگم اين كار كاملا سليقه اي هست يعني اون كسي كه اين برنامه را نوشته(كه به نظر مياد جعفر نژاد باشه)مي‌خواسته هر كد اسكي با كد بعديش پشت سر هم چاپ نشه تا شما وقتي برنامه را اجرا مي‌كنيد گيج نشيد :گیج:  به طور مثال بنويسه:
41= ) 42= * 43= + ...
ولي اگر اون فاصله ها را نمي‌گذاشت مي‌شد:
41=)42=*43=+...
البته بهتر بود به جاي فاصله \tميگذاشت تا به جاي يك فاصله 8 تا فاصله(به اندازه‌ي يك تب)مي‌داد.البته دوستمون آقاي afi_programهم درست گفته بودند ولي من احساس كردم كه براي يك تازه وارد كم توضيح داده بودند
و اما سوال اولي:
شما احتمالا منظور كسي كه برنامه را نوشته خوب نفهميديد منظور ايشان از اين كار اين بوده:
كلا در C++‎‎‎‎‎‎دو نوع تبديل نوع(type casting) داده داريم:
1.تبديل نوع ضمني:
اين تبديل نوع ضمن عمل انتساب صورت مي‌گيرد سعي مي‌كنم با زدن مثال فهم قضيه را آسون تر كنم:
 1.int x='a'
2.float y='b'
 3.char ch=97.8
 4.int a=123.56
 5.char ch=97
 
توضيحات:
1.منظور از مثال اولي اينه كه متغير xكه از نوع intاست را برابركد اسكيaيعني 97 قرار دهد
2.منظور از مثال دومي اينه كه متغير y كه از نوع floatاست را برابر كد اسكي 'b'كه همان 98است قرار دهد ولي چون yاز نوعfloat است98به صورت 98.0نگهداري مي‌كند.
3.منظور از مثال سومي اينه كه متغير ch كه از نوعcharهست را برابر97 كند چون متغر هاي charنمي‌تونن مقدار اعشاري را در خود نگه دارن(در واقع چون كد اسكي اعشاري نداريم اين اتفاق مي‌افتد)براي همين 97 در داخل ch نگهداري مي‌شود و در نهايت به كاركتري كه كد اسكي آن 97 است تبديل مي‌شود كه همان a است.
4.منظور از مثال چهارمي اينه كه متغير a كه از نوع intاست را برابر 123 قرار دهد چون متغير هاي int نمي‌توانند مقدار اعشاري را در خود نگه دارند براي همين 56. حذف مي‌شود.
5.منظور از مثال پنجمي اينه كه متغير ch كه از نوع charهست را برابر 97 قرار دهد كه در نهايت تبديل به كاركتري مي‌شود كه كد اسكي آن 97است كه همان'a'است.
حالا منظور كسي كه اين برنامه را نوشته مثل مثال 5 بوده.
راستي يك نوع تبديل نوع ديگر هم داريم كه به تبديل نوع صريح معروفه.چون تبديل نوع صريح ربطي به موضوع ما نداشت براي همين اون را توضيح ندادم ولي اگر خواستي بگو تا توضيح بدم.
مي‌دونم كه سرت رفت :متعجب:  ولي اين خواسته ي خودت بود كه به طور كامل توضيح بديم منم فقط همين كار را كردم.اگر باز هم منظورم را نفهميدي بگو تا بهتر توضيح بدم.

----------


## majmaji

> سلام دوستان ما هم در بحثتون قبول كنيد
> اول از همه چرا در coutاون فاصله ها را زده بايد بگم اين كار كاملا سليقه اي هست يعني اون كسي كه اين برنامه را نوشته(كه به نظر مياد جعفر نژاد باشه)مي‌خواسته هر كد اسكي با كد بعديش پشت سر هم چاپ نشه تا شما وقتي برنامه را اجرا مي‌كنيد گيج نشيد به طور مثال بنويسه:
> 41= ) 42= * 43= + ...
> ولي اگر اون فاصله ها را نمي‌گذاشت مي‌شد:
> 41=)42=*43=+...
> البته بهتر بود به جاي فاصله \tميگذاشت تا به جاي يك فاصله 8 تا فاصله(به اندازه‌ي يك تب)مي‌داد.البته دوستمون آقاي afi_programهم درست گفته بودند ولي من احساس كردم كه براي يك تازه وارد كم توضيح داده بودند
> و اما سوال اولي:
> شما احتمالا منظور كسي كه برنامه را نوشته خوب نفهميديد منظور ايشان از اين كار اين بوده:
> كلا در C++‎‎‎‎‎‎‎دو نوع تبديل نوع(type casting) داده داريم:
> ...


من اصلا اين آخري رو نفهميدم :ناراحت:

----------


## Yasersadegh

سلام دوست عزيز
منظورتون از آخري كدومه!!؟
اگه منظورتون مثال آخر بايد بگم كه به طور كلي منظور دوستمون sia abedi اينه كه در زبان سي يا سي++ شما در يك متغير نوع char يا نوع int حتما نبايد به ترتيب مقادير كاراكتري و عددي صحيح قرار بديد!
شما مي تونيد در يك متغير نوع int يه مقدار كاراكتري هم بريزيد (مثال 1) كه در اين صورت كد اسكي كاراكتر در متغير ذخيره ميشود كه دوستمون در مثالشون توضيح دادند!!
همچنين شما مي تونيد در يك متغير نوع char مقدار عددي هم بريزيد(مثال 5) كه در اين صورت عدد به عنوان كد اسكي در نظر گرفته شده و كاراكتر معادل آن كد اسكي در متغير ذخيره ميشود كه اين هم دوستمون در مثال 5 توضيح دادند!!
اميدوارم كه تونسته باشم خوب توضيح بدم!! :لبخند: 
موفق باشيد!! :چشمک:

----------


## majmaji

آها فهميدم چي شد :D
خوب بريم سراغ مثال بعدي
    در مثال بعدي ما برنامه اي نوشتيم كه توسط كامپيوتر يك عدد در نظر ميگيره  و كاربر بايد آن عدد رو حدس بزنه.
من اين مثال رو خيلي خوب فهميدم فقط نفهميدم چرا getch(); قبل از return 0; نيومده و در if  اومده؟
 #include <iostream.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
int magic, guess;
char ans='y';
magic=rand();
do{
cout<<"\nGuess a number:";
cin>>guess;
if(guess==magic){
cout<<"****right****";
cout<<"%d is the magic number";
getch();
ans= 'n';//end of while
}//end of if
else {
cout<<"****wrong****";
if(guess>magic){
cout<<"your guess is to hihg";
else
cout<<"your guess is to low";
cout<<"do you want to countinu?(y/n)";
cin>>ans; 
}//end of else
}while (ans=='y');
return o;
}

----------


## Yasersadegh

سلام دوست عزيز
خوب ببينيد قبلا هم در مورد دليل اين نوع استفاده getch بهتون گفتم كه برايه نگهداشتن روند اجرايه برنامه است كه خروجي رو كاربر ببينه!! اينجا هم به همين دليل getch استفاده شده!! وقتي كه كاربر عدد رو درست حدس بزنه خروجي نمايش داده ميشه و getch باعث ميشه كه برنامه منتظر بمونه تا كاربر خروجي رو ببينه!!
بنابراين چون خروجي در داخل if نمايش داده ميشه دستور getch هم در if بعد از دستور خروجي قرار مي گيره!! :لبخند گشاده!: 
اميدوارم كه متوجه علت شده باشيد!! :چشمک: 
*تذكر:* دوست عزيز در كدي كه نوشتيد دستور زير درست نيست!!

cout<<"%d is the magic number";
كه بايد به شكل زير اصلاح بشه!!

cout<<magic<<" is the magic number";
**در دستور cout از كاركتر هايي مثل d% استفاده نميشه!!

موفق باشيد :چشمک:

----------


## majmaji

> سلام دوست عزيز
> خوب ببينيد قبلا هم در مورد دليل اين نوع استفاده getch بهتون گفتم كه برايه نگهداشتن روند اجرايه برنامه است كه خروجي رو كاربر ببينه!! اينجا هم به همين دليل getch استفاده شده!! وقتي كه كاربر عدد رو درست حدس بزنه خروجي نمايش داده ميشه و getch باعث ميشه كه برنامه منتظر بمونه تا كاربر خروجي رو ببينه!!
> بنابراين چون خروجي در داخل if نمايش داده ميشه دستور getch هم در if بعد از دستور خروجي قرار مي گيره!!
> اميدوارم كه متوجه علت شده باشيد!!
> *تذكر:* دوست عزيز در كدي كه نوشتيد دستور زير درست نيست!!
> 
> cout<<"%d is the magic number";
> كه بايد به شكل زير اصلاح بشه!!
> 
> ...


درسته درسته.
پس يعني ما هر موقع كه خواستيم يه خروجي رو به نمايش بگذاريم بايد getch رو بكار ببريم.

----------


## afi_program

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

----------


## sia abedi

> درسته درسته.
> پس يعني ما هر موقع كه خواستيم يه خروجي رو به نمايش بگذاريم بايد getch رو بكار ببريم.


بله تقريبا حرفتون درسته ولي هميشه نه ببين بگذار دقيقتر بگم
شما تكه برنامه‌ي زير را در نظر بگير:
cin>>a;
cout<<a;

وقتي برنامه ران ميشه به سرعت دستورات اجرا ميشه ولي اگر به برنامه‌ي بالا نگاه كني مي‌بيني كه در خط اول متغير aاز ورودي خوانده مي‌شود براي همين تا عدد يا كاراكتري از صفحه‌ي كيبورد زده نشه و كليد Enter فشار داده نشود كامپايلر ادامه‌ي برنامه را اجرا نمي‌كند ولي در دستور دوم كامپايلر aرا در خروجي چاپ مي‌كند و به سرعت به سراغ دستور بعدي مي‌رود براي همين اگر در آخر برنامه ي ما دستور coutيا دستوراتي مثل آن باشد بايد getch را گذاشت تا برنامه بعد از انجام دستور اجازه‌ي رويت اثرات اون دستور را به كاربر بدهد شما فرض كنيد كه getch مثل cinمي‌مونه كه به كامپايلر ميگه كه بايد منتظر بمونه ولي cinمنتظر مي‌مونه تا از ورودي چيزي را بخونه ولي getch چيزي را از ورودي نمي‌خونه
البته من ديدم كه بعضي ها با getch از ورودي متغير مي‌خونن از دوستان مي‌خوام كه در مورد استفاده‌ي getch براي خوندن متغير از ورودي يك مقداري توضيح بدن (طريقه ي استفادش چه جوريه؟ چه فرقي با cinداره؟ و ... .)
البته يك نكته‌اي هم را بايد متذكر بشم كه كامپايلر هاي جديد خودشون getch را مي‌گذارند فقط براي اينكه شما گيج نشيد بايد بگم كه سعي كن قبل از return 0در همه‌ي برنامه ها getchرابگذاري حالا شايد اين سوال براتون به وجود بياد كه چرا بعد از return 0 نگذارم؟ بايد در مورد اين سوال اين نكته را متذكر بشم كه هر دستوري كه بعد از return 0 باشد اجرا نمي‌شود يعني return 0به سيستم مي‌گويد كه ديگر دستوري نمانده و برنامه تمام شده.
اميدوارم كه منظورم را متوجه شده باشيد.

----------


## majmaji

بله ممنون توضيحات خوب و عالي بود

اما در مورد مثال بعدي 
 #include <iostream.h>
#include <conio.h>
int main()
{
int grade;
clrscr();
cout<<"\nEnter a grade:";
cin>>grade;
while(grade){
if(grade>=17 &&grade<=20)
cout<<"grade="<<grade<<"score="<<'A';
if(grade>=15 &&grade<=17)
cout<<"grade="<<grade<<"score="<<'B'
if(grade>=12 &&grade<=15)
cout<<"grade="<<grade<<"score="<<'C'
if(grade<12)
cout<<"grade="<<grade<<"score="<<'D'
cout<<"\nEnter a grade:";
cin>>grade;
}//end of while
return 0;
}

خوب چند تا سوال چرا در اول و آخر اين برنامه دوبار لقشيث رو از كاربر ميگيره؟
نميشه با كاركتر ans كه يا y هست يا n شرط تكرار حلقه رو برقرار كنيم؟

----------


## afi_program

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

----------


## behnam-s

سلام



> خوب چند تا سوال چرا در اول و آخر اين برنامه دوبار grade رو از كاربر ميگيره؟


ببینید  cin>>grade    اول داخل حلقه نیست و فقط یکبار اجرا میشه. و چون شرط ورودی حلقه grade هست مجبور شده این کارو بکنه. که می شد با یک cin به روش زیر هم انجامش داد.
while(1){       "شرط "1" همیشه بر قرار است. یعنی شرط اجرای حلقه هیچ وقت false  نمی شود
cin>>grade;
if(!grade)
break;    "خروج از حلقه و ادامه برنامه بعد ار حلقه
if(grade>=17 &&grade<=20)
cout<<"grade="<<grade<<"score="<<'A';
{



> نميشه با كاركتر ans كه يا y هست يا n شرط تكرار حلقه رو برقرار كنيم؟


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

----------


## sia abedi

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





> سلام
> 
> ببینید cin>>grade اول داخل حلقه نیست و فقط یکبار اجرا میشه. و چون شرط ورودی حلقه grade هست مجبور شده این کارو بکنه. که می شد با یک cin به روش زیر هم انجامش داد.
> while(1){       "شرط "1" همیشه بر قرار است. یعنی شرط اجرای حلقه هیچ وقت false  نمی شود
> cin>>grade;
> if(!grade)
> break;    "خروج از حلقه و ادامه برنامه بعد ار حلقه
> if(grade>=17 &&grade<=20)
> cout<<"grade="<<grade<<"score="<<'A';
> ...




نظر هر دوي دوستان درسته و اين كار كاملا سليقه‌ايه

----------


## majmaji

سلام دوستان خوبید
ببخشیدا بعد از وقفه ای که تو کارم افتاد (چون فکر کردم بهتره به جای یادگرفتن برنامه نویسی برم شبکه رو اول بخونم) حالا که یکم شبکه یاد گرفتم میخوام دوباره برنامه نویسی رو از سر بگیرم.
دوستان به من پیشنهاد کردن که کتاب دایتل رو بگیرم من هم گرفتم پس از همین الان کار رو با کتاب دایتل و کامپایلر dev-C++‎ شروع میکنیم
امیدوارم بازم مثل سابق به کمک من بیایید و در حل مشکلات برنامه های  تمرینی ++C کمکم کنید.
ممنون

----------


## majmaji

خوب دوستان من تا فصل 3 پیش رفتم حالا این مشکلات برام پیش اومد
این برنامه رو در نظر بگیرید 
این برنامه تعریف یک کلاس با تابع عضو هست یک مثال ساده از تعریف کلاس با تابع عضو که تابع عضو هیچ پارامتری نداره
#include <cstdlib>
#include <iostream>
#include <conio.h>

using std::cout;
using std::endl;

class gradebook
{
      public:
            void displayMessage()
             {
                  cout<<"welcome to the gradebook"<<endl;
                 
                  }
         };
int main()
{
    gradebook mygradebook;
    mygradebook.displayMessage();
    getch();
    return 0;
}                  

این مثال ساده بود و من تونستم بفهمم
اما مثال بعدی مربوط میشه به تعریف تابع عضو با یک پارامتر
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;



class GradeBook
{
      public:
             void displayMessage(string courseName)
             {
                  cout << "welcome to the gradeBooj for\n" << courseName << "!" << endl;
                  }
                  };
                  int main()
                  {
                      string name0fcourse;
                      GradeBook myGradeBook;
                      cout << "please enter the course name:" << endl;
                      getline( cin, name0fcourse );
                      cout << endl;
                      myGradeBook.displayMessage(name0fcourse);
                      getch();
                      return 0;
                      }

حالا سوالات من:
تابع عضو displayMessage یک پارامتر داره با نام string courseName و داخل تابع main هم یک متغیر از نوع string تعریف شده. آیا این دو تا به هم ربط داره؟
داخل همون تابع main بعد از اینکه یک رشته رو چاپ میکنه که میگه please enter the course name: بجای اینکه از <<cin استفاده کنه اومده از getline استفاده چرا؟
داخل همون  cin  و name0fcourse چه کاری رو انجام میدن؟
مثال اول رو یه بار دیگه نگاه کنید اونجا که یک شی از کلاس رو تعریف کرده و اونجایی که با استفاده از شی تابع عضو کلاس رو فراخوانده. نگاه کردید
حالا بیایید مثال دوم تا اونجایی که شی  رو تعریف کرده یکی هستند ولی بجای اینکه بیاد تابع displayMessage(string courseName) رو بخونه اومده تابع displayMessage(name0fcourse) رو خونده. چرا؟

----------


## majmaji

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

----------


## mabbaszadegan

سلام رفیق
میشه دقیقا بگی مشکلت چیه ؟! :لبخند گشاده!: 

شرمنده حال خوندن این همه پست رو ندارم  :لبخند گشاده!:

----------


## majmaji

رفیق شرمندمون کردی مشکل من اینه:
خوب دوستان من تا فصل 3 پیش رفتم حالا این مشکلات برام پیش اومد
این برنامه رو در نظر بگیرید 
این برنامه تعریف یک کلاس با تابع عضو هست یک مثال ساده از تعریف کلاس با تابع عضو که تابع عضو هیچ پارامتری نداره
 	کد:
 	#include <cstdlib>
#include <iostream>
#include <conio.h>

using std::cout;
using std::endl;

class gradebook
{
      public:
            void displayMessage()
             {
                  cout<<"welcome to the gradebook"<<endl;

                  }
         };
int main()
{
    gradebook mygradebook;
    mygradebook.displayMessage();
    getch();
    return 0;
} 
این مثال ساده بود و من تونستم بفهمم
اما مثال بعدی مربوط میشه به تعریف تابع عضو با یک پارامتر
 	کد:
 	#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;



class GradeBook
{
      public:
             void displayMessage(string courseName)
             {
                  cout << "welcome to the gradeBooj for\n" << courseName << "!" << endl;
                  }
                  };
                  int main()
                  {
                      string name0fcourse;
                      GradeBook myGradeBook;
                      cout << "please enter the course name:" << endl;
                      getline( cin, name0fcourse );
                      cout << endl;
                      myGradeBook.displayMessage(name0fcourse);
                      getch();
                      return 0;
                      } 
حالا سوالات من:
تابع عضو displayMessage یک پارامتر داره با نام string courseName و داخل تابع main هم یک متغیر از نوع string تعریف شده. آیا این دو تا به هم ربط داره؟
داخل همون تابع main بعد از اینکه یک رشته رو چاپ میکنه که میگه please enter the course name: بجای اینکه از <<cin استفاده کنه اومده از getline استفاده چرا؟
داخل همون  cin  و name0fcourse چه کاری رو انجام میدن؟
مثال اول رو یه بار دیگه نگاه کنید اونجا که یک شی از کلاس رو تعریف کرده و اونجایی که با استفاده از شی تابع عضو کلاس رو فراخوانده. نگاه کردید
حالا بیایید مثال دوم تا اونجایی که شی رو تعریف کرده یکی هستند ولی بجای اینکه بیاد تابع displayMessage(string courseName) رو بخونه اومده تابع displayMessage(name0fcourse) رو خونده. چرا؟

----------


## mabbaszadegan

1. تا منظورت از ربط چی باشه ؛
خب تابع عضو displayMessage برای اجرا شدن نیاز داره تا یه string رو بگیره  ؛ حالا
الف) این string رو میتونه مستقیم برنامه نویس به تابع بده ، مثلا :
 
myGradeBook.displayMessage("mohammad");
ب) کاربر string رو به تابع بدهد ؛ دقیقا همین اتفاقی که توی مثال شما افتاده ؛
یعنی یه string توی تابع main تعریف کرده ، بعد اونو از کاربر گرفته و در خروجی چاپ میکنه ، ببین : 
string name0fcourse;
GradeBook myGradeBook;
cout << "please enter the course name:" << endl;
getline( cin, name0fcourse );
cout << endl;
myGradeBook.displayMessage(name0fcourse);

2. هیچ فرقی نداره ، درواقع شکل اصلیه دستور cin همینه ، زیاد توضیح نمیدم ، چون تو فصل 11 کامل یاد میگیری ، فعلن بدون که اینم میشه  :لبخند گشاده!: 

3. نمیگم  :لبخند گشاده!:   فعلن حفظ کن که اینم میشه ، تو فصل 11 کامل میگیری قضیه رو 
البته میتونی از همون cin معمولی استفاده کنی ، یعنی اون خط رو پاک کن ، به جاش بنویس : 
cin>>name0fcourse;

4.  جواب سوال 1 رو دوباره بخون  :لبخند گشاده!:  
فرقی نداره که ؛ فقط اسم عوض شده ، ماهیت هیچ فرقی نکرده


به نظرم خوب داری پیش میری ، اگه بازم سوالی بود ، من درخدمتم

فقط یه سوال : 
دایتل زبان اصلی رو میخونی ؟

----------


## majmaji

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

----------


## mabbaszadegan

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


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

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

----------


## majmaji

خوب با اجازت یه سوال دیگه :لبخند گشاده!: 
در مورد همون 4
گفتی ماهیتشون یکی یعنی یه کار رو انجام میدن فقط اسمشون عوض شده درسته
یعنی من میتونم تو تعریف تابع داخل displayMessage بنویسم majid و داخل تابع main بنویسم mohammad؟
آیا این خاصیت بخاطر string هست؟
اگه آره که ما میتونستیم اسم رو عوض نکنیم و اصلا name0fcourse رو تعریف نکنیم نکنیم و توی خط آخر اونجا که با استفاده از شی تابع رو خونده داخل تابع همون پارامتر coursename رو بگذاریم
اگر هم نه پس چرا تو تعریف کلاس اونجا که تابع رو تعریف کرده از لفظ string استفاده کرده ایا استفاده از این لفظ اجباریه؟

----------


## mabbaszadegan

تاحدودی داری درست میگی
بذار اینجوری واست بگم :

تو واسه تابع اینطور تعریف کردی که یه string بگیره و بش سلام کنه  :لبخند گشاده!: 
حالا اسم این string برای تابع مهم نیست ، فقط مهم اینه که string باشه

حالا واسه اینکه فک نکنی این خاصیت فقط تو string تعریف شده ، به جای string (هم توی تعریف تابع و هم توی تابع main ) بنویس int  :چشمک: 

حالا برنامه رو اجرا کن و یه عدد صحیح وارد کن ؛

دیدی ؟!

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


احتمالن بازم واست سوال پیش میاد ، منتظرم  :چشمک:

----------


## majmaji

نه سوال پیش نیومد :لبخند گشاده!: 
چون string یک رشته از کارکتر ها رو میگیره و int یک عدد صحیح رو میگیره اگه با int یک سری رشته کارکتری وارد کنی اونا رو به صورت یک رشته از اعداد در میاره البته تا جایی که int جواب بده اگه رشته کارکتری طولانی بود برای اطمینان از تبدیل شدن تمام کارکترها به عدد از long int استفاده کنیم :لبخند گشاده!:

----------


## mabbaszadegan

> نه سوال پیش نیومد
> چون string یک رشته از کارکتر ها رو میگیره و int یک عدد صحیح رو میگیره اگه با int یک سری رشته کارکتری وارد کنی اونا رو به صورت یک رشته از اعداد در میاره البته تا جایی که int جواب بده اگه رشته کارکتری طولانی بود برای اطمینان از تبدیل شدن تمام کارکترها به عدد از long int استفاده کنیم


 ای ول
خوشم اومد ازت ، همینطور ادامه بده  :چشمک: 

هرجاش باز به مشکل خوردی ، بگو ؛ تا اونجا که بتونم کمکت میکنم 

موفق باشی

----------


## majmaji

دادا دستت درد نکنه از این همه امیدی که به من میدی
حالا یه سوال دیگه در ادامه با عنوان "کلاس gradebook با یک داده ی عضو، تابع مقدار گذاری نوشتن set و تابع خواندن get" میرسیم که نویسنده سعی داره به مثال قبلی دو تا تابع عضو کلاس و یک عدد داده ی عضوی اضافه کنه. 
اما به نظر من خیلی پیچونده تقریبا این دو تا کاری رو که کرده برنامه رو هیچ تغییر خاصی نمیده
class GradeBook
{
      public:
             void setCourseName( string name )
             {
                  courseName = name;
                  }
                  string getCourseName()
                  {
                         return courseName;
                         }
             void displayMessage()
             {
                  cout << "welcome to the gradeBook for\n" << getCourseName() << "!" << endl;
                  }
                  private:
                          string courseName;
                  };
                  int main()
                  {
                     string name0fcourse;
                      GradeBook myGradeBook;
                      cout <<"initial course name is:" << myGradeBook.getCourseName() << endl;
                      cout << "please enter the course name:" << endl;
                      getline( cin, name0fcourse );
                      myGradeBook.setCourseName( name0fcourse );
                      cout << endl;
                      myGradeBook.displayMessage();
                      getch();
                      return 0;
                      }

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

----------


## mabbaszadegan

سلام
شرمنده اگه دیر شد  :چشمک: 

بذار از اول برنامه رو بررسی کنیم :
اول از همه باید ببینیم *عضو داده ای* چیه ؟ 
یادته ، توی تابع main مثلا میگفتیم :

int a;


string b;
int  m[10];
a یک داده معمولی از جنس صحیح و b یک داده از نوع رشته و m آرایه ای 10تایی از اعداد صحیح است

حالا فرض کن همین داده ها رو بیاییم تو کلاس تعریف کنیم ؛ در این صورت به اونا میگن اعضای داده ای

نکته : اعضای داده ای کلاس معمولا به صورت private تعریف میشند ؛ پس فقط توابع عضو کلاس به این اعضا دسترسی دارند 

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

واما *توابع عضو* :
گفتم که courseName یک عضو داده ای private و فقط توابع عضو کلاس به اون دسترسی دارند،
پس برای مقداردهی به این عضو داده ای ما باید از یک تابع عضو کمک بگیریم


void setCourseName( string name )
{
courseName = name;
} 

این تابع یک string رو از کاربر میگیره و courseName رو برابر اون قرار میده 
تا اینجا ما مقداری رو به عضو داده ای اختصاص دادیم ، حالا باید یه تابع دیگه بنویسیم تا مقدار این عضو داده ای رو برگردونه ؛ به این صورت :
string getCourseName()
{
return courseName;
}

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

فقط در آخر یه چیزو یادت باشه :
فقط اعضای public کلاس رو میشه تو تابع main استفاده کرد و اعضای private کلاس فقط توسط توابع عضو کلاس قابل دسترسند ؛ یعنی اگه تو تابع main کد زیر رو بنویسی ازت خطا میگیره :
myGradeBook.courseName = "mohammad";
با این روش شاید کد کمی طولانی تر بشه ، ولی امنیت برنامه بالا میره 

سوالی بود در خدمتم
موفق باشی

----------


## majmaji

پس دادا یعنی نوع دسترسی public و private هم برای توابع به کار میره و هم برای اعضای داده ای؟
اگر هم ننویسیم که public هست خودش اون رو private حساب میکنه؟

----------


## majmaji

سلام دوباره من خیلی فکر کردم ولی باز نفهمیدم :خیلی عصبانی:  بذار سوالاتم رو اینطوری بپرسم: :لبخند گشاده!: 
class GradeBook
{
      public:
             void setCourseName( string name )
             {
                  courseName = name;
                  }
در اینجا نوع دسترسی public برای کلاس هست یا برای تابع setCourseName؟


تو کتاب تو برنامه ای که نوشته جلوش یه توضیحاتی هم نوشته حالا سوال من:
  void setCourseName( string name )
             {
                  courseName = name;
                  }
توی خطی که مقدار coursename رو برابر name کرده نوشته: 
store the coursename in the object
خوب حالا سوال: اینجا object ما کدومه؟ اصلاً مگه شیوه تعریف object یه طور دیگه نبود مثلاً gradebook mygradebook مگه الان من یه شی از کلاس gradebook درست نکردم؟ پس الان اینجا کدوماشون شی هستند؟ coursename یا name?
سوال بعدی: :لبخند: 
  void displayMessage()
             {
                  cout << "welcome to the gradeBook for\n" << getCourseName() << "!" << endl;
                  }
اینجا تابع displaymessage هیچ پارامتری نداره. چرا؟ چرا در مثال قبلی داشت؟ چرا تابع setcoursename پارامتر عضو داره؟
یه سوال دیگه توی cout رو نگاه کنید بدون استفاده از شی تابع getcoursename رو خونده. آیا درسته؟ 
یه سوال دیگه:
به این خط توجه کنید:
 private:
                          string courseName;
اومده قبل از اینکه کلاس تموم شه یه پارامتری رو به نام coursename از نوع string تعریف کرده که قبلاً (یعنی قبل از اینکه تعریف کنه) دو بار در دو تابع از اون استفاده کرده
 void setCourseName( string name )
             {
                  courseName = name;
                  }
                  string getCourseName()
                  {
                         return courseName;
                         }
خوب مگه ما نگفته بودیم تا قبل از اینکه از داده ای استفاده کنیم باید حتماً قبلش تعریفش کنیم؟ مثلا قبل از اینکه ما a رو با b جمع کنیم باید حتما بگیم int a, b درسته؟ پس چرا اینجا اینجوری نکرده؟ :متفکر: 
تازه مگه ما نگفتیم هر داده ای که تعریف میشه باید عضو تابعی باشه؟ پس چرا اینجا خارج از این سه تابع نوشته؟
و سوال آخر:
این خط از برنامه چه کاری رو انجام میده به نظرتون این خط اضافی نیست؟
  cout <<"initial course name is:" << myGradeBook.getCourseName() << endl;

----------


## mabbaszadegan

سلام ، شرمنده اگه دیر شد 

اول بزار کل کد رو یه بار با دقت بررسی کنیم :
 
 class GradeBook
  {
  public:
     // function that sets the course name                       
     void setCourseName( string name )                           
     {                                                           
courseName = name; // store the course name in the object
} // end function setCourseName                             

// function that gets the course name                  
string getCourseName()                                 
{                                                      
return courseName; // return the object's courseName
} // end function getCourseName                        

// function that displays a welcome message
void displayMessage()
{
// this statement calls getCourseName to get the
// name of the course this GradeBook represents
cout << "Welcome to the grade book for\n" << getCourseName() << "!"
<< endl;
} // end function displayMessage
private:                                               
string courseName; // course name for this GradeBook
}; // end class GradeBook

خب ، این کلاس یه عضو داده ای private داره به اسم courseName ؛ 
اگه یادت باشه گفتم اعضای private  فقط در دسترس توابع عضو خود کلاس هستند ، پس برای مقداردهی به این عضو داده ای ما باید از توابع عضو set و get کمک بگیریم ؛ 
تابع  setCourseName ، عضو courseName رو با رشته ای که از ورودی میگیره مقداردهی میکنه ، اینو ببین :
GradeBook myGradeBookشی myGradeBook ساخته شد، فعلا این شی خالیه , یعنی اگه با استفاده از تابع getCourseName بنویسی : 
cout<<myGradeBook.getCourseName() ;
هیچی تو خروجی چاپ نمیشه ؛
حالا اینو ببین : 
string str;
cout<<"Please enter a name: ";
cin>>str;
myGradeBook.setCourseName(str)
توی این کد کاربر خودش شی myGradeBook رو مقداردهی میکنه ، حالا اگه دوباره بنویسی : 
cout<<myGradeBook.getCourseName() ;
میبینی که این دفعه توی خروجی همون اسمی که کاربر میده ، چاپ میشه ؛

این معنی همون جمله  store the coursename in the object هستش ، یعنی شی توسط متغیر coursename مقداردهی میشود ؛

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




> تابع displaymessage هیچ پارامتری نداره. چرا؟


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




> چرا تابع setcoursename پارامتر عضو داره؟


چون این تابع وظیفه ش اینه که یه رشته رو بگیره و بریزه تو coursename ؛ 




> توی cout ، بدون استفاده از شی تابع getcoursename رو خونده. آیا درسته؟


احتمالن یه خورده حواستو جمع میکردی خودت میگرفتی :دی :دی
ما تو تابع main از اشیا استفاده میکنیم ؛ اینجا ما تو خود کلاسیم ، پس تعریف شی اصلا معنی نداره




> کد:
>  private:                          string courseName;
> اومده قبل از اینکه کلاس تموم شه یه پارامتری رو به نام coursename از نوع string تعریف کرده که قبلاً (یعنی قبل از اینکه تعریف کنه) دو بار در دو تابع از اون استفاده کرده
> کد:
>  void setCourseName( string name )             {                  courseName = name;                  }                  string getCourseName()                  {                         return courseName;                         }
> خوب مگه ما نگفته بودیم تا قبل از اینکه از داده ای استفاده کنیم باید حتماً قبلش تعریفش کنیم؟ مثلا قبل از اینکه ما a رو با b جمع کنیم باید حتما بگیم int a, b درسته؟ پس چرا اینجا اینجوری نکرده؟
> تازه مگه ما نگفتیم هر داده ای که تعریف میشه باید عضو تابعی باشه؟ پس چرا اینجا خارج از این سه تابع نوشته؟



حرفت کاملا منطقیه ولی تو برنامه نویسی ساخت یافته ؛ 
توی برنامه نویسی شی گرا وقتی یه کلاس طراحی میکنی ، اولین چیزی که بررسی میشه اعضای داده ای کلاسند ، یعنی فرق نمیکنه عضو داده ای رو کجای کلاس معرفی کنی 
پس اینجا اول کلاس میدونه که یه عضو داده ای private به نام courseName داره و بعد توابع عضو رو بر همین اساس تحلیل میکنه ؛
البته اگه اعضای داده ای رو همون اول تعریف کلاس بنویسیم ، کد خواناتر میشه ؛




> این خط از برنامه چه کاری رو انجام میده به نظرتون این خط اضافی نیست؟





> کد:
>   cout <<"initial course name is:" << myGradeBook.getCourseName() << endl;



این خط میخواد فقط بگه که شی  myGradeBook اول خالیه ، 


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

----------


## majmaji

خوب دادا يعني چي شي ما خاليه؟
يه سوال ديگه تابع هايي كه پارامتر دارن يه چيزي رو چاپ ميكنن كه ممكنه تغير كنه مثلاً يه بار نام درس فيزيك باشه و در دفعه دومي كه اجرا ميشه نام درس شيمي باشه و توابعي كه پارامتر عضو ندارن چيزي رو چاپ ميكنن كه ثابت هست. درسته؟ يا ممكنه كارايي ديگه اي هم داشته باشه؟

----------


## mabbaszadegan

بذار  خالی بودن اشیا رو  زمانی که constructor (سازنده ها) رو خوندی برات توضیح میدم 


اما در مورد تابع بدون پارامتر :
ممکنه یه تابع پارامتر نداشته باشه ولی درون خودش یه تابع رو صدا بزنه که اون تابع مقادیر مختلفی رو برمی گردونه ، مثلا :

void displayMessage()
{
cout << "Welcome to the grade book for\n" << getCourseName() << "!"
<< endl;
}اینجا داخل تابع  displayMessage ، تابع getCourseName صدا زده شده که این تابع هربار مقدار شی را برمیگردونه و ممکنه دارای مقادیر مختلف باشه

----------


## majmaji

آها پس من یه بار میگم ببین درست فهمیدم یا نه؟
خوب ما اومدیم کلاس grade book رو تعریف کردیم و نوع دسترسی رو public تعیین کردیم (راستی public بودن کلاس به چه درد میخوره؟)
بعد از اون اومدیم سه تا تابع معرفی کردیم:
اولی setcoursename با پارامتر string name این تابع مقدار coursename رو در name ذخیره میکنه همونطوری که در جلوی توضیحاتش نوشته store the coursename in the object (یعنی اینکه name یک object هست؟)
تابع setcoursename از نوع void هست و هیچ مقداری رو بر نمیگردونه
تابع دومی تابع getcoursename هست که از نوع string هست و هیچ پارامتری نداره.
این تابع object که برای coursename است رو برمیگردونه. (یعنی name?)
تابع سوم تابع displaymessage است که از نوع void میباشد این تابع، تابع getcoursename رو میخونه برای گرفتن نام درس و چون ما در تابع main نیستیم میتونیم بدون معرفی یه شی این تابع رو فراخوانی کنیم؟
قبل از پایان کلاس متغیر coursename معرفی میشه.
بعد تابع main از نوع int شروع میشه متغیر nameofcourse معرفی میشه (آیا این آرگومان تابع setcoursename است؟)
بعد از اون یک شی از کلاس تعریف میشه و بعدش توسط خطی میخواد بگه فقط شی ما خالیه (که من نمیدونم یعنی چی :لبخند گشاده!: )
بعد از اون توسط خطی که در خروجی چاپ میشه از کاربر می خواد که نام درسی رو وارد کنه
نام درس رو توسط تابع getline گرفته و در nameofcourse ذخیره میکنه
خط بعدی رو اصلا یعنی قبلا دیدم ولی نمیدونم چیکار مکنه؟ این هم خط:
mygradebook.setcoursename( nameofcourse );
 خط آخر هم تابع displaymessage رو فراخوانی میکنه
و برنامه نموم میشه

----------


## mabbaszadegan

> ما اومدیم کلاس grade book رو تعریف کردیم و نوع دسترسی رو public تعیین کردیم (راستی public بودن کلاس به چه درد میخوره؟)


این چه حرفیه ؟!!!!
نوع دسترسی توابع عضو رو public تعریف کردیم  :لبخند: 

بقیشو تقریبا درست گفتی :دی
 
myGradeBook.setCourseName( nameOfCourse ); 

این خط برنامه شی myGradeBook رو مقداردهی میکنه ، یعنی رشته ای رو که از کاربر گرفته میریزه تو شی ؛

----------


## majmaji

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

----------


## mabbaszadegan

آره ، تقریبا درست گفتی 

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

مثلا برای شروع یه کلاس طراحی کن که مشخصات یه دانشجو (نام ، شماره دانشجویی ، سن و معدل ) رو بگیره  (این 4 تا میشند اعضای داده ای کلاس) ؛ توابع set و get رو برای هرکدوم بنویس و یه تابع هم بنویس که اطلاعات مربوط به یک دانشجو رو نشون بده 
شروع کن ، تا هرجا که نوشتی کدشو بزار اینجا باهم بررسی کنیم

----------


## mabbaszadegan

نه داداش ، این چه حرفیه 

تا ننویسی یاد نمیگیری ، من خودمم خیلی چیزا رو اینجا یادگرفتم 

موفق باشی

----------


## majmaji

من برنامه رو نوشتم ولی واقعاً درست نیست و کار  نکرد نمیدونم مشکلم کجاست ولی کدش به شکل زیر است.
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;


class GradeBook
{
      public:
 void setname (string name) //tabei ke name daneshjo ra zakhire mikonad
 {
  setname = name;
 }
 string getname() //tabei ke name daneshjo ro migire
 {
 return setname;
 }
 void setshomaredaneshjo (string shomaredaneshjo)//tabei ke shomare daneshjoei ra zakhire mikonad
 {
 setshomaredaneshjo = shomaredaneshjo;
 }
 string getshomaredaneshjo()
 {
 return getshomaredaneshjo;
 }
  void sen (string sen) //tabei ke name daneshjo ra zakhire mikonad
 {
  setsen = sen;
 }
 string getsen() //tabei ke name daneshjo ro migire
 {
 return setsen;
 }
  void setmoadel (string moadel) //tabei ke name daneshjo ra zakhire mikonad
 {
  setmoadel = moadel;
 }
 string getmoadel() //tabei ke name daneshjo ro migire
 {
 return setmoadel;
 }
        void displaymessage()//tabei ke etelaate daneshjoo ra neshan midahad.
        {
             cout <<"etelaate daneshjo:"<< getname()<< getshomaredaneshjo()<< getsen()<<  getmoadel()<<endl;
             }
             string name;
             string shomaredaneshjo;
             string sen;
             string moadel;
             };
             int main()
             {
                 string nameofname;
                 string nameofshomaredaneshjo;
                 string nameofsen;
                 string nameofmoadel;
                 gradebook mygradebook;
                 
                 cout << "etelaate daneshjoyane daneshgah" <<mygradebook.getname() << mygradebook.etshomaredaneshjo() << mygradebook.getsen() << mygradebook.getmoadel()<<endl;
                 cout <<"etelaate daneshjo ra vared konid"<<endl;
                 getline(cin,nameofname, nameofshomaredaneshjo, nameofsen, nameofmoadel);
                 mygradebook.setname( nameofname );
                  mygradebook.setshomaredaneshjo( nameofshomaredaneshjo );
                   mygradebook.setsen( nameofsen );
                    mygradebook.setmoadel( nameofmoadel ); 
                    cout << endl;
                    mygradebook.displaymessage();
                    getch();
                    return 0;
                    }

----------


## computer_science

ba salam man yek taze vared hastam  va manam ye soal dashtam chetori mitoonam ye adad 20 raghami dar mabnaye 16 daryaf konam
ba tashakkor

----------


## mabbaszadegan

1. اعضای داده ای رو باید به صورت private تعریف میکردی 
2. توابع set باید اعضای داده ای رو مقداردهی کنند
3. توابع get باید اعضای داده ای رو برگردونند

این کد رو ببین :


class student {
private:
string name;
string shomaredaneshjo;
int sen;
int moadel;
public:
void setname(string a) {
name=a;
}
string getname() {
return name; 
}
void setshomaredaneshjo(string b) {
shomaredaneshjo=b;
}
string getshomaredaneshjo() {
return shomaredaneshjo;
}
 

بقیشو سعی کن خودت بنویسی ، سوالی بود در خدمتم

----------


## mabbaszadegan

> ba salam man yek taze vared hastam va manam ye soal dashtam chetori mitoonam ye adad 20 raghami dar mabnaye 16 daryaf konam
> ba tashakkor


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

----------


## majmaji

> 1. اعضای داده ای رو باید به صورت private تعریف میکردی 
> 2. توابع set باید اعضای داده ای رو مقداردهی کنند
> 3. توابع get باید اعضای داده ای رو برگردونند
> 
> این کد رو ببین :
> 
> 
> class student {
> private:
> ...


آها درسته اما یه سوال دیگه
اونجا تو اون تابعی که از return استفاده کردی مگه نباید ما a رو return کنیم پس چرا name رو return کرده؟

----------


## mabbaszadegan

توابع get باید اعضای داده ای رو برگردونند ؛
مثلا تابع  getname باید name رو برگردونه

----------


## majmaji

آها فهمیدم ببین من برنامه رو تا اونجایی که گفتی نوشتم بقیشم اینشکلی نوشتم همشو پشت هم می نویسم
#include <cstdlib>
#include <iostream>
#include <conio.h>

using namespace std;

#include <string>
class student
 {
private:
string name;
string shomaredaneshjo;
int sen;
int moadel;
public:
void setname(string a)
 {
name=a;
}
string getname()
 {
return name; 
}
void setshomaredaneshjo(string b)
 {
shomaredaneshjo=b;
}
string getshomaredaneshjo()
{
       return shomaredaneshjo;
       }
       void setsen(int c)
       {
       sen=c;
       }
      string getsen()
       {
            return sen;
            }
            void setmoadel (int d)
            {
                 moadel=d;
                 }
                 string getmoadel()
                 {
                        return moadel;
                        }
       void displaymessage()
       {
            cout<<"etelaate daneshjo\n"<<getname()<<getshomaredaneshjo()<<gets  en()<<getmoadel()<<endl;
            }
            private:
                    string name;
                    string shomaredaneshjo;
                    int sen;
                    int moadel;
                    };
                    int main()
                    {
                        string name0fnamedaneshjo;
                        string name0fshomaredaneshjo;
                        int name0fsenedaneshjo;
                        int name0fmoadeledaneshjo;
                        gradebook mygradebook;
                        
                        cout<<"lotfan etelaate daneshjo ra vared konid:"<<endl;
                        getline(cin, name0fnamedaneshjo);
                        mygradebook.setname(name0fnamedaneshjo);
                        getline(cin, name0fshomaredaneshjo);
                        mygradebook.setname(name0fshomaredaneshjo);
                        getline(cin, name0fsenedaneshjo);
                        mygradebook.setname(name0fsenedaneshjo);
                        getline(cin, name0fmoadeledaneshjo);
                        mygradebook.setname(name0fmoadeledaneshjo);
            cout<<endl;
            mygradebook.displaymessage();
            getch();
            return 0;
            }

----------


## mabbaszadegan

خوبه ، فقط دوتا مشکل وجود داره :
1. اعضای داده ای رو یه بار اول کلاس و یه بار آخر کلاس تعریف کردی !!
یکیشو پاک کن 

2. به جای gradebook باید بنویسی student (اسم کلاس عوض شده) ؛ مثلا برای تعریف شی اینطوری بنویس:
 
student mystudent ,std1,std2;

الان سه تا شی  mystudent ,std1,std2 از کلاس student تعریف شدند

----------


## majmaji

چرا سه تا مگه با یکی نمیتونیم تابع ها رو فراخوانی کنیم؟

----------


## mabbaszadegan

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

----------


## computer_science

> سلام
> برای دریافت اعداد بزرگ باید از ساختمان های داده ای مثل لینک لیست کمک بگیری ، 
> شروع کن به نوشتن ، بعد کدتو بذار تا باهم بررسی کنیم


 با سلام
با تشکر از شما برای جوابتون
اما من برنامه نویسی به زبان cدارم  اونجا چطور میشه؟

----------


## majmaji

اما یه سوال
برنامه ای که نوشتم 8 تا ارور داد چرا؟ مگه کجاش مشکل داره؟

----------


## mabbaszadegan

کدتو بذار ببینم

----------


## majmaji

#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;


class student
 {
private:
string name;
string shomaredaneshjo;
int sen;
int moadel;
public:
void setname(string a)
 {
name=a;
}
string getname()
 {
return name; 
}
void setshomaredaneshjo(string b)
 {
shomaredaneshjo=b;
}
string getshomaredaneshjo()
{
       return shomaredaneshjo;
       }
       void setsen(int c)
       {
       sen=c;
       }
      string getsen()
       {
            return sen;
            }
            void setmoadel (int d)
            {
                 moadel=d;
                 }
                 string getmoadel()
                 {
                        return moadel;
                        }
       void displaymessage()
       {
            cout<<"etelaate daneshjo\n"<<getname()<<getshomaredaneshjo()<<gets  en()<<getmoadel()<<endl;
            }
           
                    };
                    int main()
                    {
                        string name0fnamedaneshjo;
                        string name0fshomaredaneshjo;
                        int name0fsenedaneshjo;
                        int name0fmoadeledaneshjo;
                        student mystudent;
                        
                        cout<<"lotfan etelaate daneshjo ra vared konid:"<<endl;
                        getline(cin, name0fnamedaneshjo);
                        mystudent.setname(name0fnamedaneshjo);
                        getline(cin, name0fshomaredaneshjo);
                        mystudent.setshomaredaneshjo(name0fshomaredaneshjo  );
                        getline(cin, name0fsenedaneshjo);
                        mystudent.setsen(name0fsenedaneshjo);
                        getline(cin, name0fmoadeledaneshjo);
                        mystudent.setmoadel(name0fmoadeledaneshjo);
            cout<<endl;
            mystudent.displaymessage();
            getch();
            return 0;
            }
این هم کد البته بگم من اون تغیرات رو توش انجام دادم ولی بازم ارور داد 6 تا هم ارور داد

----------


## mabbaszadegan

1. تابع getsen ، متغیر sen رو برمیگردونه  ، پس باید نوعش int باشه 
2. تابع getmoadel هم باید نوعش int باشه ،
3. برای خوندن رشته ها از getline استفاده کن ، چون دو متغیر name0fsenedaneshjo و name0fmoadeledaneshjo از نوع int هستند پس برای خوندنشون از cin معمولی باید استفاده کنی 

در کل کد تصحیح شده میشه این :

#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;


class student
 {
private:
string name;
string shomaredaneshjo;
int sen;
int moadel;
public:
void setname(string a)
 {
name=a;
}
string getname()
 {
return name; 
}
void setshomaredaneshjo(string b)
 {
shomaredaneshjo=b;
}
string getshomaredaneshjo()
{
       return shomaredaneshjo;
       }
       void setsen(int c)
       {
       sen=c;
       }
      int getsen()
       {
            return sen;
            }
            void setmoadel (int d)
            {
                 moadel=d;
                 }
                 int getmoadel()
                 {
                        return moadel;
                        }
       void displaymessage()
       {
            cout<<"etelaate daneshjo\n"<<getname()<<getshomaredaneshjo()<<gets  en()<<getmoadel()<<endl;
            }
           
                    };
                    int main()
                    {
                        string name0fnamedaneshjo;
                        string name0fshomaredaneshjo;
                        int name0fsenedaneshjo;
                        int name0fmoadeledaneshjo;
                        student mystudent;
                        
                        cout<<"lotfan etelaate daneshjo ra vared konid:"<<endl;
                        getline(cin, name0fnamedaneshjo);
                        mystudent.setname(name0fnamedaneshjo);
                        getline(cin, name0fshomaredaneshjo);
                        mystudent.setshomaredaneshjo(name0fshomaredaneshjo  );
                        cin>>name0fsenedaneshjo;
                        mystudent.setsen(name0fsenedaneshjo);
                        cin>>name0fmoadeledaneshjo;
                        mystudent.setmoadel(name0fmoadeledaneshjo);
            cout<<endl;
            mystudent.displaymessage();
            getch();
            return 0;
            }

اصلا از error نترس ، شیرینی برنامه نویسی به همین چیزاشه  :چشمک:

----------


## majmaji

خوب دوستان تا اینجا خوب پیش  رفتیم جا داره از دوست خوبم mabbaszadegan تشکر کنم بخاطر توجه ویژه که به این تاپیک و بنده داشتن و هیچ سوالی از من رو بی پاسخ نذاشتن.
واقعاً ممنونم
اما خوبه تا الان با اون چیزایی که آشنا شدیم یه مروری داشته باشیم.
خوب، داده ها چه چیزایی بودن؟ داده ها متغیر هایی هستن که در طول برنامه با اونا ار داریم و باید قبل از استفاده تعریف بشن
داده های عضو داده هایی هستن که در یک کلاس به کار میرن و باید قبل از به پایان رسیدن کلاس معرفی بشن.
تابع هم که فهمیدیم چی بود. پارامتر تابع رو هم فهمیدیم ما با استفاده از پارامتر تابع مقداری رو در یک متغیر کلاس جایگزین میکنیم.
کلاس رو هم فهمیدیم
شی رو هم فهمیدم ما با استفاده از شی توابع رو فراخوانی میکنیم
(دوستان اگه اشتباه بود بگیدا)
اما در مثال جدید که میخوایم بریم سراغش "سازنده" ها را معرفی کرده.
سازنده ها به اشیای کلاس ها مقدار اولیه می دهند.

----------


## majmaji

قبل از اینکه در مورد برنامه حرف بزنیم بریم سراغ توضیحات قبل از برنامه
مثال بعدی مربوط میشه به مقدار دادن به اشیا با سازنده ها
توی توضیحات اینطوری اومده:
هنگامی که شی GradeBook را ایجاد می کنید چه اتفاقی می افتد اگر بخواهید نام یک درس را فراهم کنید. هر کلاسی که اعلان می کنید می تواند سازنده ای فراهم کند که می تواند برای مقدار اولیه دادن به شی کلاس هنگام ایجاد آن مورد استفاده قرار گیرد.(خوب اینطور که من فهمیدم برای هر کلاس فقط یک سازنده داریم و کار سازنده ها مقدار دادن به اشیاء کلاس هست. آیا تنها کار سازنده همین هست یا باز هم کارایی دیگه ای هم دارد؟)
سازنده، تابع عضو خاصی است که باید همنام با کلاس تعریف شود از اینرو کامپایلر می تواند آن را از دیگر تابع های عضو کلاس تشخیص دهد. (از اینجا فهمیدیم که سازنده یک تابع است که مثل بقیه توابع میتونه پارامتر و داده عضو داشته باشه و باید همنام کلاس باشه)
به این بند توجه کنید لطفاً
زبان ++C برای احضار هر شی ای که ایجاد می شود نیازمند یک یک سازنده است که کمک می کند اطمینان حاصل کنیم شی قبل از استفاده در برنامه، بدرستی مقدار اولیه گرفته .(ما با اشیاء توابع را در تابع main فراخوانی می کردیم و در بقیه توابع به یه صورت دیگه که در مثال قبل دیدیم اما سازنده ها به اشیاء مقدار اولیه میدن این چه تفاوتی میتونه در فراخوانی تابع در تابع main داشته باشه؟)
قبل از مثال هم یه تذکر نوشته که من یه قسمتایش رو نمیفهمم:
تذکر: برای داده های عضوی که اشیایی از کلاس های دیگر هستند سازنده پیش فرض به صورت ضمنی هر سازنده ی پیش فرض داده ی عضو را احضار می کند تا مطمئن شود داده عضو به درستی مقدار اولیه گرفته است.(مگه میشه داده های عضوی اسم اشیاء رو هم تشکیل بده؟؟؟؟ یا شاید چون برای کلاس های متفاوت هست اصلا تداخلی ایجاد نمیکنه ؟؟)
دوستان با تشکر از اهمیتی که به این بحث میدید قبل از اینکه بریم سراغ مثال اول این ابهامات رو رفع کنیم!
با تشکر

----------


## mabbaszadegan

> خوب اینطور که من فهمیدم برای هر کلاس فقط یک سازنده داریم و کار سازنده ها مقدار دادن به اشیاء کلاس هست. آیا تنها کار سازنده همین هست یا باز هم کارایی دیگه ای هم دارد؟


نه ، ممکنه یه کلاس چندین سازنده داشته باشه ؛ اینجا بحث overloading مطرح میشه ، یعنی تابعی با یک اسم چندین بار تعریف بشه ، که این خیلی کاربرد میتونه داشته باشه 




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


بله !!




> ما با اشیاء توابع را در تابع main فراخوانی می کردیم و در بقیه توابع به یه صورت دیگه که در مثال قبل دیدیم اما سازنده ها به اشیاء مقدار اولیه میدن این چه تفاوتی میتونه در فراخوانی تابع در تابع main داشته باشه؟


منظورتو متوجه نمیشم ، خب سازنده به شی مقداردهی میکنه و دقیقا مثل توابع عضو دیگه ی کلاس تو تابع main فراخوانی میشه 




> مگه میشه داده های عضوی اسم اشیاء رو هم تشکیل بده؟؟؟؟ یا شاید چون برای کلاس های متفاوت هست اصلا تداخلی ایجاد نمیکنه ؟؟


میتونی یک عضو داده ای از جنس کلاس تعریف کنی ، مثلا :
 
class student
{
private:
string name;
string shomaredaneshjo;
int sen;
student std1;
اینجا std1 علاوه براینکه یک عضو داده ای کلاس student هست ، یک شی ازین کلاس هم به حساب میاد

----------


## majmaji

> نه ، ممکنه یه کلاس چندین سازنده داشته باشه ؛ اینجا بحث overloading مطرح میشه ، یعنی تابعی با یک اسم چندین بار تعریف بشه ، که این خیلی کاربرد میتونه داشته باشه 
> 
> 
> بله !!
> 
> 
> منظورتو متوجه نمیشم ، خب سازنده به شی مقداردهی میکنه و دقیقا مثل توابع عضو دیگه ی کلاس تو تابع main فراخوانی میشه 
> خوب در مثال قبلی ما به جا اینکه به شی مقدار بدیم تابع رو فراخونی میکردیم و با cout مقدار رو چاپ میکردیم ولی الان با سازنده میتونیم مقدار بدیم. منظورم همین بود که فقط با استفاده از سازنده برنامه چند خط کمتر میشه
> 
> ...


خوب اینجا شما فقط سه تا داده به نام name، shomaredaneshjo، sen و یک شی به نام std1 تعریف کردی اما داده ای با نام std  تعریف نکردی

----------


## mabbaszadegan

std1 هم یک شی به حساب میاد هم یک عضو داده ای ؛ مثلا توی تابع main میتونی بنویسی :
student obj;
obj.std1.sen;

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

----------


## majmaji

خوب این هم مثال بعدی که مربوط میشه به مقدار دادن به اشیا با استفاده از سازنده ها
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;

class GradeBook
{
public:
GradeBook( string name )
{
setCourseName( name );
}
void setCourseName( string name )
{
coursename = name;
}
string getCourseName()
{
return coursename;
}
void displaymessage()
{
cout <<"welcome to the grade book for\n" << getCourseName() << endl;
}
private:
string coursename;
};
int main()
{
GradeBook gradebook1( "cs101 introduction to C++‎ programing" );
GradeBook gradebook2( "cs102 data structures in C++‎" );

cout << "grade book1 created for course:" << gradebook.getCourseName() << "\ngradebook2 created for course:" << gradebook2.getCourseName() << endl;
getch();
return 0;
}

خوب من میخوام تفسیر کنم ببینم تا اینجا تونستم خوب بفهمم یا نه

خوب چند خط اول که فایل های سرآیند مورد نیاز برنامه است از فضای نام std هم چون در برنامه استفاده می کنیم باید تعریف شه
بعد کلاس GradeBook معرفی میشه. بعد از اون سازنده ای همنام با نام کلاس ایجاد میشه، این سازنده یک پارامتر به نام string name  داره و درونش یک داده عضو داره (البته چرا داده عضو یک پارامتر داره؟ مگه اون داده نیست پس چرا پارامتر داره؟) بعد از معرفی سازنده تابع setcoursename  از نوع void و با پارامتر string name معرفی میشه کار این تابع اینه که نام درس رو در متغیر name ذخیره کنه. تابع بعدی getcoursename هست از نوع string که هیچ پارامتری نداره کار این تابع اینه که تابع setcoursename رو برگردونه و بعد از اینا تابع displaymessage معرفی میشه کار این تابع اینه که پیغام خوشامد گویی رو چاپ کنه و نام درسا رو معرفی کنه
بعد از اینا و قبل از اینکه کلاس به پایان برسه متغیرایی که باهاشون سر و کار داریم با دسترسی private معرفی میشن
بعد از پایان کلاس تابع main با این هدف ایجاد میشه که 3 تابع بالا موجود در کلاس رو تست کنه
2 تا شی با مقداری که دارن معرفی میشن و در خط آخر چاپ میشن
(خوب دوستان این توضیحات کامل هستن؟  یه سوال هم خودم بپرسم در مثال قبلی قبل از پایان برنامه یه دستوری بود که اینجوری بود mygradebook.displaymessage() اما تو این مثال از این دستور استفاده نشده چرا؟)

----------


## mabbaszadegan

> (البته چرا داده عضو یک پارامتر داره؟ مگه اون داده نیست پس چرا پارامتر داره؟)


اون داده نیست ، همون تابع عضو  setcoursename هستش که داخل سازنده صدا زده شده 




> در مثال قبلی قبل از پایان برنامه یه دستوری بود که اینجوری بود mygradebook.displaymessage() اما تو این مثال از این دستور استفاده نشده چرا؟)


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

----------


## majmaji

ممنونم محمد جان حالا بعد از این مثال هم یک سری توضیحات اورده که با هم بررسی میکنیم
میگه در لیست پارامتر یک سازنده، داده هایی مشخص می شود که سازنده برای انجام کارهایش به آن نیاز دارد. خوب اینجا پارامتر string name  یا بهتره بگیم پارامتر name از نوع string مشخص شده.
میگه در بدنه سازنده، name یعنی پارامتر سازنده را به تابع setcoursename منتقل می کند که یک مقدار در داده عضو coursename جایگزین کند خوب اینجا ما یک حرکت اضافی انجام دادیم چون تابع setcoursename خودش اینکار رو انجام میده درسته؟
و بعد از همه اینا اگه میشه بگو که آرگومان یعنی چی؟
و این جمله یعنی چی: هر سازنده ای که هیچ آرگومانی نداشته باشد سازنده پیش فرض نام دارد
میگه سازنده پیش فرض به دو صورت در اختیار کلاس قرار میگیره 
1- کامپایلر در کلاسی که سازنده ای تعریف نکرده به صورت ضمنی سازنده پیش فرض رو ایجاد کنه و ....
2- برنامه نویس خودش به صورت صریح ایجاد کنه
البته من اولی رو بیشتر ترجیح میدم اما خودش یک نکته ای رو اورده با این موضوع "اگر لازم نباشد به داده های عضو کلاس مقدار اولیه دهید (تقریبا همیشه) برای حصول اطمینان از اینکه داده های عضو کلاس، هنگام ایجاد هر شی جدید از کلاستان، با مقادیر با معنی مقدار اولیه گرفته اند، یک سازنده فراهم سازید" این یعنی اینکه باید از راه دوم بریم؟؟؟

----------


## mabbaszadegan

> اینجا ما یک حرکت اضافی انجام دادیم چون تابع setcoursename خودش اینکار رو انجام میده درسته؟


این کار برای افزایش امنیت برنامه ست ، اصل کپسوله سازی capsulation



> آرگومان یعنی چی؟


آرگومان به مقادیری میگند که تابع میگیره ، مثلا توی این :
void func1(int a, int b , char c, string d)

a,b,c,d به ترتیب آرگومانهای تابع func1 به شمار میاند ؛ یعنی موقع فراخوانی تابع باید این چهار مقدار رو وارد کنی 
البته تابع میتونه هیچ آرگومانی نداشته باشه (مثل همین displaymessage یا توابع get )




> هر سازنده ای که هیچ آرگومانی نداشته باشد سازنده پیش فرض نام دارد


یعنی اینکه اگه هیچ سازنده ای رو تو تابع main صدا نزنی ، به طور اتوماتیک سازنده ای که هیچ آرگومانی ندارد فراخوانی شده و شی مورد نظر رو مقداردهی میکند


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


یه نکته : یه سری اصول هست که شاید به ظاهر مسخره بیاد (مثل همین سازنده یا تعریف کلاس توی بلاکهای #ifndef و #endif) ولی در حقیقت برنامه رو اصولی تر میکنه و از همه مهم تر به برنامه قابلیت حمل میده

----------


## majmaji

> a,b,c,d به ترتیب آرگومانهای تابع func1 به شمار میاند ؛ یعنی موقع فراخوانی تابع باید این چهار مقدار رو وارد کنی 
> البته تابع میتونه هیچ آرگومانی نداشته باشه (مثل همین displaymessage یا توابع get )


خوب تو این مثال که زدی a,b,c,d مگه پارامتر های تابع نیستن؟
تازه اگه اینها آرگومان باشن ما میتونیم داخل تابع به کار ببریم؟
مثلا بنویسیم:
void func1 ()
{
int a, b;
char c; 
string d;
}

----------


## mabbaszadegan

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

----------


## majmaji

من دو تا پست گذشتم اومدم آخری رو حذف کنم یکی مونده به آخری حذف شد اشکال نداره دوباره مینویسم:
تو پست دو تا قبلی نوشته بودم که مثال بعدی مربوط میشه به گنجاندن سر فایلی که حاوی یک کلاس تعریف شده توسط کاربر است در این مثال اینطوری عمل میشه که ما اول میام کلاس رو در یک برنامه مینویسیم  بدون تابع main و در برنامه ای دیگه میام تابع main رو مینویسیم بعلاوه یک فایل سر آیند به این شکل: 
#include "gradebook.h"
این هم برنامه ها به ترتیب
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;
class GradeBook
{
      public:
             GradeBook(string name)
             {
                              setcoursename(name);
                              }
                              void setcoursename(string name)
                              {
                                   coursename = name;
                                   }
                                   string getcoursename()
                                   {
                                          return coursename;
                                          }
                                          void displaymessage()
                                          {
                                               cout << "welcome to the gradebook for\n" << getcoursename() << "!" << endl;
                                               }
                                               private:
                                                       string coursename;
                                                       };

و برنامه بعدی که تابع main هست:
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>
#include "GradeBook.h"

using namespace std;


int main()
{
GradeBook gradebook1( "cs101 introduction to C++‎ programing" );
GradeBook gradebook2( "cs102 data structures in C++‎" );

cout << "grade book1 created for course:" << gradebook1.getCourseName() << "\ngradebook2 created for course:" << gradebook2.getCourseName() << endl;
getch();
return 0;
}
یه سوال: چرا سر فایل ها در هر دو برنامه نوشته میشه؟
یه سوال دیگه در مورد توضیحات کتاب در کتاب نوشته:
"در بخش بعدی نشان می هیم که چگونه کلاس gradebook را میتوانید به دو فایل طوری تقسیم کنید که:
1- کلاس دارای قابلیت استفاده مجدد باشد
2- مشتری های کلاس بدانند کلاس، چه توابع عضوی فراهم می سازد و چگونه آنها را احضار می سازد و انتظار چه نوع داده برگشتی را دارد
3- مشتری ها ندانند چگونه توابع عضو کلاس پیاده سازی می شوند."
من منظور کتاب رو از این توضیحات نفهمیدم منظورش چیه میشه توضیح بدید لطفاً

----------


## clover

> چرا سر فایل ها در هر دو برنامه نوشته میشه؟


سر فایل ها در هر جایی که نیاز باشد باید نوشته شوند، اما اینکه چرا با وجود نوشتن سر فایل ها در فایل GradeBook.h باز هم در فایل اصلی آنها را می نویسیم، علت این است که ممکن است شما زمانی احساس کنید نیاز به استفاده از کلاس GradeBook ندارید و تصمیم به حذف سرفایل مربوطه بگیرید، اگر سرفایل های دیگر را در تابع main هم تعریف کرده باشید مشکلی برای برنامه به وجود نخواهد آمد اما در غیر این صورت باید تمام سرفایل هایی که با حذف سرفایل GradeBook.h از برنامه حذف می شوند را اضافه کنید (و همینطور باید تمام برنامه را چک کنید تا بفهمید کدام سرفایل برای تابع main مورد نیاز بوده و کدام یک فقط برای کلاس مورد نظر و...) و این برای پروژه های بزرگ یعنی فاجعه.
اما برای جلوگیری از تعریف چند باره ی کلاس ها و عناصر تعریف شده در سرفایل ها می توانید کد موجود در فایل GradeBook.h را به این شکل تغییر دهید:
#ifndef GRADEBOOK_H
#define GRADEBOOK_H

#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;
class GradeBook
{
public:
    GradeBook(string name)
    {
        setcoursename(name);
    }

    void setcoursename(string name)
    {
        coursename = name;
    }

    string getcoursename()
    {
        return coursename;
    }

    void displaymessage()
    {
        cout << "welcome to the gradebook for\n" << getcoursename() << "!" << endl;
    }

private:
     string coursename;
};

#endif

ifndef GRADEBOOK_H# : اگر شناسه GRADEBOOK_H قبلا تعریف نشده است.
define GRADEBOOK_H# : شناسه GRADEBOOK_H را تعریف کن و بقیه دستورات را تا رسیدن به پایان شرط اجرا کن.
endiF#‎ : پایان شرط.

با اضافه کردن این دستورات در اولین فراخوانی سرفایل  GradeBook.h (ز مانی که هنوز شناسه ای با نام  GRADEBOOK_Hتعریف نشده است) شناسه ی  GRADEBOOK_H تعریف شده و کدهای داخل بلاک شرطی اجرا می شوند و در دفعات بعد به دلیل برقرار نبودن شرط از اجرای کد ها جلوگیری می شود.




> در بخش بعدی نشان می هیم که چگونه کلاس gradebook را میتوانید به دو فایل طوری تقسیم کنی


به این کار می گویند جداسازی رابط از پیاده سازی. یعنی ما در بدنه ی کلاس (در فایل GradeBook.h) فقط توابع را ا اعلان کنیم و پیاده سازی توابع را در یک فایل جداگانه (مثلا GradeBook.cpp) انجام دهیم. در حال حاضر ممکن است این کار به نظرتان مسخره بیاید، پیشنهاد می کنم در مورد علت انجام این کار و مزایای آن فعلا زیاد کنجکاوی نکنید، فقط از آن پیروی کنید. به زودی (هنگام نوشتن و مدیریت پروژه های بزرگتر و یا تجاری) به مزایای این کار پی خواهید برد.

----------


## xerxesking

سلام, من سه چهار روزه با CPP کار میکنم,
راي ضرب دو ماتريس در حالت کلی این رو تو سی پلاس پلاس نوشتم ولی اشکال میگیره, کسی می تونه یه نیگا بندازه:

#include<iostream.h>
void main()
{
  int m,n,i,j,k,p;
  int a[m][k] , b[k][n] , c[m][n];
  cout<<"Enter the number of rows for Matrix A: "<<endl;
  cin>>m;
  cout<<"Enter the number of coulmns for Matrix A: "<<endl;
  cin>>k>>endl;
  cout<<"Enter Matrix A:  "<<endl;
  for( i = 0 ; i < m ; i++)
      for( j = 0 ; j < k ; j++)
          cin>>a[m][k];
     cout<<"Enter the number of rows for Matrix B: "<<endl;
  cin>>k;
  cout<<"Enter the number of coulmns for Matrix B: "<<endl;
  cin>>n>>endl;
  cout<<"Enter Matrix B:  "<<endl;
  for( i = 0 ; i < k ; i++)
      for( j = 0 ; j < n ; j++)
          cin>>b[k][n];
  for( i = 0 ; i < m ; i++)
      for( j = 0 ; j < n ; j++)
      {
          c[m][n] = 0;
          for( p = 0 ;p < k ; p++)
              c[i][j] += a[i][p]*b[p][j];
      }
  cout<<"The resultant matrix is ";
  for( i = 0 ; i < m ; i++)
  {
      for( j = 0 ; j < n ; j++)
          cout<<a[i][j]<<" ";
      cout<<endl;
  }
}

----------


## mabbaszadegan

int a[m][k] , b[k][n] , c[m][n];

آرایه یه عضو استاتیک هستش ، نمیتونی بدون تعیین ابعاد اونو تعریف کنی ، اینجوری بنویس :
int a[50][50] , b[50][50] , c[50][50];


این یعنی چی ؟
cin>>k>>endl;
endl ، رو معمولا cout میکنند ، اینطوری بنویس :
cin>>k; 


اگه بازم سوالی بود در خدمتم ؛

----------


## majmaji

به به سلامی دوباره به دوستان خوبم دوباره از دوستای عزیزی که ما در این تاپیک همراهی کردن تشکر میکنم و خیلی خوشحالم که این تاپیک داره رونق پیدا میکنه
خوب ما رسیدیم به اینجایی که ما میتونیم با جداسازی واسطه از یک برنامه هم امنیت برنامه رو بالا ببریم هم اینکه کاری کنیم که مشتری نتونه بفهمه که ما چی نوشتیم
خوب اول یه سری توضیحات رو بنویسم
واسطه یک کلاس مشخص می کند مشتری های کاربر از چه خدماتی می توانند استفاده کنند و این خدمات را درخواست کنند اما از چگونگی انجام این خدمات آگاه نمی شوند. واسطه کلاس از توابع public هست
ما اومدیم یه برنامه رو سه قسمت کردیم 
1- سرفایل gradebook.h
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;
class GradeBook
{
      public:
             GradeBook( string );
             void setCourseName( string );
             string getCourseName();
             void displaymessage();
             private:
                     string coursename;
                     };
 
2- فایل کد منبع gradebook.cpp
#include <cstdlib>
#include <iostream>
#include "GradeBook.h"
using namespace std;

GradeBook::GradeBook( string name )
{
                      setCourseName( name );
                      }
                      void GradeBook::setCourseName( string name ) 
                      {
                           coursename = name;
                           }
                           string GradeBook::getCourseName()
                           {
                                  return coursename;
                                  }
                                  void GradeBook::displaymessage()
                                  {
                                       cout << "welcome to the gradebook for \n" << getCourseName() << endl;
                                       }

3- تابع main
#include <cstdlib>
#include <iostream>
#include "GradeBook.h"
#include <conio.h>
using namespace std;

int main()
{
    GradeBook gradebook1("cs101 introduction to C++‎ programing");
    GradeBook gradebook2("cs102 data structures in C++‎");
    
    cout << "gradebook1 created for course:" << gradebook1.getCourseName() << "\ngradebook2 created for course: " << gradebook2.getCourseName() << endl;
 getch();
    return 0;
}


اما من نتونستم این سه تا مثال رو با موفقیت اجرا کنم شما میتونید بگید مشکل چیه؟

----------


## mabbaszadegan

هیچ مشکلی نداره ، فقط اینو یادت رفته بود 
 #include<string>

اینو اول هر سه تا فایل بذار ، بعد اجراش کن

----------


## majmaji

> هیچ مشکلی نداره ، فقط اینو یادت رفته بود 
>  #include<string>اینو اول هر سه تا فایل بذار ، بعد اجراش کن


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

----------


## mabbaszadegan

چه اروری میده ؟

من اجراش کردم ، اجرا شد

----------


## majmaji

خوب ببین وقتی قسمت اول رو میخوام کامپایل کنم این ارور رو میده
  [Linker error] undefined reference to `WinMain@16' 
  ld returned 1 exit status 

و وقتی قسمت دوم رو مینویسم و میخوام کامپایل کنم این ارور ها رو میده
\Dev-Cpp\bin\t2.cpp C:\Dev-Cpp\bin\C GradeBook.h: No such file or directory. 
7 C:\Dev-Cpp\bin\t2.cpp `GradeBook' has not been declared 
8 C:\Dev-Cpp\bin\t2.cpp ISO C++‎ forbids declaration of `GradeBook' with no type 
 C:\Dev-Cpp\bin\t2.cpp In function `int GradeBook(std::string)': 
9 C:\Dev-Cpp\bin\t2.cpp `setCourseName' undeclared (first use this function) 
  (Each undeclared identifier is reported only once for each function it appears in.) 
  At global scope: 
12 C:\Dev-Cpp\bin\t2.cpp `GradeBook' is not a class or namespace 
 C:\Dev-Cpp\bin\t2.cpp In function `void setCourseName(std::string)': 
13 C:\Dev-Cpp\bin\t2.cpp `void setCourseName(std::string)' used prior to declaration 
14 C:\Dev-Cpp\bin\t2.cpp `coursename' undeclared (first use this function) 
14 C:\Dev-Cpp\bin\t2.cpp At global scope: 
17 C:\Dev-Cpp\bin\t2.cpp `GradeBook' is not a class or namespace 
 C:\Dev-Cpp\bin\t2.cpp In function `std::string getCourseName()': 
19 C:\Dev-Cpp\bin\t2.cpp `coursename' undeclared (first use this function) 
19 C:\Dev-Cpp\bin\t2.cpp At global scope: 
22 C:\Dev-Cpp\bin\t2.cpp `GradeBook' is not a class or namespace

----------


## mabbaszadegan

اینارو امتحان کن ، من همین الان اجراش کردم


1- سرفایل gradebook.h
using namespace std;
#include<string>
class GradeBook
{
      public:
             GradeBook( string );
             void setCourseName( string );
             string getCourseName();
             void displaymessage();
             private:
                     string coursename;
                     };

2- فایل کد منبع gradebook.cpp
#include <cstdlib>
#include <iostream>
#include "GradeBook.h"
using namespace std;
#include<string>
GradeBook::GradeBook( string name )
{
                      setCourseName( name );
                      }
                      void GradeBook::setCourseName( string name ) 
                      {
                           coursename = name;
                           }
                           string GradeBook::getCourseName()
                           {
                                  return coursename;
                                  }
                                  void GradeBook::displaymessage()
                                  {
                                       cout << "welcome to the gradebook for \n" <<getCourseName()<<endl;
                                       }

3- تابع main
#include<conio.h>
#include<string>
#include <iostream>
#include "GradeBook.h"
using namespace std;
int main()
{
    GradeBook gradebook1("cs101 introduction to C++‎‎ programing");
    GradeBook gradebook2("cs102 data structures in C++‎‎");
    
    cout << "gradebook1 created for course:" << gradebook1.getCourseName() << "\ngradebook2 created for course: " << gradebook2.getCourseName() << endl;
 _getch();
    return 0;
}

----------


## majmaji

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

----------


## mehrara_bolouri

سلام خوبی؟
ساختار do while به شکل زیر و شما اشتباه نوشتی
Do{
دستور;
دستور2;
.
.
 (شرط)while {
در این برنامه ای که شما نوشتی یک تکرار بی نهایت while ایجاد شده است تا تعدادی نامعلوم عدد بخونه و وارون آنها را نمایش بده.برای ایجاد حلقه تکرار بی نهایت در شرط حلقه (1) قرار میدیم ، 1 مقداری غیر صفر است و در c دارای ارزش درستی است و در طول اجرای برنامه تغییر نمی کنه.
می تونی از کتاب C++‎ جعفر نزاد قمی استفاده کنی خیلی به دردت می خوره
 :چشمک:  :لبخند:

----------


## majmaji

> سلام خوبی؟
> ساختار do while به شکل زیر و شما اشتباه نوشتی
> Do{
> دستور;
> دستور2;
> .
> .
>  (شرط)while {
> در این برنامه ای که شما نوشتی یک تکرار بی نهایت while ایجاد شده است تا تعدادی نامعلوم عدد بخونه و وارون آنها را نمایش بده.برای ایجاد حلقه تکرار بی نهایت در شرط حلقه (1) قرار میدیم ، 1 مقداری غیر صفر است و در c دارای ارزش درستی است و در طول اجرای برنامه تغییر نمی کنه.
> می تونی از کتاب C++‎‎ جعفر نزاد قمی استفاده کنی خیلی به دردت می خوره


اصلا برنامه من در مورد while نیست :متعجب:

----------


## mabbaszadegan

نمیدونم اشکال کجاست ، من همین کد رو با vs 2008 کامپایل کردم ، هیچ اروری نداد  :متعجب: 

فک نکنم ++dev c با vs فرقی بکنه  :متفکر:

----------


## majmaji

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

----------


## mabbaszadegan

خب همینه دیگه !!!!!!

باید اینو با پسوند .h ذخیره کنی :

using namespace std;
#include<string>
class GradeBook
{
      public:
             GradeBook( string );
             void setCourseName( string );
             string getCourseName();
             void displaymessage();
             private:
                     string coursename;
                     };

----------


## majmaji

ببین من میخوام تو vs 2008  بنویسم اما نمیدونم چجوری
من یه win 32  کنسول درست کردم و برنامه خالی رو فعال کردم بعد 3 قسمت داره header و sourse و resourse که اولین برنامه رو باید تو اولی بنویسم و دومی رو تو دومی سومی رو که میخوام تو سومی بنویسم ارور میده باید چکار کنم؟

----------


## mabbaszadegan

نه دیگه ، حالا وقتی win32 consoul رو ساختی ، روی یکی از اون پوشه ها کلیک راست کن و گزینه add -> new item رو انتخاب کن ، باید یه دونه h. و دوتا cpp. بسازی و کدهارو توش بنویسی 

اجرا کردی بگو

----------


## majmaji

اجرا نمیشه نمیدونم چشه به نظرت ول کنم برم جلو یا نه بازم امتحان کنم؟
امروز چند صد بار با dev امتحان کردم :لبخند گشاده!:  هر دفعه یه چیزی رو تغیر دادم ولی تو قسمت اول برنامه بعد از کامپایل ارور میده و یک ارور هم میده که میگه مثلا اگه اسم برنامه رو با majid ذخیره کرده باشم میگه majid.exe ساخته نشد و در قسمت دوم برنامه که میخوام کامپایل کنم به #include "GradeBook.h" گیر میده
به نظرت ول کنم برم جلو

----------


## mabbaszadegan

اینو امتحان کن ، اگه جواب نداد بیخیالش شو

----------


## majmaji

نه نشد.
بریم سراغ مثال بعدی 
مثال بعدی در مورد معتبر سازی نام درس هست که در این مثال می خواهیم درسی چاپ بشه که دارای 25 کارکتر یا کمتر هست
این هم همون 3 قسمت برنامه
#include <cstdlib>
#include <iostream>
#include <string> 

using namespace std;
class GradeBook
{
      public:
             GradeBook(string);
             void setCourseName(string);
             string getCourseMan();
             void displaymessage();
             private:
                     string coursename;
                     };



قسمت دوم
#include <cstdlib>
#include <iostream>
#include <string>
#include "GradeBook.h"

using namespace std;

GradeBook::GradeBook(string name)
{
                            setCourseName(name);
                            }

void GradeBook::setCourseName(string name)
{
     if ( name.Length() <= 25 )
     coursename = name;
     
      if ( name.Length() < 25 )
      {
           coursename = name.substr( 0, 25 )
           
           cout << "name \"" << name << "\" exceeds maximum length (25).\n" <<endl;
           }
           }
           
sring GradeBook::getCourseName()
{
      return coursename;
      }
      
void GradeBook::displaymessage()
{
     
     cout << "welcome to the gradebook for \n" <<  getCourseName() << endl;
     }
     
قسمت سوم
#include <cstdlib>
#include <iostream>
#include <string>
#include "GradeBook.h"
#include <conio.h>

using namespace std;

int main()
{
    GradeBook gradebook1( "cs101 introduction to programing in C++‎" );
    GradeBook gradebook2( "cs102 C++‎ data structures" );
    
    cout << "gradebook1's initial course name is:" << gradebook1.getCuorseName()
         << "\ngradebook2;s initial course name is:" << gradebook2.getCourseName() <<endl;
         
        gradebook1.setCourseName( "cs101 C++‎ programing" );
        
     cout << "gradebook1's course name is:" << gradebook1.getCuorseName()
         << "\ngradebook2;s course name is:" << gradebook2.getCourseName() <<endl;    

return 0;
getch();
}

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

----------


## majmaji

خوب کتاب یک سری توضیحات اورده که من رو اونا یک سری سوال دارم
name.length() یک احضار تابع عضو است ما که در برنامه تابع ()length رو تعریف نکردیم. تازه مگه name یک داده عضو نبود پس چرا در اینجا از اون به عنوان یک شی استفاده شده و با اون یک تابع فراخوانی میشه؟
در کلاس string کتابخانه ++C استاندارد تابع عضو length تعریف شده است که تعداد کارکتر های داخل یک شی string  را بر میگرداند. منظورش از کلاس string کتابخانه ++C استاندارد همون #include <string> هست؟
آیا تابع length فقط برای اشیا مورد استفاده قرار میگیره؟ برای داده هایی که از نوع int هستند چطور؟ برای پارامتر های یک تابع چطور؟

----------


## mabbaszadegan

#include<string>این خط کلاسی به اسم sting رو دراختیار میذاره ، این کلاس هم مثل همین کلاسهایی که خودت نوشتی یه سری توابع عضو داره ، اعضای داده ای داره ، سازنده و مخرب و friend داره 

وقتی مینویسی :
string name;یک شی name از کلاس string تعریف کردی، حالا توسط این شی میتونی از توابع عضو کلاس  string استفاده کنی

اگه دوست داشتی این لینکها رو ببین :

http://www.cplusplus.com/reference/s...string/length/
http://www.cplusplus.com/reference/s...string/insert/
http://www.cplusplus.com/reference/string/getline/
http://www.cplusplus.com/reference/string/string/empty/

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


موفق باشی

----------


## majmaji

آها تازه فهمیدم خوب برای اینکه بدونیم کلاس هایی که قبلا نوشته شده مثل همین string چه توابعی رو در اختیار میزاره و این توابع چه کار میکنن باید همین سایت ها رو بخونیم؟
تازه در آخر این فصل یک سری جمع بندی داره که یه مروری هم بر اینا برویم
در این فصل آموختید که چگونه کلاس های تعریف شده توسط کاربر را ایجاد کنید و نیز چگونه اشیا این کلاس ها را ایجاد و از آنها استفاده کنید بخصوص اینکه داده های عضو یک کلاس را برای نگهداری و ذخیره داده های هر شی از کلاس اعلان کردیم.
در مورد این قسمتی که آبی شده می خواستم بگم من کجای این مثال ها این کار رو کردم؟
آموختید که چگونه توابع عضو یک شی را برای درخواست خدماتی که ارائه می دهد احضار کنید و چگونه داده ها را به عنوان آرگومان به آن تابع عضو منتقل کنید.
این بالایی رو هم نمیدونم کجا ازش استفاده میکردیم.
تازه این مثال آخریه رو هم نتونستم اجرا کنما مثل همون قبیه ارور میده

----------


## mabbaszadegan

> برای اینکه بدونیم کلاس هایی که قبلا نوشته شده مثل همین string چه توابعی رو در اختیار میزاره و این توابع چه کار میکنن باید همین سایت ها رو بخونیم؟


دقیقا ، اگه میخوای تو برنامه نویسی پیشرفت کنی ، باید مراجع زیادی رو ببینی ؛ این چند تا سایت رو واسه شروع یادت باشه :
http://www.cplusplus.com/
http://msdn.microsoft.com/
http://www.planet-source-code.com/
http://www.codeproject.com/

اگه زبانت خوبه ، این آخری خیلی به دردت میخوره 




> داده های عضو یک کلاس را برای نگهداری و ذخیره داده های هر شی از کلاس اعلان کردیم.


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




> توابع عضو یک شی را برای درخواست خدماتی که ارائه می دهد احضار کنید و چگونه داده ها را به عنوان آرگومان به آن تابع عضو منتقل کنید.


توابع عضو set و get و یه تابع عضو displaymessage رو باهاش کار کردی ؛ 




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


نمیدونم والا ، من اجرا کردم ، اجرا شد ؛  از مدیرای بخش سوال کن ،

موفق باشی

----------


## majmaji

دست گلت درد نكنه محمد جان خيلي بهت زحمت دادم خدا بخواد ديگه فصل 3 تموم شد و حالا رسيديم سر تمريناش. من از اين بخش خوشم مياد چون سوالاش حرفه اي طراحي شده و اگه كسي كتاب رو سرسري خونده باشه نميتونه به سوالا جواب بده
اگه اشكال نداره من سوالا رو بنويسم و جوابشو بگم شما ببين من درست ميگم يا غلط:
1- در مورد تفاوت پيش نمونه تابع و تعريف تابع توضيح دهيد:
در پيش نمونه يك تابع ما نام تابع، نوع برگشتي آن و تعداد و نوع داده ها و ترتيب قرار گرفتن پارامتر ها رو كه از تابع انتظار دريافت آن را داريم تعريف مي‌كنيم اما تابع را به صورت كامل تعريف نميكنيم به صورت زير
void setCourseName(string name) ولي در تعريف تابع ما تابع را در كل تعريف ميكنيم يعني عملياتي را كه تابع انمام مي دهد را هم تعريف ميكنيم
2- سازنده پيش فرض چيست؟ اگر در كلاسي فقط يك سازنده پيش فرض به طور ضمني تعريف شده باشد داده هاي عضو اين كلاس چگونه مقدار اوليه ميگيرند؟
سازنده پيش فرض به داده عضو كلاس مقدار اوليه نميدهد اما براي هر داده ي عضوي كه يك شي از كلاس ديگر است سازنده پيش فرض را احضار مي‌كند. قسمت دوم سوال رو هم نميدونم
3- در مورد هدف از استفاده داده عضو را توضيح دهيد:
خوب اگر از متغير محلي استفاده شود فقط در همان محل تعريف تا آخر جايي كه آكولاد بسته مي‌شود قابل استفاده است براي اين كه بتونيم مطمئن بشيم و در چند تابع در يك كلاس از اون استفاده كنيم بايد اون رو به صورت داده عضو تعريف كنيم.
4- سرفايل چيست؟ فايل كد مبدا چيست؟ هدف استفاده از هر يك را توضيح دهيد؟
سرفايل ها قسمتي از برنامه هستند كه داراي پسوند h. هستند و فايل كد مبدا نيز قسمتي از برنامه هستند كه داراي پسوند cpp. هستند
براي امنيت بيشتر و براي اينكه كاربر مشتري به برنامه دسترسي نداشته باشه از اين دو استفاده ميشه.
5- توضيح دهيد چگونه بدون نوشتن اعلان using در يك برنامه ميتوان از كلاس string استفاده كرد؟
فكر كنم بايد كل كلاس string  با تابع درونش و عملياتي كه انجام ميده رو يك بار تعريف كنيم
6- توضيح دهيد چگونه يك كلاس مي تواند يك تابع set و يك تابع get براي يك داده عضو فراهم سازد
خوب ما اين كار رو در مثال هايي كه با هم نوشتيم و بحث و بررسي كرديم انجام داديم درسته؟
دادا اينا باشه بقيش برنامه نويسي هست من دارم روشون فكر ميكنم يخته سخته ولي الان رفتم زيرخمشو گرفتم :لبخند گشاده!:

----------


## mabbaszadegan

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




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


ببینم چه میکنی  :چشمک:

----------


## majmaji

خوب ما با 5 تا برنامه روبرو هستیم اولی همون کلاس gradebook هست که میگه یکاری کنید تا برنامه اسم استاد ردس را هم چاپ کند من برنامه رو نوشتم در دو قسمت یکی تعریف کلاس و دیگری تابع main اما بازهم همون ارور رو میده :گریه: 
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

class GradeBook
{
      public:
             GradeBook( string name, a)
             {
                        setCourseName( name, a );
                        }

void setCourseName( string name )
{
     
coursename = name;
}

string getCourseName()
{
       return coursename;
       }
void setTeacherName( string a )
       {
            teachername = a;
            }
string getTeacherName()
            {
                   return teachername;
                   }

void displaymessage()
{
     
     cout << "this course is presented by\n" << getTeacherName() << "welcome to the gradebook for\n" << getCourseName() << endl;
     }
     private:
             string coursename;
             string a;
     };
و قسمت دوم برنامه
#include <cstdlib>
#include <iostream>
#include <string>
#include <conio.h>
#include "GradeBook.h"

using namespace std;

int main()
{
GradeBook gradebook1( "cs101 introduction to C++‎ programing" );
GradeBook gradebook2( "this course is peresented by majid & mohamad" );

cout <<"gradebook1 created for course: " << gradebook1.getCourseName() << "\ngradebook2 is the name of teacher:" << gradebook2.getTeacherName() <<endl;
getch();
return 0;
}

----------


## mabbaszadegan

خب کدت چندتا ایراد داشت ، دونه دونه بررسیش میکنیم :

1. اعضای داده ای کلاس عبارتند از :
 coursename و teachername که این دومی رو یادت رفته بود تعریف کنی ؛ 
پس  داریم :
private:
             string coursename;
             string teachername;

2. سازنده باید اعضای داده ای رو مقداردهی کنه ، پس اگه قراره سازنده ت دوتا آرگومان داشته باشه ، باید بنویسی :
GradeBook( string a, string b)
             {
                        coursename=a;
                        teachername=b;

                        }

3. توابع set و get  رو درست نوشتی 

خب این از مشکلات تابع اولت ، کد اصلاح شده قسمت اول اینطوری میشه :

GradeBook.h
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

class GradeBook
{
      public:
             GradeBook( string a, string b)
             {
                        coursename=a;
                        teachername=b;

                        }

void setCourseName( string name )
{
     
coursename = name;
}

string getCourseName()
{
       return coursename;
       }
void setTeacherName( string a )
       {
            teachername = a;
            }
string getTeacherName()
            {
                   return teachername;
                   }

void displaymessage()
{
     
     cout << "this course is presented by\n" << getTeacherName() << "welcome to the gradebook for\n" << getCourseName() << endl;
     }
     private:
             string coursename;
             string teachername;
             
     };

واما تابع main.cpp :
فقط یه مشکل داشت ، سازنده ای که تعریف کردی دوتا آرگومان میگیره ، پس توی تابع main هم باید با دو آرگومان صدازده بشه ؛ مثلا :
GradeBook gradebook1( "cs101 introduction to C++‎‎ programing","Mohammad" );
GradeBook gradebook2( "this course is peresented by majid & mohamad","Majid" );

شکل اصلاح شده تابع main.cpp:
#include <cstdlib>
#include <iostream>
#include <string>
#include <conio.h>
#include "GradeBook.h"

using namespace std;

int main()
{
GradeBook gradebook1( "cs101 introduction to C++‎‎ programing","Mohammad" );
GradeBook gradebook2( "this course is peresented by majid & mohamad","Majid" );

cout <<"gradebook1 created for course: " << gradebook1.getCourseName() << "\ngradebook2 is the name of teacher:" << gradebook2.getTeacherName() <<endl;
getch();
return 0;
}

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


موفق باشی

----------


## majmaji

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

دادا در برنامه دوم از ما میخواد که کلاس account رو درست کنیم با این شرایط:
کلاس باید دارای یک داده عضو از نوع int برای نمایش موجودی حساب باشد.
باید سازنده ای ایجاد کنید که موجودی اولیه مشتری را دریافت کند و از آن برای مقدار اولیه دادن به داده عضو استفاده کند. سازنده باید مقدار اولیه موجودی را ارزیابی کند تا معلوم شود بزرگتر است یا برابر با صفر است در غیر اینصورت باید مقدار اولیه برابر با صفر قرار داده شود.
تابع عضو credit باید یک مقدار به مقدار اولیه اضافه کند.
تابع عضو debit باید پول را از حساب برداشت کند و باید اطمینان دهد که مقدار بدهکاری بیشتر از موجودی account نیست
در  صورت مثبت بودن جواب موجودی نباید تغیر کند و موجودی باید پیغامی مبنی بر "debit amount exceeded account balance"  است در خروجی چاپ کند.
تو برنامه گفته از 3 تابع استفاده کنید من هر کاری میکنم 4 تابع میشه تازه اینجا دو تا شرط داره یکی تو قسمت سازنده یکی هم تو قسمت برداشت پول من نمیدونم این دو تا رو چه جوری بیان کنم چون هنوز منظور سوال رو نفهمیدم تو قسمت سازنده میگه اگه بزرگتر یا براب 0 نبود خوب این به این معنی هست که مقدار پول منفی باشه و منفی یعنی اینکه بدهکاری خوب اگه مشتری بدهکار باشه بدهکاریش از بین میره
و در قسمت دوم شرطی که در قسمت برداشت  میگه مقدار بدهکاری بیشتر از موجودی نباشه؟
من گیج شدم
و نمیدونم از کجا باید شروع کنم اگه میشه یه نقطه شروع برای من مشخص کن
ممنون

----------


## mabbaszadegan

خب ، خدا رو شکر که اجرا شد  :لبخند: 


خب به نظرم اول شروع کن به نوشتن کلاس ، اعضای داده ای رو مشخص کن ، بعد هرجوری به نظر خودت معقوله واسش شرط بذار ، مثلا در مورد سازنده :
سازنده زمانی صدا زده میشه که بخواهی شی جدیدی رو معرفی کنی (در واقع این شی همون شخصیه که میخواد حساب باز کنه) ؛ خب برای باز کردن حساب شخص باید مقداری پول اولیه بریزه توحسابش ، مسلما این پول یه مقدار مثبت و حتی شاید بزرگتر از 10000$ داشته باشه  ؛ 

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

بقیشو خودت تحلیل کن ، اگه به نظرت تابع دیگه ای هم نیاز داره بهش اضافه کن 


راستی یه چیزی :
خیلی خوشم اومد ازت ، این تلاشت باعث شد منم خیلی چیزا رو یاد بگیرم ، همینطوری ادامه بدی ، مطمئنم حرفه ای میشی :تشویق:  :تشویق: 

موفق باشی :چشمک:

----------


## white tower

در این دستور که گذاشتم اون قسمتی که بولد شده رو لطف می کنید توضیح بدید که چیکار می کنه.
 out_file.write(*(char*)&temp*,sizeof(temp));

----------


## white tower

یه سوال دیگه هم دارم.این کد رو ببینید
#include<iostream>
using namespace std;
int main(){

    int max;

    cout<<"enter a number:";
    cin>>max;
    if(!cin.bad()){
        cin.clear();
        cout<<"enter an integer number please:";
        cin>>max;
    }
    cout<<"max is:"<<max<<endl;

    return 0;
}خوب این برنامه باید اگر کاربر در ورودی کاراکتر وارد کرد اخطار بده و ورودی جدید دریافت کنه.اگر برای ورودی اول کاراکتر بزنیم وارد شرط میشه و پیغام رو نمایش میده اما دیگه ورودی نمی گیره و داخل متغیر max یه عدد نامفهوم قرار میگیره.وقتی اول بلوک شرط  cin.clear() هم می ذارم باز تغییر نمی کنه و ورودی نمی گیره.
مشکل از کجاست؟

----------


## majmaji

خوب آقا محمد این برنامه من با توضیحاتی که در پست قبلی زدم این برنامه  رو نوشتم:
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

class Account
{
      public:
             Account (int mojodi)
             {
                     
             void cerdit (mojodi);
             }
             void cerdit (int mojodi, int a)
             {
                  mojodihesab = mojodi;
                  mojodihesab = mojodihesab + a;
                  }
                  void debit (int b)
                  {
                       if( b < mojodihesab)
                       mojodihesab = mojodihesab - b;
                       }
                       void getbakanc()
                       {
                            return mojodihesab;
                            }
                            private:
                                    int mojodihesab;
                                    int a;
                                    int b;
                                    };
                     

و این هم قسمت دوم
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include "Account.h"

using namespace std;
int main()
{
    Account accoount1;
    cout << "account1 mojodihesab ra neshan midahad" << account1.getbalance() << endl;
    getch();
    return 0;
}

----------


## mabbaszadegan

> در این دستور که گذاشتم اون قسمتی که بولد شده رو لطف می کنید توضیح بدید که چیکار می کنه.
>  out_file.write(*(char*)&temp*,sizeof(temp));


منم دقیقا نمیدونم ، فک کنم مال کتاب جعفرنژاده  :لبخند گشاده!: 
تا این حد میدونم که این دستور مقادیری رو که از کاربر گرفته ،توسط جریان out_file میریزه توفایل (این روش در فایلهای باینری کاربرد داره )





> یه سوال دیگه هم دارم.این کد رو ببینید
>  	کد:
>  	#include<iostream>
> using namespace std;
> int main(){
> 
>     int max;
> 
>     cout<<"enter a number:";
> ...


خب واسه اینکه باید شرط رو توی حلقه بذاری ، مثلا از while استفاده کن و تا وقتی کاربر کارکتر وارد میکنه حلقه اجرا بشه

----------


## mabbaszadegan

خب مجید جان ، کارت نسبتا خوب بود ، فقط :
1. چرا سه تا عضو داده ای ؟ به نظرت یه عضو کافی نیست ؟
2. بازم سازنده رو بد تعریف کردی ، سازنده وظیفه مقداردهی به اعضای داده ای رو داره ، یعنی سازنده Account باید اعضای داده ای کلاس رو مقدار دهی کنه ؛
3. برنامه رو طوری بنویس که واست راحته ، به نظرم بعضی جاها خیلی به خودت سخت گرفتی ، ولی درکل خوب بود 

موفق باشی

----------


## majmaji

دادا من مخم هنگ کرده این مثال رو میتونی برام بنویسی تا من دقیقا هم منظور شما رو بفهمم و هم منظور سوال کتاب رو
چون ما باید 2 تا داده دیگه داشته باشیم برای برداشت و سپرده گذاری
تازه من باز هنوز منظور این دو تا شرطی رو که سوال گذشته نمیفهمم

----------


## mabbaszadegan

سلام
اینو یه نگاه بنداز :
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

class Account
{
    private:
            int mojodihesab;

      public:
             Account (int mojodi)
             {
                 //واسه افتتاح حساب حداقل باید 10000$ بریزه به حساب ، وگرنه حساب صفر میشه
                 if(mojodi>10000) {
                     mojodihesab=mojodi; }
                 else {
                     mojodihesab=0;
                 }
             }
             // این تابع یه مقداری رو به حساب کاربر میریزه
             // مسلما این مقدار باید بزرگتر از صفر باشه
             void cerdit (int a) 
             {
                 if(a>0)
                      mojodihesab = mojodihesab + a;
                 
                  }
             // این تابع رو خودت درست نوشتی ، دیگه توضیح نمیدم
                  void debit (int b)
                  {
                       if( b < mojodihesab)
                       mojodihesab = mojodihesab - b;
                       }
                  // این تابع موجودی شخص رو برمیگردونه ، که خودت درست نوشته بودی
                  // من فقط اسمشو عوض کردم
                       int getmojodihesab()
                       {
                            return mojodihesab;
                       }
                            
};
سوالی بود ، درخدمتم

----------


## shp_com

یک نفر می شه به من بگه که با چه version کار می کنید؟

واسه من using namespace اصلا قبول نمی کنه.

----------


## majmaji

> سلام
> اینو یه نگاه بنداز :
> #include <cstdlib>
> #include <iostream>
> #include <string>
> 
> using namespace std;
> 
> class Account
> ...


خوب یک سوال مگه ما از دو متغیر a و b استفاده نمیکنیم؟ پس چرا اون ها رو معرفی نکردیم تازه مگه این دو مقدار نباید توسط ما به کامپیوتر داده بشه پس به نظر من دو تا cin کم داره

----------


## majmaji

> یک نفر می شه به من بگه که با چه version کار می کنید؟
> 
> واسه من using namespace اصلا قبول نمی کنه.


سلام 
ما داریم با کتاب دایتل پیش میریم
و در کامپایلر dev-C++‎ کار میکنیم

----------


## mabbaszadegan

سلام ،  خوشحالم که کم کم داره تعدادمون زیاد میشه ، خوش اومدی shp_com ، 




> خوب یک سوال مگه ما از دو متغیر a و b استفاده نمیکنیم؟ پس چرا اون ها رو معرفی نکردیم تازه مگه این دو مقدار نباید توسط ما به کامپیوتر داده بشه پس به نظر من دو تا cin کم داره


a و b به عنوان آرگومان وارد تابع میشند ، اگه بخواهی اونا رو کاربر وارد تابع کنه ، توی تابع main باید cin کنی و بفرستیشون تو تابع 


موفق باشی

----------


## majmaji

یعنی ما با پارامتر تابع به این دو آرگومان ها مقدار میدیم
یعنی باید تو تابع main توسط شی هایی که تعریف میکنیم تابع رو فراخونی کنیم و بعد مقدار بدیم؟

----------


## white tower

> منم دقیقا نمیدونم ، فک کنم مال کتاب جعفرنژاده 
> تا این حد میدونم که این دستور مقادیری رو که از کاربر گرفته ،توسط جریان out_file میریزه توفایل (این روش در فایلهای باینری کاربرد داره )
> 
> 
> 
> خب واسه اینکه باید شرط رو توی حلقه بذاری ، مثلا از while استفاده کن و تا وقتی کاربر کارکتر وارد میکنه حلقه اجرا بشه


نه مال کتاب جعفرنژاد نیست.البته درست فرمودید که با جریان out_file اطلاعات رو توی فایل می ریزه اما می خواستم اون قسمت که بولد کرده بودمم رو دقیقا بفهمم که چیکار می کنه.
در مورد دوم هم اون راه که شما فرمودید منظورم نیست.می خوام از cin.bad() استفاده کنم و بدونم که چرا دوباره ورودی نمی گیره.بافر رو  هم که خالی می کنم اما ورودی داخل ظرط باز هم کار نمی کنه و ازش رد میشه.

----------


## mabbaszadegan

> یعنی ما با پارامتر تابع به این دو آرگومان ها مقدار میدیم
> یعنی باید تو تابع main توسط شی هایی که تعریف میکنیم تابع رو فراخونی کنیم و بعد مقدار بدیم؟


ای ول ، دقیقا درسته ، 

فک کنم یواش یواش داری درک درستی از اشیا پیدا میکنی ، منتظر سوال بعدتم  :چشمک:

----------


## majmaji

ای ول ای ول داش محمد و ایول
دادا میگما بریم سراغ مثال بعدی ولی یه مشکلی این مثال و دو تا مثال بعدی همش شبیه مثال قبلیایی هست که حل کردیم یعنی همش یه تابع set یه تابع get بعدشم displaymessage
من  هم تمرین شماره 3 رو که این چیزا رو میخواد اینطوری نوشتم:
کلاس invoice یا صورت فروش
کلاسی به نام invoice که یک فروشگاه وسایل سختافزاری از آن بتواند برای صورت حساب جنس فروخته شده آن فروشگاه استفاده کند.
invoice باید متضمن چهار داده عضو باشد  شماره قطعه شرح قطعه تعداد جنس خریداری شده و قیمت جنس 
کلاس باید سازنده ای داشته باشد که به چهار داده عضو مقدار دهد برای هر یک از داده ها یک تابع set و یک تابع get و در آخر هم گفته یک تابع get invoiceamount برای مبلغ کل یعنی تعداد خریداری شده ضربدر قیمت یک بنویسید که این مقدار رو حساب کنه و مقدار رو برگردونه
بعد هم گفته اگر تعداد جنس و قیمت جنس مثبت نبود باید برابر صفر قرار داده شود. خوب این یعنی چی؟؟؟



این هم برنامه: ایا درسته؟
#include <cstdlib>
#include <iostream>

using namespace std;

class Invoice
{
      public:
Invoice(string a, string b, int c, int d)
{
               setShomareGhete(a);
               setSharhGhete(b);
               setTedadeGhete(c);
               setGheymateGhete(d);
               }
               
void setShomareGhete{string a)
{
     shomareghete = a;
     }
     
void setSharhGhete{string b)
{
     sharheghete = b;
     }
     
void setTedadeGhete{string c)
{
     tedadeghete = c;
     }

void setGheymateGhete{string d)
{
    gheymateghete = d;
     }
     
string getShomareGete()
     {
            return shomareghete;
            }
            
string getSharheGhete()
{
       return sharheghete;
       }
       
string getTedadeGhete()
{
       return tedadeghete;
       }
       
string getGheymateGhete()
{
       return gheymateghete;
       }
       
       
void getinvoiceamount()
{
     tedadeghete*gheymateghete=gheymatekol;
     }
     
     void displaymessage()
     {
          cout <<"etelaate foroshe mahsolat:"<< getShomareGete()<< getSharheGhete()<< getTedadeGhete()<< getGheymateGhete()<< endl;
          }
          private:
                  
            shomareghete;
            sharheghete;
            tedadeghete;
            gheymateghete;
            gheymatekol;
            };

----------


## mabbaszadegan

:لبخند گشاده!: 
تقریبا درست بود ، ولی فک کنم حواست نبوده نوع اعضای داده ای رو مشخص کنی ؛




> اگر تعداد جنس و قیمت جنس مثبت نبود باید برابر صفر قرار داده شود.


خب یعنی اگه یه وقت کاربر مقدار منفی فرستاد توی توابع set ، تابع به صورت هوشمند مقدار متغیر رو بذاره صفر  ؛ اینم یکی دیگه از فواید تعریف توابع set و get  :چشمک: 


اگه به نظرت دیگه فول شدی برو سراغ فصل بعد ، البته فک کنم تا فصل 6 و 7 سریع بتونی پیش بری تا برسیم به مبحث شیرین اشاره گر ها  :لبخند گشاده!: 
موفق باشی

----------


## majmaji

البته اگه ميشه من يه سوال از اين بخش بپرسم:
الان من اين برنامه رو نوشته حالا چيجوري با شي مقدار اعضاي داده اي رو در آرگومان قرار بدم؟؟؟
تازه اون شرطي رو كه گفته بايد هم تو تابع set و هم تو تابع get تعريف كنيم؟
يا نه فقط تو set تعريف كنم كافيه؟ شرطشم بايد با if باشه؟

----------


## mabbaszadegan

> البته اگه میشه من یه سوال از این بخش بپرسم:
> الان من این برنامه رو نوشته حالا چیجوری با شی مقدار اعضای داده ای رو در آرگومان قرار بدم؟؟؟
> تازه اون شرطی رو که گفته باید هم تو تابع set و هم تو تابع get تعریف کنیم؟
> یا نه فقط تو set تعریف کنم کافیه؟ شرطشم باید با if باشه؟


خب توی تابع main ، اول یه شی از کلاس تعریف میکنی و با استفاده از سازنده ای که واسه کلاست نوشتی شی رو مقداردهی میکنی ؛ مثلا :
Invoice obj1("001","ghete 1",10,150000);

در مورد شرط ( if ) هم فقط کافیه که توی تابع set شرط بذاری ، چون تابع get فقط قراره یه مقدار رو برگردونه و کاری با درستی و غلطی اون نداره ، 

موفق باشی

----------


## mabbaszadegan

> با سلام
> اگه میشه دوستان یه نگاهی به این برنامه ما بکنن و ببینید چرا اجرا نمیشه؟
> فایل های ضمیمه                                                Polynomials, etc.zip‏ (11.9 کیلوبایت, 0 دیدار)


برنامه ت یه تابع main کم داره فقط ، در کل خیلی قشنگ و مرتب نوشتی ، خیلی خوشم اومد

مجید جان برنامه ایشون رو دانلود کن ، خیلی میتونه کمکت کنه ، مخصوصا توی مبحث overloading عملگرها

----------


## majmaji

سلام به بچه ها مخصوصا محمد جان
برنامه رو دیدم فقط نمیدونم چرا 5 تا هدر داشت البته فکر کنم که برسم فصلای بالاتر بتونم بفهمم
فصل 4 در مورد الگوریتم و دستور های کنترلی هست
در مورد دستور های شبه کد هم یک سری توضیح آورده . یک مثال هم اورده:
prompt the user to enter the first integer
input the first integer
prompt the user to enter the secondinteger
input the second integer
add first integer and second integer
display result
حالا سوال من اینه که این شبه کد ها همون الگوریتم نویسی هست؟
در ادامه گفته که دستور های کنترلی سه دسته اند:
1- دستورهای ترتیبی
2- دستور های انتخاب
3- دستور تکرار
دوباره آیا دستور های ترتیبی همان شبه کد ها هستند؟
دوباره در مورد این توضیح داده که برنامه ها رو به صورت شبه کد بنویسید و بعد تبدیل کنید به برنامه ++C من در کل پاراگراف رو نفهمیدم ولی یه چیزی که تو چشم بود واژه "نمودار فعالیت ها" بود. یعنی چی؟

----------


## mabbaszadegan

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

توی شبه کد ، مفهومی که قراره بنویسی رو به هر زبونی که دوست داری (فارسی یا انگلیسی) مینویسی ، مثلا میگی :
 متغیر a را تعریف میکنیم
به کاربر بگو a را وارد کند
a را بخوان
اگر a منفی بود آن را در 10 ضرب کن 
در غیر این صورت a را با 10 جمع کنحالا اینو تبدیلش میکنیم به کد ++ c 
 int a;
cout<<"a :";
cin>>a;
if(a<0)
a*=10;
else
a+=10;


> در ادامه گفته که دستور های کنترلی سه دسته اند:
>  1- دستورهای ترتیبی
>  2- دستور های انتخاب
>  3- دستور تکرار


دستورهای ترتیبی که همین دستورات معمولیه که استفاده میکنی ، دستورات انتخاب مثل switch, if .. else
و دستورهای تکرار همون حلقه های تکرارند مثل for, while , do.. while




> واژه "نمودار فعالیت ها" بود. یعنی چی؟


دقیق نمودنم ، ولی فک کنم *activity  diagram* یکی از نمودارهای uml باشه که واسه تجزیه و تحلیل برنامه کاربرد داره ، ولی بازم اساتید محترم اگه اشتباه میکنم 

موفق باشی

----------


## majmaji

سلام به همه دوستان خوبید درسا خوب پیش میره امیدوارم درسا خوب پیش بره مخصوصا امتحانای آخر ترم
ما که داریم سخت کار میکنیم پول ترم جدیدو بدیم :لبخند گشاده!: 
قرض از مزاحمت اینکه فصل چهارم کار سبک تری نسبت به بقیه فصلا داره و من تازه رسیدم به دستور تکرار while تا اینحا مشکل زیادی نداشتم فقط یه مثال بود که زده بود من توضیحاتشو نفهمیده بودم
اینم مثال:
if(student grade >= 60 )
cout << "passed.\n";
else
{
cout << "failed.\n"
cout << "you must take this course again.\n";
}

 در این برنامه میگه اگه شرط درست باشه یا نباشه بالاخره cout << "passed.\n"; اجرا میشه. آیا این حرف درسته؟

----------


## mabbaszadegan

> در این برنامه میگه اگه شرط درست باشه یا نباشه بالاخره cout << "passed.\n"; اجرا میشه. آیا این حرف درسته؟


نه دیگه ، اگه شرط برقرار باشه اجرا میشه ، اگه برقرار نباشه قسمت else اجرا میشه

----------


## majmaji

درسته البته این رو کتاب نوشته بود نمیدونم چرا!!!
ما رسیدیم به یه مثال، مثال در مورد همون کلاس gradebook هست با این تفاوت که الان میخواهیم 10 تا نمره از کلاس بگیریم و میانگین رو حساب کنیم
قسمت اول برنامه:

#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;


class GradeBook
{
public:
    GradeBook(string name)
    {
        setCoursename(name);
    }
    void setCourseName(string name)
    {
        if (name.length() <= 25)
            coursename = name;
        else
        {
            coursename = name.substr(0, 25);
            cout << "name\"" << name << "\"exceeds maximum length(25).\n" << "limiting coursename to first 25 characters.\n" << endl;
        }
    }
    string getCourseName()
    {
        return coursename;
    }
    void displaymessage()
    {
        cout << "welcome to the grade book for\n" << getCourseName() << endl;
    }
    void determineclassaverage()
    {
        int total;
        int gradecounter;
        int grade;
        int average;

        total = 0;
        gradecounter = 1;
        while (gradecounter <= 10)
        {
            cout << "enter grade:";
            cin >> grade;
            total = total+grade;
            gradecounter = gradecounter+1;

        }
        average = total/10;

        cout << "\ntotal of 10 grade is:" << total << endl;
        cout << "\n class average is:" << average << endl;
    private:
        string coursename;
    };
قسمت د.م برنامه:
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;

#include "GradeBook.h"
int main()
{
    GradeBook mygradebook("cs101 C++‎ programing");

    mygradebook.displaymessage();
    mygradebook.determineclassaverage();
    getch();
    return 0;
}
برای من باز اجرا نشد چندین بار چک کردم ببینم مشکل از من هست یا نه ولی مشکل از من نبود هر جور امتحان کردم برنامه اجرانشد

----------


## mabbaszadegan

ظاهرش که درسته ، 

ارورش چیه ؟

----------


## majmaji

میگه لینک gradebook.h ساخته نشده 
 C:\Dev-Cpp\bin\tamrin\Makefile.win [Build Error]  [GradeBook.exe] Error 1

----------


## mabbaszadegan

سلام ، شرمنده که دیر جواب میدم ، یه خورده این چند روز سرم شلوغه :چشمک: 

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

----------


## majmaji

آقا محمد ما خيلي مخلصيم. مهم اينه كه شما به فكر ما هستي و علم خودت رو با همه به اشتراك ميگذاري البته من هم سوء استفاده نميكنما :لبخند گشاده!: 
بريم سراغ اصل مطلب:
ديشب داشتم رو كتاب يه فكري ميكردم يه نتيجه گيري كردم به نظرت اين نتيجه گيري من درسته؟
هدف از ايجاد سازنده اينه كه به اشياء كلاس مقدار بده و هدف از ايجاد اشيا فراخواني تابع هست. در ليست پارامتر تابع هم پارامتري مياد كه سازنده با اون كار داره.
حالا ما در همين مثال نام درس، به شي gradebook1 يك مقداري داديم وقتي با اون تابع getCourseName رو فراخواني ميكنيم مقدار شي جاي CourseName ميشينه به اين ترتيب كه در سازنده پارامتر name تعريف ميشه در تابعset مقدار Coursename در name ذخيره ميشه و در تابع get اين متغير  coursename بازگشت ميشه (البته مقدارش) و اين مقدار هم همون مقدار پارامتر هست
اين نتيجه گيري من درسته؟

خوب اگه اينجوري باشه در همين مثال بالا چرا با شي اي كه مقدار نام كلاس رو داره تابع determineclassaverage رو فراخواني كرديم؟

----------


## white tower

سلام.
من یه سوال دارم که خودمم خوب نمی دونم چیه.امیدوارم که متوجه بشید
این قضیه بایت کم ارزش و با ارزش چیه؟من الان یه برنامه دارم می نویسم که فکر کنم باید در قیمتیش جای این بایتها رو در یه عدد
short int
عوض کنم.این متغیر باید مقدار یک بگیره منتها در حالت برعکس معمول.امیدوارم متوجه شده باشید.اگر فرض کنیم در حالت معمولی بایت اول مقدار رو نگه می داره الان می خوام برعکسش کنم یعنی بایت دوم مقدار رو نگه داره.شاید اینطوری برنامه ام راه بیافته.هیچ ایراد دیگه ای جز این ندیدم.
ممنون .

----------


## mabbaszadegan

> آقا محمد ما خیلی مخلصیم. مهم اینه که شما به فکر ما هستی و علم خودت رو با همه به اشتراک میگذاری البته من هم سوء استفاده نمیکنما
> بریم سراغ اصل مطلب:
> دیشب داشتم رو کتاب یه فکری میکردم یه نتیجه گیری کردم به نظرت این نتیجه گیری من درسته؟
> هدف از ایجاد سازنده اینه که به اشیاء کلاس مقدار بده و هدف از ایجاد اشیا فراخوانی تابع هست. در لیست پارامتر تابع هم پارامتری میاد که سازنده با اون کار داره.
> حالا ما در همین مثال نام درس، به شی gradebook1 یک مقداری دادیم وقتی با اون تابع getCourseName رو فراخوانی میکنیم مقدار شی جای CourseName میشینه به این ترتیب که در سازنده پارامتر name تعریف میشه در تابعset مقدار Coursename در name ذخیره میشه و در تابع get این متغیر  coursename بازگشت میشه (البته مقدارش) و این مقدار هم همون مقدار پارامتر هست
> این نتیجه گیری من درسته؟
> 
> خوب اگه اینجوری باشه در همین مثال بالا چرا با شی ای که مقدار نام کلاس رو داره تابع determineclassaverage رو فراخوانی کردیم؟


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

----------


## mabbaszadegan

> سلام.
> من یه سوال دارم که خودمم خوب نمی دونم چیه.امیدوارم که متوجه بشید
> این قضیه بایت کم ارزش و با ارزش چیه؟من الان یه برنامه دارم می نویسم که فکر کنم باید در قیمتیش جای این بایتها رو در یه عدد
> short int
> عوض کنم.این متغیر باید مقدار یک بگیره منتها در حالت برعکس معمول.امیدوارم متوجه شده باشید.اگر فرض کنیم در حالت معمولی بایت اول مقدار رو نگه می داره الان می خوام برعکسش کنم یعنی بایت دوم مقدار رو نگه داره.شاید اینطوری برنامه ام راه بیافته.هیچ ایراد دیگه ای جز این ندیدم.
> ممنون .


سلام

مثلا این عدد (در مبنای دو) رو ببین :
10100010
این عدد 8 بیت هستش که به چهار بیت سمت راست میگندبایت کم ارزش ، یعنی اگه حذف بشند عدد زیاد تغییر نمیکنه ؛ ولی به چهار بیت سمت چپ بیت باارزش میگند ، یعنی اگه حذف بشند مقدار عدد به کلی تغییر میکنه

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

موفق باشی

----------


## majmaji

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


این تابع:
 void determineclassaverage()
    {
        int total;
        int gradecounter;
        int grade;
        int average;

        total = 0;
        gradecounter = 1;
        while (gradecounter <= 10)
        {
            cout << "enter grade:";
            cin >> grade;
            total = total+grade;
            gradecounter = gradecounter+1;

        }

----------


## mabbaszadegan

خب این تابع که کارش مشخصه ، داره میانگین 10 تا عدد رو حساب میکنه و معدل 10 درس رو در خروجی چاپ میکنه :
average = total / 10; // integer division yields integer result
 // display total and average of grades
 cout << "\nTotal of all 10 grades is " << total << endl;
 cout << "Class average is " << average << endl;
 بعد توی تابع main اومده با استفاده از شی myGradeBook تابع determineClassAverage رو فراخونی کرده

موفق باشی

----------


## majmaji

خوب دادا مشکل همینه این شی mygradebook مگه مقدارش مخصوص چاپ نام درس نیست؟
مگه ما نباید یه شی دیگه ای درست کنیم که این تابع رو جداگونه احضار کنه؟
یا نه اصلا هیچ فرقی نداره ؟

----------


## mabbaszadegan

> خوب دادا مشکل همینه این شی mygradebook مگه مقدارش مخصوص چاپ نام درس نیست؟
> مگه ما نباید یه شی دیگه ای درست کنیم که این تابع رو جداگونه احضار کنه؟
> یا نه اصلا هیچ فرقی نداره ؟


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

----------


## white tower

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

----------


## Negative_Se7en

اینو امتحان کن.

double f = (double)1312156644.564655;
printf("%f",f);

----------


## white tower

> اینو امتحان کن.
> 
> double f = (double)1312156644.564655;
> printf("%f",f);


اول ممنون.
بعد با C++‎ لطف بفرمایید.

----------


## Negative_Se7en

یعنی منظور شما اینه که این کد در ++C اجرا نمیشه ؟!!!!!!

----------


## white tower

> یعنی منظور شما اینه که این کد در ++C اجرا نمیشه ؟!!!!!!


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

----------


## Negative_Se7en

دوست من. اگه هدفت اینه که خودت یه تابع بنویسی که این کارو بکنه یه سری به این بزن :
https://barnamenevis.org/showthread.php?t=204334
شاید به نظر بی ربط بیاد ولی به کاری شما میخواهید بکنید ربط داره.
یه تابع توش هست که رشته رو به int تبدیل میکنه ، به نظر من خودت یه سری تغییرات توش بده و یا ازش الگو بگیر و یه تابع بنویس که float یا double رو به رشته تبدیل کنه. :چشمک:

----------


## sh4mid

> ه سوال مبتدی :من یه متغیر اعشار دارم که وقتی چاپش می کنم با نماد علمی چاپ میشه.چیکار کنم که با اعشار بیاد که بفهمم چنده؟
> ممنون


#include<iomanip>

cout.setf(ios:;fixed);
cout.setf(ios::showpoint);
cout.precision(2);

long f=10.3;
cout<<f<<endl;

----------


## Negative_Se7en

sh4mid .من هم یه همچین چیزی رو بهش پیشنهاد دادم ولی میخواد خودش کد کاملش رو بنویسه.

----------


## white tower

> #include<iomanip>
> 
> cout.setf(ios:;fixed);
> cout.setf(ios::showpoint);
> cout.precision(2);
> 
> long f=10.3;
> cout<<f<<endl;


این دقیقا همون چیزه که می خواستم.با اینsetf خیلی کار کردم اما آخرش به نتیجه نرسید.فکر کنم چون precision رو مقدار نداده بودم جواب نمی داد درسته یا ارتباطی نداره؟البته تو کد شما هم یه مشکل کوچولو هست.شما متغیر صحیح برای مقدار اعشاری تعریف کردید.
یه سوال دیگه هم در همین رابطه:فرق این دو تا کد شیه.منظورم اینه که '|' چه تغییری اعمال می کنه؟
 cout.setf(ios::fixed | ios::showpoint);
cout.setf(ios::fixed , ios::showpoint);

----------


## Negative_Se7en

white tower جان.من که آخر متوجه نشدم که چی می خواهی. :متفکر: 
اون چیزی که شما به من گفتی ، هیچ ربطی به این نداشت.

----------


## sh4mid

> البته تو کد شما هم یه مشکل کوچولو هست.شما متغیر صحیح برای مقدار اعشاری تعریف کردید


این شبه کده ! سخت نگیر  :لبخند:   :لبخند:  :لبخند: 




> فرق این دو تا کد شیه.منظورم اینه که '|' چه تغییری اعمال می کنه؟


http://www.cplusplus.com/reference/i...ios_base/setf/

http://www.cplusplus.com/reference/i...base/fmtflags/

----------


## majmaji

به به سلام دوستان میبینم اینجا خوب رونق گرفته خدا رو شکر
من هم یه سوال ازتون بپرسم
به این برنامه نگه کنید:
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;
#include "GradeBook.h"
GradeBook::GradeBook(string name)
{
                            setCourseName( name );
}


void GradeBook::setCourseName( string name )
{
        if(name.length() <= 25)
        coursename = name;
        else
        {
            coursename = name.substr( 0, 25 );
            }
         
         
string GradeBook::getCoursename()
{
       return coursename;
       }
       
       
void GradeBook::displaymessage()
{
     cout<< "welcome to the gradebook for\n" << getCourseName()<<endl;
     }
     
     
void GradeBook::determineclassaverage()
{
     int total;
     int gradecounter;
     int grade;
     double average;
     
     total = 0;
     gradecounter = 0;
     cout<< "enter grade or -1 to quit:";
     cin>>grade;
     
     
     while(grade != -1)
     {
                 total = total + grade;
                 gradecounter = gradecounter + 1;
                 
     
     cout<< "enter grade or -1 to quit:";
     cin>>grade;
     }
     
     
     if( gradeconter != 0 )
     {
         average = static_cast< double >( total ) / gradeconter;
         cout << "\ntotal of all" << gradecounter << "grade entered is" << total << endl;
         cout << "class average is" << setprecision( 2 ) << fixed << average << endl;
         }
         else
         cout << "no grades were entered " << endl;
         }
         
         
         
         
         
         
         
         
         
         
         
         
         
     
     
     
     
     
     
     
     


در این برنامه این دو خط یعنی چی؟
 average = static_cast< double >( total ) / gradeconter;

 cout << "class average is" << setprecision( 2 ) << fixed << average << endl;

----------


## E G A L E

> دست گلت درد نکنه محمد جان خیلی بهت زحمت دادم خدا بخواد دیگه فصل 3 تموم شد و حالا رسیدیم سر تمریناش. من از این بخش خوشم میاد چون سوالاش حرفه ای طراحی شده و اگه کسی کتاب رو سرسری خونده باشه نمیتونه به سوالا جواب بده
> اگه اشکال نداره من سوالا رو بنویسم و جوابشو بگم شما ببین من درست میگم یا غلط:
> 1- در مورد تفاوت پیش نمونه تابع و تعریف تابع توضیح دهید:
> در پیش نمونه یک تابع ما نام تابع، نوع برگشتی آن و تعداد و نوع داده ها و ترتیب قرار گرفتن پارامتر ها رو که از تابع انتظار دریافت آن را داریم تعریف می‌کنیم اما تابع را به صورت کامل تعریف نمیکنیم به صورت زیر
> void setCourseName(string name) ولی در تعریف تابع ما تابع را در کل تعریف میکنیم یعنی عملیاتی را که تابع انمام می دهد را هم تعریف میکنیم
> 2- سازنده پیش فرض چیست؟ اگر در کلاسی فقط یک سازنده پیش فرض به طور ضمنی تعریف شده باشد داده های عضو این کلاس چگونه مقدار اولیه میگیرند؟
> سازنده پیش فرض به داده عضو کلاس مقدار اولیه نمیدهد اما برای هر داده ی عضوی که یک شی از کلاس دیگر است سازنده پیش فرض را احضار می‌کند. قسمت دوم سوال رو هم نمیدونم
> 3- در مورد هدف از استفاده داده عضو را توضیح دهید:
> خوب اگر از متغیر محلی استفاده شود فقط در همان محل تعریف تا آخر جایی که آکولاد بسته می‌شود قابل استفاده است برای این که بتونیم مطمئن بشیم و در چند تابع در یک کلاس از اون استفاده کنیم باید اون رو به صورت داده عضو تعریف کنیم.
> ...


من به کتابی که شما میخونین علاقه مند شدم میشه بگین از چه کتابی میخونین؟

----------


## lartenk

دوستان من یه مشکل اساسی با این ارایه ها دارم،مثلا یه ارایه ی 10 تایی دارم میخوام حرف o رو با استفاده از کارکتر @ توش در بیاره!هر کدی مینویسم اصلا وقتی کمپایل میکنه هیچی نشون نمیده،خواهش میکنم کمک کنید.

----------


## majmaji

> من به کتابی که شما میخونین علاقه مند شدم میشه بگین از چه کتابی میخونین؟


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

----------


## mabbaszadegan

سلام مجید جان

سوال اول :
average = static_cast< double >( total ) / gradeconter;

عملگر static_cast برای تبدیل صریح نوع متغیرها به کار میره ، توی این مثال total اول از نوع int تعریف شده ، بعد توی این خط با دستور static_cast< double >( total ) به double تبدیل میشه


سوال دوم :
cout << "class average is" << setprecision( 2 ) << fixed << average << endl; 

تابع setprecision یکی از توابع دستکاری کننده جریان ورودی و خروجی هستش که با اون میتونی مشخص کنی اعداد تا چند رقم اعشار نمایش داده شوند ؛ این کد رو تست کن :

_#include <iostream>_
#include <iomanip>
using namespace std;
 
int main () {
  double f =3.14159;
  cout << setprecision (5) << f << endl;
  cout << setprecision (9) << f << endl;
  cout << fixed;
  cout << setprecision (5) << f << endl;
  cout << setprecision (9) << f << endl;
  return 0;
}

البته این مباحث کامل تو فصل 15 میخونی 

موفق باشی

----------


## mabbaszadegan

> دوستان من یه مشکل اساسی با این ارایه ها دارم،مثلا یه ارایه ی 10 تایی دارم میخوام حرف o رو با استفاده از کارکتر @ توش در بیاره!هر کدی مینویسم اصلا وقتی کمپایل میکنه هیچی نشون نمیده،خواهش میکنم کمک کنید.


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

موفق باشی

----------


## majmaji

سلام دادا
خوب مشکل اینه چرا ما باید total رو تبدیل کنیم
مگه ما نمیخوایمکهحاصل تخصیم رو بهمون اعشاری نشون بده پس باید average رو تبدیل کنیم
نه؟

----------


## mabbaszadegan

> سلام دادا
> خوب مشکل اینه چرا ما باید total رو تبدیل کنیم
> مگه ما نمیخوایمکهحاصل تخصیم رو بهمون اعشاری نشون بده پس باید average رو تبدیل کنیم
> نه؟


آره ، درسته 
این مثال فقط میخواسته کاربرد این تابع رو نشون بده ، شاید درست ترش این بود که نوع average رو عوض کنه

موفق باشی

----------


## majmaji

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

3 تاشو انجام دادم اما یکی دیگش میگه که برنامه ای بنویسید کهاندازه دو ضلع عمود بر هم مثلث قائم الزاویه رو بگیره و اندازه وتر رو حساب کنه من برنامه رو نوشتم ولی خوب نمیدونم از تابع sqrt چگونه استفاده کنم؟
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    int a, b, c;
    cout <<"/n2zele amod barham mosalas ra vared konid:";
    cin >> b >>c;
    a = sqrt((b*b) + (c*c));
    cout << "vatar barabar ast ba:" << a;
    return 0;
}
نظرت چیه مطمئنا غلط نوشتم چون ارور داد به نظرت چگونه باید از sqrt استفاده کرد؟

----------


## mabbaszadegan

سلام
تابع sqrt به این صورت تعریف شده که یک متغیر double یا  float رو میگیره و حاصلی که برمیگردونه هم از نوع double یا float هست .
یعنی الان باید نوع متغیرهای a,b,c رو عوض کنی ، مثلا بذار double

این صفحه رو ببین ، فک کنم کمکت کنه :
http://www.cplusplus.com/reference/clibrary/cmath/sqrt/

بازم سوالی بود در خدمتم  :چشمک: 

موفق باشی

----------


## majmaji

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

----------


## mabbaszadegan

توی هر کامپایلر این مقدار متفاوته ، مثلا توی ویژوال استودیو یه مقدار و توی بورلند یا توربو یه مقدار دیگه داره  :چشمک: 

یکی از روشها استفاده از عملگر sizeof هستش ؛
یه روش دیگه الان به ذهنم میرسه به کمک متغیر char ؛ یادت باشه متغیر char توی همه کامپایلرها 1 بایت فضا میگیره
روش سوم فعلا به ذهنم چیزی نیومد ، روش فکر میکنم  :متفکر: 

ببینم چه میکنی  :چشمک: 

موفق باشی

----------


## lartenk

بنده هم یه سوال داشتم: سوال برنامه ای رو خواسته که مختصات دو نقظه رو بگیره و با استفاده از این دو نقطه یک مربع رسم کنه،بنده راهی به ذهنم نمیرسه ممنون میشم راهنمایی کنید...

----------


## mabbaszadegan

> بنده هم یه سوال داشتم: سوال برنامه ای رو خواسته که مختصات دو نقظه رو بگیره و با استفاده از این دو نقطه یک مربع رسم کنه،بنده راهی به ذهنم نمیرسه ممنون میشم راهنمایی کنید...


سلام 
خب نباید زیاد سخت باشه ، وقتی مختصات دو نقطه رو داشته باشی طول اضلاع مربع رو میتونی حساب کنی ، بعدا مختصات دو راس دیگه مربع رو میتونی بدست بیاری (این از محاسباتش)

در مورد رسم شکل مربع توی محیط ویژوال استودیو من بلد نیستم ، از دوستانی که با بورلند یا توربو کار کردند میتونی بپرسی  :چشمک: 

موفق باشی

----------


## lartenk

نه ببینید مختصات دو راس مقابل رو دارم،بعد هم اینکه با ارایه باید کار کنم.

----------


## mabbaszadegan

نه ، نیازی به آرایه نیست ؛
اگه مختصات همه نقاط رو داری که دیگه مشکلی نیست ، باید با استفاده از توابع کلاس graphic شکل رو رسم کنی (من کار با این توابع رو بلد نیستم ، از دوستان دیگه میتونی کمک بگیری )

----------


## Nima_NF

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

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

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

----------

