-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patha1_functions.c
More file actions
349 lines (254 loc) · 11.5 KB
/
a1_functions.c
File metadata and controls
349 lines (254 loc) · 11.5 KB
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
/********* a1_functions.c ********
Student Name = Marwan Alakhras
Student Number = 101296201
*/
#include "a1_functions.h"
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#define max_milestones 5 //max allowed # of milestones is 5
#define hourly_wage 30 //average hourly salary in the company
#define hours_in_day 8.00 //The number of working hours in a day is 8 hours
void init_milestone(milestone_t * milestone_to_int, unsigned short int num_activities){
char milestone_name[100];
printf("Enter the name of the milestone: ");
scanf(" %s", &milestone_name);
strcpy((*milestone_to_int).name, milestone_name);
(*milestone_to_int).completed = false;
(*milestone_to_int).actual_cost = 0;
(*milestone_to_int).actual_duration = 0;
printf("Milestone initialized.\n\n\n");
};
_Bool is_milestone_ID_unique(milestone_t *array_of_IDs, unsigned short int ID_to_check, int number_of_elements){
for (int i = 0; i < number_of_elements; i++){
if (array_of_IDs[i].id == ID_to_check){
return false;
}
}
return true;
}
_Bool is_activity_ID_unique(const unsigned short int array_of_IDs [], unsigned short int ID_to_check, int number_of_elements){
for (int i = 0; i < number_of_elements; i++){
if (array_of_IDs[i] == ID_to_check){
return false;
}
}
return true;
}
void init_activity(activity_t * activity_to_int){
char activity_name[100];
int planned_duration_input = 0;
printf("Enter activity name: ");
scanf("%s", &activity_name);
strcpy((*activity_to_int).name, activity_name);
printf("Enter the planned duration (in hours) for the activity: ");
scanf(" %i", &planned_duration_input);
while(planned_duration_input < 0 || planned_duration_input > 65535){
printf("Invalid duration. Must be 1 to 655345. Enter the planned duration (in hours) for the activity: ");
scanf(" %i", &planned_duration_input);
}
(*activity_to_int).planned_cost = (float) (planned_duration_input * hourly_wage);
(*activity_to_int).actual_cost = 0;
(*activity_to_int).planned_duration = (unsigned short int) planned_duration_input;
(*activity_to_int).actual_duration = 0;
(*activity_to_int).completed = false;
printf("Activity initialized\n");
}
project_t init_project(char name[], milestone_t *milestone_list, int number_milestones, const int * number_activities){
project_t project_ABC; //Creates a variable of the type project_t struct
strcpy(project_ABC.name, name);
project_ABC.planned_cost = 0;
project_ABC.planned_duration = 0;
for (int i = 0; i < number_milestones; i++){
for (int j = 0; j < *number_activities;j++){
project_ABC.planned_cost += milestone_list[i].activity_list[j].planned_cost;
project_ABC.planned_duration += milestone_list[i].activity_list[j].planned_duration;
}
number_activities++;
}
project_ABC.actual_cost = 0;
project_ABC.planned_duration = (unsigned short int) ceil(project_ABC.planned_duration / hours_in_day);
project_ABC.actual_duration = 0;
project_ABC.completed = false;
printf("\n\nPROJECT INITIALIZED\n");
printf("----------------------\n\n");
return project_ABC; //Returns the initialized project to main
}
void print_main_menu(void){
printf("\n----------------------\n");
printf("\n1. Update Activity\n2. Print stats\n3. Exit\n");
}
void print_project_stats(project_t details, const milestone_t * list_milestones, int num_milestones, const int * number_activities){
printf("\nThe name of the project is %s\n", details.name);
if (details.completed == true){
printf("The project is completed. \n");
if (details.planned_cost > details.actual_cost){
printf("The project was under budget by $%.2f.\n",fabs(details.planned_cost - details.actual_cost));
}
else if (details.planned_cost < details.actual_cost){
printf("The project was over budget by $%.2f. \n",fabs(details.planned_cost - details.actual_cost));
}
else if (details.planned_cost == details.actual_cost){
printf("The project was neither over or under budget. \n");
}
if (details.planned_duration > details.actual_duration){
printf("The project was early by is %hu days. \n", (unsigned short int) ceil(details.planned_duration - details.actual_duration));
}
else if (details.planned_duration < details.actual_duration){
printf("The project was late by is %hu days. \n", (unsigned short int) ceil(details.actual_duration - details.planned_duration));
}
else if (details.planned_duration == details.actual_duration){
printf("The project was neither late or delayed.\n");
}
}
else if (details.completed == false){
print_milestone_stats(list_milestones, num_milestones, number_activities);
}
}
void print_milestone_stats(const milestone_t * list_milestones, int num_milestones, const int * number_activities){
for (int i = 0; i < num_milestones; i++, number_activities++){
float milestone_planned_cost = 0; //Sum of planned costs of its activities
int milestone_planned_duration = 0; //Sum of planned durations of its activities in hrs
int num_completed_activties = 0; //Number of completed activities in the milestone.
for (int j = 0; j < *number_activities; j++){
milestone_planned_cost += list_milestones[i].activity_list[j].planned_cost;
milestone_planned_duration +=list_milestones[i].activity_list[j].planned_duration;
if (list_milestones[i].activity_list[j].completed == true){
num_completed_activties++;
}
}
if (list_milestones[i].completed == true){
printf("\nMilestone %s was completed. \n",list_milestones[i].name);
if (milestone_planned_cost > list_milestones[i].actual_cost){
printf("The milestone was under budget by $%.2f\n", fabs(milestone_planned_cost - list_milestones[i].actual_cost));
}
else if (milestone_planned_cost < list_milestones[i].actual_cost){
printf("The project was over budget by $%.2f\n",fabs(milestone_planned_cost - list_milestones[i].actual_cost));
}
else if (milestone_planned_cost == list_milestones[i].actual_cost){
printf("The milestone was neither over or under budget.\n");
}
if (milestone_planned_duration > list_milestones[i].actual_duration){
printf("The milestone was early by %i days. \n", (short int) ceil((milestone_planned_duration - list_milestones[i].actual_duration) / hours_in_day));
}
else if (milestone_planned_duration < list_milestones[i].actual_duration){
printf("The milestone was late by %i days. \n", (short int) ceil((list_milestones[i].actual_duration - milestone_planned_duration) / hours_in_day));
}
else if(milestone_planned_duration == list_milestones[i].actual_duration){
printf("The milestone was neither late or delayed.\n");
}
}
else if (list_milestones[i].completed == false){
printf("\nMilestone %s is incomplete. \n",list_milestones[i].name);
printf("Completed activities are %i out of %i\n", num_completed_activties, *number_activities);
printf("The planned duration for the milestone is %i days.\n", (short int) ceil(milestone_planned_duration / hours_in_day));
printf("The planned cost for the milestone is $%.2f.\n", milestone_planned_cost);
}
}
}
_Bool is_activity_completed(const milestone_t * list_milestones, int num_milestones, const int * number_activities, unsigned short int ID_to_check){
for (int i = 0; i<num_milestones;i++, number_activities++){
for (int j = 0; j<*number_activities; j++){
if (ID_to_check == list_milestones[i].activity_list[j].id){
if (list_milestones[i].activity_list[j].completed == true){
return true;
}
}
}
}
return false;
}
void update_activity(activity_t * activity_to_update){
char is_activity_completed_input;
int actual_duration_input = 0;
printf("Enter the actual duration (in hours) for the activity: ");
scanf(" %i", &actual_duration_input);
while (actual_duration_input < 0 || actual_duration_input > 65535){
printf("Invalid duration. Must be 0 to 65535. Enter the actual duration for the activity: ");
scanf(" %i", &actual_duration_input);
}
(*activity_to_update).actual_duration = (unsigned short int) actual_duration_input;
printf("Is the activity completed (Y/N)? ");
scanf(" %c", &is_activity_completed_input);
while (is_activity_completed_input != 'y' && is_activity_completed_input!= 'Y' && is_activity_completed_input != 'n' && is_activity_completed_input != 'N'){
printf("Invalid Input. Is the activity completed (Y/N)? ");
scanf(" %c", &is_activity_completed_input);
}
is_activity_completed_input = toupper(is_activity_completed_input);
if (is_activity_completed_input == 'Y'){
(*activity_to_update).completed = true;
}
else if (is_activity_completed_input == 'N'){
(*activity_to_update).completed = false;
}
(*activity_to_update).actual_cost = ((*activity_to_update).actual_duration) * hourly_wage;
}
void update_milestone(milestone_t * milestone_to_update, int activities_in_milestone){
_Bool all_activites_completed = true; //assumes all are completed unless proven otherwise.
float milestone_actual_cost = 0.0; //Sum of actual costs of its activities
int milestone_actual_duration = 0; //Sum of actual durations of its activities
for (int j = 0; j<activities_in_milestone ; j++){
if ((*milestone_to_update).activity_list[j].completed == false){
all_activites_completed = false;
break;
}
}
if (all_activites_completed == true){
(*milestone_to_update).completed = true;
}
else if (all_activites_completed == false){
(*milestone_to_update).completed = false;
}
if ((*milestone_to_update).completed == true){
for (int j = 0; j<activities_in_milestone ; j++){
milestone_actual_cost += (*milestone_to_update).activity_list[j].actual_cost;
milestone_actual_duration += (*milestone_to_update).activity_list[j].actual_duration;
}
(*milestone_to_update).actual_cost = milestone_actual_cost;
(*milestone_to_update).actual_duration = milestone_actual_duration;
}
}
void update_project(const milestone_t * milestone_array, int num_milestones, const int * number_activities, project_t * my_project){
_Bool all_milestones_completed = true; //Assumes all milestones are completed unless proven otherwise
(*my_project).actual_cost = 0; //Resets the actual cost so it can be calculated with the new values
(*my_project).actual_duration = 0; //Resets the actual duration so it can calculated with the new values
for (int i = 0; i < num_milestones; i++, number_activities++){
for (int j = 0; j < *number_activities;j++){
(*my_project).actual_cost += milestone_array[i].activity_list[j].actual_cost;
(*my_project).actual_duration += milestone_array[i].activity_list[j].actual_duration;
}
}
(*my_project).actual_duration = (unsigned short int) ceil((*my_project).actual_duration / hours_in_day);
for (int i = 0; i < num_milestones; i++){
if (milestone_array[i].completed == false){
all_milestones_completed = false;
break;
}
}
(*my_project).completed = all_milestones_completed;
}
unsigned short int get_input_usi(void){
unsigned short int user_input = 0;
printf("Please select one of the following options: ");
scanf("%hu", &user_input);
while(user_input < 1 || user_input > 3){
printf("Invalid selection. ");
print_main_menu();
printf("Please select one of the following options: ");
scanf("%hu", &user_input);
}
return user_input;
}
float get_input_f(void){
//This function was not used in the program.
float user_input = 0.0;
printf("Enter a float value greater than 0.0: ");
scanf(" %f", &user_input);
while(user_input <= 0){
printf("Invalid float value\n");
printf("Enter a float value greater than 0.0: ");
scanf(" %f", &user_input);
}
}