Language/자료구조

[5] C review < 전화번호부 알고리즘 version2.0 >

Return 2021. 11. 22. 10:54

동작 방식 : 파일을 로드하고 저장하는 기능을 추가하며, 정렬이 알파벳 순으로 되도록 추가합니다. 

 

생각해야 할점 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);
}