-
نقل قول: مشكلات من با ++C
آره ، تقریبا درست گفتی
ببین به نظرم داری حفظ میکنی ، اگه الان چندتا کد بنویسی خیلی بیشتر به دردت میخوره
مثلا برای شروع یه کلاس طراحی کن که مشخصات یه دانشجو (نام ، شماره دانشجویی ، سن و معدل ) رو بگیره (این 4 تا میشند اعضای داده ای کلاس) ؛ توابع set و get رو برای هرکدوم بنویس و یه تابع هم بنویس که اطلاعات مربوط به یک دانشجو رو نشون بده
شروع کن ، تا هرجا که نوشتی کدشو بزار اینجا باهم بررسی کنیم
-
نقل قول: مشكلات من با ++C
نه داداش ، این چه حرفیه
تا ننویسی یاد نمیگیری ، من خودمم خیلی چیزا رو اینجا یادگرفتم
موفق باشی
-
نقل قول: مشكلات من با ++C
من برنامه رو نوشتم ولی واقعاً درست نیست و کار نکرد نمیدونم مشکلم کجاست ولی کدش به شکل زیر است.
#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;
}
-
نقل قول: مشكلات من با ++C
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
-
نقل قول: مشكلات من با ++C
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;
}
بقیشو سعی کن خودت بنویسی ، سوالی بود در خدمتم
-
نقل قول: مشكلات من با ++C
نقل قول:
نوشته شده توسط
computer_science
ba salam man yek taze vared hastam va manam ye soal dashtam chetori mitoonam ye adad 20 raghami dar mabnaye 16 daryaf konam
ba tashakkor
سلام
برای دریافت اعداد بزرگ باید از ساختمان های داده ای مثل لینک لیست کمک بگیری ،
شروع کن به نوشتن ، بعد کدتو بذار تا باهم بررسی کنیم
-
نقل قول: مشكلات من با ++C
نقل قول:
نوشته شده توسط
mabbaszadegan
1. اعضای داده ای رو باید به صورت private تعریف میکردی
2. توابع set باید اعضای داده ای رو مقداردهی کنند
3. توابع get باید اعضای داده ای رو برگردونند
این کد رو ببین :
class student {
private:
string name;
string shomaredaneshjo;
int sen;
int moadel;
public:
void setname(string a) {
name=a;
}
string getname() {
return name;
}
void setshomaredaneshjo(string b) {
shomaredaneshjo=b;
}
string getshomaredaneshjo() {
return shomaredaneshjo;
}
بقیشو سعی کن خودت بنویسی ، سوالی بود در خدمتم
آها درسته اما یه سوال دیگه
اونجا تو اون تابعی که از return استفاده کردی مگه نباید ما a رو return کنیم پس چرا name رو return کرده؟
-
نقل قول: مشكلات من با ++C
توابع get باید اعضای داده ای رو برگردونند ؛
مثلا تابع getname باید name رو برگردونه
-
نقل قول: مشكلات من با ++C
آها فهمیدم ببین من برنامه رو تا اونجایی که گفتی نوشتم بقیشم اینشکلی نوشتم همشو پشت هم می نویسم
#include <cstdlib>
#include <iostream>
#include <conio.h>
using namespace std;
#include <string>
class student
{
private:
string name;
string shomaredaneshjo;
int sen;
int moadel;
public:
void setname(string a)
{
name=a;
}
string getname()
{
return name;
}
void setshomaredaneshjo(string b)
{
shomaredaneshjo=b;
}
string getshomaredaneshjo()
{
return shomaredaneshjo;
}
void setsen(int c)
{
sen=c;
}
string getsen()
{
return sen;
}
void setmoadel (int d)
{
moadel=d;
}
string getmoadel()
{
return moadel;
}
void displaymessage()
{
cout<<"etelaate daneshjo\n"<<getname()<<getshomaredaneshjo()<<gets en()<<getmoadel()<<endl;
}
private:
string name;
string shomaredaneshjo;
int sen;
int moadel;
};
int main()
{
string name0fnamedaneshjo;
string name0fshomaredaneshjo;
int name0fsenedaneshjo;
int name0fmoadeledaneshjo;
gradebook mygradebook;
cout<<"lotfan etelaate daneshjo ra vared konid:"<<endl;
getline(cin, name0fnamedaneshjo);
mygradebook.setname(name0fnamedaneshjo);
getline(cin, name0fshomaredaneshjo);
mygradebook.setname(name0fshomaredaneshjo);
getline(cin, name0fsenedaneshjo);
mygradebook.setname(name0fsenedaneshjo);
getline(cin, name0fmoadeledaneshjo);
mygradebook.setname(name0fmoadeledaneshjo);
cout<<endl;
mygradebook.displaymessage();
getch();
return 0;
}
-
نقل قول: مشكلات من با ++C
خوبه ، فقط دوتا مشکل وجود داره :
1. اعضای داده ای رو یه بار اول کلاس و یه بار آخر کلاس تعریف کردی !!
یکیشو پاک کن
2. به جای gradebook باید بنویسی student (اسم کلاس عوض شده) ؛ مثلا برای تعریف شی اینطوری بنویس:
student mystudent ,std1,std2;
الان سه تا شی mystudent ,std1,std2 از کلاس student تعریف شدند
-
نقل قول: مشكلات من با ++C
چرا سه تا مگه با یکی نمیتونیم تابع ها رو فراخوانی کنیم؟
-
نقل قول: مشكلات من با ++C
آره
فقط خواستم مثال زده باشم ،
یک شی کافیه
-
نقل قول: مشكلات من با ++C
نقل قول:
نوشته شده توسط
mabbaszadegan
سلام
برای دریافت اعداد بزرگ باید از ساختمان های داده ای مثل لینک لیست کمک بگیری ،
شروع کن به نوشتن ، بعد کدتو بذار تا باهم بررسی کنیم
با سلام
با تشکر از شما برای جوابتون
اما من برنامه نویسی به زبان cدارم اونجا چطور میشه؟
-
نقل قول: مشكلات من با ++C
اما یه سوال
برنامه ای که نوشتم 8 تا ارور داد چرا؟ مگه کجاش مشکل داره؟
-
نقل قول: مشكلات من با ++C
-
نقل قول: مشكلات من با ++C
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
class student
{
private:
string name;
string shomaredaneshjo;
int sen;
int moadel;
public:
void setname(string a)
{
name=a;
}
string getname()
{
return name;
}
void setshomaredaneshjo(string b)
{
shomaredaneshjo=b;
}
string getshomaredaneshjo()
{
return shomaredaneshjo;
}
void setsen(int c)
{
sen=c;
}
string getsen()
{
return sen;
}
void setmoadel (int d)
{
moadel=d;
}
string getmoadel()
{
return moadel;
}
void displaymessage()
{
cout<<"etelaate daneshjo\n"<<getname()<<getshomaredaneshjo()<<gets en()<<getmoadel()<<endl;
}
};
int main()
{
string name0fnamedaneshjo;
string name0fshomaredaneshjo;
int name0fsenedaneshjo;
int name0fmoadeledaneshjo;
student mystudent;
cout<<"lotfan etelaate daneshjo ra vared konid:"<<endl;
getline(cin, name0fnamedaneshjo);
mystudent.setname(name0fnamedaneshjo);
getline(cin, name0fshomaredaneshjo);
mystudent.setshomaredaneshjo(name0fshomaredaneshjo );
getline(cin, name0fsenedaneshjo);
mystudent.setsen(name0fsenedaneshjo);
getline(cin, name0fmoadeledaneshjo);
mystudent.setmoadel(name0fmoadeledaneshjo);
cout<<endl;
mystudent.displaymessage();
getch();
return 0;
}
این هم کد البته بگم من اون تغیرات رو توش انجام دادم ولی بازم ارور داد 6 تا هم ارور داد
-
نقل قول: مشكلات من با ++C
1. تابع getsen ، متغیر sen رو برمیگردونه ، پس باید نوعش int باشه
2. تابع getmoadel هم باید نوعش int باشه ،
3. برای خوندن رشته ها از getline استفاده کن ، چون دو متغیر name0fsenedaneshjo و name0fmoadeledaneshjo از نوع int هستند پس برای خوندنشون از cin معمولی باید استفاده کنی
در کل کد تصحیح شده میشه این :
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
class student
{
private:
string name;
string shomaredaneshjo;
int sen;
int moadel;
public:
void setname(string a)
{
name=a;
}
string getname()
{
return name;
}
void setshomaredaneshjo(string b)
{
shomaredaneshjo=b;
}
string getshomaredaneshjo()
{
return shomaredaneshjo;
}
void setsen(int c)
{
sen=c;
}
int getsen()
{
return sen;
}
void setmoadel (int d)
{
moadel=d;
}
int getmoadel()
{
return moadel;
}
void displaymessage()
{
cout<<"etelaate daneshjo\n"<<getname()<<getshomaredaneshjo()<<gets en()<<getmoadel()<<endl;
}
};
int main()
{
string name0fnamedaneshjo;
string name0fshomaredaneshjo;
int name0fsenedaneshjo;
int name0fmoadeledaneshjo;
student mystudent;
cout<<"lotfan etelaate daneshjo ra vared konid:"<<endl;
getline(cin, name0fnamedaneshjo);
mystudent.setname(name0fnamedaneshjo);
getline(cin, name0fshomaredaneshjo);
mystudent.setshomaredaneshjo(name0fshomaredaneshjo );
cin>>name0fsenedaneshjo;
mystudent.setsen(name0fsenedaneshjo);
cin>>name0fmoadeledaneshjo;
mystudent.setmoadel(name0fmoadeledaneshjo);
cout<<endl;
mystudent.displaymessage();
getch();
return 0;
}
اصلا از error نترس ، شیرینی برنامه نویسی به همین چیزاشه :چشمک:
-
نقل قول: مشكلات من با ++C
خوب دوستان تا اینجا خوب پیش رفتیم جا داره از دوست خوبم mabbaszadegan تشکر کنم بخاطر توجه ویژه که به این تاپیک و بنده داشتن و هیچ سوالی از من رو بی پاسخ نذاشتن.
واقعاً ممنونم
اما خوبه تا الان با اون چیزایی که آشنا شدیم یه مروری داشته باشیم.
خوب، داده ها چه چیزایی بودن؟ داده ها متغیر هایی هستن که در طول برنامه با اونا ار داریم و باید قبل از استفاده تعریف بشن
داده های عضو داده هایی هستن که در یک کلاس به کار میرن و باید قبل از به پایان رسیدن کلاس معرفی بشن.
تابع هم که فهمیدیم چی بود. پارامتر تابع رو هم فهمیدیم ما با استفاده از پارامتر تابع مقداری رو در یک متغیر کلاس جایگزین میکنیم.
کلاس رو هم فهمیدیم
شی رو هم فهمیدم ما با استفاده از شی توابع رو فراخوانی میکنیم
(دوستان اگه اشتباه بود بگیدا)
اما در مثال جدید که میخوایم بریم سراغش "سازنده" ها را معرفی کرده.
سازنده ها به اشیای کلاس ها مقدار اولیه می دهند.
-
نقل قول: مشكلات من با ++C
قبل از اینکه در مورد برنامه حرف بزنیم بریم سراغ توضیحات قبل از برنامه
مثال بعدی مربوط میشه به مقدار دادن به اشیا با سازنده ها
توی توضیحات اینطوری اومده:
هنگامی که شی GradeBook را ایجاد می کنید چه اتفاقی می افتد اگر بخواهید نام یک درس را فراهم کنید. هر کلاسی که اعلان می کنید می تواند سازنده ای فراهم کند که می تواند برای مقدار اولیه دادن به شی کلاس هنگام ایجاد آن مورد استفاده قرار گیرد.(خوب اینطور که من فهمیدم برای هر کلاس فقط یک سازنده داریم و کار سازنده ها مقدار دادن به اشیاء کلاس هست. آیا تنها کار سازنده همین هست یا باز هم کارایی دیگه ای هم دارد؟)
سازنده، تابع عضو خاصی است که باید همنام با کلاس تعریف شود از اینرو کامپایلر می تواند آن را از دیگر تابع های عضو کلاس تشخیص دهد. (از اینجا فهمیدیم که سازنده یک تابع است که مثل بقیه توابع میتونه پارامتر و داده عضو داشته باشه و باید همنام کلاس باشه)
به این بند توجه کنید لطفاً
زبان ++C برای احضار هر شی ای که ایجاد می شود نیازمند یک یک سازنده است که کمک می کند اطمینان حاصل کنیم شی قبل از استفاده در برنامه، بدرستی مقدار اولیه گرفته .(ما با اشیاء توابع را در تابع main فراخوانی می کردیم و در بقیه توابع به یه صورت دیگه که در مثال قبل دیدیم اما سازنده ها به اشیاء مقدار اولیه میدن این چه تفاوتی میتونه در فراخوانی تابع در تابع main داشته باشه؟)
قبل از مثال هم یه تذکر نوشته که من یه قسمتایش رو نمیفهمم:
تذکر: برای داده های عضوی که اشیایی از کلاس های دیگر هستند سازنده پیش فرض به صورت ضمنی هر سازنده ی پیش فرض داده ی عضو را احضار می کند تا مطمئن شود داده عضو به درستی مقدار اولیه گرفته است.(مگه میشه داده های عضوی اسم اشیاء رو هم تشکیل بده؟؟؟؟ یا شاید چون برای کلاس های متفاوت هست اصلا تداخلی ایجاد نمیکنه ؟؟)
دوستان با تشکر از اهمیتی که به این بحث میدید قبل از اینکه بریم سراغ مثال اول این ابهامات رو رفع کنیم!
با تشکر
-
نقل قول: مشكلات من با ++C
نقل قول:
خوب اینطور که من فهمیدم برای هر کلاس فقط یک سازنده داریم و کار سازنده ها مقدار دادن به اشیاء کلاس هست. آیا تنها کار سازنده همین هست یا باز هم کارایی دیگه ای هم دارد؟
نه ، ممکنه یه کلاس چندین سازنده داشته باشه ؛ اینجا بحث overloading مطرح میشه ، یعنی تابعی با یک اسم چندین بار تعریف بشه ، که این خیلی کاربرد میتونه داشته باشه
نقل قول:
از اینجا فهمیدیم که سازنده یک تابع است که مثل بقیه توابع میتونه پارامتر و داده عضو داشته باشه و باید همنام کلاس باشه
بله !!
نقل قول:
ما با اشیاء توابع را در تابع main فراخوانی می کردیم و در بقیه توابع به یه صورت دیگه که در مثال قبل دیدیم اما سازنده ها به اشیاء مقدار اولیه میدن این چه تفاوتی میتونه در فراخوانی تابع در تابع main داشته باشه؟
منظورتو متوجه نمیشم ، خب سازنده به شی مقداردهی میکنه و دقیقا مثل توابع عضو دیگه ی کلاس تو تابع main فراخوانی میشه
نقل قول:
مگه میشه داده های عضوی اسم اشیاء رو هم تشکیل بده؟؟؟؟ یا شاید چون برای کلاس های متفاوت هست اصلا تداخلی ایجاد نمیکنه ؟؟
میتونی یک عضو داده ای از جنس کلاس تعریف کنی ، مثلا :
class student
{
private:
string name;
string shomaredaneshjo;
int sen;
student std1;
اینجا std1 علاوه براینکه یک عضو داده ای کلاس student هست ، یک شی ازین کلاس هم به حساب میاد
-
نقل قول: مشكلات من با ++C
نقل قول:
نوشته شده توسط
mabbaszadegan
نه ، ممکنه یه کلاس چندین سازنده داشته باشه ؛ اینجا بحث 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 تعریف نکردی
-
نقل قول: مشكلات من با ++C
std1 هم یک شی به حساب میاد هم یک عضو داده ای ؛ مثلا توی تابع main میتونی بنویسی :
student obj;
obj.std1.sen;
اینجور تعریف کردن معمولا برای ساختن ساختمان داده (مثل لینک لیست یا درخت و گراف ) کاربرد داره
-
نقل قول: مشكلات من با ++C
خوب این هم مثال بعدی که مربوط میشه به مقدار دادن به اشیا با استفاده از سازنده ها
#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() اما تو این مثال از این دستور استفاده نشده چرا؟)
-
نقل قول: مشكلات من با ++C
نقل قول:
(البته چرا داده عضو یک پارامتر داره؟ مگه اون داده نیست پس چرا پارامتر داره؟)
اون داده نیست ، همون تابع عضو setcoursename هستش که داخل سازنده صدا زده شده
نقل قول:
در مثال قبلی قبل از پایان برنامه یه دستوری بود که اینجوری بود mygradebook.displaymessage() اما تو این مثال از این دستور استفاده نشده چرا؟)
اینجا اومده به جای استفاده از تابع displaymessage خودش مستقیما تو تابع main شی رو چاپ کرده
تو این مثال اگه تابع displaymessage رو حذف کنی هیچ اتفاقی نمی افته
-
نقل قول: مشكلات من با ++C
ممنونم محمد جان حالا بعد از این مثال هم یک سری توضیحات اورده که با هم بررسی میکنیم
میگه در لیست پارامتر یک سازنده، داده هایی مشخص می شود که سازنده برای انجام کارهایش به آن نیاز دارد. خوب اینجا پارامتر string name یا بهتره بگیم پارامتر name از نوع string مشخص شده.
میگه در بدنه سازنده، name یعنی پارامتر سازنده را به تابع setcoursename منتقل می کند که یک مقدار در داده عضو coursename جایگزین کند خوب اینجا ما یک حرکت اضافی انجام دادیم چون تابع setcoursename خودش اینکار رو انجام میده درسته؟
و بعد از همه اینا اگه میشه بگو که آرگومان یعنی چی؟
و این جمله یعنی چی: هر سازنده ای که هیچ آرگومانی نداشته باشد سازنده پیش فرض نام دارد
میگه سازنده پیش فرض به دو صورت در اختیار کلاس قرار میگیره
1- کامپایلر در کلاسی که سازنده ای تعریف نکرده به صورت ضمنی سازنده پیش فرض رو ایجاد کنه و ....
2- برنامه نویس خودش به صورت صریح ایجاد کنه
البته من اولی رو بیشتر ترجیح میدم اما خودش یک نکته ای رو اورده با این موضوع "اگر لازم نباشد به داده های عضو کلاس مقدار اولیه دهید (تقریبا همیشه) برای حصول اطمینان از اینکه داده های عضو کلاس، هنگام ایجاد هر شی جدید از کلاستان، با مقادیر با معنی مقدار اولیه گرفته اند، یک سازنده فراهم سازید" این یعنی اینکه باید از راه دوم بریم؟؟؟
-
نقل قول: مشكلات من با ++C
نقل قول:
اینجا ما یک حرکت اضافی انجام دادیم چون تابع setcoursename خودش اینکار رو انجام میده درسته؟
این کار برای افزایش امنیت برنامه ست ، اصل کپسوله سازی capsulation
نقل قول:
آرگومان یعنی چی؟
آرگومان به مقادیری میگند که تابع میگیره ، مثلا توی این :
void func1(int a, int b , char c, string d)
a,b,c,d به ترتیب آرگومانهای تابع func1 به شمار میاند ؛ یعنی موقع فراخوانی تابع باید این چهار مقدار رو وارد کنی
البته تابع میتونه هیچ آرگومانی نداشته باشه (مثل همین displaymessage یا توابع get )
نقل قول:
هر سازنده ای که هیچ آرگومانی نداشته باشد سازنده پیش فرض نام دارد
یعنی اینکه اگه هیچ سازنده ای رو تو تابع main صدا نزنی ، به طور اتوماتیک سازنده ای که هیچ آرگومانی ندارد فراخوانی شده و شی مورد نظر رو مقداردهی میکند
کلا تعریف سازنده باعث بالارفتن امنیت برنامه میشه ؛
یه نکته : یه سری اصول هست که شاید به ظاهر مسخره بیاد (مثل همین سازنده یا تعریف کلاس توی بلاکهای #ifndef و #endif) ولی در حقیقت برنامه رو اصولی تر میکنه و از همه مهم تر به برنامه قابلیت حمل میده
-
نقل قول: مشكلات من با ++C
نقل قول:
a,b,c,d به ترتیب آرگومانهای تابع func1 به شمار میاند ؛ یعنی موقع فراخوانی تابع باید این چهار مقدار رو وارد کنی
البته تابع میتونه هیچ آرگومانی نداشته باشه (مثل همین displaymessage یا توابع get )
خوب تو این مثال که زدی a,b,c,d مگه پارامتر های تابع نیستن؟
تازه اگه اینها آرگومان باشن ما میتونیم داخل تابع به کار ببریم؟
مثلا بنویسیم:
void func1 ()
{
int a, b;
char c;
string d;
}
-
نقل قول: مشكلات من با ++C
درسته ، تو اولی برنامه نویس آرگومانها رو به تابع میده ولی در حالت دوم کاربر آرگومانها رو مقداردهی میکنه
-
نقل قول: مشكلات من با ++C
من دو تا پست گذشتم اومدم آخری رو حذف کنم یکی مونده به آخری حذف شد اشکال نداره دوباره مینویسم:
تو پست دو تا قبلی نوشته بودم که مثال بعدی مربوط میشه به گنجاندن سر فایلی که حاوی یک کلاس تعریف شده توسط کاربر است در این مثال اینطوری عمل میشه که ما اول میام کلاس رو در یک برنامه مینویسیم بدون تابع 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- مشتری ها ندانند چگونه توابع عضو کلاس پیاده سازی می شوند."
من منظور کتاب رو از این توضیحات نفهمیدم منظورش چیه میشه توضیح بدید لطفاً
-
نقل قول: مشکلات من با ++C
نقل قول:
چرا سر فایل ها در هر دو برنامه نوشته میشه؟
سر فایل ها در هر جایی که نیاز باشد باید نوشته شوند، اما اینکه چرا با وجود نوشتن سر فایل ها در فایل 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) انجام دهیم. در حال حاضر ممکن است این کار به نظرتان مسخره بیاید، پیشنهاد می کنم در مورد علت انجام این کار و مزایای آن فعلا زیاد کنجکاوی نکنید، فقط از آن پیروی کنید. به زودی (هنگام نوشتن و مدیریت پروژه های بزرگتر و یا تجاری) به مزایای این کار پی خواهید برد.
-
نقل قول: مشکلات من با ++C
سلام, من سه چهار روزه با 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;
}
}
-
نقل قول: مشكلات من با ++C
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;
اگه بازم سوالی بود در خدمتم ؛
-
نقل قول: مشكلات من با ++C
به به سلامی دوباره به دوستان خوبم دوباره از دوستای عزیزی که ما در این تاپیک همراهی کردن تشکر میکنم و خیلی خوشحالم که این تاپیک داره رونق پیدا میکنه
خوب ما رسیدیم به اینجایی که ما میتونیم با جداسازی واسطه از یک برنامه هم امنیت برنامه رو بالا ببریم هم اینکه کاری کنیم که مشتری نتونه بفهمه که ما چی نوشتیم
خوب اول یه سری توضیحات رو بنویسم
واسطه یک کلاس مشخص می کند مشتری های کاربر از چه خدماتی می توانند استفاده کنند و این خدمات را درخواست کنند اما از چگونگی انجام این خدمات آگاه نمی شوند. واسطه کلاس از توابع 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;
}
اما من نتونستم این سه تا مثال رو با موفقیت اجرا کنم شما میتونید بگید مشکل چیه؟
-
نقل قول: مشكلات من با ++C
هیچ مشکلی نداره ، فقط اینو یادت رفته بود
#include<string>
اینو اول هر سه تا فایل بذار ، بعد اجراش کن
-
نقل قول: مشکلات من با ++C
نقل قول:
نوشته شده توسط
mabbaszadegan
هیچ مشکلی نداره ، فقط اینو یادت رفته بود
#include<string>
اینو اول هر سه تا فایل بذار ، بعد اجراش کن
من این کار رو کردم اما بازم ارور داد
-
نقل قول: مشكلات من با ++C
چه اروری میده ؟
من اجراش کردم ، اجرا شد
-
نقل قول: مشكلات من با ++C
خوب ببین وقتی قسمت اول رو میخوام کامپایل کنم این ارور رو میده
[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
-
نقل قول: مشكلات من با ++C
اینارو امتحان کن ، من همین الان اجراش کردم
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;
}
-
نقل قول: مشكلات من با ++C
بازم همون ارور ها رو میده یعنی اشکال از کجا میتونه باشه؟:متعجب:
-
نقل قول: مشکلات من با ++C
سلام خوبی؟
ساختار do while به شکل زیر و شما اشتباه نوشتی
Do{
دستور;
دستور2;
.
.
(شرط)while {
در این برنامه ای که شما نوشتی یک تکرار بی نهایت while ایجاد شده است تا تعدادی نامعلوم عدد بخونه و وارون آنها را نمایش بده.برای ایجاد حلقه تکرار بی نهایت در شرط حلقه (1) قرار میدیم ، 1 مقداری غیر صفر است و در c دارای ارزش درستی است و در طول اجرای برنامه تغییر نمی کنه.
می تونی از کتاب C++ جعفر نزاد قمی استفاده کنی خیلی به دردت می خوره
:چشمک::لبخندساده:
-
نقل قول: مشکلات من با ++C
نقل قول:
نوشته شده توسط
mehrara_bolouri
سلام خوبی؟
ساختار do while به شکل زیر و شما اشتباه نوشتی
Do{
دستور;
دستور2;
.
.
(شرط)while {
در این برنامه ای که شما نوشتی یک تکرار بی نهایت while ایجاد شده است تا تعدادی نامعلوم عدد بخونه و وارون آنها را نمایش بده.برای ایجاد حلقه تکرار بی نهایت در شرط حلقه (1) قرار میدیم ، 1 مقداری غیر صفر است و در c دارای ارزش درستی است و در طول اجرای برنامه تغییر نمی کنه.
می تونی از کتاب C++ جعفر نزاد قمی استفاده کنی خیلی به دردت می خوره
:چشمک::لبخندساده:
اصلا برنامه من در مورد while نیست:متعجب:
-
نقل قول: مشكلات من با ++C
نمیدونم اشکال کجاست ، من همین کد رو با vs 2008 کامپایل کردم ، هیچ اروری نداد :متعجب:
فک نکنم ++dev c با vs فرقی بکنه :متفکر:
-
نقل قول: مشكلات من با ++C
میگم شاید مشکل از نحوه ذخیره کردن برنامه باشه
من هر کدوم از این سه قسمت رو با پسوند cpp. ذخیره میکنم شاید نباید این شکلی عمل کنم
من بازم امتحان کردم ولی این بار فقط به قسمت اول گیر داد الان vs2008 رو نصب میکنم و رو اون هم امتحان میکنم
-
نقل قول: مشكلات من با ++C
خب همینه دیگه !!!!!!
باید اینو با پسوند .h ذخیره کنی :
using namespace std;
#include<string>
class GradeBook
{
public:
GradeBook( string );
void setCourseName( string );
string getCourseName();
void displaymessage();
private:
string coursename;
};
-
نقل قول: مشكلات من با ++C
ببین من میخوام تو vs 2008 بنویسم اما نمیدونم چجوری
من یه win 32 کنسول درست کردم و برنامه خالی رو فعال کردم بعد 3 قسمت داره header و sourse و resourse که اولین برنامه رو باید تو اولی بنویسم و دومی رو تو دومی سومی رو که میخوام تو سومی بنویسم ارور میده باید چکار کنم؟
-
نقل قول: مشكلات من با ++C
نه دیگه ، حالا وقتی win32 consoul رو ساختی ، روی یکی از اون پوشه ها کلیک راست کن و گزینه add -> new item رو انتخاب کن ، باید یه دونه h. و دوتا cpp. بسازی و کدهارو توش بنویسی
اجرا کردی بگو
-
نقل قول: مشكلات من با ++C
اجرا نمیشه نمیدونم چشه به نظرت ول کنم برم جلو یا نه بازم امتحان کنم؟
امروز چند صد بار با dev امتحان کردم:لبخند: هر دفعه یه چیزی رو تغیر دادم ولی تو قسمت اول برنامه بعد از کامپایل ارور میده و یک ارور هم میده که میگه مثلا اگه اسم برنامه رو با majid ذخیره کرده باشم میگه majid.exe ساخته نشد و در قسمت دوم برنامه که میخوام کامپایل کنم به #include "GradeBook.h" گیر میده
به نظرت ول کنم برم جلو
-
1 ضمیمه
نقل قول: مشكلات من با ++C
اینو امتحان کن ، اگه جواب نداد بیخیالش شو
-
نقل قول: مشكلات من با ++C
نه نشد.
بریم سراغ مثال بعدی
مثال بعدی در مورد معتبر سازی نام درس هست که در این مثال می خواهیم درسی چاپ بشه که دارای 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();
}
خوب اینو داشته باشید تا اشکالات رو در پست بعدی بنویسم
-
نقل قول: مشكلات من با ++C
خوب کتاب یک سری توضیحات اورده که من رو اونا یک سری سوال دارم
name.length() یک احضار تابع عضو است ما که در برنامه تابع ()length رو تعریف نکردیم. تازه مگه name یک داده عضو نبود پس چرا در اینجا از اون به عنوان یک شی استفاده شده و با اون یک تابع فراخوانی میشه؟
در کلاس string کتابخانه ++C استاندارد تابع عضو length تعریف شده است که تعداد کارکتر های داخل یک شی string را بر میگرداند. منظورش از کلاس string کتابخانه ++C استاندارد همون #include <string> هست؟
آیا تابع length فقط برای اشیا مورد استفاده قرار میگیره؟ برای داده هایی که از نوع int هستند چطور؟ برای پارامتر های یک تابع چطور؟