간단한 도서 관리 프로그램을 작성하라. 제목, 저자명, 페이지 수에 대한 정보를 저장할 수 있는 구조체를 정의하고 구조체 배열을 선언하는 방식으로 한다. main 함수에서는 사용자로부터 3권의 도서에 대해 정보를 입력받고 입력이 끝나면 도서정보를 출력하라.
main.c 파일
#include <stdio.h>
#include "stbook.h"
int main(void) {
Book bookList[3];
printf("도서 정보 입력\n");
for (int i = 0; i < sizeof(bookList) / sizeof(Book); i++) {
printf("저자 : ");
fgets(bookList[i].author, sizeof(bookList[i].author), stdin);
printf("제목 : ");
fgets(bookList[i].title, sizeof(bookList[i].title), stdin);
printf("페이지 수 : ");
scanf("%d", &bookList[i].pages);
getchar();
}
printf("\n도서 정보 출력\n");
for (int i = 0; i < sizeof(bookList) / sizeof(Book); i++) {
printf("book %d\n", i + 1);
printf("저자 : ");
fputs(bookList[i].author, stdout);
printf("제목 : ");
fputs(bookList[i].title, stdout);
printf("페이지 수 : %d\n", bookList[i].pages);
}
}
stbook.h 파일
typedef struct book {
char author[15];
char title[30];
int pages;
}Book;
도서 정보 입력
저자 : Lee
제목 : study C
페이지 수 : 500
저자 : Kim
제목 : study CPP
페이지 수 : 550
저자 : Jung
제목 : study Java
페이지 수 : 700
_
도서 정보 출력
book 1
저자 : Lee
제목 : study C
페이지 수 : 500
book 2
저자 : Kim
제목 : study CPP
페이지 수 : 550
book 3
저자 : Jung
제목 : study Java
페이지 수 : 700
문제1에서 구현한 프로그램을 변경하여, 구조체 배열을 선언하지 않고 구조체 포인터 배열을 선언한 뒤 구조체 변수를 동적으로 할당하는 방식으로 구현하라.
main.c 파일
#include <stdio.h>
#include <stdlib.h>
#include "stbook.h"
int main(void) {
Book *bookList[3];
printf("도서 정보 입력\n");
for (int i = 0; i < sizeof(bookList) / sizeof(Book*); i++) {
Book* ptr = malloc(sizeof(bookList));
printf("저자 : ");
fgets(ptr -> author, sizeof(ptr->author), stdin);
printf("제목 : ");
fgets(ptr->title, sizeof(ptr->title), stdin);
printf("페이지 수 : ");
scanf("%d", &ptr->pages);
getchar();
bookList[i] = ptr;
}
printf("\n도서 정보 출력\n");
for (int i = 0; i < sizeof(bookList) / sizeof(Book*); i++) {
printf("book %d\n", i + 1);
printf("저자 : ");
fputs(bookList[i]->author, stdout);
printf("제목 : ");
fputs(bookList[i]->title, stdout);
printf("페이지 수 : %d\n", bookList[i]->pages);
}
}
stbook.h 파일
typedef struct book {
char author[15];
char title[30];
int pages;
}Book;
도서 정보 입력
저자 : Lee
제목 : study C
페이지 수 : 500
저자 : Kim
제목 : study CPP
페이지 수 : 550
저자 : Jung
제목 : study java
페이지 수 : 700
.
도서 정보 출력
book 1
저자 : Lee
제목 : study C
페이지 수 : 500
book 2
저자 : Kim
제목 : study CPP
페이지 수 : 550
book 3
저자 : Jung
제목 : study java
페이지 수 : 700
문자열을 저장하고 있는 파일을 열어 A와 P로 시작하는 단어의 수를 세어서 출력하는 프로그램을 작성하라. 모든 단어는 공백 문자(스페이스바, \t
, \n
)에 의해 구분된다.
#include <stdio.h>
int main(int argc, char *argv[]) {
FILE* fp = fopen(argv[1], "rt"); //문자열의 배열 argv. 첫 번째 문자열은 프로그램의 실행 경로로 고정.
if (fp == NULL)printf("file open failed\n");
int Anum = 0, Pnum = 0;
int ret;
char word[10];
do{
ret = fscanf(fp, "%s", word);
if (word[0] == 'A')
Anum++;
else if (word[0] == 'P')
Pnum++;
} while (ret != EOF);
printf("A로 시작하는 단어의 수 : %d\n", Anum);
printf("P로 시작하는 단어의 수 : %d\n", Pnum);
fclose(fp);
return 0;
}
text.txt 내용
파일 입출력 부분에서 약간 헤매었지만 재미있었다.
교재의 가이드에 따르면 공백 문자를 기준으로 단어를 분류하므로, 공백을 기준으로 문자열을 구분하는 fscanf 함수를 사용하는 편이 좋다고 하여 참고했다.(scanf 함수 또한 공백을 기준으로 문자열 구분)
그리고 텍스트 파일은 Debug 파일에 exe 파일과 같이 존재해야 정상 작동한다.
두 개의 텍스트 파일 내용이 동일한지 아닌지를 확인하는 프로그램을 작성하라. 공백문자 하나라도 다른 경우 두 텍스트 파일은 다른 것으로 한다.
#include <stdio.h>
int main(int argc, char *argv[]) {
FILE* fp1 = fopen(argv[1], "rt");
FILE* fp2 = fopen(argv[2], "rt");
if (fp1 == NULL || fp2 == NULL)printf("file open failed\n");
char c1, c2;
do {
c1 = fgetc(fp1);
c2 = fgetc(fp2);
if (c1 != c2) {
printf("두 파일의 내용이 일치하지 않습니다.\n");
fclose(fp1);
fclose(fp2);
return 0;
}
} while (c1 != EOF && c2 != EOF);
if(c1 == EOF && c2 == EOF)
printf("두 파일의 내용이 일치합니다.\n");
else
printf("두 파일의 내용이 일치하지 않습니다.\n");
fclose(fp1);
fclose(fp2);
return 0;
}
텍스트 파일의 내용
코드의 중복된 부분이 많은데 이 부분을 없앨수는 없을까?
#include <stdio.h>
int main(int argc, char *argv[]) {
FILE* fp1 = fopen(argv[1], "rt");
FILE* fp2 = fopen(argv[2], "rt");
if (fp1 == NULL || fp2 == NULL)printf("file open failed\n");
char c1, c2;
while (1) {
c1 = fgetc(fp1);
c2 = fgetc(fp2);
if (c1 != c2) {
printf("두 파일의 내용이 일치하지 않습니다.\n");
break;
}
else if (c1 == EOF && c2 == EOF) {
printf("두 파일의 내용이 일치합니다.\n");
break;
}
}
fclose(fp1);
fclose(fp2);
return 0;
}
이렇게 하면 중복된 부분도 제거되고 깔끔해진다. 근데 뭔가 다른 케이스에서 오류가 나지는 않을지 찜찜하다. 이 코드가 더 맞는 코드겠지? 놓친 부분이 있는지 자꾸 신경쓰인다.😂
열혈 C 교재는 여기서 마무리하도록 하겠다.
전에 공부했을 때와 비슷하게 문자열 처리나 파일 입출력을 꼼꼼히 보지는 못한 것 같다.
그래도 그 때 못 풀었던 예제들을 차근차근 풀 수 있어서 좋았다.
너무 시간을 많이 잡아먹은 것 같아 빨리 속도 내서 다른 프로그래밍 언어들과 CS지식을 공부해야겠다.