-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinsertMember.c
194 lines (126 loc) · 4.75 KB
/
insertMember.c
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
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#include "book.h"
#include "member.h"
#include "admin.h"
#include "menu.h"
#include "dataTypes.h"
#include "utilities.h"
void insertMember() {
SetConsoleTitle("Library System > Member Menu > Inserting New Member");
// assigning to NULL to facilitate realloc
// array is needed
// writing into files will be after inserting all books
memberDataType * member = NULL;
// for verifications
bool valid;
// realloc iterator
int i=0;
do {
system("cls");
// series of terniry operators for ordinal indicators
// i.e. 1(st), 2(nd), etc.
printf("Please, Enter %d%s Member's Details.\n\n", (i+1) , (i+1==1)?"st":(i+1==2)?"nd":(i+1==3)?"rd":"th" );
member = realloc(member, (i+1)*sizeof(memberDataType) );
// first name entry
do {
printf("\nFirst Name : ");
strcap(gets(member[i].name.first));
if( strcmp(member[i].name.first , "") == 0 )
errMsg("Error !\nusage: no blank entry allowed");
} while ( strcmp(member[i].name.first , "") == 0 );
// last name entry
do {
printf("\nLast Name : ");
strcap(gets(member[i].name.last));
if( strcmp(member[i].name.last , "") == 0 )
errMsg("Error !\nusage: no blank entry allowed");
} while ( strcmp(member[i].name.last , "") == 0 );
// city entry
do {
printf("\nCity : ");
strcap(gets(member[i].address.city));
if( strcmp(member[i].address.city , "") == 0 )
errMsg("Error !\nusage: no blank entry allowed");
} while ( strcmp(member[i].address.city , "") == 0 );
// building entry
do {
printf("\nBulding : ");
scanf("%d",&member[i].address.building);
if( member[i].address.building<0 )
errMsg("Error !\nusage: only positive integers are allowed");
} while ( member[i].address.building<0 );
// street entry
do {
printf("\nStreet : ");
scanf("%d",&member[i].address.street);
// avoiding logical errors causes by contiguous scanf and gets
getc(stdin);
if( member[i].address.street<0 )
errMsg("Error !\nusage: only positive integers are allowed");
} while ( member[i].address.street<0 );
// ID entry
do {
printf("\nID : ");
gets(member[i].ID);
valid = duplicateID(member[i].ID);
if(!valid)
errMsg("Error !\nThis ID was previously taken.");
if( strcmp(member[i].ID , "") == 0 )
errMsg("Error !\nusage: no blank entry allowed");
} while ( strcmp(member[i].ID , "") == 0 || !valid );
// check age validity
do{
printf("\nAge : ");
scanf("%d", &member[i].age);
// avoiding logical errors causes by contiguous scanf and gets
getc(stdin);
if( member[i].age<=0 )
errMsg("Error !\nusage: age must be positive number");
}while(member[i].age<=0);
// check phone number validity
do{
printf("\nPhone Number (11 digits) : ");
gets(member[i].phoneNum);
if( strlen(member[i].phoneNum)!=11 )
errMsg("Error !\nusage: phone numbers must consist of 11 digit");
else
acpMsg("Valid phone number");
} while ( strlen(member[i].phoneNum)!=11 );
// check email validity
do{
printf("\nE-Mail : ");
gets(member[i].email);
valid = isEmail(member[i].email);
if(valid)
acpMsg("Valid e-mail address");
else
errMsg("Error\ninvalid e-mail address");
} while(!valid);
// books number increment
i++;
} while( yesNoRequest("add another member")==true );
FILE * members = fopen("members.bin", "a");
// failure check
if(members==NULL) {
perror("\a\nError");
getche();
return;
}
int k;
for(k=0 ; k<i ; k++) {
// initializing logic values to each structure without user's interfere
member[k].borrowedBooks = 0;
fwrite(&member[k] , sizeof(memberDataType) , 1 , members);
}
fclose(members);
free(member);
fflush(stdin);
memberMenu();
}