티스토리 뷰

반응형


안녕하세요! 오늘 시간에도 지난 시간에 이어서 C언어 콘서트의 문제를 올려보도록 하겠습니다.(개인적인 공부목적입니다) 문제는 10장에 이은 11장 구조체에 관한 문제이고 9장과 10장에 대한 문제는 아래 링크를 달아놨으니 궁금하신 분들은 참고하시기를 바랍니다. 


2018/11/21 - [IT 공부 및 일상] - C언어 콘서트 9장 포인터 Programming 문제


2018/11/22 - [IT 공부 및 일상] - C언어 콘서트 10장 문자와 문자열 Programming 문제


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
25
26
#include<stdio.h>
 
typedef struct email {
    char title[20];
    char receiver[20];
    char sender[20];
    char context[100];
    int ymd;
    int rank;
}EMAIL;
 
int main(void) {
    EMAIL e1 = {
        "제목",
        "발신자",
        "수신자",
        "내용입니다.",
        20181124,
        0
    };
 
    printf("본 이메일의 개요\n제목: %s\n발신자: %s\n수신자: %s\n내용: %s\n날짜: %d\n순위: %d"
        e1.title, e1.receiver, e1.sender, e1.context, e1.ymd, e1.rank);
 
    return 0;
}
cs



2번 문제

음식을 이루는 정보들로 이름과 칼로리를 지정해서 이를 구조체로 만들고 여러 음식을 입력할 수 있게 구조체를 배열로 만들고 입력이 끝난 후에 음식들의 총 칼로리를 계산합니다.


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
#include<stdio.h>
 
typedef struct food {
    char f_name[20];
    int f_clorie;
}FOOD;
 
int cal_total_calories(FOOD *f);
 
int main(void) {
    FOOD f_array[5];
 
    for (int i = 0; i < sizeof(f_array) / sizeof(f_array[0]); i++) {
        printf("%d번째 음식의 이름을 입력하시오: ", i+1);
        fgets(f_array[i].f_name, sizeof(f_array[i].f_clorie), stdin);
        rewind(stdin);
        printf("%d번째 음식의 칼로리를 입력하시오: ", i + 1);
        scanf("%d"&f_array[i].f_clorie);
        rewind(stdin);
    }
 
    printf("입력한 음식들의 총 칼로리는 %d입니다.", cal_total_calories(f_array));
 
    return 0;
}
 
int cal_total_calories(FOOD *f) {
    int sum = 0;
 
    for (int i = 0; i < 5; i++)
        sum += f[i].f_clorie;
 
    return sum;
}
cs



3번 문제

직원의 사번과 나이, 이름, 전화번호를 묶어서 구조체로 만들고 10명의 직원에 해당하는 데이터를 입력하고 나이 조건에 만족하는 직원들의 정보들을 출력합니다.


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
#include<stdio.h>
#include<string.h>
 
typedef struct employee {
    int emp_num;
    int emp_age;
    char emp_name[20];
    char emp_tel[14];
}EMP;
 
