++C עץ - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

++C עץ


נעמה.

Recommended Posts

אני צריכה ליצור מבנה נתונים של עץ השומר פרטי תלמידים.

יש לי פונקציה Add()המוסיפה איברים לעץ.

יש לי struct studentהמכיל שם ות"ז (מערך תוים ומערך מספרים.)

איך אני מוסיפה student לעץ???

כשאני עושה:


cin>>student.name;
cin>>student.ID;
t.Add(student);

הקומפלייר רושם לי:


void __thiscall SearchTree<char>::Add(char)' : cannot convert parameter 1 from 'struct Student' to 'char'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Error executing cl.exe.

מה עושים????????

קישור לתוכן
שתף באתרים אחרים

כן, זה פתר בעיה אחת אבל:

יש פונקציה שמדפיסה את איברי העץ ככה היא נראית:


virtual void Process(T val) {cout<<val<<" ";}

וזה מה שהקומפיילר רושם:


binary '<<' : no operator defined which takes a right-hand operand of type 'struct Student' (or there is no acceptable conversion)

קישור לתוכן
שתף באתרים אחרים

לבעיית ההדפסה - את יכולה, כמו ש- k-o-b-y ענה להדפיס כל שדה בנפרד.

אם למדת חפיפת אופרטורים, אז אתה יכולה לעשות את זה בצורה יותר אלגנטית ע"י חפיפת אופרטור >> על student.

לגבי מציאת אובייקט בעץ - איך בדיוק את מסדרת את העץ?

יש לך אופרטור < על student?

קישור לתוכן
שתף באתרים אחרים

טוב, לדעתי זה חומר כנראה קצת מתקדם בשבילך (לא ממש לומדים את זה בתיכון), אבל שיהיה.

ככה מגדירים את אופרטור ההדפסה על אובייקט כלשהו:

ostream& operator<< (ostream& os, const Student& s) {
os << s.name << ' ' << s.id;
return os;
}

כמה דברים חשובים - הפונקציה צריכה לקבל ostream& ואת הקלאס שאת רוצה להדפיס, והיא צריכה להחזיר ostream&.

בסוף הפונקציה את חייבת להחזיר את אובייקט ה-os.

בתוך הפונקציה, תשתמשי ב-os כמו שהיית משתמשת ב-cout.

עכשיו, תוכלי לעשות cout לאובייקט מסוג Student.

נ.ב. אופציה אחרת כמובן היא להגדיר פונקציה printStudent שמקבלת Student ומדפיסה אותו, ולהשתמש בה (או לחילופין להגדיר את הפונקציה כמתודה בתוך Student)

נ.ב.ב. מעשית, אין הבדל בין struct ל-class. ההבדל היחיד הוא שבאופן דיפולטי, כל הממברים ב-struct הם public וב-class הם private.

קישור לתוכן
שתף באתרים אחרים

אני חוזר ואומר - אין הבדל מעשי בין struct ל-class, אז זה לא רלבנטי כאן.

אם כל התוכנית שלך נמצאת בקובץ אחד, אז תגדירי את הפונקציה בדיוק אחרי הגדרת Student.

הדרך הנכונה לעשות היא:

1. לדאוג שההגדרה של Student תשב בקובץ hh (לדוגמה, student.hh).

2. מיד אחרי ההגדרה של Student, לשים רק את ה-header של הפונקציה (כלומר רק השורה הראשונה, עם ; בסוף).

3. לכתוב בתוך קובץ cc כלשהו (נניח student.cc) את המימוש המלא של הפונקציה (כמו שאני רשמתי). כמובן לדאוג שהקובץ הזה יכלל בתוכנית.

קישור לתוכן
שתף באתרים אחרים

עשיתי מחלקה להגדרת סטודנט.

שתי בעיות: 1. constructor שאינו מקבל ערכים(סוגריים ריקות)-מה ואיך עושים.

2. operator is הוא רושם לי בעיות.

זה מה שעשיתי עד עכשיו:


#include <ostream>
#include <istream>
#include <cstring>
using namespace std;

