티스토리 뷰
안녕하세요! 이번시간에는 저번 시간에 이어서 C언어 콘서트 12장 Programming 문제를 풀어보았습니다. 그 전 장들의 문제에 대한 링크는 아래에 있으니 참조하실 분은 해주시기를 바랍니다.
2018/11/21 - [IT 공부 및 일상] - C언어 콘서트 9장 포인터 Programming 문제
2018/11/22 - [IT 공부 및 일상] - C언어 콘서트 10장 문자와 문자열 Programming 문제
2018/11/25 - [IT 공부 및 일상] - C언어 콘서트 11장 구조체 Programming 문제
1번 문제
두 개의 파일이름을 입력받고 해당하는 파일들을 읽어와서 배열에 대입한 다음에 strcmp 함수로 비교합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include<stdio.h> #include<string.h> int main1(void) { FILE *fp; char filename1[100], filename2[100]; char file1_context[100], file2_context[100]; printf("첫번째 파일 이름: "); scanf("%s", filename1); printf("두번째 파일 이름: "); scanf("%s", filename2); if ((fp = fopen(filename1, "r")) == NULL) { fprintf(stderr, "%s 파일을 열 수가 없습니다.\n", filename1); return 0; } while (!feof(fp)) fgets(file1_context, 100, fp); fclose(fp); if ((fp = fopen(filename2, "r")) == NULL) { fprintf(stderr, "%s 파일을 열 수가 없습니다.\n", filename2); exit(1); } while (!feof(fp)) fgets(file2_context, 100, fp); fclose(fp); if (strcmp(file1_context, file2_context) == 0) printf("두 파일은 서로가 같습니다.\n"); else printf("두 파일은 서로가 다릅니다.\n"); return 0; } | cs |
2번 문제
파일이 없다고 가정하고 처음부터 파일을 만든 다음에 다시 불러오는 방식으로 코드를 작성하였고 당일 매출이 월간 매출 파일의 끝 단에 붙여졌는지 확인하기 위해 위치 표시자 fseek 함수를 사용하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include<stdio.h> #include<stdlib.h> int main2(void) { FILE *fp1, *fp2; fp1 = NULL; fp2 = NULL; char fname1[20], fname2[20]; int mon_sales[] = { 100, 300, 200, 100, 200, 300, 300, 200, 300, 100, 100, 300, 200, 100, 200, 300, 300, 200, 300, 100, 100, 300, 200, 100, 200, 300, 300, 200, 300, 100, }; int tod_sale[] = { 400 }; int add_sale[] = { 0 }; int cmp_sale; printf("첫번째 파일 이름: "); gets(fname1); printf("두번째 파일 이름: "); gets(fname2); if ((fp1 = fopen(fname1, "wb")) == NULL) { fprintf(stderr, "실패!"); return 1; } else fwrite(mon_sales, sizeof(int), sizeof(mon_sales) / sizeof(mon_sales[0]), fp1); fclose(fp1); if ((fp2 = fopen(fname2, "wb")) == NULL) { fprintf(stderr, "실패!"); return 1; } else fwrite(tod_sale, sizeof(int), 1, fp2); fclose(fp2); if ((fp2 = fopen(fname2, "rb")) == NULL) { fprintf(stderr, "실패!"); return 1; } else fread(add_sale, sizeof(int), 1, fp2); if ((fp1 = fopen(fname1, "ab")) == NULL) { fprintf(stderr, "실패!"); return 1; } else { fwrite(add_sale, sizeof(int), 1, fp1); } fclose(fp1); if ((fp1 = fopen(fname1, "rb")) == NULL) { fprintf(stderr, "실패!"); return 1; } else { fseek(fp1, -4L, SEEK_END); fread(&cmp_sale, sizeof(int), 1, fp1); } fclose(fp1); if (cmp_sale == add_sale[0]) printf("mon_sales.dat에 tod_sale.dat가 추가되었습니다."); return 0; } | cs |
3번 문제
파일에서의 위치의 끝 부분을 fgets 함수에서 반환된 포인터로 확인하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include<stdio.h> #include<stdlib.h> int main(void) { char filename[10]; char buffer[100]; int count = 1; FILE *fp; printf("파일 이름을 입력하시오: "); scanf("%s", filename); if ((fp = fopen(filename, "r")) == NULL) { fprintf(stderr, "%s 파일을 열 수가 없습니다", filename); exit(1); } while (fgets(buffer, 100, fp) != NULL) { printf("%d %s\n", count, buffer); count++; } fclose(fp); return 0; } | cs |
4번 문제
"컨트롤 + Z"는 입력버퍼에서 아무런 값이 입력되지 않으니 fgets 함수에 stdin을 대입하고 반환된 값이 NULL인지를 체크합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include<stdio.h> int main(void) { FILE *fp; char input[20]; char buffer[100]; printf("파일 이름을 입력하시오: "); gets(input); rewind(stdin); if ((fp = fopen(input, "w")) == NULL) { fprintf(stderr, "실패!"); return 1; } while (1) { char *p = fgets(buffer, sizeof(buffer), stdin); if (p == NULL) break; fputs(buffer, fp); } fclose(fp); return 0; } | cs |
5번 문제
두 개의 파일에서 값을 읽어서 값이 일치하는 경우와 일치하지 않는 경우를 구분하는데 일치하지 않는 경우에는 동일한 라인에서 두 개의 값이 문자열일 수도 있고 아니면 하나는 문자열 다른 하나는 NULL 값이 있기 때문에 이를 조건문을 통해 구현하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include<stdio.h> #include<string.h> int main5(void) { FILE *fp1, *fp2; char fname1[20], fname2[20]; char buffer_1[100]; char buffer_2[100]; printf("첫번째 파일 이름: "); gets(fname1); rewind(stdin); printf("두번째 파일 이름: "); gets(fname2); rewind(stdin); if ((fp1 = fopen(fname1, "r")) == NULL) { fprintf(stderr, "실패!"); return 1; } if ((fp2 = fopen(fname2, "r")) == NULL) { fprintf(stderr, "실패!"); return 1; } while (1) { char *c1 = fgets(buffer_1, 100, fp1); char *c2 = fgets(buffer_2, 100, fp2); if (c1 == NULL || c2 == NULL) { if (c1 == NULL && c2 == NULL) break; printf("<< %s\n>> %s\n", buffer_1, buffer_2); return 1; } if (strcmp(buffer_1, buffer_2) != 0) { printf("<< %s>> %s", buffer_1, buffer_2); return 1; } } fclose(fp1); fclose(fp2); printf("파일은 서로 일치함"); return 0; } | cs |
6번 문제
3개의 줄을 한번에 출력하도록 만들었습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include<stdio.h> #include<conio.h> int main6(void) { FILE *fp; char fname[20]; char buffer[100]; char c; printf("파일 이름: "); gets(fname); if ((fp = fopen(fname, "r")) == NULL) { fprintf(stderr, "실패!"); return 1; } while ((c = getch()) != -1) { for (int i = 0; i < 3; i++) { char *cv = fgets(buffer, 100, fp); if (cv == NULL) return 1; printf("%s", buffer); } } fclose(fp); return 0; } | cs |
7번 문제
책을 입력하는 함수와 검색하는 함수, 제거하는 함수를 만들고 입력받은 정수 값을 switch 문을 통해서 구분시켜서 구현하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct book { char title[20]; char author[20]; char press[20]; }BOOK; void input_bookitem(BOOK *book, char *fname, int *count) { FILE *fp; printf("도서의 이름: "); gets_s(book[*count].title, 20); rewind(stdin); printf("저자: "); gets_s(book[*count].author, 20); rewind(stdin); printf("출판사명: "); gets_s(book[*count].press, 20); rewind(stdin); if ((fp = fopen(fname, "r+")) == NULL) { fprintf(stderr, "실패!"); exit(1); } fseek(fp, 0L, SEEK_END); fprintf(fp, "%s\n%s\n%s\n", book[*count].title, book[*count].author, book[*count].press); fclose(fp); (*count)++; } int search_bookitem(BOOK *book, char *fname, int *count) { FILE *fp; BOOK book_info; char book_title[20]; int num = *count; printf("찾고있는 책 제목을 입력하시오: "); gets_s(book_title, sizeof(book_title)); rewind(stdin); if ((fp = fopen(fname, "r")) == NULL) { fprintf(stderr, "실패!"); exit(1); } while (num--) { fscanf(fp, "%s%s%s", book_info.title, book_info.author, book_info.press); if (strcmp(book_info.title, book_title) == 0) { return 1; } } return 0; } void remove_bookitem(BOOK *book, char *fname, int *count) { FILE *fp; BOOK book_temp[29]; char rm_item[20]; int num = *count; int step = 0; printf("삭제하려는 책 제목을 입력하시오: "); gets_s(rm_item, 20); rewind(stdin); if ((fp = fopen(fname, "r")) == NULL) { fprintf(stderr, "실패!"); exit(1); } while (num--) { fscanf(fp, "%s%s%s", book_temp[step].title, book_temp[step].author, book_temp[step].press); step++; if (strcmp(book_temp[step-1].title, rm_item) == 0) { step--; (*count)--; } } fclose(fp); if ((fp = fopen(fname, "w")) == NULL) { fprintf(stderr, "실패!"); exit(1); } for (int i = 0; i <= step; i++) { fprintf(fp, "%s\n%s\n%s\n", book_temp[i].title, book_temp[i].author, book_temp[i].press); } fclose(fp); } int main(void) { FILE *fp; BOOK book_array[30]; char fname[] = "book_database.c"; int number; int count = 0, result; if ((fp = fopen(fname, "w")) == NULL) { fprintf(stderr, "실패!"); exit(1); } fclose(fp); do { printf("메뉴\n"); printf("1. 입력\n"); printf("2. 탐색\n"); printf("3. 삭제\n"); printf("4. 종료\n"); printf("번호를 입력하시오: "); scanf("%d", &number); rewind(stdin); switch (number) { case 1: input_bookitem(book_array, fname, &count); break; case 2: result = search_bookitem(book_array, fname, &count); if(result) printf("데이터베이스에 존재합니다.\n"); else printf("데이터베이스에 존재하지 않습니다.\n"); break; case 3: remove_bookitem(book_array, fname, &count); break; case 4: return 1; default: printf("올바른 값을 입력하세요!\n"); break; } } while (1); return 0; } | cs |
8번 문제
0 하나가 입력된 파일을 만들어 저장하다는 가정하에 모드를 "r+"로 파일에서 값을 읽어서 1을 증가시킨 다음에 다시 파일에 입력합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include<stdio.h> int main(void) { FILE *fp; char fname[] = "test8.c"; int count; if ((fp = fopen(fname, "r+")) == NULL) { fprintf(stderr, "실패!"); return 1; } else { fscanf(fp, "%d", &count); count++; fseek(fp, 0L, SEEK_SET); fprintf(fp, "%d", count); } fclose(fp); printf("현재 %d번째 실행입니다.", count); return 0; } | cs |
'IT 공부 및 일상' 카테고리의 다른 글
C언어 콘서트 14장 동적 메모리 Programming 문제 (0) | 2018.12.11 |
---|---|
C언어 콘서트 13장 전처리 및 기타 기능 Programming 문제 (0) | 2018.12.11 |
C언어 콘서트 11장 구조체 Programming 문제 (0) | 2018.11.25 |
C언어 콘서트 10장 문자와 문자열 Programming 문제 (0) | 2018.11.22 |
C언어 콘서트 9장 포인터 Programming 문제 (0) | 2018.11.21 |
- Total
- Today
- Yesterday
- 서치콘솔
- 애플
- 자바
- sitemap
- HTML
- 네이버
- C언어 콘서트
- 이클립스
- 구글
- 동미참
- MAC
- 함수
- vmware
- 크롬
- RSS
- 태움
- 웹마스터도구
- 인공지능
- 예비군
- 아나콘다
- 윈도우10
- 파이썬
- C언어
- 구글 웹마스터도구
- 애드센스
- 사이트맵
- 학생예비군
- 애널리틱스
- 안드로이드
- 가상머신
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |