[5] C review < 전화번호부 알고리즘 version2.0 >Language/자료구조2021. 11. 22. 10:54
Table of Contents
동작 방식 : 파일을 로드하고 저장하는 기능을 추가하며, 정렬이 알파벳 순으로 되도록 추가합니다.
생각해야 할점 3가지!
1. 어떻게 알파벳 순서로 add 할 것인가 ?
알파벳 순의 add는 version1.0과 가장 큰 차이점 입니다.
위와 같이 index i를 이용해 해당 칸에 존재하는 값과 새로 들어오는 값을 비교하여 추가합니다.
2. 특정 값을 삭제할때 어떻게 삭제할 것인가 ?
version 1.0에서는 맨 뒤에 값을 삭제할 값에 넣어 해결하였지만 이렇게 하면 애쓴 알파벳 정렬이 깨질 위험이 커집니다. 즉 삭제할 값 뒤쪽에 존재하는 배열을 한 칸씩 왼쪽으로 당겨야 합니다.
3. 어떻게 파일을 load하고 save할 것인가 ?
앞에서 했던 file 입출력 프로그램을 기억합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define CAPACITY 100
#define BUFFER_SIZE 20
// Phone version 1.0
// 1. 프롬프트에 명령 입력받는다.
// 2. 입력후 각 명령에 필요한 인자를 입력받는다.
// 3. add,find,status,delete,exit
char *names[CAPACITY];
char *numbers[CAPACITY];
int n = 0;
void add();
void find();
void status();
void delete ();
void load();
void save();
int search(char *name);
int main()
{
char command[BUFFER_SIZE];
while (1)
{
printf("$ ");
scanf("%s", command);
if (strcmp(command, "add") == 0)
{
add();
}
else if (strcmp(command, "find") == 0)
{
find();
}
else if (strcmp(command, "status") == 0)
{
status();
}
else if (strcmp(command, "delete") == 0)
{
delete ();
}
else if (strcmp(command, "load") == 0)
{
load();
}
else if (strcmp(command, "save") == 0)
{
save();
}
else if (strcmp(command, "exit") == 0)
break;
}
return 0;
}
void add()
{
char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE];
scanf("%s", buf1);
scanf("%s", buf2);
int i = n - 1;
while (i >= 0 && strcmp(names[i], buf1) > 0)
{
names[i + 1] = names[i];
numbers[i + 1] = numbers[i];
i--;
}
names[i + 1] = strdup(buf1);
numbers[i + 1] = strdup(buf2);
n++;
printf("%s was added succesfully", buf1);
}
void find()
{
char buf[BUFFER_SIZE];
scanf("%s", buf);
int index = search(buf);
if (index == -1)
{
printf("No person name in phonebook");
}
else
printf("%s\n", numbers[index]);
}
void status()
{
int i;
for (i = 0; i < n; i++)
{
printf("%s %s\n", names[i], numbers[i]);
}
printf("Total %d persons.\n", n);
}
void delete ()
{
char buf[BUFFER_SIZE];
scanf("%s", buf);
int index = search(buf);
if (index == -1)
{
printf("No person in phonebook");
return;
}
int j = index;
for (; j < n - 1; j++)
{
names[j] = names[j + 1];
numbers[j] = numbers[j + 1];
}
n--;
printf("%s was deleted successfully\n", buf);
}
int search(char *name)
{
int i;
for (i = 0; i < n; i++)
{
if (strcmp(name, names[i]) == 0)
{
return i;
}
}
return -1;
}
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);
}
void save()
{
int i;
char fileName[BUFFER_SIZE];
char tmp[BUFFER_SIZE];
scanf("%s", tmp);
scanf("%s", fileName);
FILE *fp = fopen(fileName, "w");
if (fp = NULL)
{
printf("Save failed.\n");
return;
}
for (i = 0; i < n; i++)
{
fprintf(fp, "%s %s\n", names[i], numbers[i]);
}
fclose(fp);
}
'Language > 자료구조' 카테고리의 다른 글
[7] C review < 전화번호부 알고리즘 version4.0 > (0) | 2021.11.23 |
---|---|
[6] C review < 전화번호부 알고리즘 version3.0 > (0) | 2021.11.22 |
[4] C review < 전화번호부 알고리즘 version1.0 > (0) | 2021.11.22 |
[3] C review < 문자열 응용> (0) | 2021.11.16 |
[2] C review < 문자열 > (0) | 2021.11.15 |
@Return :: Return
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!