티스토리 뷰

반응형


안녕하세요! 이번에는C언어 콘서트의 13장에 해당하는 전처리 및 기타 기능 파트의 문제들을 풀어보았습니다. 다른 장들의 문제들의 링크는 아래에 있으니 궁금하신 분들은 참조해 주시기를 바랍니다. 참고로 4번 문제는 문제의 의도를 몰라서 그냥 넘어갔습니다.


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


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


2018/11/25 - [IT 공부 및 일상] - C언어 콘서트 11장 구조체 Programming 문제


2018/11/29 - [IT 공부 및 일상] - C언어 콘서트 12장 표준 입출력과 파일 입출력 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
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<stdio.h>
#include<ctype.h>
 
#define RANGE(x, y, z) ((x < y) || (x > z) ? 0 : 1)
#define ODD_GT(x, y) (((x % 2== 1&& (x > y) ? 1 : 0)
#define IS_UPPER(c) isupper(c)
 
int main(void) {
    int num1, num2, num3;
    int cnum1, cnum2;
    char c;
 
    printf("세 개의 정수(x, y, z)를 입력하시오: ");
    scanf("%d %d %d"&num1, &num2, &num3);
 
    printf("두 개의 정수(x, y)를 입력하시오: ");
    scanf("%d %d"&cnum1, &cnum2);
    rewind(stdin);
 
    printf("문자(c) 한 개를 입력하시오: ");
    c = getchar();
 
    if (!RANGE(num1, num2, num3))
        printf("x는 y보다 작거나 z보다 크다!\n");
    else
        printf("x는 y보다 크고 z보다 작다!\n");
 
    if (ODD_GT(cnum1, cnum2))
        printf("x는 홀수이고 y보다 크다!\n");
    else
        printf("x는 홀수이거나 y보다 크지않다!\n");
 
    if (IS_UPPER(c))
        printf("c는 대문자이다!");
    else
        printf("c는 소문자이다!");
 
    return 0;
}
cs



2번 문제

정수형 배열의 원소들의 평균을 구하는 함수에서 DEBUG 기호가 정의되어 있는 경우에 중간의 값을 출력합니다. 


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
#include<stdio.h>
 
#define SIZE 50
#define DEBUG
 
float mean_array(int *A) {
    int sum = 0;
 
    for (int i = 0; i < SIZE; i++) {    
        sum += *(A + i);
 
        if (i == SIZE / 2) {
            #ifdef DEBUG
            printf("배열의 중간 단계의 값은 %d입니다.\n"*(A + i));
            #endif        
        }
    }
 
    return (float)sum / (float)SIZE;
}
 
int main(void) {
    int int_array[SIZE] = { 12345678910,
                            234567891011,
                            3456789101112,
                            45678910111213,
                            567891011121314 };
 
    printf("배열의 평균은 %3.2f입니다.", mean_array(int_array));
 
    return 0;
}
cs



3번 문제

다른 파일에 배열의 원소의 총 합과 각 원소들을 출력하는 함수를 정의하고 새로운 헤더파일을 만들어서 main 함수에서도 그 함수들을 사용할 수 있도록 만듭니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
#include"array.h"
 
#define SIZE 10
 