class Student
{
private:
char name[7];
char family[15];
int ID;

public:
Student(){}
Student(char*, char*, int);
Student(const Student&);

void setName(char*);
void setFamily(char*);
void setID(int);
char* getName();
char* getFamily();
int getID(){return ID;}

//àåôøèåøéí
void operator=(Student);
int operator>(Student) const;
int operator<(Student) const;
int operator==(Student);
int operator!=(Student);

friend istream& operator>>(istream& ,Student);
friend ostream& operator<<(ostream& ,Student);

};

Student::Student(char* Name=NULL, char* Family=NULL, int Id=NULL)
{
strcpy(name,Name);
strcpy(family,Family);
ID=Id;
}

Student::Student(const Student &s)
{
strcpy(name,s.name);
strcpy(family,s.family);
ID=s.ID;
}

void Student::setName(char* Name)
{
strcpy(name,Name);
}

void Student::setFamily(char* Family)
{
strcpy(family,Family);
}

void Student::setID(int Id)
{
ID=Id;
}

char* Student::getName()
{
return name;
}

char* Student::getFamily()
{
return family;
}

ostream& operator<<(ostream& os, Student &s)
{
os<<s.getName()<<" "<<s.getFamily()<<" "<<s.getID()<<endl;
return os;
}

int Student::operator <(Student s)const
{
if ((strcmp(s.name,name))>0)
{
return true;
}
if((strcmp(s.family,family))>0)
{
return true;
}
else
if(((strcmp(s.name,name))==0)&&((strcmp(s.family,family))==0))
{
return false;
}
}

int Student::operator >(Student s)const
{
if ((strcmp(name,s.name))>0)
{
return true;
}
if((strcmp(family,s.family))>0)
{
return true;
}
else
if(((strcmp(name,s.name))==0)&&((strcmp(s.family,family))==0))
{
return false;
}
}

int Student::operator==(Student s)
{
if((s.name==name)&&(s.ID==ID))
{
return true;
}
else
{
return false;
}
}

int Student::operator!=(Student s)
{
if((s.name!=name)&&(s.ID!=ID))
{
return true;
}
else
{
return false;
}
}

אשמח לתיקונים.

קישור לתוכן
שתף באתרים אחרים

CC?? HH?? יכולים להשתמש בסיומות האלה?

1) תמחקי את הCTOR שלא מקבל ערכים.

2) איזה ERROR הקומפיילר נותן לך?

3) יכולים להשתמש ב- FRIEND: לשים את ההגדרות בקובץ H. במימוש לשים בשורה הראשונה:

 #include "Student.h" 

ואחר כך את המימושים(עי שם המחלקה ו- :: אחר כך) כולל המימוש של ההדפסה. לקרוא לקובץ המימוש Student.cpp(חובה אותו שם כמו קובץ הH). להכיל בקובץ הCPP הראשי את הקובץ עם הH בסוף.

ההגדרה של הFRIEND:

friend ostream& operator<<(ostream&,const Student&);

בתוך ההגדרה של המחלקה.

מימוש ה- FRIEND(בתוך קובץ הCPP של מימוש המחלקה):

ostream& operator<<(ostream& os,const Student& s)
{
cout<<s.name<<"\n"<<s.family<<"\n";
}

שימוש:


Student s("bla", "bla");
cout<<s;

קישור לתוכן
שתף באתרים אחרים

כאשר אני מגדירה בתכנית הראשית Student s הוא רושם לי הערה:


'Student' : no appropriate default constructor available

הקובץ שהבאתי הוא קובץ h.

3. לגבי אופרטור is אם אני מממשת ככה:


istream& operator<<(istream& is, Student &s)
{
is>>s.setName()<<s.setFamily()<<s.setID()<<endl;
return is;
}

אז אני צריכה להכניס ערכים לפונקציות setץ מאיפה אני מביאה אותם??

קישור לתוכן
שתף באתרים אחרים

אני יודעת שצריך להכניס ערכים לסטודנט, אבל אבל אבל- בתכנית הראשית זה מה שעשיתי:


SearchTree<Student> t;
Student student;
char name[7], family[15];
int id;

for(int i=0; i<7; i++)
{
cout<<"\nEnter name,family and id of the student: ";
gets(name);
gets(family);
cin>>id;
student.setName(name);
student.setFamily(family);
student.setID(id);
t.Add(student);
}

ועל שורת ההצהרה של Studebt student הקומפיילר רושם לי:


'Student::Student' : ambiguous call to overloaded function

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...