Linking problem, I believe.

I have a assignment which requires the use of multiple files.
I don't believe I am linking them together correctly. I'm using visual basic 2008 at the moment.
Ofter I get the program working I'll create a make file and test that.
I'm also not too familiar with the string.h library, so hopefully i am using that correctly.
If someone could tell me what I'm doing wrong I would greatly appreciate it.
I have a few experimental things I'm trying that I'm not sure about, Mainly using logical operators instead of if then statements for ensuring I'm indexing an array correctly, but due to the linking problems I haven't been able to test them.(without making a separate file just explicitly for it.)
Hopefully its something simple.
Thanks in advance.

Here is a copy of the assignment

Overview

Build a normalized student record system. Create a class to represent student data. You will also create classes to handle other specific types of data including dates and addresses. Your system will include all the necessary header files, cpp files, and a main program to incorporate the larger system.
Details

Imagine a university wants to keep track of the following data about each student:

* First name
* Last name
* address line 1
* address line 2
* city
* state
* zip code
* date of birth month
* date of birth day
* date of birth year
* anticipated completion month
* anticipated completion day
* anticipated completion year
* gpa
* credit hours completed

It is obvious that we will need a student class to contain all this data. However, the principles of data design indicate that the address should be its own class, as should the date. Your program should then have at least three classes: address, date, and student. Student will have two instances of date and one of address among its data members.
Process

Build all the classes you will need for this project. Each class should have a separate header file. This file contains only the class definition. Ensure your headers use the #ifndef structure described in lecture, and include whatever other headers they need.

Build a cpp file for each class which contains the code implementation of the class. This code file will include the class header file and any other headers and libraries needed.

Build a main program that imports all the needed classes and tests them. You'll then modify this program.

Create a makefile to control the compilation process. The instructor will test the program by running the make utility, so be sure your makefile works. If you use a visual editor like code::blocks, you'll still need to create and test a makefile for your project.
The complete project

When the classes are done, create a main program which does the following:

* Load up student data from a text file. All the needed information for the students should be in a text file, with each student's information on one line. You should have 50 students worth of data. NOTE: Please do not use real data. It might be helpful to write a program to generate fake data, or use the one at http://www.fakenamegenerator.com/gen-random-us-us.php
* Store student data on the heap Student data will be a large array, so it should be stored on the heap. Ensure you've also removed heap data when necessary.
* List all data for all students in a report format Create a method of the Student class to print a report about every student.
* Create a simpler list that prints only the last and first name of each student.
* Output a list of student names in alphabetical order Print the list in alphabetical order
* Build a simple sort utility. We'll talk more about sorting later, but the simplest type of sort to implement may involve creating a new blank array on the heap, finding the earliest name left in the primary array, and repeating until the temporary array is full.

Turning it in

This project will consist of a number of smaller files. You'll have a .cpp and a .h file for each class, a main.cpp file, a data file, and a makefile. Please turn in all files. Be sure all your files are properly documented.

HeaderFiles:
Address Class:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef string
#define string
	#include <string>
#endif

class Address {
	private:
		string Line1;
		string Line2;
		string City;
		string State;
		int Zip;
	public:
		//Get/Accessor functions
		  string GetLine1();
		  string GetLine2();
		  string GetCity();
		  string GetState();
		  int GetZip();
		//Set/Mutator functions
		 void SetLine1( string );
		 void SetLine2( string );
		 void SetCity( string );
		 void SetState( string );
		 void SetZip( int );
		 void SetAddress(string,string,string,string, int);
		//constructors
		 Address();
	};

Date Class:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


class Date {
	private:
		int Year;
		int Month;
		int Day;
	public:
		//Get/Accessor functions
		  int GetYear();
		  int GetMonth();
		  int GetDay();
		//Set/Mutator functions
		 void SetYear( int );
		 void SetMonth(int );
		 void SetDay(int );
		 void SetDate(int,int,int);
		//constructors
		 Date();
};

Name Class:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef string
#define string
	#include <string>
#endif

