Help with classes.

I need help with assignment, this is what my assignment reads:

"Define a class called Class with the same data members as the Class structure above. Member functions must be added as needed: constructor to initialize a Class object and allocate memory for it when it's created (or added), to edit the information of an existing object, to display Class information, the function for calculating the GPA and a destructor to free dynamically allocated memory for each object. The destructor ensures that each and every object created will be freed. This will make it unnecessary for Quit to call a delete() function to delete all objects and free their allocated memory . The main function will still present the menu and perform the required actions, but the actions will be performed on objects - by member functions on member data."

This is the second version of the code we must write but I'm having trouble understanding what is is my professor wants?
I've written the first part already does anyone know what I have to do to modify it to what he's asking.

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
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
#include <iostream>
#include <cstdlib>
#include <sstream>
#include <string>
#include <cstring>
#include <fstream>
#include <iomanip>
#include <cstddef>

using namespace std;

#define MAX 10

struct Class {

	char title[30];

	int units;

	char grade;

};

typedef struct Class ClassType;

int bin_search(ClassType *classPointer[], int l, int r, char title[30]);

void sort(ClassType *classPointer[]);

int find_allocated_size(ClassType *classPointer[]);

void list_all_Classes(ClassType *classPointer[]);

 

int showMenu() {

	cout << "1. Add new class " << endl;

	cout << "2. Edit an existing class" << endl;

	cout << "3. Display a class" << endl;

	cout << "4. List all classes " << endl;

	cout << "5. Display GPA" << endl;

	cout << "6. Delete all classes" << endl;

	cout << "7. Quit" << endl;

	cout << "Enter selection number: ";

	int choice;

	cin >> choice;

	while (cin.fail())

	{

		cin.clear();

		cin.ignore(1000, '\n');

		cout << "Error: Please enter a number " << endl;

		cin >> choice;

	}

	return choice;

}

void add(ClassType *classPointer[]) {

	char title[30];

	int units;

	char grade;

	int content_flag = 0;

	cout << "Enter class name: ";
	std::cin.ignore(1000, '\n');
	std::cin.getline(title, sizeof(title));

	cout << "Enter number of units: ";
	cin >> units;
	
	cout << "Enter grade received: ";
	cin >> grade;
	

	for (int i = 0; i< MAX; i++) {

		if (classPointer[i] == NULL) {

			classPointer[i] = (ClassType *)malloc(sizeof(ClassType));

			strcpy_s(classPointer[i]->title, title);

			classPointer[i]->units = units;

			classPointer[i]->grade = grade;

			content_flag = 1;

			break;

		}

	}

	if (content_flag == 1) {

		cout << "Select one of the following actions:" << endl;

	}

	else {

		cout << "Class was not added." << endl;

	}

}

void edit(ClassType *classPointer[]) {

	

	list_all_Classes(classPointer);

	cout << "Please enter index to edit: " << endl;

	int user_index;

	cin >> user_index;

	if (user_index < 0 || user_index > find_allocated_size(classPointer)) {



		cout << "Index specified is out of range" << endl;

		return;

	}

	else {
		
		
		char title[30];

		int units;

		char grade;

		cout << "Editing: " << classPointer[user_index]->title << ", "
			<< classPointer[user_index]->units << " Units, Grade: "
			<< classPointer[user_index]->grade << '\n';



		cout << "Enter class name: ";
		std::cin.ignore(1000, '\n');
		std::cin.getline(title, sizeof(title));

		cout << "Enter units: ";
		cin >> units;
		cout << "Enter grade: ";
		cin >> grade;

		

		strcpy_s(classPointer[user_index]->title, title);

		classPointer[user_index]->units = units;

		classPointer[user_index]->grade = grade;

		cout << "Class modified" << endl;

	}
	cout << "Select one of the following actions: " << endl;

}

void list_all_Classes(ClassType *classPointer[]) {



	for (int i = 0; i< MAX; i++) {

		if (classPointer[i] != NULL) {

			cout << i << ". " << classPointer[i]->title << ", " << classPointer[i]->units << " Units, " << "Grade: "<< classPointer[i]->grade << endl;

		}

	}
	cout << "Select one of the following actions: " << endl;
}

