C언어 도서관 관리 프로그램 - ceon-eo doseogwan gwanli peulogeulaem

easy software

C언어/구조체

C언어 구조체 배열을 이용한 간단한 도서관리 프로그램

JAVA 웹개발자 2015. 2. 16. 20:21

뭐, 제목은 거창하게 지어놨는데 도서관리 프로그램이라고 하기 조금 어려운 수준입니다.

구조체의 멤버로는 저자, 제목, 페이지가 있습니다.

main 함수에서는 총 3권의 책에 대한 정보를 입력받고, 입력이 끝나면 책의 정보를 출력해줍니다.

#include <stdio.h>

void clearBuffer(void);

//책의 정보를 저장하는 구조체
typedef struct book{
     char author[10]; //저자
     char name[30]; //제목
     int page; //페이지
}Book;

int main(void){
     Book b[3]; //구조체 배열선언

     printf("도서 정보 입력\n");

     //사용자로부터 세 권의 책 정보를 입력받아
     //구조체 배열에 저장
     for (int i = 0; i < 3; i++){
          putchar('\n');//줄바꿈

          //스페이스바(띄어쓰기 및 공백)를 문자열에 포함
          //시키기 위하여 scanf대신 fgets을 사용
          fputs("저자 : ", stdout);
          fgets(b[i].author, sizeof(b[i].author), stdin);

          fputs("제목 : ", stdout);
          fgets(b[i].name, sizeof(b[i].name), stdin);

          fputs("페이지 수 : ", stdout);
          scanf("%d", &b[i].page);
  
          //scanf로 입력받을때 사용자가 엔터를 누름
          //입력 버퍼에는 데이터를 제외한 엔터가 남게됨
          //그 엔터를 제거하기 위해 clearBuffer를 호출
          clearBuffer();
     }

     fputs("\n\n\n도서 정보 출력\n", stdout);

     //사용자로부터 입력받은 책 정보를 출력
     for (int i = 0; i < 3; i++){
          printf("\nbook %d \n", i+1);

          //fputs로 사용자가 입력시 엔터가 문자열에 포함되므로
          //굳이 줄바꿈인 \n를 해줄 필요가 없음
          printf("저자 : %s", b[i].author);
          printf("제목 : %s", b[i].name);
          printf("페이지 수 : %d \n", b[i].page);
     }

     return 0;
}

void clearBuffer(void){
     //입력버퍼에 문자가 들어있으면,
     //문자를 모두 소모하여 버퍼를 비워버림
     //단순히 사용만하고 저장하지 않으면 비워지게 되는 원리 이용
     while (getchar() != '\n');
}

위의 코드에 대해 설명드릴 내용이 많습니다.

다만, clearBuffer라는 함수는 제 블로그에서

'입력버퍼를 비우는 함수' 라고 검색하면 설명을 바로 보실 수 있기 때문에 생략하겠습니다.

일단 구조체를 하나 정의해서 문자열과 정수를 저장할 수 있는 멤버를 선언합니다.

이후에 main함수에서 길이가 3인 구조체 배열을 선언했습니다.

이 구조체 배열은 아래와 같습니다.

C언어 도서관 관리 프로그램 - ceon-eo doseogwan gwanli peulogeulaem

사용자가 책 한권의 정보를 입력하면 b[0]의 멤버에 저장됩니다.

그리고 두번째는 b[1]에 저장됩니다.

코드를 보면 출력할때 printf함수만 사용한게 아니라, putchar와 fputs도 사용하고 있는데요,

다양한 출력문을 보여드리기 위해 저렇게 작성했습니다.

코드 중간에 사용자로부터 책에 대한 정보를 사용자로부터 입력받고 있습니다.

그런데 저자와 제목은 scanf가 아닌 fgets를 사용하고 있습니다.

이유는 scanf는 띄어쓰기로 문자열을 구분합니다.

즉, "Hong Kim Lee" 를 입력하면 Hong만 인식하는 것입니다.

그런데 fgets는 띄어쓰기도 문자로 인식하기 때문에 scanf대신 사용한 것입니다.

입력을 받을 때 또 한가지 특이한 점은 page를 입력받을 때만 & 연산자를 사용했다는 점입니다.

배열을 전달한다는 것은, 배열의 첫번째 주소를 전달한다는 것이기 때문에

문자열을 입력받을 때에는 & 연산자를 사용하지 않은 것입니다.

단, int형인 page를 입력받을 때에는 & 연산자를 사용하여 주소값을 전달하고 있습니다.

잘 이해가 되지 않는다면, 제 블로그에서 포인터와 배열에 관한 카테고리를 공부해 보세요.

이렇게 제목만 거창하고 실상은? 조금 허접해 보일 수 있는 도서관리 프로그램을 보셨습니다.

작은 프로그램이지만, 참 많은 내용을 포함하고 있는 좋은 문제입니다.

출력결과