[자료구조 - C언어] 자료구조 제14강: Music Library Program(7)

2022. 11. 4. 16:24CS/자료구조

728x90

//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎

 

0. 실행 예

  • Data file name? - 프로그램을 실행하면 어떤 데이터 파일을 load 할지 물어본다.
    • 입력 없이 Enter를 치면 데이터 파일로부터 데이터를 읽지 않고 프로그램을 실행
  • status - 저장된 모든 노래의 번호, 가수, 제목, 파일의 경로명을 출력
    • 노래의 번호는 입력 순서 대로 번호 할당
    • 출력 시 가수 이름 알파벳 순으로 출력
      • 동일한 가수 이름이면 노래 제목으로 알파벳 순으로 출력
  • add - 가수 이름, 제목, 파일명으로 추가
    • 파일명은 지정하지 않아도 된다.
  • search - 가수 이름과 노래 제목으로 검색
    • 제목 없이 가수 이름만 검색해도 된다.
  • play 4 - 4번 노래를 play
  • remove 6 - 6번 노래를 목록에서 삭제
  • save as my_collection.txt - 목록을 파일에 저장
  • exit - 종료
  • 파일 형식
    가수#노래제목#경로#
    LESSERAFIM#Sour Grapes# #
    • 가수#노래제목#경로# 순서
    • #문자를 필드 간의 구분자
    • 존재하지 않는 항목의 경우 하나의 공백 문자로 표시
      • 모든 라인은 반드시 구분자로 끝난다.

 

1. 검색하기

1-1. command_process에 search함수 추가하기

//main.c

void handle_search();

void process_command(){
...

if(strcmp(command, "add")==0)
    handle_add();
else if(strcmp(command, "search")==0)
    handle_search();

...
}

1-2. void handle_search()

  • c언어에서는 함수이름은 같으나 매개변수가 다른 함수의 오버로딩이 되지 않기 때문에 강의와 다르게 함수 이름을 다르게 작성함
    • 가수의 이름과 제목으로 검색하는 함수: void search_song(char *artist, char *title)
    • 가수의 이름으로만 검색하는 함수: void search_song_artist(char *artist)
//main.c

void handle_search(){
    char name[BUFFER_LENGTH], title[BUFFER_LENGTH];
    printf("    Artist: ");
    if(read_line(stdin, name, BUFFER_LENGTH) <= 0){
        printf("    Artist name required.\\n");
        return;
    }
    
    //제목을 입력하면 해당 노래만 출력
    //제목을 입력하지 않으면 가수이름으로 검색 ~ 가수의 모든 노래 출력

    printf("    Title: ");
    int title_len = read_line(stdin, name, BUFFER_LENGTH);
    
    if(title_len <= 0)
        //이름으로만 검색 - c언어 오버로딩 X
        search_song_artist(name);
    else
        search_song(name, title);
}

1-3. 파일을 프로그램에 add하고 search 함수 구현하기

  • 파일을 로드해서 add_song하기
//library.c

void load(FILE *fp){
    char buffer[BUFFER_LENGTH];    //한 라인의 데이터를 읽어올 데이터 배열
    char *name, *title, *path;
    while(1){       //무한 루프
        //끝에 도달 - 종료
        if(read_line(fp, buffer, BUFFER_LENGTH) <=0)
            break;
        
        name = strtok(buffer, "#");
        if(strcmp(name, " ")==0)
            name = NULL;
        else
            name = strdup(name);
        
        title = strtok(NULL, "#");
        if(strcmp(title, " ")==0)
            title = NULL;
        else
            title = strdup(title);
      
        path = strtok(NULL, "#");
        if(strcmp(path, " ")==0)
            path = NULL;
        else
            path = strdup(path);
    
//        printf("%s %s % s\\n", name, title, path);
        add_song(name, title, path);
    }
}
  • 가수 이름(name)과 제목(title) 2개를 매개변수로 검색하는 함수 구현
//library.c

void search_song(char *artist, char *title){
    Artist *ptr_artist = find_artist(artist);
    
    if(ptr_artist == NULL){
        printf("No such artist exists.\\n");
        return;
    }

    SNode *ptr_snode = ptr_artist->head;
    //노래제목은 알파벳 순 정렬
    while(ptr_snode != NULL && strcmp(ptr_snode->song->title, title) < 0)
        ptr_snode = ptr_snode->next;
    
    
    if(ptr_snode != NULL && strcmp(ptr_snode->song->title, title) == 0){
        printf("Found:\\n");
        print_song(ptr_snode->song);
    }
    else{
        printf("No such song exists.\\n");
        return;
    }
}

void search_song_artist(char *artist){
    
}

1-4. library.h에 프로토타입 include

//library.h

void search_song(char *artist, char *title);
void search_song(char *artist);

 

2. 결과

Data file name ?  list.txt
$ status
iu
    0: twenty-three, C://music/twenty-three.mp4
nct127
    3: Cherry Bomb, C://music/Cherry Bomb.mp4
txt
    2: Our Summer, C://music/Our Summer.mp4
    1: crown, C://music/crown.mp4
$ add
    Artist: txt
    Title: ghosting
    Path: C://music/ghosting.mp4
$ search
    Artist: txt
    Title: ghosting
Found:
    4: ghosting, C://music/ghosting.mp4
$ search
    Artist: nct127
    Title: kick it
No such song exists.
$

 

 

 

 


부경대학교 권오흠 교수님의 [c로 배우는 자료구조 및 여러 가지 예제 실습] 강의 정리입니다. 감사합니다.

https://www.youtube.com/watch?v=yrEN5bIod_I&t=377s 

 

728x90