본문 바로가기

Computer Science/따라하며 배우는 C

17-01 ~ 17-02 영화 평점관리 연습문제

728x90

17-01. 영화 평점관리 연습문제


이번 부록에서는 data structure에 대해서 주로 다룰 것이다. 이 강의 뒷부분을 이해하기 위해서, 해당 문제를 스스로 풀어보기를 강력히 권장한다.

17장은 예제가 길어지므로, (코드를 따라서 치는 것보다) 이번 예제를 직접 작성해보고, 이후 이어지는 내용을 배우고 추후 작성했던 프로그램을 업그레이드 하는 방식으로 구현하면 재밌게 공부할 수 있을 것이다.


#include <stdio.h>
// #include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

//// 01

#define TSIZE 45
#define LMAX 10


struct movie
{
    /* data */
    char title[TSIZE];
    float rating;
};

void read_file(struct movie movie_list[], size_t* ptr_n_items)
{
    char filename[TSIZE] = {0,};

    // filenae_input
    printf("Please input filename to read and press Enter.\n");
    printf(">> ");

    if (scanf("%[^\n]%*c", filename) != 1){
        printf("wrong input. Terminating.\n");
        exit(1);
    }

    FILE* file = fopen(filename, "r");

    if (file == NULL)
    {
        printf("Error: cannot open file.\n");
        exit(1);
    }

    // counting
    int num =0;
    if (fscanf(file, "%d%*c", &num) != 1)
    {
        printf("ERROR: Wrong file format.");
        exit(1);
    }


    // counting
    for (int n = 0; n< num; ++n)
    {
        if (fscanf(file, "%[^\n]%*c", movie_list[*ptr_n_items].title) != 1 ||
            fscanf(file, "%f%*c", &movie_list[*ptr_n_items].rating) != 1)
        {
            printf("ERROR: Wrong file format.\n");
            exit(1);
        }

        *ptr_n_items += 1;
    }

    // double check
    assert(*ptr_n_items == num);

    fclose(file);

    printf("%zu items have been read from the file.\n", *ptr_n_items);
}

void write_file(struct movie movie_list[], int n_items)
{
    char filename[TSIZE] = {0, };

    // filename_input
    printf("Please inpput filename to read and press Enter.\n");
    printf(">> ");

    if (scanf("%[^\n]%*c", filename) != 1){
        printf("wrong input. Terminating.\n");
        exit(1);
    }


    FILE* file = fopen(filename, "w");

    if (file == NULL)
    {
        printf("error: cannot open file.\n");
        exit(1);
    }

    fprintf(file, "%d\n", n_items);
    for (int n= 0; n<n_items;++n)
    {
        fprintf(file, "%s\n", movie_list[n].title);
        fprintf(file, "%f\n", movie_list[n].rating);
    }

    fclose(file);

    printf("%d items have been saved to the file.\n", n_items);
}

int input_int()
{
    int input;


    // 사용자가 정수를 입력할 때까지 반복
    while (1)
    {
        printf(">> ");
        if (scanf("%d%*c", &input) == 1) return input;
        else {
            printf("please input an integer and press enter. Try again.\n");
            while (getchar() != '\n') continue;
        }
    }
}

int input_menu()
{   
    while (1)
    {

    // option input
    printf("Please select an option and press enter.\n");   
    printf("1. Print all items \t 2.Print an item \n3. Edit an item \t 4. Add an item. \n\
    5. Insert an item \t 6. Delete an item \n7. Delete all items \t 8. Save file\n\
    9. Search by name \t 10. Quit\n");

    int input = input_int();

    if (input >= 1 && input <= 10) return input;
    else 
        printf("%d is invalid. Please try again.\n", input);
    }

}

void print_all(struct movie movie_list[], int n_items){
    for (int n = 0; n < n_items; ++n)
        printf("%d : \"%s\", %.1f\n", n, movie_list[n].title, movie_list[n].rating);
}