int main(void) {
    int A[SIZE] = { 12345678910 };
 
    printf("배열의 원소의 총 합은 %d입니다.\n", get_sum_of_array(A, SIZE));
    print_array(A, SIZE);
 
    return 0;
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include"array.h"
 
int get_sum_of_array(int A[], int size) {
    int sum = 0;
    for (int i = 0; i < size; i++
        sum += A[i];
 
    return sum;
}
 
void print_array(int A[], int size) {
    for (int i = 0; i < size; i++)
        printf("%d번째 원소: %d\n", i + 1, A[i]);
}
cs


1
2
3
4
5
6
7
8
#ifndef ARRAY_H
#define ARRAY_H
 
int get_sum_of_array(int A[], int size);
 
void print_array(int A[], int size);
 
#endif
cs



5번 문제

XOR의 기능을 사용하여 문자열을 암호화 및 복호화하는 함수들을 다른 파일에 정의하고 새로운 헤더파일을 만들어내서 main 함수에서도 사용할 수 있도록 만듭니다. 


이 코드에 아직 해결되지 않은 점은 키값으로 정수를 입력할 경우 맨 처음에 입력한 암호화 키와 다음에 입력하는 복화화 키의 값의 십의 자리가 일치하면 복화화가 정상적으로 진행된다는 점입니다. 


하지만 다중 소스로 나누지 않고 main 함수 하나로 해결하고 키 값 변수를 char형에서 int형으로 바꾸면 이상하게 정상적으로 작동은 합니다. 이 문제는 나중에 알게되면 수정하도록 하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include"ecrpt.h"
 
int main(void) {
    char input_str[100];
 
    printf("문자열을 입력하시오: ");
    gets(input_str);
    rewind(stdin);
 
    encode_str(input_str);
    printf("암호화된 문자열: %s\n", input_str);
 
    decode_str(input_str);
    printf("복호화된 문자열: %s\n", input_str);
 
    return 0;
}
cs


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
#include<stdio.h>
#include"ecrpt.h"
 
void encode_str(char *A) {
    unsigned char encode_key;
 
    printf("암호화 키값을 입력하세요: ");
    scanf("%c"&encode_key);
    rewind(stdin);
 
    while ((*A) != '\0') {
        (*A) ^= encode_key;
        A += 1;
    }
}
 
void decode_str(char *A) {
    unsigned char decode_key;
 
    printf("복호화 키값을 입력하세요: ");
    scanf("%c"&decode_key);
 
    while ((*A) != '\0') {
        (*A) ^= decode_key;
        A += 1;
    }
}
cs


1
2
3
4
5
6
7
8
#ifndef ECRPT_H
#define ECRPT_H
 
void encode_str(char *A);
 
void decode_str(char *A);
 
#endif
cs



6번 문제

이진수를 연속적으로 입력받기 위해서 문자형 배열에 값을 입력받습니다. 그런 다음에 다른 파일에 정의한 함수를 호출하여 이진수를 나타내는 문자열 배열과 회전 비트 수, 회전 방향을 매개변수로 입력합니다. 


회전을 계산하는 함수에서는 문자형 배열 3개를 선언하고 방향에 따라 조건을 구분합니다. 각 배열의 역할로는 8비트 범위를 벗어나는 숫자들을 보관하는 배열과 벗어나지 않고 남아있는 숫자들을 보관하는 배열, 앞의 두 배열을 합치는 배열입니다. 


최종적으로 반환되는 값은 입력받은 이진수 배열로 두 배열을 합친 배열을 strcpy 함수를 사용해서 복사시킨 다음에 반환시킵니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
#include<string.h>
#include"rttbit.h"
 
int main(void) {
    char bin_str[10];
    int bin_num, rtt_time, rtt_vector;
    
    printf("이진수를 입력하시오: ");
    fgets(bin_str, sizeof(bin_str), stdin);
    bin_str[strlen(bin_str) - 1= '\0';
 
    printf("회전 비트수를 입력하시오: ");
    scanf("%d"&rtt_time);
    printf("회전 방향을 입력하시오(왼쪽:-1, 오른쪽:1): ");
    scanf("%d"&rtt_vector);
 
    cal_rttbit(bin_str, rtt_time, rtt_vector);
 
    printf("원형 회전한 결과는 %s", bin_str);
 
    return 0;
}
cs


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<string.h>
#include"rttbit.h"
 
char *cal_rttbit(char *bin_str, int bit_time, int bit_vector) {
    char rmn_arr[9], sprtd_arr[9], buffer[9= { "" };
    int i, count = 0;
 
    if (bit_vector == -1) {
        for (i = 0; i < 8; i++) {
            if (i >= bit_time)
                rmn_arr[i - bit_time] = bin_str[i];
            else {
                count++;
                sprtd_arr[i] = bin_str[i];
            }
        }
 
        sprtd_arr[count] = '\0';
        rmn_arr[i - bit_time] = '\0';
 
        strcat(buffer, rmn_arr);
        strcat(buffer, sprtd_arr);
 
        buffer[8= '\0';
        strcpy(bin_str, buffer);
 
        return bin_str;
    }
    else if (bit_vector == 1) {
        for (i = 0; i < 8; i++) {
            if ((8 - bit_time) > i)
                rmn_arr[i] = bin_str[i];
            else {
                count++;
                sprtd_arr[i - 8 + bit_time] = bin_str[i];
            }
        }
 
        sprtd_arr[count] = '\0';
        rmn_arr[i - bit_time] = '\0';
 
        strcat(buffer, sprtd_arr);
        strcat(buffer, rmn_arr);
 
        buffer[8= '\0';
        strcpy(bin_str, buffer);
 
        return bin_str;
    }
}
cs


1
2
3
4
5
6
#ifndef RTTBIT_H
#define RTTBIT_H
 
char* cal_rttbit(char *bin_str, int bit_time, int bit_vector);
 
#endif
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
글 보관함