class Name {
	private:
		string FirstName;
		string LastName;
	public:
		//Get/Accessor functions
		  string GetFirstName();
		  string GetLastName();
		//Set/Mutator functions
		 void SetFirstName( string );
		 void SetLastName( string );
		 void SetFullName(string,string);
		//constructors
		 Name();
};

Performance Class:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Performance {
	private:
		float GPA;
		int Credits;
	public:
		//Get/Accessor functions
		  float GetGPA();
		  int GetCredits();
		//Set/Mutator functions
		 void SetGPA( float );
		 void SetCredits( int );
		 void SetPerformance(float,int);
		//constructors
		 Performance();
};

Student Class:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#ifndef string
#define string
	#include <string>
#endif

#ifndef Address
#define Address
	#include "Address.h"
#endif
#ifndef Date
#define Date
	#include "Date.h"
#endif
#ifndef Name
#define Name
	#include "Name.h"
#endif
#ifndef Performance
#define Performance
	#include "Performance.h"
#endif


class Student {
	private:
		Name SName;
		Address SAddress;
		Date SBirthDate;
		Date SGradDate;
		Performance SPerformance;
	public:
		//Get/Accessor functions.
		  Name GetSName();
		  Address GetSAddress();
		  Date GetSBirthDate();
		  Date GetSGradDate();
		  Performance GetSPerformance();
		  void Report();
		  void SimpleReport();
		//Set/Mutator Functions
		 //none, just use sub-class's setfunctions.
		//constructors
		 Student();
};


aux cpp files:
Address Class's functions:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef Address
#define Address
	#include "Address.h"
#endif

#ifndef string
#define string
	#include <String.h>
#endif
//Get/Accessor functions
string Address :: GetLine1( ){ return Line1;}
string Address :: GetLine2(){return Line2;}
string Address :: GetCity(){return City;}
string Address :: GetState(){return State;}
int Address :: GetZip(){return Zip;}
//Set/Mutator functions
void Address :: SetLine1( string NewLine1 ){Line1 = NewLine1;}
void Address :: SetLine2( string NewLine2 ){Line2 = NewLine2;}
void Address :: SetCity( string NewCity ){City = NewCity;}
void Address :: SetState( string NewState ){State = NewState;}
void Address :: SetZip(int NewZip ){Zip=NewZip;}
void Address :: SetAddress(string NewLine1,string NewLine2,string NewCity,string NewState, int NewZip){SetLine1(NewLine1);SetLine2(NewLine2);SetCity(NewCity);SetState(NewState);SetZip(NewZip);}
//constructors
Address :: Address(){}


Date Class's functions:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef Date
#define Date
	#include "Date.h"
#endif
//Get/Accessor functions
int Date :: GetYear(){return Year;}
int Date :: GetMonth(){return Month;}
int Date :: GetDay(){return Day;}
//Set/Mutator functions
void Date :: SetYear( int NewYear){Year = NewYear;}
void Date :: SetMonth(int NewMonth){Month = NewMonth;}
void Date :: SetDay(int NewDay){Day = NewDay;}
void Date :: SetDate(int NewDay,int NewMonth,int NewYear){SetDay(NewDay);SetMonth(NewMonth);SetYear(NewYear);}
//constructors
Date :: Date(){}

Name Class's functions:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef Name
#define Name
	#include "Name.h"
#endif

#ifndef string
#define string
	#include <String.h>
#endif

//Get/Accessor functions
string Name :: GetFirstName( return FirstName;){}
string Name :: GetLastName(){return LastName;}
//Set/Mutator functions
void Name :: SetFirstName( string NewFirstName ){FirstName = NewFirstName;}
void Name :: SetLastName( string NewLastName){LastName = NewLastName;}
void Name :: SetFullName(string NewFirstname,string NewLastName){SetFirstName(NewFirstName);SetLastName(NewLastName);}
//constructors
Name :: Name(){}

Performance Class's functions:
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef Performance
#define Performance
	#include "Performance.h"