void print_an_item(struct movie movie_list[], int n_items)
{
    printf("Input the index of item to print.\n");
    int index = input_int();
    if (index < n_items)
        printf("%d : \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating);
    else
        printf("Invalid item.\n");
}

void edit_an_item(struct movie movie_list[], int n_items)
{
    printf("input the index of item to edit.\n");
    int index = input_int();
    if (index < n_items)
    {
        printf("%d : \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating);

        printf("input new title and press enter.\n");
        printf(">> ");
        int f = scanf("%[^\n]%*c", movie_list[index].title);

        printf("Input new rating and press enter.\n");
        printf(">> ");
        f = scanf("%f%*c", &movie_list[index].rating);

        printf("%d : \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating);
    }

    else
        printf("Invalid item.\n");
}

void add_an_item(struct movie movie_list[], size_t* ptr_n_items) // n_items is a pointer
{
    if (*ptr_n_items == LMAX)
    {
        printf("No more space.\n");
        return;
    }

    const int index = *ptr_n_items;

    printf("input new title and press enter.\n");
    printf(">> ");
    int f = scanf("%[^\n]%*c", movie_list[index].title);

    printf("Input new rating and press enter.\n");
    printf(">> ");
    f = scanf("%f%*c", &movie_list[index].rating);

    printf("%d : \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating);

    *ptr_n_items += 1;
}

void insert_an_item(struct movie movie_list[], size_t* ptr_n_items)
{
    if (*ptr_n_items == LMAX)
    {
        printf("No more space.\n");
        return;
    }

    printf("input the index of item to insert.\n");
    int index = input_int();

    // case1. memmove로 한칸씩 옮기기
    // memmove(&moive_list[index + 1], &movie_list[index], sizeof(struct movie)* (*ptr_n_items - index));

    // case2. For loop implemenatation
    for (int i = *ptr_n_items - 1; i>=index; i--)
    {
        strcpy(movie_list[i+1].title, movie_list[i].title);
        movie_list[i+1].rating = movie_list[i].rating;
    }

    printf("input new title and press enter.\n");
    printf(">> ");
    int f = scanf("%[^\n]%*c", movie_list[index].title);

    printf("Input new rating and press enter.\n");
    printf(">> ");
    f = scanf("%f%*c", &movie_list[index].rating);

    printf("%d : \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating);

    *ptr_n_items += 1;

}

void delete_an_item(struct movie movie_list[], size_t* ptr_n_items)
{
    printf("input the index of item to delete.\n");
    int index = input_int();

    //memmove(&movie_list[index], &movie_list[index+1],
    //sizeof(struct movie) * (*ptr_n_items - index);

    /* For loop implementation */
    for (int i = index; i < *ptr_n_items; i++)
    {
        strcpy(movie_list[i].title, movie_list[i+1].title);
        movie_list[i].rating = movie_list[i+1].rating;
    }

    *ptr_n_items -= 1;
}

void search_by_name(struct movie movie_list[], int n_items)// 여기서부터 시작
{
    printf("input new title and press enter.\n");
    printf(">> ");

    char title[TSIZE] = {0,};
    if (scanf("%[^\n]%*c", title) != 1)
    {
        printf("wrong input.\n");
        return;
    }

    int index = 0;
    for (; index < n_items; ++index)
    {
        if (strcmp(movie_list[index].title, title) == 0)
            break;
    }

    if (index == n_items)
        printf("No movie found: %s\n", title);
    else 
        printf("%d : \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating);
}




int main()
{
    struct movie movie_list[LMAX];
    size_t n_items = 0;

    read_file(movie_list, &n_items);

    while (1)
    {
        printf("\n");

        int s = input_menu();

        switch (s)
        {
        case 1:
            print_all(movie_list, n_items);
            break;
        case 2:
            print_an_item(movie_list, n_items);
            break;
        case 3:
            edit_an_item(movie_list, n_items);
            break;
        case 4:
            add_an_item(movie_list, &n_items);
        case 5:
            insert_an_item(movie_list, &n_items);
            break;
        case 6:
            delete_an_item(movie_list, &n_items);
            break;
        case 7:
            n_items = 0;
            break;
        case 8:
            write_file(movie_list, n_items);
            break;
        case 9:
            search_by_name(movie_list, n_items);
            break;
        case 10:
            printf("Good bye\n");
            exit(0);
        default:
            printf("%d is not implemented.\n",s);

        }

        return 0;

    }




}
 
728x90

'Computer Science > 따라하며 배우는 C' 카테고리의 다른 글

17-03 ~ 17-04 Linked List  (0) 2022.06.16
16 Preprocessor  (0) 2022.06.11
15 Bit  (0) 2022.06.10
14 구조체  (0) 2022.06.04
13 File_IO  (0) 2022.06.03