-
Notifications
You must be signed in to change notification settings - Fork 0
/
employeeclass.cpp
357 lines (312 loc) · 25.1 KB
/
employeeclass.cpp
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
/*********************************************************************************
* ASSIGNMENT 05 - EMPLOYEE TRACKING SYSTEM
*
* This program will perform multiple tasks to keep track of a maximum of 100
* employees and all their information.
*
* It will check if a file "Employee.txt" already exists. If it doesnt, one will be created.
* If it does exist, all the information will be taken from the file and put into a new
* object (Employee class, one object for each employee) via a dynamically allocated array.
* The number of employee records will be determined and stored for later use.
*
* The menu will have 5 options:
* (1) Add new employee:
* ->This function will ask the user to enter the data of the new employee
* ->The number of employees that have been entered from the file will be used to
* determine the position of array of pointers.
* ->A new Employee object will be created at this position, initialised using the data
* ->The counter for number of employees will be increased and passed back to main
* function by reference
*
* (2) Display Employee Info:
* ->This function will use bubble sort to arrange all the employees in alphabetic order
* (according to their last names)
* ->It will then display all the information of the employees in that order.
*
*(3) Search for Employee:
* ->User will be asked for employee ID.
* ->ID will be taken in and compared with all the id's stored
* ->If it matches an existing id, the information of that employee will be displayed
* ->If it does not match an existing id, an error message will be shown
*
*(4) Delete Employee:
* ->User will be asked for employee ID
* ->Position of the employee with that ID will be recorded
* ->If employee with that id does not exist, error message will be shown
* ->If employee with that ID does exist, that employee object will be deleted
* and the employees recorded after that employee in the array of pointers will
* be moved up so there isn't an empty array element.
* ->Counter keeping track of number of employees will be decremented.
*
*(5) Save data to file
* ->Employee.txt file will be cleared
* ->All employee objects will be saved to the file.
*
* Written by Sindhura L Boppudi (slb170330)
* CS 1337. 004
* Professor: John Cole
*********************************************************************************/
#include "stdafx.h"
#include <iostream>
#include "Employee.h"
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;
//Global const for size of dynamic array
const int MAX = 100;
//FUNCTION PROTOTYPES
/********************************************************************/
int insertEmployeeInfo(fstream &employeeFile, Employee *empInfo[MAX]);
void newEmployee(int &numEmps, Employee *empInfo[MAX]);
void displayInfo(int numEmps, Employee *empInfo[MAX]);
void searchAndDisplay(int numEmps, Employee *empInfo[MAX]);
void deleteEmployee(int &numEmps, Employee *empInfo[MAX]);
void saveData(int numEmps, Employee *empInfo[MAX]);
/********************************************************************/
int main()
{
//Variable for user's input for menu choice
int userChoice;
//Keep a counter for number of employees . It will also be
//used as a counter for the dynamic array so the position of a newEmployee will be determined
int numEmps = 0;
//Create dynamically allocated array
Employee *empInfo[MAX];
//Initialise File so that it can be read from and written to.
fstream employeeFile("Employee.txt", ios::in | ios::out | ios::app);
//(ios::in | ios::out | ios::app) allows the Employee file to act as an input and output file
if (employeeFile.is_open())
{
//Get new entryPoint for dynamic array counter, after employee info from file is put in. This will also be the number of employees in the file.
numEmps = insertEmployeeInfo(employeeFile, empInfo);
}
//Open file.
employeeFile.open("Employee.txt");
while (true)
{
//Create menu
cout << "Choose one of the following menu options:" << endl;
cout << "(1) Enter new employee information" << endl;
cout << "(2) Display all employee information" << endl;
cout << "(3) Search for employee, using employee ID" << endl;
cout << "(4) Remove/Delete employee from database" << endl;
cout << "(5) Save all data to external file and exit" << endl;
cin >> userChoice;
//Navigate menu
switch (userChoice)
{
case 1: //Create new employee
newEmployee(numEmps, empInfo);
numEmps++;
break;
case 2: //Display all employee info
displayInfo(numEmps, empInfo);
break;
case 3: //Search for a specific employee
searchAndDisplay(numEmps, empInfo);
break;
case 4: //Delete a certain employee
deleteEmployee(numEmps, empInfo);
break;
case 5: //Write all employee information to Employee.txt file and exit program
saveData(numEmps, empInfo);
return 0;
default:
cout << "Please enter valid menu option." << endl;
}
}
return 0;
}
/***WORKING**************************************************************
* Find number of employees in file
* Take in employee info and make a new object with info as parameters
************************************************************************/
int insertEmployeeInfo(fstream &employeeFile, Employee *empInfo[MAX])
{
//Variables for needed employee info
string employeeID, lastName, firstName, birthDate, startDate, temp;
char gender;
double salary;
int numLines = 0;
//Count number of lines, aka employees, in file for for loop that will be used to enter employee info into dynamic array.
while (getline(employeeFile, temp, '\n'))
{
numLines++;
}
//Go back to the beginning of the file so it can be processed
employeeFile.clear();
employeeFile.seekg(0, ios::beg);
for (int ix = 0; ix < numLines; ix++)
{
employeeFile >> employeeID >> lastName >> firstName >> birthDate >> gender >> startDate >> salary;
//Create new object in dynamic array
empInfo[ix] = new Employee(employeeID, lastName, firstName, birthDate, gender, startDate, salary);
}
return numLines;
}
/***WORKING*************************************************************
* This function will ask the user to enter the data of the new employee
* The number of employees that have been entered from the file will be used to
* determine the position of array of pointers.
* A new Employee object will be created at this position, initialised using the data
* The counter for number of employees will be increased and passed back to main
* function by reference
************************************************************************/
void newEmployee(int &numEmps,Employee *empInfo[MAX])
{
//Variables for needed employee info
string employeeID, lastName, firstName, birthDate, startDate;
char gender;
double salary;
cout << "Enter the following information to add a new employee:" << endl;
cout << "Employee ID: ";
cin >> employeeID;
cout << "First Name: ";
cin >> firstName;
cout << "Last Name: ";
cin >> lastName;
cout << "Birth Date: ";
cin >> birthDate;
cout << "Gender: ";
cin >> gender;
cout << "Start Date: ";
cin >> startDate;
cout << "Salary: ";
cin >> salary;
empInfo[numEmps] = new Employee(employeeID, lastName, firstName, birthDate, gender, startDate, salary);
}
/***WORKING****************************************************************
* Using bubble sort, the employees will be sorted in alphabetical order
* ->A do-while loop will be used.
* ->All last names will be compared in a for loop.
* ->If statement will be used to swap employee info and set boolean to true
* ->Boolean will be set to true only when swapping takes place, so once
* swapping is finished, boolean will remain false and do-while loop will end.
* ->Employee info will be displayed.
***************************************************************************/
void displayInfo(int numEmps, Employee *empInfo[MAX])
{
bool swap;
Employee *temp[1];
do
{
swap = false;
for (int ix = 0; ix+1 < numEmps; ix++)
{
//Compare strings
if (empInfo[ix + 1]->getLastName() < empInfo[ix]->getLastName())
{
temp[0] = empInfo[ix];
empInfo[ix] = empInfo[ix + 1];
empInfo[ix + 1] = temp[0];
swap = true;
}
}
} while (swap);
cout << setw(15) << "Employee ID" << setw(15) << "Last Name" << setw(15) << "First Name" << setw(15) << "Birth Date";
cout << setw(10) << "Gender" << setw(15) << "Start Date" << setw(15) << "Salary" << endl;
for (int ix = 0; ix < numEmps; ix++)
{
cout << setw(15) << empInfo[ix]->getEmpID();
cout << setw(15) << empInfo[ix]->getLastName() << setw(15) << empInfo[ix]->getFirstName();
cout << setw(15) << empInfo[ix]->getBirthDate() << setw(10) << empInfo[ix]->getGender();
cout << setw(15) << empInfo[ix]->getStartDate() << setw(10) << fixed << setprecision(0) << empInfo[ix]->getSalary() << endl;
}
}
/***WORKING*************************************************************
* User will be asked for employee ID.
* ->ID will be taken in and compared with all the id's stored using a
* for loop.
* ->If-statement will be used to switch boolean to true to break the
* for-loop when id is found. Position will be recorded.
* ->If it matches an existing id, the information of that employee will be displayed
* ->If it does not match an existing id, an error message will be shown
***********************************************************************/
void searchAndDisplay(int numEmps, Employee *empInfo[MAX])
{
string empID;
int reqPosition;
bool idExists = false;
cout << "Enter the ID of the employee: ";
cin >> empID;
//Compare entered id with stored id's
for (int ix = 0; ix < numEmps; ix++)
{
if (empInfo[ix]->getEmpID() == empID)
{
idExists = true; //Once the id is found, set boolean to true
reqPosition = ix; //Record position of matching id
break; //Exit loop
}
}
if (idExists) //Display info
{
cout << endl << "Employee ID: " << empInfo[reqPosition]->getEmpID() << endl;
cout << "Name: " << empInfo[reqPosition]->getFirstName() << " " << empInfo[reqPosition]->getLastName() << endl;
cout << "Birth Date: " << empInfo[reqPosition]->getBirthDate() << endl;
cout << "Gender: " << empInfo[reqPosition]->getGender() << endl;
cout << "Start Date: " << empInfo[reqPosition]->getStartDate() << endl;
cout << "Salary: " << empInfo[reqPosition]->getSalary() << endl;
cout << "" << endl;
}
else //Display error message
{
cout << "There is no employee with this ID" << endl << endl;
}
}
/***WORKING****************************************************************
* Ask user for id of employee they want to delete
* Find position of that employee using for loop. When the id is found, position
* in array will be recorded and loop will be broken
* If ID doesnt exist, error message will be shown, otherwise:
* Delete that employee object
* Shift all other employee objects so that the array is still continuous
* using for loop
**************************************************************************/
void deleteEmployee(int &numEmps, Employee *empInfo[MAX])
{
string empID;
int reqPosition;
bool idExists = false;
cout << "Enter the ID of the employee: ";
cin >> empID;
//Compare entered id with all stored id's
for (int ix = 0; ix < numEmps; ix++)
{
if (empInfo[ix]->getEmpID() == empID)
{
idExists = true; //Once the id is found, set boolean to true
reqPosition = ix; //Record position of matching id
break; //Exit loop
}
}
if (idExists) //If id is valid, delete the employee
{
delete empInfo[reqPosition];
for (int ix = reqPosition; ix < numEmps; ix++)
{
empInfo[ix] = empInfo[ix + 1];
}
numEmps--;
}
else
{
cout << "ID entered is invalid." << endl; //If id in invalid, show error message
}
}
/***WORKING****************************************************************
* Employee.txt file will be cleared.
* All the employee objects will be saved in Employee.txt using a for loop.
***************************************************************************/
void saveData(int numEmps, Employee *empInfo[MAX])
{
//Clear file.
fstream employeeFile("Employee.txt", ios::in | ios::out | ios::trunc);
//Save all data to it
for (int ix = 0; ix < numEmps; ix++)
{
employeeFile << empInfo[ix]->getEmpID() << " " << empInfo[ix]->getLastName() << " " << empInfo[ix]->getFirstName() << " ";
employeeFile << empInfo[ix]->getBirthDate() << " " << empInfo[ix]->getGender() << " " << empInfo[ix]->getStartDate() << " " << empInfo[ix]->getSalary() << endl;
}
}