#endif
//Get/Accessor functions
float Performance :: GetGPA(){return GPA;}
int Performance :: GetCredits(){return Credits;}
//Set/Mutator functions
void Performance :: SetGPA( float NewGPA ){GPA=NewGPA;}
void Performance :: SetCredits( int NewCredits){Credits=NewCredits;}
void Performance :: SetPerformance(float NewGPA,int NewCredits){SetGPA(NewGPA);SetCredits(NewCredits);}
//constructors
Performance :: Performance(){}


Student Class's functions:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#ifndef Student
#define Student
	#include "Student.h"
#endif

#ifndef iostream
#define iostream
	#include <iostream.h>
#endif

//Get/Accessor functions.
Name Student :: GetSName(){return SName;}
Address Student :: GetSAddress(){return SAddress;}
Date Student :: GetSBirthDate(){return SBirthDate;}
Date Student :: GetSGradDate(){return SGradDate;}
Performance GetSPerformance(){return SPerformance;}
//Utility Functions{}
void Student :: Report(){
cout <<"|--------------------------- \n";
cout <<"Student's Name: \n";
cout <<"	First Name: "<<this.GetSName.GetFirstName()<<" \n";
cout <<"	Last  Name: "<<this.GetSName.GetLastName()<<" /n";
cout <<"Student's Address: \n";
cout <<"	First  Line: "<<this.GetSAddress.GetFirstLine() <<" \n";
cout <<"	Second Line: "<<this.GetSAddress.GetSecondLine()<<" \n";
cout <<"	City	   : "<<this.GetSAddress.GetCity()		<<" \n";
cout <<"	State	   : "<<this.GetSAddress.GetState()	    <<" \n";
cout <<"	Zip		   : "<<this.GetSAddress.GetZip()		<<" \n";
cout <<"Student's BirthDate: \n";
cout <<"	Day  : "<<this.GetSBirthDate.GetDay()  <<" \n";
cout <<"	Month: "<<this.GetSBirthDate.GetMonth()<<" \n";
cout <<"	Year : "<<this.GetSBirthDate.GetYear() <<" \n";
cout <<"Student's GradDate: \n";
cout <<"	Day  : "<<this.GetSGradDate.GetDay()  <<" \n";
cout <<"	Month: "<<this.GetSGradDate.GetMonth()<<" \n";
cout <<"	Year : "<<this.GetSGradDate.GetYear() <<" \n";
cout <<"Student's Performance: \n"
cout <<"	GPA	   : "<<this.GetSPerformance().GetGPA()<<" \n";
cout <<"	Credits: "<<this.GetSPerformance().GetCredits()<<" \n";
cout <<"|--------------------------- \n";
}
void Student :: SimpleReport(){
cout <<"|--------------------------- \n";
cout <<"Student's Name: \n";
cout <<"	First Name: "<<this.GetSName.GetFirstName()<<" \n";
cout <<"	Last  Name: "<<this.GetSName.GetLastName()<<" /n";
cout <<"|--------------------------- \n";
}
//Set/Mutator Functions
	//none, just use sub-class's setfunctions.
//constructors
Student :: Student(){}



Main cpp file:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#include <iostream.h>
#include <fstream>
#include <stdio.h>

#ifndef iostream
#define iostream
	#include <iostream.h>
#endif
#ifndef string
#define string
	#include <string.h>
#endif

#define STUDENTNUMBER 50 // Don't change with out also changing numerous things in TextGenerate Function.

#include "AddressFunctions.cpp"
#include "DateFunctions.cpp"
#include "NameFunctions.cpp"
#include "PerformanceFunctions.cpp"
#include "StudentFunctions.cpp"



//Function Declarations
void Print(*Student,int);
void SimplePrint(*Student,int);
void Alphabetize(*Student);
int TextGeneration();
//Function Definitions
void Print(*Student SArrayP,int Alphabetize){
	if(Alphabetize != 1){
		Alphabetize(SArrayP);
	}
	int i;
	for(i=0; i<STUDENTNUMBER;i++){
		SArrayP->Print();
		SArray+=1;
	}
}
void SimplePrint(*Student SArrayP,int Alphabetize){
	if(Alphabetize != 0){
		Alphabetize(SArrayP);
	}
	int i;
	for(i=0; i<STUDENTNUMBER;i++){
		SArrayP->SimplePrint();
		SArray+=1;
	}
}
void Alphabetize(*Student SArrayP){ // basic bubble sort, http://www.daniweb.com/software-development/cpp/code/216454 Helped alot. not 100% sure it'll work.
	int i;//counter
	int j;//counter
	for(i=0;i<STUDENTNUMBER-1;i++){
		for(j=0;j<STUDENTNUMBER-1-i;j++){
			//combine first and last names into full names, and compare, swap if first is greater then second
			if(strcmp((SArrayP->GetSName().GetFirstName())+=" " +=(SArrayP->GetSName().GetLastName()),((SArrayP+1)->GetSName().GetFirstName())+=" "+=((SArrayP+1)->GetSName().GetLastName()))>0){
				swap(SArrayP[j],SArrayP[j+1])
			}
		}
	}		
}


int TextGeneration () {
  srand(STUDENTNUMBER); // NOTE TO self: Make based on time when done debugging
  ofstream Data;
  Data.open ("Data.txt");
  if(Data.is_open()){
	 int i; // counter
	 int j; // counter
	//Name info
	 string new FirstName[STUDENTNUMBER];
	 string new LastName[STUDENTNUMBER];
	//Address info
	 string new Line1[STUDENTNUMBER];
	 string new Line2[STUDENTNUMBER];
	
	//variables to generate Unique full names
	 string new FirstNames1[5] = {"Allen","Bob","Charles","Dan","Edward"};
	 string new FirstNames2[5] = {"Adriene","Betty","Charlie","Danny","Edna"};
	 string new LastNames1[5] = {"Fnord","Gary","Howard","eyes","Joshua"};
	 string new LastNames2[5] = {"Fockers","Great","Henry","Its","Jones"};
	 string new FirstNames[2] = {FirstNames1,FirstNames2};
	 string new LastNames[2] = {LastNames1,LastNames2}; 
	 
	 // Variables to generate random unique addresses
	 string new Lines1[5] = {"159 faternity st.","399 Dorm Blvd.","222 faternity st.", "777 Dorm Blvd", "82 Canal street");
	 string new Lines2[10] = {"Apartment A", "Apartment B", "Apartment C", "Apartment D", "Apartment E","Apartment F", "Apartment G", "Apartment H", "Apartment I"};
//Note to Self, Works?
	 for(i=0;i<STUDENTNUMBER;i++){
		 for(j=0; j<5; j++){
			strCopy(FirstName[i],FirstNames[i>25][j]);//not 100% sure if this will work.
			strCopy(LastName[i],LastNames[i>25][j + floor(i/5)-(i>25)*(floor(i/5)-6)- 4*((j+i/5)>5)]);
			//^^Not 100% sure if this will work, changes to correct variables based on the value of other variables^^
		 }
	 }


  
// The above and below works?
 
	for(i=0;i<STUDENTNUMBER;i++){
		 for(j=0; j<10; j++){
			strCopy(Line1[i],Lines1[j]);// Not 100% sure if this will work
			strCopy(Line2[i],Lines2[j + floor(i/10)-(i>25)*(floor(i/10)-11)- 4*((j+i/10)>10)]);
			//^^This works2?, changes to correct variables based on the value of other variables
		 }
	 }
//The above works?

	//deallocate unneeded variables
	delete [] FirstNames1;
	delete [] FirstNames2;
	delete [] LastNames1;
	delete [] LastNames2;
	delete [] FirstNames;
	delete [] LastNames;

	 for(i=0; i<STUDENTNUMBER;i++){
			// name info
			Data << FirstName[i] << "\n"; // first name
			Data << LastName[i] << "\n"; // last name
			// address info
			Data << Line1[i] <" \n"; // line 1
			Data << Line2[i] " \n"; // line 2
			Data << "Indianapolis  \n"; // city
			Data << "IN  \n"; // state
			Data << "46168 \n"; // zip
			// birthdate info
			Data << rand()%28 + 1  << " \n"; //day
			// ^^ No one is born between the 29th though 31st of any month, easier coding. ^^
			Data << rand()%12 + 1 << " \n";//month
			Data << 2011 -(rand()%49 + 12)<< "\n";//year
			//graddate info
			Data << rand()%28 + 1 << " \n";//day
			// ^^ No one Graduates between the 29th though 31st of any month, easier coding. ^^
			Data << rand()%12 + 1 << " \n"; // month
			Data << 2011 + (rand()%6+2)<< " \n"; // year
			//performance info
		    Data << (rand()%16)/(float rand()%4)<<" \n"; //gpa
			Data << (rand()%300)<< " \n"; //credits
			// ^^ no one has 300 or more credits. ^^
	 }
	
	 //Deallocate rest of memory
		delete [] FirstName;
		delete [] LastName;
		delete [] Line1;
		delete [] line2;
		

	 Data.close();
	 } else {
		cout << "Data File failed to open. \n";
	 }
  return 0;
}


