[C] 씹어먹는 C 언어 - <15 - 4. string - 도서 관리 프로젝트>

Kim Dongil·2022년 10월 29일
0

C

목록 보기
22/28
#include <stdio.h>

int add_book(char(*book_name)[30], char(*auth_name)[30], char(*publ_name)[30],
    int* borrowed, int* num_total_book); // 책을 추가하는 함수
int search_book(char(*book_name)[30], char(*auth_name)[30],
    char(*publ_name)[30], int num_total_book); // 책을 검색하는 함수 호출 

int compare(char* str1, char* str2); // 문자열 비교 함수 
int borrow_book(int* borrowed); // 책을 빌리는 함수
int return_book(int* borrowed); // 책을 반납하는 함수

    int main() {

    int user_choice; /* 유저가 선택한 메뉴 */
    int num_total_book = 0; /* 현재 책의 수 */
    char book_name[100][30], auth_name[100][30], publ_name[100][30];  //책, 저자, 출판사를 저장할 배열. 책의 최대 개수는 100 권
    int borrowed[100]; // 빌렸는지 상태를 표시

    while (1) {
        printf("도서 관리 프로그램 \n");
        printf("메뉴를 선택하세요 \n");
        printf("1. 책을 새로 추가하기 \n");
        printf("2. 책을 검색하기 \n");
        printf("3. 책을 빌리기 \n");
        printf("4. 책을 반납하기 \n");
        printf("5. 프로그램 종료 \n");

        printf("당신의 선택은 : ");
        scanf("%d", &user_choice);

        switch (user_choice) {
        case 1: // 책을 새로 추가하는 함수 호출
            add_book(book_name, auth_name, publ_name, borrowed, &num_total_book);
            break;
        case 2: // 책을 검색하는 함수 호출
            search_book(book_name, auth_name, publ_name, num_total_book);
            break;
        case 3: // 책을 빌리는 함수 호출
            borrow_book(borrowed);
            break;
        case 4: // 책을 반납하는 함수 호출
            return_book(borrowed);
            break;
        case 5: // 프로그램을 종료한다.
            break;
        }
    }

    return 0;
}

int add_book(char(*book_name)[30], char(*auth_name)[30],
    char(*publ_name)[30], int* borrowed, int* num_total_book) {
    printf("추가할 책의 제목 : ");
    scanf("%s", book_name[*num_total_book]);

    printf("추가할 책의 저자 : ");
    scanf("%s", auth_name[*num_total_book]);

    printf("추가할 책의 출판사 : ");
    scanf("%s", publ_name[*num_total_book]);

    borrowed[*num_total_book] = 0; /* 빌려지지 않음*/
    printf("추가 완료! \n");
    (*num_total_book)++;

    return 0;
}

int search_book(char(*book_name)[30], char(*auth_name)[30],
    char(*publ_name)[30], int num_total_book) {
    int user_input; /* 사용자의 입력을 받는다. */
    int i;
    char user_search[30];

    printf("어느 것으로 검색 할 것인가요? \n");
    printf("1. 책 제목 검색 \n");
    printf("2. 지은이 검색 \n");
    printf("3. 출판사 검색 \n");
    scanf("%d", &user_input);

    printf("검색할 단어를 입력해주세요 : ");
    scanf("%s", user_search);

    printf("검색 결과 \n");

    if (user_input == 1) {
        /*

        i 가 0 부터 num_total_book 까지 가면서 각각의 책 제목을
        사용자가 입력한 검색어와 비교하고 있다.

        */
        for (i = 0; i < num_total_book; i++) {
            if (compare(book_name[i], user_search)) {
                printf("번호 : %d // 책 이름 : %s // 지은이 : %s // 출판사 : %s \n", i,
                    book_name[i], auth_name[i], publ_name[i]);
            }
        }

    }
    else if (user_input == 2) {
        /*

        i 가 0 부터 num_total_book 까지 가면서 각각의 지은이 이름을
        사용자가 입력한 검색어와 비교하고 있다.

        */
        for (i = 0; i < num_total_book; i++) {
            if (compare(auth_name[i], user_search)) {
                printf("번호 : %d // 책 이름 : %s // 지은이 : %s // 출판사 : %s \n", i,
                    book_name[i], auth_name[i], publ_name[i]);
            }
        }

    }
    else if (user_input == 3) {
        /*

        i 가 0 부터 num_total_book 까지 가면서 각각의 출판사를
        사용자가 입력한 검색어와 비교하고 있다.

        */
        for (i = 0; i < num_total_book; i++) {
            if (compare(publ_name[i], user_search)) {
                printf("번호 : %d // 책 이름 : %s // 지은이 : %s // 출판사 : %s \n", i,
                    book_name[i], auth_name[i], publ_name[i]);
            }
        }
    }

    return 0;
}