void display_single_Class(ClassType *classPointer[]) {

	if (find_allocated_size(classPointer) == 0) {

		cout << "No classes added to display" << endl;

		return;

	}

	char title[30];

	cout << "Enter the class title: ";
	std::cin.ignore(1000, '\n');
	std::cin.getline(title, sizeof(title));

	sort(classPointer);

	int allocated_size = find_allocated_size(classPointer);

	int index = bin_search(classPointer, 0, allocated_size - 1, title);

	if (index == -1) {

		cout << "Class was not found" << endl;

	}

	else {

		cout << classPointer[index]->title << ", " << classPointer[index]->units << " Units, " << "Grade: " << classPointer[index]->grade << endl;

	}
	cout << "Select one of the following actions: " << endl;
}

int find_allocated_size(ClassType *classPointer[]) {

	int count = 0;

	for (int i = 0; i< MAX; i++) {

		if (classPointer[i] != NULL) {

			count++;

		}

	}

	return count;

}

void sort(ClassType *classPointer[]) {

	int n = find_allocated_size(classPointer);



	for (int i = 0; i < n - 1; i++) {



		for (int j = 0; j < n - i - 1; j++) {



			if (strcmp(classPointer[j]->title, classPointer[j + 1]->title) > 0) {

				ClassType * temp = classPointer[j];

				classPointer[j] = classPointer[j + 1];

				classPointer[j + 1] = temp;

			}

		}

	}

}

int bin_search(ClassType *classPointer[], int l, int r, char title[30])

{

	if (r >= l)

	{

		int mid = l + (r - l) / 2;

		

		if (strcmp(classPointer[mid]->title, title) == 0)

			return mid;

		

		if (strcmp(classPointer[mid]->title, title) > 0)

			return bin_search(classPointer, l, mid - 1, title);

		

		return bin_search(classPointer, mid + 1, r, title);

	}

	
	return -1;

}
void delete_all_classes(ClassType *classPointer[]) {
	for (int i = 0; i < MAX; i++) {
		if (classPointer[i] != NULL)
		{
			free(classPointer[i]); classPointer[i] = NULL;
		}
	}
	
}

int get_points_from_grade(char grade) {
	int points; switch (grade) {
	case 'A':points = 4; break;
	case 'B':points = 3; break;
	case 'C':points = 2; break;
	case 'D':points = 1; break;
	case 'F':points = 0; break;
	default: points = 0;
	}
	return points;
}


void getGPACalulation(ClassType *classPointer[]) {
	double gpa = 0.0; 
	int sum_of_the_products = 0;
	int total_number_of_units = 0;
	int n = find_allocated_size(classPointer);
	for (int i = 0; i < n; i++) 
	{ 
	total_number_of_units += classPointer[i]->units; 
	int points = get_points_from_grade(classPointer[i]->grade); 
	sum_of_the_products += classPointer[i]->units * points;
	}
	if (total_number_of_units != 0) { 
		gpa = sum_of_the_products / double(total_number_of_units);
	} 
	cout << "GPA = " << gpa << endl;

}


int main() {

	ClassType *classPointer[MAX];

	for (int i = 0; i< MAX; i++) {

		classPointer[i] = NULL;

	}

	int choice;

	do {

		choice = showMenu();

		switch (choice) {

		case 1:

			add(classPointer);

			break;

		case 2:

			edit(classPointer);

			break;

		case 3:

			display_single_Class(classPointer);

			break;

		case 4: 
			list_all_Classes(classPointer);

			break;

			
		case 5: 
			getGPACalulation(classPointer);

			break;

		case 6:
			delete_all_classes(classPointer);
			cout << "All classes deleted!" << endl;
			break;

		case 7:
			delete_all_classes(classPointer);

			break;

		default:

			cout << "Invalid choice" << endl;

		}



	} while (choice != 7);

}
Last edited on
First of all, there is no need for the typedef in line 24. In C++ you can use the name of a struct (or class) without the keyword.

In C++, struct and class mean the same thing except all members of a struct are public by default, and all members of a class are private by default. Many programmers tend to use struct when creating a data structure like in C, basically a convenient way to pass a set of related data around. When member functions are added, these programmers tend to use the keyword class instead.

Your assignment says to add member functions to your class. Member functions operate on the data within the class. That way the data and the functions that operate on the data are bound together in the class definition.

In order to better understand classes, see the following tutorial page from elsewhere on this web site: http://www.cplusplus.com/doc/tutorial/classes/

By the way, your instructions say this:

The destructor ensures that each and every object created will be freed.


The way you have your class defined, you have not defined any member objects that need to be specifically freed. Possibly the title field was meant to be dynamically allocated for this exercise: char* title;. The way you have it defined does not show this, and there is nothing currently in your class that could benefit from a destructor. You might want to check with your teacher to see what he wants.

Topic archived. No new replies allowed.