도서대여프로그램 with C
이런 큰(?)프로그램은 처음만들어본다. 문법공부하고 내가 배운 걸로 뭐하나라도 만들어봐야겠다해서 만든 프로그램이다. 내가 배운 점을 요약해봤다.
1. 디버깅을 할 줄 아는 개발자가 되자
처음에는 오류가 나면 무조건 그 오류코드복사해서 구글링했는데, 가만히 생각해보면 오류메세지를 읽지도 않고 구글링한 것도 대부분이거니와, 오류를 읽지도않고 답답한 마음만 앞섰다. 해서 차분하게 오류메세지읽고 차분하게..(가능할까..?)디버깅하는 습관을 들이자. 메모리누수도 메모리주소까지 보면서 코드를 짜려면 많이 연습하고 공부해야겠단 생각이 든다.
2. 문법적으로나 메모리관리측면으로나 구조적으로나 어느것이 좀 더 나은 표현이고 어떤 코드가 맞는 코드인지를 많이 배웠다. 처음 내가 짠 코드들은 허점이 너무도 많았다(지금도 허점투성이지만..).
1) (p_book + i)->name; 과 *(p_book + i)->name; 의 차이점은?
2)p_book->name; 과 (*p_book)->name;의 차이점은?
3)p_book->name(자료형 char 배열)과 p_book->birthday(자료형 int)의 차이점은?
4)compare문자열비교함수
5)구조체를 가르키는 포인터의 초기화
무조건 초기화는 NULL로 하는 줄 알았다, 해서 구조체를 가르키는 포인터를 NULL로 넣고 scanf로 구조체를 가리키는 포인터에 구조체안의 변수에 값을 넣을려고 보면 항상 주소가 NULL이라서 의아했었다.. 하지만 다시 한번 깨달았다. 포인터는 그저 어떤 변수의 메모리주소를 담고있는 변수라고 특별히 그 메모리주소에가서 값을 넣을 수 있는 것뿐이라고.구조체를 가르키는 포인터에서 이런 문법적인 부분이 많이 헷갈렸다. 컴파일 오류를 고치느라 급급하면 어느새 고쳐서 작동되고 있었지만 내 머리속으로는 이해하지 못해 답답한 부분이였다. 포인터가 조금 헷갈렸지만 이 프로그램하면서 조금 친숙해진 것같다. 운동이나 영어회화처럼 프로그래밍도 훈련, 연습과 공부이 실력과 비례한 것같다. 노력으로 나아질 수 있다는 희망이 너무 기쁘다.
다른 사람이 짠 코드를 보다가 내 코드를 보면 너무 지저분하고 가독성도 떨어지지만,, 더 나아지겠지라며 믿는다..
#include <stdio.h>
#include <string.h>
#include <iostream>
#define MAX_NAME_COUNT 30
#define MAX_ARRAY_COUNT 50;
#pragma warning(disable:4996)
struct Book {
char name[MAX_NAME_COUNT];
char author[MAX_NAME_COUNT];
unsigned char borrow = 1;
};
struct Member {
char name[MAX_NAME_COUNT];
int birthday;
};
int compare(char* str1, char* str2);
void AddMember(Member* p_member, int* member_count);
void ShowMember(Member* p_member, int* member_count);
void AddBook(Book* p_book, int* book_count);
void ShowBookList(Book* p_book, int* book_count);
void DeletBook(Book* p_book);
void ReviseBook(Book* p_book);
void BorrowBooK(Book* p_book, Member* p_member, int* member_count, int* book_count);
void main()
{
Member member[50];
Book book[50];
int member_num = 0, book_num = 0;
int count = 1;
while (count != 7) {
printf("--- < 도서관에 오신 것을 환영합니다>---\n");
printf("0. 회원가입\n");
printf("1. 회원 목록\n");
printf("2. 도서 추가\n");
printf("3. 도서 삭제\n");
printf("4. 도서 수정\n");
printf("5. 도서 목록\n");
printf("6. 도서 대여\n");
printf("7. 관리 종료\n");
printf("--------------------\n");
printf("--->메뉴선택");
scanf("%d", &count);
if (count == 0)AddMember(member, &member_num);
else if (count == 1)ShowMember(member, &member_num);
else if (count == 2)AddBook(book,&book_num);
else if (count == 3)DeletBook(book);
else if (count == 4)ReviseBook(book);
else if (count == 5)ShowBookList(book, &book_num);
else if (count == 6)BorrowBooK(book,member,&member_num,&book_num);
else if (count == 7)break;
}
}
int compare(char* str1, char* str2) {
while (*str1) {
if (*str1 != *str2) {
return 0;
}
str1++;
str2++;
}
if (*str2 == '\0') return 1;
return 0;
}
void AddMember(Member* p_member, int* member_count)
{
for (int i = (*member_count); i == (*member_count); i++) {
printf("\n");
printf("< 회원가입란 > \n");
printf("%dth\n", (*member_count));
printf("이름 : ");
scanf("%s", &((p_member + i)->name));
printf("생년월일 : ");
scanf("%d", &((p_member + i)->birthday));
}
(*member_count)++;
}
void ShowMember(Member* p_member, int* member_count)
{
for (unsigned char i = 0; i < (*member_count); i++) {
printf("회원번호 : %d\n", i);
printf("이름 : %s\n", (p_member + i)->name);
printf("생년월일 : %d\n", (p_member + i)->birthday);
printf("\n");
}
}
void AddBook(Book* p_book, int* book_count)
{
for (int i = (*book_count); i == (*book_count); i++) {
printf("\n");
printf("< 책추가 > \n");
printf("%dth\n", (*book_count));
printf("책이름 : ");
scanf("%s", &((p_book + i)->name));
printf("지은이 : ");
scanf("%s", &((p_book + i)->author));
}
(*book_count)++;
}
void ShowBookList(Book* p_book, int* book_count)
{
for (int i = 0; i < (*book_count); i++) {
if ((p_book + i)->borrow == 3)printf("\n");
else {
printf("\n이름 : %s\n", (p_book + i)->name);
printf("지은이 : %s\n", (p_book + i)->author);
}
if ((p_book)->borrow == 1) printf("대여 가능합니다.\n");
else if ((p_book)->borrow == 0) printf("대여 중입니다.\n");
}
}
void DeletBook(Book* p_book)
{
Book book_temp = { 0, };
Book* pbook_temp = &book_temp;
unsigned char for_compare;
int i = 0;
printf("어떤 도서 삭제를 원하시나요 ? :");
scanf("%s", pbook_temp->name);
for (i = 0; (p_book + i)->name != pbook_temp->name; i++) {
for_compare = compare((p_book + i)->name, pbook_temp->name);
if (for_compare == 1) {
*(p_book + i)->name = NULL;
*(p_book + i)->author = NULL;
(p_book + i)->borrow = 3;
printf("삭제되었습니다. \n");
break;
}
}
}
void ReviseBook(Book* p_book)
{
Book book_temp = { 0, };
Book* pbook_temp = &book_temp;
unsigned char for_compare;
int i = 0;
printf("어떤 도서 수정을 원하시나요? :");
scanf("%s", pbook_temp->name);
for (i = 0; (p_book + i)->name != pbook_temp->name; i++) {
for_compare = compare((p_book + i)->name, pbook_temp->name);
if (for_compare == 1) {
printf("<%s 수정란>\n", (p_book + i)->name);
printf("이름 : ");
scanf("%s", pbook_temp->name);
printf("지은이 : ");
scanf("%s", pbook_temp->author);
*(p_book + i)->name = *pbook_temp->name;
*(p_book + i)->author = *pbook_temp->author;
printf("수정되었습니다. \n");
break;
}
}
}
void BorrowBooK(Book* p_book, Member* p_member, int* member_count, int* book_count)
{
Book book_temp;
Member member_temp;
Book* pbook_temp = &book_temp;
Member* pmember_temp = &member_temp;
int i, j, for_compare;
printf("회원이름 : ");
scanf("%s", pmember_temp->name);
for (i = 0; i < (*member_count); i++) {
for_compare = compare((p_member + i)->name, pmember_temp->name);
if (for_compare == 1) {
printf("빌릴 책 제목 : ");
scanf("%s", pbook_temp->name);
for (j = 0; j < (*book_count); j++) {
for_compare = compare((p_book + j)->name, pbook_temp->name);
if (for_compare == 1) {
(p_book + j)->borrow = 0;
printf("대여 완료되었습니다.\n");
}
}
}
else printf("책 제목이 일치하지 않습니다.\n");
}
}