int compare(char* str1, char* str2) {
    while (*str1) {
        if (*str1 != *str2) {
            return 0;
        }

        str1++;
        str2++;
    }

    if (*str2 == '\0') return 1;

    return 0;
}

int borrow_book(int* borrowed) {
    int book_num; // 사용자로 부터 책번호를 받을 변수
     
    printf("빌릴 책의 번호를 말해주세요 \n");
    printf("책 번호 : ");
    scanf("%d", &book_num);

    if (borrowed[book_num] == 1) {
        printf("이미 대출된 책입니다! \n");
    }
    else {
        printf("책이 성공적으로 대출되었습니다. \n");
        borrowed[book_num] = 1;
    }

    return 0;
}

int return_book(int* borrowed) {
    int num_book; // 반납할 책의 번호

    printf("반납할 책의 번호를 써주세요 \n");
    printf("책 번호 : ");
    scanf("%d", &num_book);

    if (borrowed[num_book] == 0) {
        printf("이미 반납되어 있는 상태입니다\n");
    }
    else {
        borrowed[num_book] = 0;
        printf("성공적으로 반납되었습니다\n");
    }

    return 0;
}

1. 위 프로그램을 다 지우고 다시 만들어보자. 물론 소스가 정확히 일치하지 않아도 된다. 기능만 동일하면 된다.

(난이도 : 下)

#include <stdio.h>

int add_book(char(*book_name)[30], char(*author_name)[30], char(*publisher_name)[30],
	int* borrowed_book, int* total_book);
int search_book(char(*book_name)[30], char(*author_name)[30], char(*publisher_name)[30], 
	int total_book);

int compare(char* str1, char* str2);

int borrow_book(int* borrowed_book);
int return_book(int* borrowed_book);

int main(void) {

	int user_choice;
	int total_book = 0; 
	char book_name[100][30], author_name[100][30], publisher_name[100][30]; 
	int borrowed_book[100];

	while (1) {

		printf("도서 관리 프로그램 \n");
		printf("1. 책 추가하기 \n");
		printf("2. 책 검색하기 \n");
		printf("3. 책 빌리기 \n");
		printf("4. 책 반납하기 \n");
		printf("5. 종료하기 \n");
		printf("\n");

		printf("당신의 선택 : ");
		scanf("%d", &user_choice);
		printf("\n");

		switch (user_choice) {
		case 1:
			add_book(book_name, author_name, publisher_name, borrowed_book, &total_book);
			break;
		case 2:
			search_book(book_name, author_name, publisher_name, total_book);
			break;
		case 3:
			borrow_book(borrowed_book);
			break;
		case 4:
			return_book(borrowed_book);
			break;
		case 5:
			return 0;
		}

	}
}

int add_book(char(*book_name)[30], char(*author_name)[30], char(*publisher_name)[30],
	int* borrowed_book, int* total_book) {

	printf("추가할 책의 제목 : ");
	scanf("%s", book_name[*total_book]);

	printf("추가할 책의 저자 : ");
	scanf("%s", author_name[*total_book]);

	printf("추가할 책의 출판사 : ");
	scanf("%s", publisher_name[*total_book]);

	borrowed_book[*total_book] = 0;
	(* total_book)++;

	printf("\n");

	return 0;
}

