전화번호부 v2.0
전화번호부 v1.0(4강)에 더해 파일로 저장 및 로드, 알파벳 순 정렬 기능을 추가한다
자료구조는 v1.0과 동일하며 load, save 함수가 추가된다.
#include ..
#define CAPACITY 100
#define BUFFER_SIZE 100
char * names[CAPACITY];
char * numbers[CAPACITY];
int n = 0;
void load();
void add();
void find();
void status();
void remove();
void save();
int main() {
char buffer[BUFFER_SIZE];
while (1){
printf("$ ");
scanf("%s", buffer);
if (strcmp(command, "read")==0)
load();
else if (strcmp(command, "add")==0)
add();
else if (strcmp(command, "find")==0)
find();
else if (strcmp(command, "delete")==0)
remove;
else if (strcmp(command, "save")==0)
save();
else if (strcmp(command, "exit")==0)
break;
}
return 0;
}
- load()
void load() {
char fileName[BUFFER_SIZE];
char buf1[BUFFER_SIZE];
char buf2[BUFFER_SIZE];
scanf("%s", fileName);
FILE *fp = fopen(fileName, "r");
if (fp==NULL) {
printf("Open failed.\n");
return;
}
while ((fscanf(fp, "%s", buf1) != EOF)) {
fscanf(fp, "%s", buf2);
names[n] = strdup(buf1);
numbers[n] = strdup(buf2);
n++;
}
fclose(fp);
}
- save()
void save() {
int i;
char fileName(BUFFER_SIZE];
char tmp[BUFFER_SIZE];
scanf("%s", tmp); //which is "as", discarded
scanf("%s", fileName);
FILE *fp = fopen(fimeName, "w"); //해당 이름의 파일이 없다면 fopen 함수에서 새로 만들어준다.
if (fp==NULL) {
printf("Open failed.\n");
return;
}
for(i=0;i<n;i++) {
fprint(fp, "%s %s\n", names[i], numbers[i]);
}
fclose(fp); // 파일을 닫지않아도 당장에는 문제가 생기지 않지만 시스템 자원을 계속 소모하여 프로그램의 성능이 나빠지거나 심한경우 프로그램이 다운될 수 있다.
}
bubble sort는 현재의 전화번호부 프로그램처럼 잦은 추가, 삭제가 발생할 수 있는 경우에 적합하지 않다.
이미 정렬되어있다는 기준에서 bubble sort의 경우 배열의 자리이동이 빈번해진다.
- add()
void add() {
char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE];
scanf("%s", buf1);
scanf("%s", buf12;
int i=n-1;
while(i>0 && strcmp(name[i], buf1) > 0) { // i번째 사람이 새로 입력된 사람보다 더 크다 그러므로 큰 이름 값을 뒤로 옮기는 루틴을 수행
names[i+1] = names[i];
numbers[i+1] = numbers[i];
i--;
}
names[n] = strdup(buf1);
numbers[n] = strdup(buf2);
n++;
printf("%s was added successfully.\n", buf1);
}
- remove()
void remove() {
char buf[BUFFER_SIZE];
scanf("%s", buf);
int index = search(buf); // return -1 if not exists
if (index == -1) {
printf("No persion named '%s' exists.\n", buf);
return;
}
int j = index;
for (; j<n-1; j++) { // 정렬은 이미 되어 있으므로 한 칸씩 앞으로 가져오기만해도 정렬은 유지된다.
names[j] = names[j+1];
number[j] = numbers[j+1];
n--;
printf("'%s' was deleted successfully. \n", buf);
return;
}
}
- find()
void find() {
char buf[BUFFER_SIZE];
scanf("%s", buf);
int index = search(buf);
if (index==-1) {
printf("No person named '%s' exists/ \n", buf);
else
printf("%s\n", numbers[index]);
}
}
- search()
int search(char *name) {
int i;
for (i=0; i<n; i++)
if (strcmp(name, names[i])==0) {
return i;
}
return -1;
}
find 함수에서 호출해서 해당 이름의 사람이 어느 위치에 있는지 인덱스를 반환한다.
- status()
void status() {
int i;
for (i=0; i<n; i++)
printf("%s %s\n", names[i], numbers[i]);
printf("Total %d persons. \n", n);
}
전화번호부에 있는 이름, 전화번호 그리고 총 몇 명이 있는지 반환한다.
'CS > 자료구조' 카테고리의 다른 글
[인프런|9강] C로 배우는 자료구조 | 전화번호부 v4.0 (0) | 2020.11.16 |
---|---|
[인프런|6,7,8강] C로 배우는 자료구조 | 전화번호부 v3.0 (0) | 2020.11.15 |
[인프런|4강] C로 배우는 자료구조 | 전화번호부 v1.0 (0) | 2020.11.13 |
[인프런|3강] C로 배우는 자료구조 | 문자열 연습문제 (0) | 2020.11.11 |
[인프런|2강] C로 배우는 자료구조 | 문자열 (0) | 2020.11.10 |