-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhelloworld.c
236 lines (216 loc) · 6.9 KB
/
helloworld.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
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
/* CRUD 성적관리 프로그램
1. 사용자 데이터 타입 정의
2. 데이터 추가 함수 구현
3. 데이터 보기 기능 구현
4. 데이터 수정 기능 구현
5. 데이터 삭제 기능 구현
6. 데이터 관리를 위한 메뉴 및 Main 완성
7. 다중 데이터 처리 구현
8. 파일 저장/불러오기 기능 구현
9. 검색 기능 구현
10. 라이브러리 생성
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*1. 사용자 데이터 타입 정의
필요한 변수 선언*/
typedef struct { //typedef로 구조체 정의 해주어 선언시마다 struct를 쓰지 않도록 해준다
char name[50];
int weight;
int price;
int standardPrice;
int starNum;
}Snack; //이름 정의
int selectMenu();
/*2. 점수 추가 기능 구현*/
int addSnack(Snack *s);
/*3. 입력한 점수 출력 기능 구현*/
void readSnack(Snack s);
/*4. 입력된 점수 수정 기능 구현*/
int updateSnack(Snack *s);
/*4. 입력된 점수 삭제 기능 구현*/
int deleteSnack(Snack *s);
/*7. 다중 데이터 처리 구현*/
void listSnack(Snack *s, int count);
int selectSnack(Snack *s, int count);
/*8. 파일 저장/불러오기 기능 구현*/
void saveSnackList(Snack *s, int count);
int loadSnackList(Snack s[]);
/*9. 검색 기능 구현*/
void searchSnackName(Snack *s, int count);
void searchSnackPrice(Snack *s, int count);
void searchSnackStarNum(Snack *s, int count);
int selectMenu(){
int menu;
printf("\n==과자관리 프로그램==\n");
printf("1. 조회\n2. 추가\n3. 수정\n4. 삭제\n5. 저장\n6. 검색\n0. 종료\n\n");
printf("원하는 메뉴는? ");
scanf("%d", &menu);
return menu;
}
int addSnack(Snack *s){ //정보 직접 수정: 포인터로 받음
printf("제품명은? ");
getchar();
fgets(s->name, 50, stdin);
printf("중량은? ");
scanf("%d", &s->weight);
printf("가격은? ");
scanf("%d", &s->price);
printf("표준가격은? ");
scanf("%d", &s->standardPrice);
printf("별점수은? ");
scanf("%d", &s->starNum);
printf("\n=> 추가됨!\n");
return 1; //잘 추가 되었는지 1 리턴
}
void readSnack(Snack s){
printf("%8d원 %3dg %7d원 %4d점 %s", s.price, s.weight, s.standardPrice, s.starNum, s.name);
}
int updateSnack(Snack *s){ //정보 직접 수정: 포인터로 받음
printf("제품명은? ");
getchar();
fgets(s->name, 50, stdin);
printf("중량은? ");
scanf("%d", &s->weight);
printf("가격은? ");
scanf("%d", &s->price);
printf("표준가격은? ");
scanf("%d", &s->standardPrice);
printf("별점수은? ");
scanf("%d", &s->starNum);
printf("=> 수정됨!\n");
return 1; //제대로 추가 되었는지 1 리턴
}
int deleteSnack(Snack *s){ //정보 직접 수정: 포인터로 받음
s->weight= -1;
s->price= -1;
s->standardPrice= -1;
s->starNum= -1;
printf("=> 삭제됨!\n");
return 1; //삭제가 제대로 되었는지 확인
}
void listSnack(Snack *s, int count){
//배열을 보내줌: 첫번째 두번째 세번째 등 반복문을 돌려야하므로
//count: 몇번째 인덱스까지 입력 되었는지
printf("\n번호 가격 중량 표준가격 별점수 제품명");
printf("\n========================================\n");
for(int i = 0; i< count; i++){
if(s[i].weight == -1 && s[i].price == -1 && s[i].standardPrice == -1 && s[i].starNum){
continue;
}
printf("%2d", i+1);
readSnack(s[i]);
printf("\n");
}
}
int selectSnack(Snack *s, int count){
//리스트를 보여줘야하기 때문에 배열 변수
int num;
listSnack(s, count);
printf("번호를 고르세요 (취소: 0) ");
scanf("%d", &num);
return num;
}
void saveSnackList(Snack *s, int count){ //데이터 배열변수를 넘김
FILE *fp; //파일 포인터 생성
fp = fopen("snack.txt", "wt"); //파일 열기 fopen()
for(int i=0; i<count; i++){
//파일에 데이터 출력(쓰기) fprintf() fputs()
if(s[i].weight != -1 || s[i].price != -1 || s[i].standardPrice != -1 || s[i].starNum != -1){
fprintf(fp,"%d %d %d %d %s", s[i].price, s[i].weight, s[i].standardPrice, s[i].starNum, s[i].name);
}
}
fclose(fp); //파일 닫기
printf("저장됨!\n");
}
int loadSnackList(Snack *s){ //데이터 배열변수를 넘김
int count = 0;
FILE *fp; //파일 포인터 생성
fp = fopen("snack.txt", "rt"); //파일 열기 fopen()
if(fp == NULL){ //파일이 없다면 종료
printf("=> 파일 없음\n");
return 0;
}
for( ; ; count++){
//파일에 데이터 입력(읽기)
fscanf(fp,"%d %d %d %d %[^\n]", &s[count].price, &s[count].weight, &s[count].standardPrice, &s[count].starNum, s[count].name);
if(feof(fp)){ //파일의 끝
break;
}
}
fclose(fp);
printf("=>로딩 성공\n");
return count; //count 리턴
}
void searchSnackName(Snack *s, int count){ //배열변수를 넘김
int scount = 0;
char search[50];
printf("검색할 이름은?");
scanf("%s", search);
printf("\n번호 가격 중량 표준가격 별점수 제품명");
printf("\n========================================\n");
for(int i =0; i<count; i++){
if(strstr(s[i].name, search)){
printf("%2d", i+1);
readSnack(s[i]);
printf("\n");
scount++;
}
}
if(scount == 0){
printf("=> 검색된 데이터 없음!");
}
}
void searchSnackPrice(Snack *s, int count){
int scount = 0;
int min=0, max=0;
printf("검색할 최소가격과 최대 가격을 입력하세요\n");
printf("최소가격: ");
scanf("%d", &min);
printf("최대가격: ");
scanf("%d", &max);
printf("\n번호 가격 중량 표준가격 별점수 제품명");
printf("\n========================================\n");
for(int i =0; i<count; i++){
if(s[i].price >= min && s[i].price <= max){
printf("%2d", i+1);
readSnack(s[i]);
printf("\n");
scount++;
}
}
if(scount == 0){
printf("검색된 데이터 없음!");
}
}
void searchSnackStarNum(Snack *s, int count){
int scount = 0;
int min=0, max=0;
printf("검색할 최소, 최대 별 개수를 입력하세요\n");
printf("최소별점: ");
scanf("%d", &min);
printf("최대별점: ");
scanf("%d", &max);
printf("\n번호 가격 중량 표준가격 별점수 제품명");
printf("\n========================================\n"); for(int i =0; i<count; i++){
if(s[i].starNum >= min && s[i].starNum <= max){
printf("%2d", i+1);
readSnack(s[i]);
printf("\n");
scount++;
}
}
if(scount == 0){
printf("검색된 데이터 없음!");
}
}
int main(void){
// #ifdef DEBUG
// printf("Debug: [%s : %d] %s\n",__FILE__,__LINE__,__func__);
// #endif
Snack s[100]; //배열변수
int count = 0, menu = 0;
int curcount = 0; //현재 입력받는 사람이 몇번째인지
count = loadSnackList(s);
curcount = count;