int search_book(char(*book_name)[30], char(*author_name)[30], char(*publisher_name)[30],
	int total_book) {	

	int user_input;
	int i;
	char search_book[30];

	printf("1. 책 이름 검색 \n");
	printf("2. 책 저자 검색 \n");
	printf("3. 책 풀판사 검색 \n");
	printf("\n");

	printf("당신의 선택 : ");
	scanf("%d", &user_input);

	printf("검색할 내용 입력 : ");
	scanf("%s", search_book);
	printf("\n");

	switch (user_input) {
	case 1:
		for (i = 0; i < total_book; i++) {
			if (compare(book_name[i], search_book)) {
				printf("책 번호 : %d // 책 이름 : %s // 책 저자 : %s // 책 출판사 : %s \n", i, book_name[i], author_name[i], publisher_name[i]);
			}
		}
		break;
	case 2:
		for (i = 0; i < total_book; i++) {
			if (compare(author_name[i], search_book)) {
				printf("책 번호 : %d // 책 이름 : %s // 책 저자 : %s // 책 출판사 : %s \n", i, book_name[i], author_name[i], publisher_name[i]);
			}
		}
		break;
	case 3:
		for (i = 0; i < total_book; i++) {
			if (compare(publisher_name[i], search_book)) {
				printf("책 번호 : %d // 책 이름 : %s // 책 저자 : %s // 책 출판사 : %s \n", i, book_name[i], author_name[i], publisher_name[i]);
			}
		}
		break;
	}

	printf("\n");

	return 0;
}

int compare(char* str1, char* str2) {
	while (*str1) {
		if (*str1 != *str2) {
			return 0;
		}

		str1++;
		str2++;
	}

	if (*str2 == '\0') return 1;

	return 0;
}

int borrow_book(int* borrowed_book) {

	int user_input;

	printf("빌릴 책 번호 입력 : ");
	scanf("%d", &user_input);

	if (borrowed_book[user_input] == 1)
		printf("이미 대여된 책 입니다 \n");
	else
	{
		printf("책을 정상적으로 대여 했습니다 \n");
		borrowed_book[user_input] = 1;
	}
	printf("\n");
	
	return 0;
}

int return_book(int* borrowed_book) {

	int user_input;

	printf("반납할 책 번호 입력 : ");
	scanf("%d", &user_input);

	if (borrowed_book[user_input] == 0)
		printf("이미 반납한 책 입니다 \n");
	else
	{
		printf("책을 정상적으로 반납 했습니다 \n");
		borrowed_book[user_input] = 0;
	}
	printf("\n");

	return 0;
}

2. search_book 함수는 살짝 지저분한 편이다. 다른 함수를 제작하여 조금 간추릴 수 있겠는가?

(난이도 : 中下)

if~else if 문에서 switch문으로 바꿔서 간결하게 바꿨다.

int search_book(char(*book_name)[30], char(*author_name)[30], char(*publisher_name)[30],
	int total_book) {	

	int user_input;
	int i;
	char search_book[30];

	printf("1. 책 이름 검색 \n");
	printf("2. 책 저자 검색 \n");
	printf("3. 책 풀판사 검색 \n");
	printf("\n");

	printf("당신의 선택 : ");
	scanf("%d", &user_input);

	printf("검색할 내용 입력 : ");
	scanf("%s", search_book);
	printf("\n");

	switch (user_input) {
	case 1:
		for (i = 0; i < total_book; i++) {
			if (compare(book_name[i], search_book)) {
				printf("책 번호 : %d // 책 이름 : %s // 책 저자 : %s // 책 출판사 : %s \n", i, book_name[i], author_name[i], publisher_name[i]);
			}
		}
		break;
	case 2:
		for (i = 0; i < total_book; i++) {
			if (compare(author_name[i], search_book)) {
				printf("책 번호 : %d // 책 이름 : %s // 책 저자 : %s // 책 출판사 : %s \n", i, book_name[i], author_name[i], publisher_name[i]);
			}
		}
		break;
	case 3:
		for (i = 0; i < total_book; i++) {
			if (compare(publisher_name[i], search_book)) {
				printf("책 번호 : %d // 책 이름 : %s // 책 저자 : %s // 책 출판사 : %s \n", i, book_name[i], author_name[i], publisher_name[i]);
			}
		}
		break;
	}

	printf("\n");

	return 0;
}