int main(){
		ifstream Data;
		Data.open("Data.txt",ios::in);
		Student new Students[STUDENTNUMBER];
		string StudentInfo;
		char Request;
		int i = 0; // counter
		int Alphabetize=0;

		if(!Data.is_open()){ // create file if it is not already created.
			Date.close("Data.txt");
			TextGeneration();
			Data.open("Data.txt");
		}
		if(Data.is_open()){
			while ( Data.good() || i<STUDENTNUMBER){
				
				
				//AssignNames
				getline(Data,StudentInfo);
				Students[i].GetSName().SetFirstName(StudentInfo);
				getline(Data,StudentInfo);
				Students[i].GetSName().SetLastName(StudentInfo);
				//AssignAddress
				getline(Data,StudentInfo);
				Students[i].GetSAddress().SetLine1();
				getline(Data,StudentInfo);
				Students[i].GetSAddress().SetLine2(StudentInfo);
				getline(Data,StudentInfo);
				Students[i].GetSAddress().SetCity(StudentInfo);
				getline(Data,StudentInfo);
				Students[i].GetSAddress().SetState(StudentInfo);
				getline(Data,StudentInfo);
				Students[i].GetSAddress().SetLineZip(int(StudentInfo)); // not sure if type casting is neccassry or not, or if it returns the right value.
				//AssignBirthDate
				getline(Data,StudentInfo);
				Students[i].GetSBirthDate().SetDay(int(StudentInfo));
				getline(Data,StudentInfo);
				Students[i].GetSBirthDate().SetMonth(int(StudentInfo));
				getline(Data,StudentInfo);
				Students[i].GetSBirthDate().SetYear(int(StudentInfo));
				//AssignGradDate
				getline(Data,StudentInfo);
				Students[i].GetSGradDate().SetDay(int(StudentInfo));
				getline(Data,StudentInfo);
				Students[i].GetSGradDate().SetMonth(int(StudentInfo));
				getline(Data,StudentInfo);
				Students[i].GetSGradDate().SetYear(int(StudentInfo));
				//AssignPerformance
				getline(Data,StudentInfo);
				Students[i].GetSPerformance().SetGPA(float(StudentInfo));
				getline(Data,StudentInfo);
				Students[i].GetSPerformance().SetCredits(int(StudentInfo));
				i++
				
			}

			cout << "Would you like to print a list? Enter Y for yes, N for no please. \n";
			cin >> Request;
			if(Request == 'Y' || request =='y'){
				cout << " Would you like the list to be alphabatized? Enter Y for yes, N for no please. \n"
				cin >> Request;
				if(Request == 'Y' || request =='y'){
					Alphabetize = 1;
				}
				cout << " Would you like the list Simple? Enter Y for yes, N for no please. \n"
				cin >> Request;
				if(Request == 'Y' || request =='y'){
					SimplePrint(*Students,Alphabetize);
				} else {
					Print(*Students,Alphabetize);
				}
			}
			cout << "Thank you and have a nice day. \n";
		} else {
			cout << "File Could not Open.";
		}
		Data.close("Data.txt");
		//deallocate memory
		delete [] Students;
	return 0;
}
Last edited on
Topic archived. No new replies allowed.