티스토리 뷰

반응형


안녕하세요! 이번시간에는 저번 시간에 이어서 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[] = { 100300200100200300300200300100,
                        100300200100200300300200300100,
                        100300200100200300300200300100, };
    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 *= 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


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함