3. search_book 함수를 조금 개량하여 빌려진 책은 검색결과 출력되지 않게 하거나, "대출됨" 이라는 문구가 출력되게 해보자.

(난이도 : 下)

switch (user_input) {
	case 1:
		for (i = 0; i < total_book; i++) {
			if (compare(book_name[i], search_book)) {
				if (borrowed_book[i] == 0)
					printf("책 번호 : %d // 책 이름 : %s // 책 저자 : %s // 책 출판사 : %s \n", i, book_name[i], author_name[i], publisher_name[i]);
				else
					printf("대출됨");
			}
		}
		break;
	case 2:
		for (i = 0; i < total_book; i++) {
			if (compare(author_name[i], search_book)) {
				if (borrowed_book[i] == 0)
					printf("책 번호 : %d // 책 이름 : %s // 책 저자 : %s // 책 출판사 : %s \n", i, book_name[i], author_name[i], publisher_name[i]);
				else
					printf("대출됨");
			}
		}
		break;
	case 3:
		for (i = 0; i < total_book; i++) {
			if (compare(publisher_name[i], search_book)) {
				if (borrowed_book[i] == 0)
					printf("책 번호 : %d // 책 이름 : %s // 책 저자 : %s // 책 출판사 : %s \n", i, book_name[i], author_name[i], publisher_name[i]);
				else
					printf("대출됨");
			}
			break;
		}	

4. search_book 함수를 개량하여 특정한 검색어를 입력했을 때 그 검색어를 포함하는 문자열도 검색되게 해보자.

(난이도 : 中)
예를 들어 책 제목이 "learnCfast", "learningC", "whatisC?" 일 때, learn 를 검색하면 "learnCfast" 와 "learningC" 가 나온다. 왜냐하면 이들은 모두 "learn 라는 문자열을 포함하고 있기 때문이다.

int compare(char* str1, char* str2) {
	int i=0, j=0, length = 0;

	while (str2[length])
		length++;

	while (str1[i]) {
		if (str1[i] != str2[j]) {
			i++;
		}
		else {
			i++;
			j++;
		}
	}

	if (j == length) {
		return 1;
	}

	return 0;
}

3번 함수에서 compare 함수만 개량했다.
아래에 모든 함수 올림.

#include <stdio.h>

int add_book(char(*book_name)[30], char(*author_name)[30], char(*publisher_name)[30],
	int* borrowed_book, int* total_book);
int search_book(char(*book_name)[30], char(*author_name)[30], char(*publisher_name)[30], 
	int* borrowed_book, int total_book);

int compare(char* str1, char* str2);

int borrow_book(int* borrowed_book);
int return_book(int* borrowed_book);

int main(void) {

	int user_choice;
	int total_book = 0; 
	char book_name[100][30], author_name[100][30], publisher_name[100][30]; 
	int borrowed_book[100];

	while (1) {

		printf("도서 관리 프로그램 \n");
		printf("1. 책 추가하기 \n");
		printf("2. 책 검색하기 \n");
		printf("3. 책 빌리기 \n");
		printf("4. 책 반납하기 \n");
		printf("5. 종료하기 \n");
		printf("\n");

		printf("당신의 선택 : ");
		scanf("%d", &user_choice);
		printf("\n");

		switch (user_choice) {
		case 1:
			add_book(book_name, author_name, publisher_name, borrowed_book, &total_book);
			break;
		case 2:
			search_book(book_name, author_name, publisher_name, borrowed_book, total_book);
			break;
		case 3:
			borrow_book(borrowed_book);
			break;
		case 4:
			return_book(borrowed_book);
			break;
		case 5:
			return 0;
		}

	}
}

int add_book(char(*book_name)[30], char(*author_name)[30], char(*publisher_name)[30],
	int* borrowed_book, int* total_book) {

	printf("추가할 책의 제목 : ");
	scanf("%s", book_name[*total_book]);

	printf("추가할 책의 저자 : ");
	scanf("%s", author_name[*total_book]);

	printf("추가할 책의 출판사 : ");
	scanf("%s", publisher_name[*total_book]);

	borrowed_book[*total_book] = 0;
	(* total_book)++;

	printf("\n");

	return 0;
}

int search_book(char(*book_name)[30], char(*author_name)[30], char(*publisher_name)[30],
	int* borrowed_book, int total_book) {

	int user_input;
	int i;
	char search[30];

	printf("1. 책 이름 검색 \n");
	printf("2. 책 저자 검색 \n");
	printf("3. 책 풀판사 검색 \n");
	printf("\n");

	printf("당신의 선택 : ");
	scanf("%d", &user_input);

	printf("검색할 내용 입력 : ");
	scanf("%s", search);
	printf("\n");

	switch (user_input) {
	case 1:
		for (i = 0; i < total_book; i++) {
			if (compare(book_name[i], search)) {
				if (borrowed_book[i] == 0)
					printf("책 번호 : %d // 책 이름 : %s // 책 저자 : %s // 책 출판사 : %s \n", i, book_name[i], author_name[i], publisher_name[i]);
				else
					printf("대출됨");
			}
		}
		break;
	case 2:
		for (i = 0; i < total_book; i++) {
			if (compare(author_name[i], search)) {
				if (borrowed_book[i] == 0)
					printf("책 번호 : %d // 책 이름 : %s // 책 저자 : %s // 책 출판사 : %s \n", i, book_name[i], author_name[i], publisher_name[i]);
				else
					printf("대출됨");
			}
		}
		break;
	case 3:
		for (i = 0; i < total_book; i++) {
			if (compare(publisher_name[i], search)) {
				if (borrowed_book[i] == 0)
					printf("책 번호 : %d // 책 이름 : %s // 책 저자 : %s // 책 출판사 : %s \n", i, book_name[i], author_name[i], publisher_name[i]);
				else
					printf("대출됨");
			}
			break;
		}

		printf("\n");

		return 0;
	}
}

int compare(char* str1, char* str2) {
	int i=0, j=0, length = 0;

	while (str2[length])
		length++;

	while (str1[i]) {
		if (str1[i] != str2[j]) {
			i++;
		}
		else {
			i++;
			j++;
		}
	}

	if (j == length) {
		return 1;
	}

	return 0;
}

int borrow_book(int* borrowed_book) {

	int user_input;

	printf("빌릴 책 번호 입력 : ");
	scanf("%d", &user_input);

	if (borrowed_book[user_input] == 1)
		printf("이미 대여된 책 입니다 \n");
	else
	{
		printf("책을 정상적으로 대여 했습니다 \n");
		borrowed_book[user_input] = 1;
	}
	printf("\n");
	
	return 0;
}

int return_book(int* borrowed_book) {

	int user_input;

	printf("반납할 책 번호 입력 : ");
	scanf("%d", &user_input);

	if (borrowed_book[user_input] == 0)
		printf("이미 반납한 책 입니다 \n");
	else
	{
		printf("책을 정상적으로 반납 했습니다 \n");
		borrowed_book[user_input] = 0;
	}
	printf("\n");

	return 0;
}

0개의 댓글