[C 언어] - Phone Book - v1

RuiN·2022년 8월 5일
0

Practice

목록 보기
1/4
post-thumbnail

간단하게 이름과 번호를 Console 창에 입력하여 저장하고 조회하고, 삭제하는 로직을 만들어 볼까 합니다.


Main ( )

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define CAPACITY 100
#define BUFFER_SIZE 100

char *names[CAPACITY];      /* names */
char *numbers[CAPACITY];    /* phone numbers */
int n = 0;                  /* number of people in phone directory */

void add();
void find();
void delete();
void status();

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, "exit") == 0)
            break;
    }
    return 0;
};
  • strcmp ( ) 를 통해서 입력한 문자열과 비교하여 맞는 단어가 나오면 0을 리턴하게 한후 ,
    그에 맞는 메소드를 실행시키는 로직

생성 ( Add )

void add(){
    char nameTmp[BUFFER_SIZE], numberTmp[BUFFER_SIZE];
    scanf("%s", nameTmp);
    scanf("%s", numberTmp);

    names[n] = strdup(nameTmp);
    numbers[n] = strdup(numberTmp);
    n++;

    printf("%s was added successfully.\n", nameTmp);
}
  • 지역변수로 nameTmp 와 numberTmp str 배열을 선언하고
    배열에 값을 입력한다.
  • 그다음 strdup ( ) 를 통해서 지역변수 배열의 값을 복사해서 names 와 numbers 포인터 배열에 값을 넣는다.
  • n++ 을 통해서 정보의 갯수를 증가시키고
  • nameTmp 에 입력한 이름을 출력한다.

조회 ( Find )

void find(){
    char findTmp[BUFFER_SIZE];

    scanf("%s", findTmp);

    int i ;
    for (int i = 0; i < n; ++i) {
        if (strcmp(findTmp, names[i]) == 0) {
            printf("%s\n", numbers[i]);
            return;
        }
    }
    printf("No person name '%s' exists.\n", findTmp);
}
  • 조회할 이름을 입력받을 findTmp 배열을 선언
  • for 문을 통해서 findTmp에 입력한 값과 names 포인터 배열에 있는 값과 동일한지 파악
    (동일하면 0 을 return)
  • 만약 동일하다면 해당하는 이름의 전화번호를 출력하고, 그게 아니라면 아무도 없다라는 메시지를 출력한다.

상태 ( Status )

void status(){
    int i ;
    for (int i = 0; i < n; ++i) {
        printf("%s  %s\n", names[i], numbers[i]);
    }
    printf("Total %d persons.\n", n);
}
  • for 문을 돌면서 출력한다.

삭제 ( Delete )

void delete(){
    char deleteTmp[BUFFER_SIZE];
    scanf("%s", deleteTmp);

    int i ;
    for (int i = 0; i < n; ++i) {
        if (strcmp(deleteTmp, names[i]) == 0) {
            names[i] = names[n - 1];
            numbers[i] = numbers[n - 1];
            n--;
            printf("'%s' was deleted successfully.  \n", deleteTmp);
            return;
        }
    }
    printf("No person name '%s' exists.\n", deleteTmp);
}
  • 조회할 이름을 입력받을 deleteTmp 배열을 선언
  • deleteTmp 에 입력한 이름과 names에 있는 이름과 같으면
    맨뒤에 있는 값을 입력한 이름의 값이 있는곳으로 덮어쓴다.
  • 그다음 성공했다는 메시지를 출력하고, 만약 해당 이름이 존재하지 않는다면 없다는 메시지를 출력한다.

Complete Code

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define CAPACITY 100
#define BUFFER_SIZE 100

char *names[CAPACITY];      /* names */
char *numbers[CAPACITY];    /* phone numbers */
int n = 0;                  /* number of people in phone directory */

void add();
void find();
void delete();
void status();

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, "exit") == 0)
            break;
    }
    return 0;
};

void add(){
    char nameTmp[BUFFER_SIZE], numberTmp[BUFFER_SIZE];
    scanf("%s", nameTmp);
    scanf("%s", numberTmp);

    names[n] = strdup(nameTmp);
    numbers[n] = strdup(numberTmp);
    n++;

    printf("%s was added successfully.\n", nameTmp);
}

void find(){
    char findTmp[BUFFER_SIZE];

    scanf("%s", findTmp);

    int i ;
    for (int i = 0; i < n; ++i) {
        if (strcmp(findTmp, names[i]) == 0) {
            printf("%s\n", numbers[i]);
            return;
        }
    }
    printf("No person name '%s' exists.\n", findTmp);
}

void status(){
    int i ;
    for (int i = 0; i < n; ++i) {
        printf("%s  %s\n", names[i], numbers[i]);
    }
    printf("Total %d persons.\n", n);
}

void delete(){
    char deleteTmp[BUFFER_SIZE];
    scanf("%s", deleteTmp);

    int i ;
    for (int i = 0; i < n; ++i) {
        if (strcmp(deleteTmp, names[i]) == 0) {
            names[i] = names[n - 1];
            numbers[i] = numbers[n - 1];
            n--;
            printf("'%s' was deleted successfully.  \n", deleteTmp);
            return;
        }
    }
    printf("No person name '%s' exists.\n", deleteTmp);
}
profile
어디까지 올라갈지 궁금한 하루

0개의 댓글