int main(void) {
    EMP emp[10];
 
    for (int i = 0; i < sizeof(emp) / sizeof(emp[0]); i++) {
        printf("%d번째 사원의 사번을 입력하시오: ", i + 1);
        scanf("%d"&emp[i].emp_num);
        printf("%d번째 사원의 나이를 입력하시오: ", i + 1);
        scanf("%d"&emp[i].emp_age);
        rewind(stdin);
        printf("%d번째 사원의 이름을 입력하시오: ", i + 1);
        fgets(emp[i].emp_name, sizeof(emp[i].emp_name), stdin);
        emp[i].emp_name[strlen(emp[i].emp_name) - 1= '\0';
        printf("%d번째 사원의 전화번호를 입력하시오: ", i + 1);
        fgets(emp[i].emp_tel, sizeof(emp[i].emp_tel), stdin);
        emp[i].emp_tel[strlen(emp[i].emp_tel) - 1= '\0';
    }
 
    printf("조건을 만족한 직원 리스트\n");
 
    for (int i = 0; i < 10; i++) {
        if (emp[i].emp_age >= 20 && emp[i].emp_age <= 30)
            printf("이름: %s 나이: %d 사번: %d 전화번호: %s\n"
                emp[i].emp_name, emp[i].emp_age, emp[i].emp_num, emp[i].emp_tel);
    }
 
    return 0;
}
cs



4번 문제

정수와 소수점 이하의 숫자로 이루어진 복소수 구조체를 만들어서 입력한 배열의 원소들을 합한 다음 int형으로 캐스팅하여 출력합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
 
typedef struct complex_num {
    float num1;
    float num2;
}CMP_num;
 
int main(void) {
    CMP_num cmp_num[2];
 
    printf("첫번째 복소수를 입력하시오(a, b): ");
    scanf("%f %f"&cmp_num[0].num1, &cmp_num[0].num2);
    printf("두번째 복소수를 입력하시오(c, d): ");
    scanf("%f %f"&cmp_num[1].num1, &cmp_num[1].num2);
 
    printf("복소수의 합은 %d+%di입니다."
        (int)(cmp_num[0].num1 + cmp_num[1].num1), 
        (int)(cmp_num[0].num2 + cmp_num[1].num2));
 
    return 0;
}
cs



5번 문제

입력받은 문자열을 strtok 함수를 통해서 단어로 나누고 이 단어를 구조체 배열의 크기가 마지막까지 배열의 원소에 포함된 문자형 배열과 비교하고 이를 통해 처음보는 단어인지를 구분할 수 있습니다. 그런 다음 printf에서 필드를 지정해서 일정한 간격으로 문자열이 출력될 수 있도록 합니다. 


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
#include<stdio.h>
#include<string.h>
 
struct inf_word{
    char word[20];
    int freq;
};
 
int main(void) {
    struct inf_word freq_word_array[10= { ""0 };
    char str[100];
    char *token;
    char seps[] = " \t\n,";
    int count = 0;
 
    printf("텍스트를 입력하시오: ");
    fgets(str, sizeof(str), stdin);
    str[strlen(str) - 1= '\0';
 
    if (str[strlen(str) - 1== '.')
        str[strlen(str) - 1= '\0';
 
    token = strtok(str, seps);    
 
    while (token != NULL) {
        
        for (int i = 0; i < 10; i++) {
            if (strcmp(freq_word_array[i].word, token) == 0) {                
                freq_word_array[i].freq++;
                break;
            }
            else {
                if (strcmp(freq_word_array[i].word, ""== 0) {
                    strcat(freq_word_array[count].word, token);
                    freq_word_array[count].freq = 1;
                    count++;
                    break;
                }
            }
        }    
 
        token = strtok(NULL, seps);
    }
 
    printf("----------------------------------------\n");
    printf("%-19s빈도\n""단어");
    printf("----------------------------------------\n");
 
    for (int i = 0; i < count; i++)
        printf("%-19s%d\n", freq_word_array[i].word, freq_word_array[i].freq);
 
    return 0;
}
cs



6번 문제

책에 대한 정보들을 묶어서 구조체를 만들고 반복문과 조건문을 통해서 입력한 정수값에 따라서 다른 작업이 실행되도록 합니다.


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
#include<stdio.h>
#include<string.h>
 
enum book_type{만화, 공상과학, 소설, 고전};
 
typedef struct book_inf {
    char title[20];
    char author[20];
    char position[20];
    enum book_type type;
}BOOK_INF;
 
int search_book_title(BOOK_INF *receiver, int count) {
    char to_search_title[20];
    int result = 0;
    printf("검색할 책 제목을 입력하시오: ");
    fgets(to_search_title, sizeof(to_search_title), stdin);
    to_search_title[strlen(to_search_title) - 1= '\0';
 
    for (int i = 0; i < count; i++) {
        if (strcmp(receiver[i].title, to_search_title) == 0) {
            result = 1;
            break;
        }
    }
 
    return result;
}
 
int main(void) {
    BOOK_INF book_inf_array[20];
    int judge_int;
    int count = 0;
 
    do {
        printf("=====================\n");
        printf("1. 추가\n");
        printf("2. 출력\n");
        printf("3. 검색\n");
        printf("4. 종료\n");
        printf("=====================\n");
 
        printf("정수값을 입력하시오: ");
        scanf("%d"&judge_int);
        rewind(stdin);
 
        switch (judge_int) {
            case 1:
                if (count != 20) {
                    printf("제목: ");
                    fgets(book_inf_array[count].title, sizeof(book_inf_array[count].title), stdin);
                    book_inf_array[count].title[strlen(book_inf_array[count].title) - 1= '\0';
                    printf("저자: ");
                    fgets(book_inf_array[count].author, sizeof(book_inf_array[count].author), stdin);
                    book_inf_array[count].author[strlen(book_inf_array[count].author) - 1= '\0';
                    printf("위치: ");
                    fgets(book_inf_array[count].position, sizeof(book_inf_array[count].position), stdin);
                    book_inf_array[count].position[strlen(book_inf_array[count].position) - 1= '\0';
                    printf("장르(0: 만화, 1: 공상과학, 2: 소설, 3: 고전) ");
                    scanf("%d"&book_inf_array[count].type);
                    count++;
                }
                else
                    printf("데이터베이스 용량초과!\n");
                break;
            case 2:
                for (int i = 0; i < count; i++) {
                    printf("제목: %s\n", book_inf_array[i].title);                
                    printf("저자: %s\n", book_inf_array[i].author);
                    printf("위치: %s\n", book_inf_array[i].position);
                    printf("장르(0: 만화, 1: 공상과학, 2: 소설, 3: 고전) %d\n", book_inf_array[i].type);
                }
                break;
            case 3:
                if (search_book_title(&book_inf_array, count) == 1
                    printf("찾으시는 책이 데이터베이스에 존재합니다.\n");
                else 
                    printf("찾으시는 책이 데이터베이스에 존재하지 않습니다.\n");
                break;
            case 4:
                return 1;
            default:
                printf("알맞는 값을 입력해주세요.\n");
                break;
        }        
    } while (1);
 
    return 0;
}
cs



7번 문제

가위와 바위, 보를 열거형 데이터 타입으로 지정하고 이를 이용해서 사용자가 입력한 문자열이 가위이면 0이 바위이면 1 보이면 2를 반환하도록 만들고 컴퓨터의 수는 rand() 함수를 이용해 발생시킨 난수를 3으로 나누어서 해결한다. 그리고 사용자의 수와 컴퓨터의 수를 서로 뺄셈을 하면 결과로 사용자가 이겼을 때 -2와 1이 나오고 졌을 때 -1과 2가 나온다는 점을 착안해서 조건문을 만들었습니다.


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
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
 
typedef enum srp{ Scissor, Rock, Paper }SRP;
 
int ToConvertEnum(char *str);
 
int main(void) {
    char input_val[10];
    SRP using_val;
    int result;
    
    printf("입력할 수 있는 값은 한글과 영문자입니다.\nex) 가위 rock Paper\n");
 
    while (1) {
        printf("가위, 바위, 보 중에서 하나를 선택하시오(종료:q) : ");
        scanf("%s", input_val);
 
        if (input_val[0== 'q'break;
 
        using_val = ToConvertEnum(input_val);
 
        if (using_val == 3) {
            printf("올바른 값을 입력해주세요.\n");
            continue;
        }
 
        result = using_val - (rand() % 3);
 
        if (result == -2 || result == 1)
            printf("이겼습니다.(졌습니다)\n");
        else if (result == -1 || result == 2)
            printf("졌습니다.(이겼습니다)\n");
        else
            printf("비겼습니다.\n");
    }
 
    return 0;
}
 
int ToConvertEnum(char *str) {
    char *val_range[] = { "가위"
                           "scissor",
                           "Scissor",
                           "바위",
                           "rock",
                           "Rock",
                           "보",
                           "paper",
                           "Paper" };
 
    for (int i = 0; i < 9; i++) {
        if (strcmp(str, val_range[i]) == 0) {
            if (i >= 0 && i <= 2)
                return 0;
            else if (i >= 3 && i <= 5)
                return 1;
            else
                return 2;
        }
    }
 
    return 3;
}
cs



8번 문제

열거형으로 도형의 종류를 표현하고 공용체로 각 도형에 해당하는 데이터를 표현하였는데 공용체의 크기는 8바이트로 보면 int형 배열 2개와 double형 변수 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<stdio.h>
#include<corecrt_math_defines.h>
#include<math.h>
 
typedef enum type_thing{ triangle, square, circle }TYPE_THING;
 
union data_thing {
    int triangle_data[2];
    int square_data[2];
    double circle_data;
};
 
int main(void) {
    TYPE_THING choice;
    union data_thing user_data;
 
    printf("도형의 종류를 선택하시오(0,1,2): ");
    scanf("%d"&choice);
 
    switch (choice)
    {
    case triangle:
        printf("삼각형의 밑변과 높이를 각각 입력하시오: ");
        scanf("%d %d"&user_data.triangle_data[0], &user_data.triangle_data[1]);
        printf("결과는 %d입니다.", user_data.triangle_data[0* user_data.triangle_data[1/ 2);
        break;
    case square:
        printf("사각형의 가로와 세로를 각각 입력하시오: ");
        scanf("%d %d"&user_data.square_data[0], &user_data.square_data[1]);
        printf("결과는 %d입니다.", user_data.square_data[0* user_data.square_data[1]);
        break;
    case circle:
        printf("원의 반지름을 입력하시오: ");
        scanf("%lf"&user_data.circle_data);
        printf("결과는 %lf입니다.", sqrt(user_data.circle_data) * M_PI);
        break;
    default:
        break;
    }
 
    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
글 보관함