PDA

View Full Version : سوال: مشكلات من با ++C



majmaji
دوشنبه 02 شهریور 1388, 14:09 عصر
سلام دوستان من دارم برنامه نويسي ++C كار ميكنم براي همين وقتي به مشكل بر مي‌خورم كسي نيست كه ازش سوال كنم بهم جواب بده
حالا اگه ممكنه شما دوستان كمك كنيد به بنده (البته ناراحت نشيد من يكم گيراييم كمه:لبخند:) باسه همين ممنون ميشم با صبر و شكيبايي كمك كنيد به بنده تا شايد حرفه اي شم مرسي ممنون

majmaji
دوشنبه 02 شهریور 1388, 15:17 عصر
خوب دوستان شروع ميكنيم من خوندم و رسيدم به ساختار تكرار 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
دوشنبه 02 شهریور 1388, 16:36 عصر
سلام دوست عزيز
خوب دوست عزيز من تبريك ميگم بهتون كه به سي ++ علاقه مند شديد و شروع به ياد گيري كرديد!! مطمئن باشيد كه بنده و دوستان و اساتيد محترم هر چقدر كه بتونيم كمكتون خواهيم كرد!!
حالا در مورد اين مسئله بنده توضيحاتي عرض مي كنم كه اميدوارم جواب سوالاتتون رو بگيريد!!

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


