PDA

View Full Version : خطا در برنامه



omidparkour
جمعه 06 دی 1392, 15:54 عصر
سلام
من برنامه ی زیر رو نوشتم اما بعضی قسمت هاش خطا داره لطفا کمکم کنید
کامپایلرم هم visual studio 2012 هستش
ممنون
#include "stdafx.h"
#include "iostream"
using namespace std;
class isnutnameexception
{
char message[100];
void setmessage(char* message)
{
strcpy(this->message,message);
}
public:
isnutnameexception (char* message)
{
setmessage(message);
}
char* getmessage()
{
return message;
}
};
class isnutname:public isnutnameexception
{
isnutname(char* message):isnutnameexception(message)
{
}
};
class isnutfname:public isnutnameexception
{
isnutfname(char* message):isnutnameexception(message)
{
}
};
class student
{
char name,fname;
public:
void setname(char* name)
{
if (strlen(name)>5)
this->name,name;
else
throw isnutname("please enter a true name");
}

void setfname(char* fname)
{
if(strlen(fname)>5)
this->fname,fname;
else
throw isnutfname("please enter a true fname");

}
int printstudent()
{
return name + fname;

}
};
void main()
{
student s1;
char name,fname;
try
{
cin >> name;
s1.setname(name);
}
catch(isnutname esm)
{
cout << esm.getmessage() << endl;

}
try
{
cin >> fname;
s1.setfname(fname);

}
catch(isnutfname family)
{
cout << family.getmessage() << endl;
}
cout<< s1.printstudent() << endl;
}

omidshaman
جمعه 06 دی 1392, 19:38 عصر
از main شروع می کنیم

cin >> name;
s1.setname(name);

cin >> fname;s1.setfname(fname);


شما داخل main متغیر name و fname رو از نوع char ساختی پس فقط با cin یک حرف از ورودی گرفته میشه و بقیش دور ریخته میشه و البته ارور هم میده چون ورودی تابع داخلا کلاس Char* هستش .

void setname(char* name)

---------------------------------------------------------------
catch(isnutname esm)
یکی از اصول اسم گذاری اینه که اسم انگلیسی گذاشته بشه نه فارسی مثلا بزار nameException به جای esm !

----------------------------------------------------------------
میریم سراغ کلاس student
اولا این که حرف اول اسم کلاس رو بزرگ بنویس .
داخل تابع setName

if (strlen(name)>5)this->name,name;

this-> name , name ینی چی ؟!!
= رو یادت رفته بزاری ؟
با فرض این که = هم بزاری باز هم اشتباه هستش چون اینجوری name ای که داخل main برنامه ساختی
آدرسش کپی میشه داخل name کلاس پس به محض این که name اون جا مقدارش عوض بشه name داخل کلاس هم مقدارش عوض میشه (یعنی مثلا اگر 4 تا شی از Student بسازی با اون روش داخل main هر 4 تا اسمشون یکی میشه !! )
درستش اینه که کد به این شکل باشه :
int nameSize=strlen(name);
if(name != NULL)
{
delete[] name;
name=NULL;
}

if (nameSize>5)
{
this->name=new char[nameSize];
strcpy(this->name,name);
}
else
throw isnutname("please enter a true name");


تابع setfname هم به همین شکل باید عوض بشه .

---------------------------------
میرسیم به تابع
int printstudent()
{
return name + fname;

}

این هم کلا اشتباه هسته شما نمی تونی این جوری 2 تا char* که رو جمع بزنی انتظار هم داشته باشی کار کنن چون name , fname این جا از نوع ادرس هستن اصلا جمع زدنشون به این شکل بی معنیه
روشی که من پیشنهاد می کنم اینه که به این شکل بنویسی :
char* getName()
{
return name;
}
char* getLastName()
{
return fname;
}
و داخل main
cout<<s1.getName()<<" "<<s1.getLastName();
----------------------------------------------------------
میریم به کلاس isnutname
مشکلی که داره اینه که شما
isnutname(char* message):isnutnameexception(message) {
}

رو قبلش public نزاشتی یعنی بصورت پیش فرض سازنده کلاس privateُ تعریف میشه .
--------------------------
نحوه اسم گذاری این 3 تا هم مشکل داره این جوری بزار مثلا
StudentException
NameException
FNameException

در ضمن من نمی فهمم چرا به استفاده از char* اصرار داری از string استفاده کن .

یکسری چیزای دیگه هم هست که تا این چیزایی که گفتم رو درست نکنی نزاری نمی گم :لبخند:
سوال دیگه ای داشتی بیا تو لینک توی امضای من بپرس من زیاد به این جا سر نمی زنم
www.7khatcode.com

omidparkour
شنبه 07 دی 1392, 10:08 صبح
سلام
من ویرایش کردم اما باز ...
#include "stdafx.h"
#include "iostream"
using namespace std;

class isnutnameexception
{
char message[100];
void setmessage(char* message)
{
strcpy(this->message,message);
}
public:
isnutnameexception (char* message)
{
setmessage(message);
}
char* getmessage()
{
return message;
}
};
class isnutname:public isnutnameexception
{
isnutname(char* message):isnutnameexception(message)
{
}
};
class isnutfname:public isnutnameexception
{
isnutfname(char* message): isnutnameexception(message)
{
}
};
class student
{
char name,fname;
public:
void setname(char* name)
{
int nameSize=strlen(name);
if(name != NULL)
{
delete[] name;
name=NULL;
}

if (nameSize>5)
{
this->name = new char[nameSize];
strcpy(this->name,name);
}
else
throw isnutname("please enter a true name");
}

void setfname(char* fname)
{
if(strlen(fname)>5)
this->fname,fname;
else
throw isnutfname("please enter a true fname");

}
char* getname()
{
return name;
}
char* getfname()
{
return fname;
}
};
void main()
{
student s1;
char name,fname;
try
{
cin >> name;
s1.setname(name);
}
catch(isnutname esm)
{
cout << esm.getmessage() << endl;

}
try
{
cin >> fname;
s1.setfname(fname);

}
catch(isnutfname family)
{
cout << family.getmessage() << endl;
}
cout<< s1.getname << "" << s1.getfname << endl;
}

omidshaman
شنبه 07 دی 1392, 17:41 عصر
تمام مشکلاتی که داشت رو اون بالا گفتم !!
شما حفظی کد می نویسین ؟ یعنی کل کد رو یک جا می نویسین بعد تازه می خواین اجراش کنین ؟!
اون strcpy هدرش cstring ه
char با char* فرق می کنه ( همون موارد اولی )
دوست عزیز من بیکار که نیستم بیام 2 کیلومتر تایپ کنم آخرشم ببینم نصف چیزایی که گفتمو اصلا نخونده باشی !