17 Feb 2009 : Overall comments for OOPS submitted by 15 Feb 2009 a) Fields within the class Employee cannot be accessed in the main program. Normally this fields are declared as private or protected. For example, class Employee has been defined as class Employee { private: string id,name,tel,type }; void main(){ cout << name; // the 'name' here is not the Employee name. Just meaningless. } What object does "name" belongs to? If you "cout << name" in a member function e.g. show() void Employee::show(){ cout << name << endl; // the name is an attribute of Employee } void main(){ Employee x,y.z; // x,y and z are 3 employees of the company x.show(); // show the name of x (not of y or not of z) y.show(); // show the name of y } For Employee we can defined many employees objects. Employee x,y,z; // defines 3 employees x,y and z // and each object has a name. //How is the name of x,y,z accessed? //How is the name of x,y,z updated? b) You must have constructor in each class definition. The constructor is used to give an initial value to the class object. This is called "initialisaton". e.g. void main(){ int x,y,z; cout << x << endl; // what is the value of x? Not known z=3; // now z has a value cout << z << endl; } In the above example x,y,z may have an initial value of 0, but NOT all compilers do that. For OOPs class Student { private: string name; public: void show() { cout << name << endl;} // what name will be displayed; }; void main(){ Student p1,p2; p1.show(); // name shown is not known as value is not initialised } // To initialised use the construtor Employee::Student() { Name = "";} c) Writa a program either as an OOPs program or without using OOPs. Don't mixed up the two Don't define a class Employee and next enter and save the record in the main program WITHOUT reference to OOP. or use x.show(); where the data for x has NOT BEEN ENTERED at all class Student { string name; public: void show() { cout << name << endl; } }; void main(){ Student x; string name; cout << "Name "; getline( cin,name); // the "name" here is not the "name" defined in Student x.show(); // it will not show "name" entered in the previous line } d) Saving records in a file. The format of file is given and save according to fixed length fields. e.g. Name 20(A) and sex=1 char and classNo = 2 digit. Save name in columns 1-20 Save sex in column 21 save classNo in column 22-23 DON'T PUT A SPACE BETWEEN the fields. ---------------------------------------- outfile << left << setw(20) << name << sex << setw(2) << classNO<< endl;// correct Should not be outfile << left << setw(20) << name << " " << sex << " " << setw(2) << classNO<< endl;//wrong For REPORTS you may leave space in betwen fields for readability but NOT for DATA file where the lengths of the fields have been fixed. e) Don't create EXTRA fields in the definition of your class. e.g class Employee { public: string id, name, tel; char employee_type; int i,no_rec; // should not be included ofstream outfile; // should not be included } void main(){ Employee x,yz; // The 3 empolyees x,y and z each have // the field name,id,type and tel // but also include i,no_rec,outfile // which SHOULD NOT BE part of Employee --------------------------------------------------------- FEB19 2009 Comments on submitted project work f) String type and cstring type ------------------------------- This are two different types of 'string'. cstring type use 'char' For cstring operation use of = or + is an ERROR e.g char name1[31], name2[31]; // for name1 and name2 name1 = "Ah Kow"; // this is wrong strcpy( name, "Ah Kow"); // this is correct strcpy(name2,name1); // name2 = name1 name2="TAN " + name1; // this is wrong strcpy(name2,"TAN "); // name2 = "TAN" strcat(name2,name1); // name2 = name2 + name1 // to enter a name into name1 use cout << "enter name "; cin.get(name1, 31, '\n'); cin.get(); For string type, you can use + and = string name1,name2; name1 = "Ah Kow"; name2 = "Tan "; To enter name cout << "Enter name "; getline( cin,name1); name2 = name2 + name1; You should use string type for fields like EG: name,employee_id,address. cout << "name "; getline(cin,name); For single char, use char type EG: char type_employee; // 'H' or 'S' cin.get(type_employee); cin.get(); for telephone, you can use long long telephone; // long integer cin >> telephone; cin.get(); PREFERABLY KEEP TO STRING TYPE IN YOUR FIELD DEFINITION g) The CREATEEMPLOYEE should NOT be a member function of Employee. The algorithm for CREATEEMPLOYEE could be void CREATEEMPLOYEE { open output file("employee.dat") Check for file error if any Enter the deptName and no of records. Store as deptName and No of records as header in output file for 1 to No of records { enter a record // x.enter() where Employee x; save a record // x.save() 'x' is an employee } close file } -------------------------------------------------- Other Comments h) Demo program to read in data from file class.dat. Not using OOPs ------------------------------- 4 013Ab beng AGPMACS 022Ah Seng SGPMACS 054Ah Mong CGPECCS 126Ah Seng SGPHAMA ------------------------------- * Reading of file There is a 'file pointer' that is placed at the begining of file when it is opened. As the record is read, the pointer moves to the next position. For e.g. in the above file: reading in one line (which is the first line): dept and no_rec The pointer goes to the second line. reading in another line. The second line, the second line "013Ab beng AGPMACS" is read and pointer goes to the 3rd line. Continue reading will move the pointer down until it reaches the "end of file" // DEMO PROGRAM TO READ IN THE ABOVE FILE ifstream infile; // ifstream is for input file infile.open("class.dat"); // open the file class.dat as an input file if (!infile) { cout << "File not found " << endl; exit(1); // abort processing } // get the number of records '4' from the input file (the first line) int i,no_rec; infile >> no_rec; infile.get(); // reads in no_rec =4 // loop to read in rest of file string one_rec, name, subj1,subj2,subj3 ; long idno; char stream; for (i=0;i