while(1){


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


do{


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

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

majmaji
دوشنبه 02 شهریور 1388, 17:51 عصر
دوست من دستت درد نكنه خيلي خوب توضيح دادي فهميدم ولي برنامه بدون ارور كار كرد
يعني وقتي return 0 رو در // زدم هيچ اروري نداد احتمالا بخاطر اين بوده كه برنامه خاتمه پيدا نميكرده
البته بگم من بدون// هم برنامه رو اجرا كردم ارور داد
و اصلا return 0 رو هم حذف كردم بازم ارور داد

afi_program
دوشنبه 02 شهریور 1388, 19:17 عصر
برنامه در هیچ حالتی ارور نمیده فقط وقتی return0 جز خطوط اجرایی باشه warning میده که طبیعیه چون خطی در برنامه هست که هرگز اجرا نخواهد شد

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

clover
سه شنبه 03 شهریور 1388, 12:44 عصر
درسته منظور من هم همون warning بود اما چرا هميشه return 0 جزء خطوط اجرايي بود و اجرا مي‌شد اما الان تو اين برنامه نبايد جزء خطوط اجرايي باشه و بايد تو توضيحات بياد.
تازه وقتي هم كه از خطوط اجرايي پاكش كردم باز هم warning داد
يعني بخاطر همون(1)while هست كه return 0 جزء خطوط اجرايي نيست؟
شما تابع main را از نوع int تعریف کردید و معناش این هست که تابع یک مقدار برگشتی از نوع int داره . کامپایلر کاری به این که حلقه تا بی نهایت تکرار میشه نداره . مهم اینه که main یک تابع از نوع int هست و وقتی دستور ;return 0 را از برنامه حذف کنی کامپایلر اخطار میده که تابع شما نوع مورد نظر را برگشت نداد ، همین .

majmaji
سه شنبه 03 شهریور 1388, 14:29 عصر
شما تابع main را از نوع int تعریف کردید و معناش این هست که تابع یک مقدار برگشتی از نوع int داره . کامپایلر کاری به این که حلقه تا بی نهایت تکرار میشه نداره . مهم اینه که main یک تابع از نوع int هست و وقتی دستور ;return 0 را از برنامه حذف کنی کامپایلر اخطار میده که تابع شما نوع مورد نظر را برگشت نداد ، همین .
خوب پس چرا در مثال بالا تو توضيحات نوشته شده؟

clover
سه شنبه 03 شهریور 1388, 17:45 عصر
خوب پس چرا در مثال بالا تو توضيحات نوشته شده؟

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

afi_program
سه شنبه 03 شهریور 1388, 18:44 عصر
با نظر دوستمون موافقم بهتر بود ازنوع void تعریف می شد اما چون هرگز اجرا نمیشد(تو برنامه مورد نظر)به عنوان توضیحات اومده بود تا بگه که این خط جز برنامه است البته من اینجوری فکر میکنم ولی بهتر بود این کارو نمیکرد

majmaji
چهارشنبه 04 شهریور 1388, 17:31 عصر
دوستان عزيز راهنمايياتون بسيار عالي بود. خيلي ممنون كه به بنده اهميت ميديد و باعث رشد بنده در امر برنامه نويسي ميشيد.
در ادامه به ساختار هاي تصميم ميرسيم
ساختار تصميم 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
چهارشنبه 04 شهریور 1388, 18:53 عصر
با عرض سلام دوباره به دوستان
خوب دوست عزيز در مورد اين مثالي كه نوشتي اول يه مسئله رو بگم و اون اينكه يك خط تويه كدت جا افتاده!! شما بايد بعد از حلقه while و قبل از شرط if كد زير رو بنويسيد!!



charcount++;

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

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

majmaji
چهارشنبه 04 شهریور 1388, 19:13 عصر
درسته من اون خط رو جا انداختم ممنون از تذكرتون
خوب اينكه بفهمه آخر جمله كجاست ميتونست يطور ديگه بگه بدون استفاده از ch=getch() !='\n
مثلا اينطوري

for(count=0; cin.get() !='.'; count++);

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

Yasersadegh
پنج شنبه 05 شهریور 1388, 10:32 صبح
خوب دوست عزيز مي دونيد فرق اين كدي كه گفتيد با getch چيه!!؟:متفکر:
ببينيد تابع زير هر بار تنها يك كاراكتر مي خونه و به محض وارد كردن يك كاراكتر به دستور بعدي ميره!!



c=getch();

ولي دستور زير با خوندن يك يا چند كاراكتر كنترل برنامه رو به دستور بعدي نمي بره، و كاربر تا كليد enter رو نزنه به دستور بعدي نميره!!



cin.get();

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

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



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


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

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

majmaji
یک شنبه 08 شهریور 1388, 17:38 عصر
ممنون از همه دوستاي خوبم
خوب دوستان اميدوارم طاعات و عبادات شما در اين ماه مبارك قبول باشه ما رو هم دعا كنيد ممنون
در ادامه ميرسيم به برنامه اي براي جدول كد اسكي

#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
یک شنبه 08 شهریور 1388, 22:14 عصر
سلام جواب سوال اولت منفیه چون قراره مقدار i را بریزه توی ch و نه برعکس(مقدار متغیر سمت راست در متغیر سمت چپ ریخته میشه)
جواب سوال 2:صرفا برای اینه که وقتی میخواد بعدی رو چاپ کنه با قبلی قاتی نشه.امیدوارم کافی و مفید بوده باشه.
موفق باشی

sia abedi
دوشنبه 09 شهریور 1388, 13:52 عصر
ممنون از همه دوستاي خوبم
خوب دوستان اميدوارم طاعات و عبادات شما در اين ماه مبارك قبول باشه ما رو هم دعا كنيد ممنون
در ادامه ميرسيم به برنامه اي براي جدول كد اسكي

#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 هست اون فاصله هايي كه خالي گذاشته براي چيه؟
سلام دوستان ما هم در بحثتون قبول كنيد
اول از همه چرا در 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
شنبه 14 شهریور 1388, 15:48 عصر
سلام دوستان ما هم در بحثتون قبول كنيد
اول از همه چرا در 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

توضيحات:





حالا منظور كسي كه اين برنامه را نوشته مثل مثال 5 بوده. 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'است.
راستي يك نوع تبديل نوع ديگر هم داريم كه به تبديل نوع صريح معروفه.چون تبديل نوع صريح ربطي به موضوع ما نداشت براي همين اون را توضيح ندادم ولي اگر خواستي بگو تا توضيح بدم.
مي‌دونم كه سرت رفت:متعجب: ولي اين خواسته ي خودت بود كه به طور كامل توضيح بديم منم فقط همين كار را كردم.اگر باز هم منظورم را نفهميدي بگو تا بهتر توضيح بدم.
من اصلا اين آخري رو نفهميدم:ناراحت:

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

majmaji
دوشنبه 16 شهریور 1388, 09:07 صبح
آها فهميدم چي شد :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
دوشنبه 16 شهریور 1388, 16:41 عصر
سلام دوست عزيز
خوب ببينيد قبلا هم در مورد دليل اين نوع استفاده getch بهتون گفتم كه برايه نگهداشتن روند اجرايه برنامه است كه خروجي رو كاربر ببينه!! اينجا هم به همين دليل getch استفاده شده!! وقتي كه كاربر عدد رو درست حدس بزنه خروجي نمايش داده ميشه و getch باعث ميشه كه برنامه منتظر بمونه تا كاربر خروجي رو ببينه!!
بنابراين چون خروجي در داخل if نمايش داده ميشه دستور getch هم در if بعد از دستور خروجي قرار مي گيره!!:لبخند:
اميدوارم كه متوجه علت شده باشيد!!:چشمک:
تذكر: دوست عزيز در كدي كه نوشتيد دستور زير درست نيست!!



cout<<"%d is the magic number";

كه بايد به شكل زير اصلاح بشه!!



cout<<magic<<" is the magic number";

**در دستور cout از كاركتر هايي مثل d% استفاده نميشه!!

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

majmaji
دوشنبه 16 شهریور 1388, 18:43 عصر
سلام دوست عزيز
خوب ببينيد قبلا هم در مورد دليل اين نوع استفاده getch بهتون گفتم كه برايه نگهداشتن روند اجرايه برنامه است كه خروجي رو كاربر ببينه!! اينجا هم به همين دليل getch استفاده شده!! وقتي كه كاربر عدد رو درست حدس بزنه خروجي نمايش داده ميشه و getch باعث ميشه كه برنامه منتظر بمونه تا كاربر خروجي رو ببينه!!
بنابراين چون خروجي در داخل if نمايش داده ميشه دستور getch هم در if بعد از دستور خروجي قرار مي گيره!!:لبخند:
اميدوارم كه متوجه علت شده باشيد!!:چشمک:
تذكر: دوست عزيز در كدي كه نوشتيد دستور زير درست نيست!!



cout<<"%d is the magic number";

كه بايد به شكل زير اصلاح بشه!!



cout<<magic<<" is the magic number";

**در دستور cout از كاركتر هايي مثل d% استفاده نميشه!!

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





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

afi_program
سه شنبه 17 شهریور 1388, 13:19 عصر
البته یه راهش اینه که همین راه برای برنامه هایی که یکبار قرار اجرا بشن خوبه.در حقیقت با این کار برنامه منتظر دریافت کلیدی هست که این به معنای توقف برنامه تا دریافت کلید هست.
موفق باشی

sia abedi
سه شنبه 17 شهریور 1388, 22:20 عصر
درسته درسته.
پس يعني ما هر موقع كه خواستيم يه خروجي رو به نمايش بگذاريم بايد 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
جمعه 20 شهریور 1388, 12:51 عصر
بله ممنون توضيحات خوب و عالي بود

اما در مورد مثال بعدي

#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
جمعه 20 شهریور 1388, 13:11 عصر
برای سوال اول:دلیل خصی نداره فقط باتوجه به نوع نوشتن برنامه چون برای بقیه ی نمرات در آخر حلقه نمره را میگیره برای اولی خارج از حلقه گرفته همین.
سوال دوم:چرا میتونستی یک کاراکتر تعریف کنی و در آخر حلقه از کاربر بگیری که مایل به ادامه ی برنامه هست یا نه که در این صورت بهتره نمره را در اول حلقه بگیری و دیگه اول برنامه نمره دریافت نکنی.اما در این مثالی که گذاشتی برای خروج بر اساس نمره وارد شده تصمیم گیری میشه.امیدوارم واضح و کافی بوده باشه.
موفق باشی

behnam-s
جمعه 20 شهریور 1388, 13:26 عصر
سلام

خوب چند تا سوال چرا در اول و آخر اين برنامه دوبار 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
جمعه 20 شهریور 1388, 14:06 عصر
برای سوال اول:دلیل خصی نداره فقط باتوجه به نوع نوشتن برنامه چون برای بقیه ی نمرات در آخر حلقه نمره را میگیره برای اولی خارج از حلقه گرفته همین.
سوال دوم:چرا میتونستی یک کاراکتر تعریف کنی و در آخر حلقه از کاربر بگیری که مایل به ادامه ی برنامه هست یا نه که در این صورت بهتره نمره را در اول حلقه بگیری و دیگه اول برنامه نمره دریافت نکنی.اما در این مثالی که گذاشتی برای خروج بر اساس نمره وارد شده تصمیم گیری میشه.امیدوارم واضح و کافی بوده باشه.
موفق باشی


سلام

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

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



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

majmaji
یک شنبه 22 آذر 1388, 15:25 عصر
سلام دوستان خوبید
ببخشیدا بعد از وقفه ای که تو کارم افتاد (چون فکر کردم بهتره به جای یادگرفتن برنامه نویسی برم شبکه رو اول بخونم) حالا که یکم شبکه یاد گرفتم میخوام دوباره برنامه نویسی رو از سر بگیرم.
دوستان به من پیشنهاد کردن که کتاب دایتل رو بگیرم من هم گرفتم پس از همین الان کار رو با کتاب دایتل و کامپایلر dev-C++ شروع میکنیم
امیدوارم بازم مثل سابق به کمک من بیایید و در حل مشکلات برنامه های تمرینی ++C کمکم کنید.
ممنون

majmaji
سه شنبه 24 آذر 1388, 17:58 عصر
خوب دوستان من تا فصل 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
چهارشنبه 25 آذر 1388, 09:48 صبح
داداش نیما اینجا کسی دوست نداره به کمک ما بیاد بازم اگه میشه زحمت اینارو بکش

mabbaszadegan
چهارشنبه 25 آذر 1388, 11:39 صبح
سلام رفیق
میشه دقیقا بگی مشکلت چیه ؟!:لبخند:

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

majmaji
چهارشنبه 25 آذر 1388, 11:54 صبح
رفیق شرمندمون کردی مشکل من اینه:
خوب دوستان من تا فصل 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
چهارشنبه 25 آذر 1388, 12:17 عصر
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
چهارشنبه 25 آذر 1388, 15:02 عصر
میدونی من زبان اصلیشو خریدم داشتم میخوندم بعد دیدم یکی از بچه ها دو جلد فارسیشو داره گرفتم ترجمه خودم رو باهاش مقایسه میکنم

mabbaszadegan
چهارشنبه 25 آذر 1388, 15:06 عصر
میدونی من زبان اصلیشو خریدم داشتم میخوندم بعد دیدم یکی از بچه ها دو جلد فارسیشو داره گرفتم ترجمه خودم رو باهاش مقایسه میکنم

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

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

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

mabbaszadegan
چهارشنبه 25 آذر 1388, 16:14 عصر
تاحدودی داری درست میگی
بذار اینجوری واست بگم :

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

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

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

دیدی ؟!

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


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

majmaji
چهارشنبه 25 آذر 1388, 17:05 عصر
نه سوال پیش نیومد:لبخند:
چون string یک رشته از کارکتر ها رو میگیره و int یک عدد صحیح رو میگیره اگه با int یک سری رشته کارکتری وارد کنی اونا رو به صورت یک رشته از اعداد در میاره البته تا جایی که int جواب بده اگه رشته کارکتری طولانی بود برای اطمینان از تبدیل شدن تمام کارکترها به عدد از long int استفاده کنیم:لبخند:

mabbaszadegan
چهارشنبه 25 آذر 1388, 18:55 عصر
نه سوال پیش نیومد:لبخند:
چون string یک رشته از کارکتر ها رو میگیره و int یک عدد صحیح رو میگیره اگه با int یک سری رشته کارکتری وارد کنی اونا رو به صورت یک رشته از اعداد در میاره البته تا جایی که int جواب بده اگه رشته کارکتری طولانی بود برای اطمینان از تبدیل شدن تمام کارکترها به عدد از long int استفاده کنیم:لبخند:
ای ول
خوشم اومد ازت ، همینطور ادامه بده :چشمک:

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

موفق باشی

majmaji
پنج شنبه 26 آذر 1388, 00:35 صبح
دادا دستت درد نکنه از این همه امیدی که به من میدی
حالا یه سوال دیگه در ادامه با عنوان "کلاس 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
پنج شنبه 26 آذر 1388, 20:13 عصر
سلام
شرمنده اگه دیر شد :چشمک:

بذار از اول برنامه رو بررسی کنیم :
اول از همه باید ببینیم عضو داده ای چیه ؟
یادته ، توی تابع 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
سه شنبه 01 دی 1388, 11:27 صبح
پس دادا یعنی نوع دسترسی public و private هم برای توابع به کار میره و هم برای اعضای داده ای؟
اگر هم ننویسیم که public هست خودش اون رو private حساب میکنه؟

majmaji
سه شنبه 08 دی 1388, 10:40 صبح
سلام دوباره من خیلی فکر کردم ولی باز نفهمیدم:عصبانی++: بذار سوالاتم رو اینطوری بپرسم::لبخند:

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
چهارشنبه 09 دی 1388, 16:40 عصر
سلام ، شرمنده اگه دیر شد

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




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
پنج شنبه 10 دی 1388, 10:00 صبح
خوب دادا يعني چي شي ما خاليه؟
يه سوال ديگه تابع هايي كه پارامتر دارن يه چيزي رو چاپ ميكنن كه ممكنه تغير كنه مثلاً يه بار نام درس فيزيك باشه و در دفعه دومي كه اجرا ميشه نام درس شيمي باشه و توابعي كه پارامتر عضو ندارن چيزي رو چاپ ميكنن كه ثابت هست. درسته؟ يا ممكنه كارايي ديگه اي هم داشته باشه؟

mabbaszadegan
پنج شنبه 10 دی 1388, 11:01 صبح
بذار خالی بودن اشیا رو زمانی که constructor (سازنده ها) رو خوندی برات توضیح میدم


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



void displayMessage()
{
cout << "Welcome to the grade book for\n" << getCourseName() << "!"
<< endl;
}

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

majmaji
پنج شنبه 10 دی 1388, 12:05 عصر
آها پس من یه بار میگم ببین درست فهمیدم یا نه؟
خوب ما اومدیم کلاس 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
پنج شنبه 10 دی 1388, 12:43 عصر
ما اومدیم کلاس grade book رو تعریف کردیم و نوع دسترسی رو public تعیین کردیم (راستی public بودن کلاس به چه درد میخوره؟)

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

بقیشو تقریبا درست گفتی :دی


myGradeBook.setCourseName( nameOfCourse );

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

majmaji
پنج شنبه 10 دی 1388, 12:51 عصر
آها درسته.
اون بقیه سوالا که قرمز نوشتم چی؟ اونا رو هم درست گفتم؟

mabbaszadegan
پنج شنبه 10 دی 1388, 13:01 عصر
آره ، تقریبا درست گفتی

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

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

mabbaszadegan
پنج شنبه 10 دی 1388, 13:10 عصر
نه داداش ، این چه حرفیه

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

موفق باشی

majmaji
پنج شنبه 10 دی 1388, 16:46 عصر
من برنامه رو نوشتم ولی واقعاً درست نیست و کار نکرد نمیدونم مشکلم کجاست ولی کدش به شکل زیر است.

#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
پنج شنبه 10 دی 1388, 20:34 عصر
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
جمعه 11 دی 1388, 16:22 عصر
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
جمعه 11 دی 1388, 16:39 عصر
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
جمعه 11 دی 1388, 21:34 عصر
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;
}


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

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

mabbaszadegan
جمعه 11 دی 1388, 21:38 عصر
توابع get باید اعضای داده ای رو برگردونند ؛
مثلا تابع getname باید name رو برگردونه

majmaji
جمعه 11 دی 1388, 22:02 عصر
آها فهمیدم ببین من برنامه رو تا اونجایی که گفتی نوشتم بقیشم اینشکلی نوشتم همشو پشت هم می نویسم

#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()<<getsen()<<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
جمعه 11 دی 1388, 22:17 عصر
خوبه ، فقط دوتا مشکل وجود داره :
1. اعضای داده ای رو یه بار اول کلاس و یه بار آخر کلاس تعریف کردی !!
یکیشو پاک کن

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


student mystudent ,std1,std2;

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

majmaji
جمعه 11 دی 1388, 22:20 عصر
چرا سه تا مگه با یکی نمیتونیم تابع ها رو فراخوانی کنیم؟

mabbaszadegan
جمعه 11 دی 1388, 22:24 عصر
آره
فقط خواستم مثال زده باشم ،
یک شی کافیه

computer_science
شنبه 12 دی 1388, 12:34 عصر
سلام
برای دریافت اعداد بزرگ باید از ساختمان های داده ای مثل لینک لیست کمک بگیری ،
شروع کن به نوشتن ، بعد کدتو بذار تا باهم بررسی کنیم
با سلام
با تشکر از شما برای جوابتون
اما من برنامه نویسی به زبان cدارم اونجا چطور میشه؟

majmaji
شنبه 12 دی 1388, 18:46 عصر
اما یه سوال
برنامه ای که نوشتم 8 تا ارور داد چرا؟ مگه کجاش مشکل داره؟

mabbaszadegan
یک شنبه 13 دی 1388, 05:52 صبح
کدتو بذار ببینم

majmaji
یک شنبه 13 دی 1388, 15:10 عصر
#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()<<getsen()<<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
یک شنبه 13 دی 1388, 21:23 عصر
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()<<getsen()<<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
سه شنبه 15 دی 1388, 17:26 عصر
خوب دوستان تا اینجا خوب پیش رفتیم جا داره از دوست خوبم mabbaszadegan (http://barnamenevis.org/forum/member.php?u=97040) تشکر کنم بخاطر توجه ویژه که به این تاپیک و بنده داشتن و هیچ سوالی از من رو بی پاسخ نذاشتن.
واقعاً ممنونم
اما خوبه تا الان با اون چیزایی که آشنا شدیم یه مروری داشته باشیم.
خوب، داده ها چه چیزایی بودن؟ داده ها متغیر هایی هستن که در طول برنامه با اونا ار داریم و باید قبل از استفاده تعریف بشن
داده های عضو داده هایی هستن که در یک کلاس به کار میرن و باید قبل از به پایان رسیدن کلاس معرفی بشن.
تابع هم که فهمیدیم چی بود. پارامتر تابع رو هم فهمیدیم ما با استفاده از پارامتر تابع مقداری رو در یک متغیر کلاس جایگزین میکنیم.
کلاس رو هم فهمیدیم
شی رو هم فهمیدم ما با استفاده از شی توابع رو فراخوانی میکنیم
(دوستان اگه اشتباه بود بگیدا)
اما در مثال جدید که میخوایم بریم سراغش "سازنده" ها را معرفی کرده.
سازنده ها به اشیای کلاس ها مقدار اولیه می دهند.

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

mabbaszadegan
پنج شنبه 17 دی 1388, 10:14 صبح
خوب اینطور که من فهمیدم برای هر کلاس فقط یک سازنده داریم و کار سازنده ها مقدار دادن به اشیاء کلاس هست. آیا تنها کار سازنده همین هست یا باز هم کارایی دیگه ای هم دارد؟

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


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


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


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



class student
{
private:
string name;
string shomaredaneshjo;
int sen;
student std1;


اینجا std1 علاوه براینکه یک عضو داده ای کلاس student هست ، یک شی ازین کلاس هم به حساب میاد

majmaji
پنج شنبه 17 دی 1388, 14:26 عصر
نه ، ممکنه یه کلاس چندین سازنده داشته باشه ؛ اینجا بحث overloading مطرح میشه ، یعنی تابعی با یک اسم چندین بار تعریف بشه ، که این خیلی کاربرد میتونه داشته باشه


بله !!


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

میتونی یک عضو داده ای از جنس کلاس تعریف کنی ، مثلا :



class student
{
private:
string name;
string shomaredaneshjo;
int sen;
student std1;


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



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

mabbaszadegan
پنج شنبه 17 دی 1388, 15:06 عصر
std1 هم یک شی به حساب میاد هم یک عضو داده ای ؛ مثلا توی تابع main میتونی بنویسی :

student obj;
obj.std1.sen;

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

majmaji
پنج شنبه 17 دی 1388, 20:03 عصر
خوب این هم مثال بعدی که مربوط میشه به مقدار دادن به اشیا با استفاده از سازنده ها

#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
جمعه 18 دی 1388, 07:53 صبح
(البته چرا داده عضو یک پارامتر داره؟ مگه اون داده نیست پس چرا پارامتر داره؟)

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


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

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

mabbaszadegan
جمعه 18 دی 1388, 12:42 عصر
اینجا ما یک حرکت اضافی انجام دادیم چون تابع setcoursename خودش اینکار رو انجام میده درسته؟


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

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

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

void func1(int a, int b , char c, string d)

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


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

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


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


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

majmaji
جمعه 18 دی 1388, 23:01 عصر
a,b,c,d به ترتیب آرگومانهای تابع func1 به شمار میاند ؛ یعنی موقع فراخوانی تابع باید این چهار مقدار رو وارد کنی
البته تابع میتونه هیچ آرگومانی نداشته باشه (مثل همین displaymessage یا توابع get )
خوب تو این مثال که زدی a,b,c,d مگه پارامتر های تابع نیستن؟
تازه اگه اینها آرگومان باشن ما میتونیم داخل تابع به کار ببریم؟
مثلا بنویسیم:

void func1 ()
{
int a, b;
char c;
string d;
}

mabbaszadegan
جمعه 18 دی 1388, 23:31 عصر
درسته ، تو اولی برنامه نویس آرگومانها رو به تابع میده ولی در حالت دوم کاربر آرگومانها رو مقداردهی میکنه

majmaji
شنبه 19 دی 1388, 14:32 عصر
من دو تا پست گذشتم اومدم آخری رو حذف کنم یکی مونده به آخری حذف شد اشکال نداره دوباره مینویسم:
تو پست دو تا قبلی نوشته بودم که مثال بعدی مربوط میشه به گنجاندن سر فایلی که حاوی یک کلاس تعریف شده توسط کاربر است در این مثال اینطوری عمل میشه که ما اول میام کلاس رو در یک برنامه مینویسیم بدون تابع 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
شنبه 19 دی 1388, 15:56 عصر
چرا سر فایل ها در هر دو برنامه نوشته میشه؟
سر فایل ها در هر جایی که نیاز باشد باید نوشته شوند، اما اینکه چرا با وجود نوشتن سر فایل ها در فایل 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
یک شنبه 20 دی 1388, 14:18 عصر
سلام, من سه چهار روزه با 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
دوشنبه 21 دی 1388, 07:17 صبح
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
چهارشنبه 23 دی 1388, 09:27 صبح
به به سلامی دوباره به دوستان خوبم دوباره از دوستای عزیزی که ما در این تاپیک همراهی کردن تشکر میکنم و خیلی خوشحالم که این تاپیک داره رونق پیدا میکنه
خوب ما رسیدیم به اینجایی که ما میتونیم با جداسازی واسطه از یک برنامه هم امنیت برنامه رو بالا ببریم هم اینکه کاری کنیم که مشتری نتونه بفهمه که ما چی نوشتیم
خوب اول یه سری توضیحات رو بنویسم
واسطه یک کلاس مشخص می کند مشتری های کاربر از چه خدماتی می توانند استفاده کنند و این خدمات را درخواست کنند اما از چگونگی انجام این خدمات آگاه نمی شوند. واسطه کلاس از توابع 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
چهارشنبه 23 دی 1388, 09:52 صبح
هیچ مشکلی نداره ، فقط اینو یادت رفته بود

#include<string>

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

majmaji
پنج شنبه 24 دی 1388, 14:22 عصر
هیچ مشکلی نداره ، فقط اینو یادت رفته بود

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

mabbaszadegan
پنج شنبه 24 دی 1388, 14:39 عصر
چه اروری میده ؟

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

majmaji
پنج شنبه 24 دی 1388, 17:57 عصر
خوب ببین وقتی قسمت اول رو میخوام کامپایل کنم این ارور رو میده
[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
پنج شنبه 24 دی 1388, 18:23 عصر
اینارو امتحان کن ، من همین الان اجراش کردم


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
پنج شنبه 24 دی 1388, 18:34 عصر
بازم همون ارور ها رو میده یعنی اشکال از کجا میتونه باشه؟:متعجب:

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

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

mabbaszadegan
پنج شنبه 24 دی 1388, 23:57 عصر
نمیدونم اشکال کجاست ، من همین کد رو با vs 2008 کامپایل کردم ، هیچ اروری نداد :متعجب:

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

majmaji
جمعه 25 دی 1388, 10:30 صبح
میگم شاید مشکل از نحوه ذخیره کردن برنامه باشه
من هر کدوم از این سه قسمت رو با پسوند cpp. ذخیره میکنم شاید نباید این شکلی عمل کنم
من بازم امتحان کردم ولی این بار فقط به قسمت اول گیر داد الان vs2008 رو نصب میکنم و رو اون هم امتحان میکنم

mabbaszadegan
جمعه 25 دی 1388, 10:58 صبح
خب همینه دیگه !!!!!!

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


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

majmaji
جمعه 25 دی 1388, 19:33 عصر
ببین من میخوام تو vs 2008 بنویسم اما نمیدونم چجوری
من یه win 32 کنسول درست کردم و برنامه خالی رو فعال کردم بعد 3 قسمت داره header و sourse و resourse که اولین برنامه رو باید تو اولی بنویسم و دومی رو تو دومی سومی رو که میخوام تو سومی بنویسم ارور میده باید چکار کنم؟

mabbaszadegan
جمعه 25 دی 1388, 20:01 عصر
نه دیگه ، حالا وقتی win32 consoul رو ساختی ، روی یکی از اون پوشه ها کلیک راست کن و گزینه add -> new item رو انتخاب کن ، باید یه دونه h. و دوتا cpp. بسازی و کدهارو توش بنویسی

اجرا کردی بگو

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

mabbaszadegan
شنبه 26 دی 1388, 22:47 عصر
اینو امتحان کن ، اگه جواب نداد بیخیالش شو

majmaji
یک شنبه 27 دی 1388, 19:32 عصر
نه نشد.
بریم سراغ مثال بعدی
مثال بعدی در مورد معتبر سازی نام درس هست که در این مثال می خواهیم درسی چاپ بشه که دارای 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
یک شنبه 27 دی 1388, 19:45 عصر
خوب کتاب یک سری توضیحات اورده که من رو اونا یک سری سوال دارم
name.length() یک احضار تابع عضو است ما که در برنامه تابع ()length رو تعریف نکردیم. تازه مگه name یک داده عضو نبود پس چرا در اینجا از اون به عنوان یک شی استفاده شده و با اون یک تابع فراخوانی میشه؟
در کلاس string کتابخانه ++C استاندارد تابع عضو length تعریف شده است که تعداد کارکتر های داخل یک شی string را بر میگرداند. منظورش از کلاس string کتابخانه ++C استاندارد همون #include <string> هست؟
آیا تابع length فقط برای اشیا مورد استفاده قرار میگیره؟ برای داده هایی که از نوع int هستند چطور؟ برای پارامتر های یک تابع چطور؟

mabbaszadegan
یک شنبه 27 دی 1388, 20:01 عصر
#include<string>این خط کلاسی به اسم sting رو دراختیار میذاره ، این کلاس هم مثل همین کلاسهایی که خودت نوشتی یه سری توابع عضو داره ، اعضای داده ای داره ، سازنده و مخرب و friend داره

وقتی مینویسی :

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

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

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

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


موفق باشی

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

mabbaszadegan
یک شنبه 27 دی 1388, 22:27 عصر
برای اینکه بدونیم کلاس هایی که قبلا نوشته شده مثل همین 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
سه شنبه 29 دی 1388, 09:52 صبح
دست گلت درد نكنه محمد جان خيلي بهت زحمت دادم خدا بخواد ديگه فصل 3 تموم شد و حالا رسيديم سر تمريناش. من از اين بخش خوشم مياد چون سوالاش حرفه اي طراحي شده و اگه كسي كتاب رو سرسري خونده باشه نميتونه به سوالا جواب بده
اگه اشكال نداره من سوالا رو بنويسم و جوابشو بگم شما ببين من درست ميگم يا غلط:
1- در مورد تفاوت پيش نمونه تابع و تعريف تابع توضيح دهيد:
در پيش نمونه يك تابع ما نام تابع، نوع برگشتي آن و تعداد و نوع داده ها و ترتيب قرار گرفتن پارامتر ها رو كه از تابع انتظار دريافت آن را داريم تعريف مي‌كنيم اما تابع را به صورت كامل تعريف نميكنيم به صورت زير
void setCourseName(string name) ولي در تعريف تابع ما تابع را در كل تعريف ميكنيم يعني عملياتي را كه تابع انمام مي دهد را هم تعريف ميكنيم
2- سازنده پيش فرض چيست؟ اگر در كلاسي فقط يك سازنده پيش فرض به طور ضمني تعريف شده باشد داده هاي عضو اين كلاس چگونه مقدار اوليه ميگيرند؟
سازنده پيش فرض به داده عضو كلاس مقدار اوليه نميدهد اما براي هر داده ي عضوي كه يك شي از كلاس ديگر است سازنده پيش فرض را احضار مي‌كند. قسمت دوم سوال رو هم نميدونم
3- در مورد هدف از استفاده داده عضو را توضيح دهيد:
خوب اگر از متغير محلي استفاده شود فقط در همان محل تعريف تا آخر جايي كه آكولاد بسته مي‌شود قابل استفاده است براي اين كه بتونيم مطمئن بشيم و در چند تابع در يك كلاس از اون استفاده كنيم بايد اون رو به صورت داده عضو تعريف كنيم.
4- سرفايل چيست؟ فايل كد مبدا چيست؟ هدف استفاده از هر يك را توضيح دهيد؟
سرفايل ها قسمتي از برنامه هستند كه داراي پسوند h. هستند و فايل كد مبدا نيز قسمتي از برنامه هستند كه داراي پسوند cpp. هستند
براي امنيت بيشتر و براي اينكه كاربر مشتري به برنامه دسترسي نداشته باشه از اين دو استفاده ميشه.
5- توضيح دهيد چگونه بدون نوشتن اعلان using در يك برنامه ميتوان از كلاس string استفاده كرد؟
فكر كنم بايد كل كلاس string با تابع درونش و عملياتي كه انجام ميده رو يك بار تعريف كنيم
6- توضيح دهيد چگونه يك كلاس مي تواند يك تابع set و يك تابع get براي يك داده عضو فراهم سازد
خوب ما اين كار رو در مثال هايي كه با هم نوشتيم و بحث و بررسي كرديم انجام داديم درسته؟
دادا اينا باشه بقيش برنامه نويسي هست من دارم روشون فكر ميكنم يخته سخته ولي الان رفتم زيرخمشو گرفتم:لبخند:

mabbaszadegan
سه شنبه 29 دی 1388, 10:14 صبح
سلام مجید جان ، آفرین ، خیلی خوبه :تشویق:
البته زیاد رو تعریفها نمیخواد گیر بدی ، وقتی خودت کد بنویسی ، به طور اتوماتیک تعریفها هم یاد میگیری


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

majmaji
سه شنبه 29 دی 1388, 11:54 صبح
خوب ما با 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
سه شنبه 29 دی 1388, 12:18 عصر
خب کدت چندتا ایراد داشت ، دونه دونه بررسیش میکنیم :

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
چهارشنبه 30 دی 1388, 11:03 صبح
آره دادا درست شد میدونی اشکال کارم کجا بود قسمت اول رو باید با همون نام کلاس ذخیره میکردم ولی من با یه نام دیگه ای ذخیره میکردم

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

mabbaszadegan
چهارشنبه 30 دی 1388, 19:16 عصر
خب ، خدا رو شکر که اجرا شد :لبخندساده:


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

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

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


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

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

white tower
پنج شنبه 01 بهمن 1388, 07:08 صبح
در این دستور که گذاشتم اون قسمتی که بولد شده رو لطف می کنید توضیح بدید که چیکار می کنه.

out_file.write((char*)&temp,sizeof(temp));

white tower
پنج شنبه 01 بهمن 1388, 09:33 صبح
یه سوال دیگه هم دارم.این کد رو ببینید

#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
پنج شنبه 01 بهمن 1388, 10:31 صبح
خوب آقا محمد این برنامه من با توضیحاتی که در پست قبلی زدم این برنامه رو نوشتم:

#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
پنج شنبه 01 بهمن 1388, 20:37 عصر
در این دستور که گذاشتم اون قسمتی که بولد شده رو لطف می کنید توضیح بدید که چیکار می کنه.

out_file.write((char*)&temp,sizeof(temp));


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



یه سوال دیگه هم دارم.این کد رو ببینید
کد:
#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() هم می ذارم باز تغییر نمی کنه و ورودی نمی گیره.
مشکل از کجاست؟
خب واسه اینکه باید شرط رو توی حلقه بذاری ، مثلا از while استفاده کن و تا وقتی کاربر کارکتر وارد میکنه حلقه اجرا بشه

mabbaszadegan
پنج شنبه 01 بهمن 1388, 20:44 عصر
خب مجید جان ، کارت نسبتا خوب بود ، فقط :
1. چرا سه تا عضو داده ای ؟ به نظرت یه عضو کافی نیست ؟
2. بازم سازنده رو بد تعریف کردی ، سازنده وظیفه مقداردهی به اعضای داده ای رو داره ، یعنی سازنده Account باید اعضای داده ای کلاس رو مقدار دهی کنه ؛
3. برنامه رو طوری بنویس که واست راحته ، به نظرم بعضی جاها خیلی به خودت سخت گرفتی ، ولی درکل خوب بود

موفق باشی

majmaji
جمعه 02 بهمن 1388, 11:49 صبح
دادا من مخم هنگ کرده این مثال رو میتونی برام بنویسی تا من دقیقا هم منظور شما رو بفهمم و هم منظور سوال کتاب رو
چون ما باید 2 تا داده دیگه داشته باشیم برای برداشت و سپرده گذاری
تازه من باز هنوز منظور این دو تا شرطی رو که سوال گذشته نمیفهمم

mabbaszadegan
جمعه 02 بهمن 1388, 14:07 عصر
سلام
اینو یه نگاه بنداز :

#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
جمعه 02 بهمن 1388, 14:48 عصر
یک نفر می شه به من بگه که با چه version کار می کنید؟

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

majmaji
جمعه 02 بهمن 1388, 15:53 عصر
سلام
اینو یه نگاه بنداز :

#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;
}

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

majmaji
جمعه 02 بهمن 1388, 15:55 عصر
یک نفر می شه به من بگه که با چه version کار می کنید؟

واسه من using namespace اصلا قبول نمی کنه.
سلام
ما داریم با کتاب دایتل پیش میریم
و در کامپایلر dev-c++ کار میکنیم

mabbaszadegan
جمعه 02 بهمن 1388, 22:16 عصر
سلام ، خوشحالم که کم کم داره تعدادمون زیاد میشه ، خوش اومدی shp_com ،


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


موفق باشی

majmaji
شنبه 03 بهمن 1388, 07:42 صبح
یعنی ما با پارامتر تابع به این دو آرگومان ها مقدار میدیم
یعنی باید تو تابع main توسط شی هایی که تعریف میکنیم تابع رو فراخونی کنیم و بعد مقدار بدیم؟

white tower
شنبه 03 بهمن 1388, 08:34 صبح
منم دقیقا نمیدونم ، فک کنم مال کتاب جعفرنژاده :لبخند:
تا این حد میدونم که این دستور مقادیری رو که از کاربر گرفته ،توسط جریان out_file میریزه توفایل (این روش در فایلهای باینری کاربرد داره )



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

mabbaszadegan
شنبه 03 بهمن 1388, 16:11 عصر
یعنی ما با پارامتر تابع به این دو آرگومان ها مقدار میدیم
یعنی باید تو تابع main توسط شی هایی که تعریف میکنیم تابع رو فراخونی کنیم و بعد مقدار بدیم؟
ای ول ، دقیقا درسته ،

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

majmaji
یک شنبه 04 بهمن 1388, 11:24 صبح
ای ول ای ول داش محمد و ایول
دادا میگما بریم سراغ مثال بعدی ولی یه مشکلی این مثال و دو تا مثال بعدی همش شبیه مثال قبلیایی هست که حل کردیم یعنی همش یه تابع 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
یک شنبه 04 بهمن 1388, 12:19 عصر
:لبخند:
تقریبا درست بود ، ولی فک کنم حواست نبوده نوع اعضای داده ای رو مشخص کنی ؛


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


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

majmaji
یک شنبه 04 بهمن 1388, 13:23 عصر
البته اگه ميشه من يه سوال از اين بخش بپرسم:
الان من اين برنامه رو نوشته حالا چيجوري با شي مقدار اعضاي داده اي رو در آرگومان قرار بدم؟؟؟
تازه اون شرطي رو كه گفته بايد هم تو تابع set و هم تو تابع get تعريف كنيم؟
يا نه فقط تو set تعريف كنم كافيه؟ شرطشم بايد با if باشه؟

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

خب توی تابع main ، اول یه شی از کلاس تعریف میکنی و با استفاده از سازنده ای که واسه کلاست نوشتی شی رو مقداردهی میکنی ؛ مثلا :

Invoice obj1("001","ghete 1",10,150000);

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

موفق باشی

mabbaszadegan
یک شنبه 04 بهمن 1388, 16:53 عصر
با سلام
اگه میشه دوستان یه نگاهی به این برنامه ما بکنن و ببینید چرا اجرا نمیشه؟
فایل های ضمیمه http://barnamenevis.org/forum/images/attach/zip.gif Polynomials, etc.zip‏ (http://www.barnamenevis.org/forum/attachment.php?attachmentid=43136&d=1264335109) (11.9 کیلوبایت, 0 دیدار)
برنامه ت یه تابع main کم داره فقط ، در کل خیلی قشنگ و مرتب نوشتی ، خیلی خوشم اومد

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

majmaji
سه شنبه 06 بهمن 1388, 15:45 عصر
سلام به بچه ها مخصوصا محمد جان
برنامه رو دیدم فقط نمیدونم چرا 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
سه شنبه 06 بهمن 1388, 18:02 عصر
سلام
شبه کد ، تقریبا یه چیزی شبیه همون الگوریتم ، با این تفاوت که توش محدودیتی وجود نداره ؛

توی شبه کد ، مفهومی که قراره بنویسی رو به هر زبونی که دوست داری (فارسی یا انگلیسی) مینویسی ، مثلا میگی :


متغیر 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
چهارشنبه 07 بهمن 1388, 23:48 عصر
سلام به همه دوستان خوبید درسا خوب پیش میره امیدوارم درسا خوب پیش بره مخصوصا امتحانای آخر ترم
ما که داریم سخت کار میکنیم پول ترم جدیدو بدیم:لبخند:
قرض از مزاحمت اینکه فصل چهارم کار سبک تری نسبت به بقیه فصلا داره و من تازه رسیدم به دستور تکرار while تا اینحا مشکل زیادی نداشتم فقط یه مثال بود که زده بود من توضیحاتشو نفهمیده بودم
اینم مثال:

if(student grade >= 60 )
cout << "passed.\n";
else
{
cout << "failed.\n"
cout << "you must take this course again.\n";
}

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

mabbaszadegan
پنج شنبه 08 بهمن 1388, 23:10 عصر
در این برنامه میگه اگه شرط درست باشه یا نباشه بالاخره cout << "passed.\n"; اجرا میشه. آیا این حرف درسته؟
نه دیگه ، اگه شرط برقرار باشه اجرا میشه ، اگه برقرار نباشه قسمت else اجرا میشه

majmaji
جمعه 09 بهمن 1388, 11:56 صبح
درسته البته این رو کتاب نوشته بود نمیدونم چرا!!!
ما رسیدیم به یه مثال، مثال در مورد همون کلاس 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
شنبه 10 بهمن 1388, 08:17 صبح
ظاهرش که درسته ،

ارورش چیه ؟

majmaji
شنبه 10 بهمن 1388, 09:21 صبح
میگه لینک gradebook.h ساخته نشده
C:\Dev-Cpp\bin\tamrin\Makefile.win [Build Error] [GradeBook.exe] Error 1

mabbaszadegan
یک شنبه 11 بهمن 1388, 09:19 صبح
سلام ، شرمنده که دیر جواب میدم ، یه خورده این چند روز سرم شلوغه:چشمک:

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

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

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

white tower
دوشنبه 12 بهمن 1388, 09:21 صبح
سلام.
من یه سوال دارم که خودمم خوب نمی دونم چیه.امیدوارم که متوجه بشید
این قضیه بایت کم ارزش و با ارزش چیه؟من الان یه برنامه دارم می نویسم که فکر کنم باید در قیمتیش جای این بایتها رو در یه عدد
short int
عوض کنم.این متغیر باید مقدار یک بگیره منتها در حالت برعکس معمول.امیدوارم متوجه شده باشید.اگر فرض کنیم در حالت معمولی بایت اول مقدار رو نگه می داره الان می خوام برعکسش کنم یعنی بایت دوم مقدار رو نگه داره.شاید اینطوری برنامه ام راه بیافته.هیچ ایراد دیگه ای جز این ندیدم.
ممنون .

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

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

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

mabbaszadegan
سه شنبه 13 بهمن 1388, 21:03 عصر
سلام.
من یه سوال دارم که خودمم خوب نمی دونم چیه.امیدوارم که متوجه بشید
این قضیه بایت کم ارزش و با ارزش چیه؟من الان یه برنامه دارم می نویسم که فکر کنم باید در قیمتیش جای این بایتها رو در یه عدد
short int
عوض کنم.این متغیر باید مقدار یک بگیره منتها در حالت برعکس معمول.امیدوارم متوجه شده باشید.اگر فرض کنیم در حالت معمولی بایت اول مقدار رو نگه می داره الان می خوام برعکسش کنم یعنی بایت دوم مقدار رو نگه داره.شاید اینطوری برنامه ام راه بیافته.هیچ ایراد دیگه ای جز این ندیدم.
ممنون .


سلام

مثلا این عدد (در مبنای دو) رو ببین :

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

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

موفق باشی

majmaji
سه شنبه 13 بهمن 1388, 23:15 عصر
نتیجه گیریت درسته ، فقط من متوجه سوال آخرت نشدم ، یعنی این تابع رو پیدا نکردم:لبخند:
این تابع:

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
چهارشنبه 14 بهمن 1388, 11:26 صبح
خب این تابع که کارش مشخصه ، داره میانگین 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
چهارشنبه 14 بهمن 1388, 12:05 عصر
خوب دادا مشکل همینه این شی mygradebook مگه مقدارش مخصوص چاپ نام درس نیست؟
مگه ما نباید یه شی دیگه ای درست کنیم که این تابع رو جداگونه احضار کنه؟
یا نه اصلا هیچ فرقی نداره ؟

mabbaszadegan
چهارشنبه 14 بهمن 1388, 13:06 عصر
خوب دادا مشکل همینه این شی mygradebook مگه مقدارش مخصوص چاپ نام درس نیست؟
مگه ما نباید یه شی دیگه ای درست کنیم که این تابع رو جداگونه احضار کنه؟
یا نه اصلا هیچ فرقی نداره ؟
نه دیگه ، به وسیله همین یک شی میتونی به تمام توابع عضو دسترسی داشته باشی و نیازی به تعریف شی جدید نداری

white tower
دوشنبه 19 بهمن 1388, 14:52 عصر
یه سوال مبتدی :من یه متغیر اعشار دارم که وقتی چاپش می کنم با نماد علمی چاپ میشه.چیکار کنم که با اعشار بیاد که بفهمم چنده؟
ممنون

Negative_Se7en
دوشنبه 19 بهمن 1388, 15:57 عصر
اینو امتحان کن.


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

white tower
دوشنبه 19 بهمن 1388, 19:25 عصر
اینو امتحان کن.


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

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

Negative_Se7en
دوشنبه 19 بهمن 1388, 23:21 عصر
یعنی منظور شما اینه که این کد در ++C اجرا نمیشه ؟!!!!!!

white tower
سه شنبه 20 بهمن 1388, 07:06 صبح
یعنی منظور شما اینه که این کد در ++C اجرا نمیشه ؟!!!!!!
نه قربان کی چنین حرفی زد؟یه دستور کاملا سی پلاس پلاسی می خوام.

Negative_Se7en
سه شنبه 20 بهمن 1388, 14:12 عصر
دوست من. اگه هدفت اینه که خودت یه تابع بنویسی که این کارو بکنه یه سری به این بزن :
http://barnamenevis.org/forum/showthread.php?t=204334
شاید به نظر بی ربط بیاد ولی به کاری شما میخواهید بکنید ربط داره.
یه تابع توش هست که رشته رو به int تبدیل میکنه ، به نظر من خودت یه سری تغییرات توش بده و یا ازش الگو بگیر و یه تابع بنویس که float یا double رو به رشته تبدیل کنه.:چشمک:

sh4mid
چهارشنبه 21 بهمن 1388, 17:42 عصر
ه سوال مبتدی :من یه متغیر اعشار دارم که وقتی چاپش می کنم با نماد علمی چاپ میشه.چیکار کنم که با اعشار بیاد که بفهمم چنده؟
ممنون


#include<iomanip>

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

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

Negative_Se7en
چهارشنبه 21 بهمن 1388, 19:42 عصر
sh4mid (http://www.barnamenevis.org/forum/member.php?u=35307) .من هم یه همچین چیزی رو بهش پیشنهاد دادم ولی میخواد خودش کد کاملش رو بنویسه.

white tower
چهارشنبه 21 بهمن 1388, 21:59 عصر
#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
چهارشنبه 21 بهمن 1388, 22:07 عصر
white tower جان.من که آخر متوجه نشدم که چی می خواهی.:متفکر:
اون چیزی که شما به من گفتی ، هیچ ربطی به این نداشت.

sh4mid
چهارشنبه 21 بهمن 1388, 23:13 عصر
البته تو کد شما هم یه مشکل کوچولو هست.شما متغیر صحیح برای مقدار اعشاری تعریف کردیداین شبه کده ! سخت نگیر :لبخندساده: :لبخندساده::لبخندساده:


فرق این دو تا کد شیه.منظورم اینه که '|' چه تغییری اعمال می کنه؟http://www.cplusplus.com/reference/iostream/ios_base/setf/

http://www.cplusplus.com/reference/iostream/ios_base/fmtflags/

majmaji
جمعه 23 بهمن 1388, 20:00 عصر
به به سلام دوستان میبینم اینجا خوب رونق گرفته خدا رو شکر
من هم یه سوال ازتون بپرسم
به این برنامه نگه کنید:

#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
شنبه 24 بهمن 1388, 19:15 عصر
دست گلت درد نکنه محمد جان خیلی بهت زحمت دادم خدا بخواد دیگه فصل 3 تموم شد و حالا رسیدیم سر تمریناش. من از این بخش خوشم میاد چون سوالاش حرفه ای طراحی شده و اگه کسی کتاب رو سرسری خونده باشه نمیتونه به سوالا جواب بده
اگه اشکال نداره من سوالا رو بنویسم و جوابشو بگم شما ببین من درست میگم یا غلط:
1- در مورد تفاوت پیش نمونه تابع و تعریف تابع توضیح دهید:
در پیش نمونه یک تابع ما نام تابع، نوع برگشتی آن و تعداد و نوع داده ها و ترتیب قرار گرفتن پارامتر ها رو که از تابع انتظار دریافت آن را داریم تعریف می‌کنیم اما تابع را به صورت کامل تعریف نمیکنیم به صورت زیر
void setCourseName(string name) ولی در تعریف تابع ما تابع را در کل تعریف میکنیم یعنی عملیاتی را که تابع انمام می دهد را هم تعریف میکنیم
2- سازنده پیش فرض چیست؟ اگر در کلاسی فقط یک سازنده پیش فرض به طور ضمنی تعریف شده باشد داده های عضو این کلاس چگونه مقدار اولیه میگیرند؟
سازنده پیش فرض به داده عضو کلاس مقدار اولیه نمیدهد اما برای هر داده ی عضوی که یک شی از کلاس دیگر است سازنده پیش فرض را احضار می‌کند. قسمت دوم سوال رو هم نمیدونم
3- در مورد هدف از استفاده داده عضو را توضیح دهید:
خوب اگر از متغیر محلی استفاده شود فقط در همان محل تعریف تا آخر جایی که آکولاد بسته می‌شود قابل استفاده است برای این که بتونیم مطمئن بشیم و در چند تابع در یک کلاس از اون استفاده کنیم باید اون رو به صورت داده عضو تعریف کنیم.
4- سرفایل چیست؟ فایل کد مبدا چیست؟ هدف استفاده از هر یک را توضیح دهید؟
سرفایل ها قسمتی از برنامه هستند که دارای پسوند h. هستند و فایل کد مبدا نیز قسمتی از برنامه هستند که دارای پسوند cpp. هستند
برای امنیت بیشتر و برای اینکه کاربر مشتری به برنامه دسترسی نداشته باشه از این دو استفاده میشه.
5- توضیح دهید چگونه بدون نوشتن اعلان using در یک برنامه میتوان از کلاس string استفاده کرد؟
فکر کنم باید کل کلاس string با تابع درونش و عملیاتی که انجام میده رو یک بار تعریف کنیم
6- توضیح دهید چگونه یک کلاس می تواند یک تابع set و یک تابع get برای یک داده عضو فراهم سازد
خوب ما این کار رو در مثال هایی که با هم نوشتیم و بحث و بررسی کردیم انجام دادیم درسته؟
دادا اینا باشه بقیش برنامه نویسی هست من دارم روشون فکر میکنم یخته سخته ولی الان رفتم زیرخمشو گرفتم:لبخند:


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

lartenk
شنبه 24 بهمن 1388, 20:34 عصر
دوستان من یه مشکل اساسی با این ارایه ها دارم،مثلا یه ارایه ی 10 تایی دارم میخوام حرف o رو با استفاده از کارکتر @ توش در بیاره!هر کدی مینویسم اصلا وقتی کمپایل میکنه هیچی نشون نمیده،خواهش میکنم کمک کنید.

majmaji
شنبه 24 بهمن 1388, 23:53 عصر
من به کتابی که شما میخونین علاقه مند شدم میشه بگین از چه کتابی میخونین؟
خیلی ممنون بابتتوجهتون
من از روی کتاب چگونه با سی پلاس پلاس برنامه نویسی کنیم دایتل و دایتل دارم پیش میرم

mabbaszadegan
سه شنبه 27 بهمن 1388, 00:23 صبح
سلام مجید جان

سوال اول :

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
سه شنبه 27 بهمن 1388, 00:26 صبح
دوستان من یه مشکل اساسی با این ارایه ها دارم،مثلا یه ارایه ی 10 تایی دارم میخوام حرف o رو با استفاده از کارکتر @ توش در بیاره!هر کدی مینویسم اصلا وقتی کمپایل میکنه هیچی نشون نمیده،خواهش میکنم کمک کنید.
سلام
راستش من متوجه سوالتون نشدم ، اگه ممکنه یه خورده بیشتر توضیح بدید

موفق باشی

majmaji
سه شنبه 27 بهمن 1388, 13:41 عصر
سلام دادا
خوب مشکل اینه چرا ما باید total رو تبدیل کنیم
مگه ما نمیخوایمکهحاصل تخصیم رو بهمون اعشاری نشون بده پس باید average رو تبدیل کنیم
نه؟

mabbaszadegan
سه شنبه 27 بهمن 1388, 14:06 عصر
سلام دادا
خوب مشکل اینه چرا ما باید total رو تبدیل کنیم
مگه ما نمیخوایمکهحاصل تخصیم رو بهمون اعشاری نشون بده پس باید average رو تبدیل کنیم
نه؟
آره ، درسته
این مثال فقط میخواسته کاربرد این تابع رو نشون بده ، شاید درست ترش این بود که نوع average رو عوض کنه

موفق باشی

majmaji
شنبه 01 اسفند 1388, 14:05 عصر
سلامت باشی دادا
من دارم برایاینکه فقط مثالای کتاب رو کپی نزده باشم چند تا برنامه از مبتدی انجام بدم تا همین فصل 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
شنبه 01 اسفند 1388, 16:11 عصر
سلام
تابع sqrt به این صورت تعریف شده که یک متغیر double یا float رو میگیره و حاصلی که برمیگردونه هم از نوع double یا float هست .
یعنی الان باید نوع متغیرهای a,b,c رو عوض کنی ، مثلا بذار double

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

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

موفق باشی

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

mabbaszadegan
شنبه 01 اسفند 1388, 18:09 عصر
توی هر کامپایلر این مقدار متفاوته ، مثلا توی ویژوال استودیو یه مقدار و توی بورلند یا توربو یه مقدار دیگه داره :چشمک:

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

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

موفق باشی

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

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

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

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

موفق باشی

lartenk
یک شنبه 02 اسفند 1388, 20:14 عصر
نه ببینید مختصات دو راس مقابل رو دارم،بعد هم اینکه با ارایه باید کار کنم.

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

Nima_NF
یک شنبه 02 اسفند 1388, 20:44 عصر
ضمن تشکر از تمامی دوستانی که در این تاپیک با فعالیت خوبشان به دیگران کمک می کنند، لازم می بینم که در مورد ادامه یافتن این تاپیک توضیحی بدهم.

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

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