티스토리 뷰
안녕하세요! 이번에는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] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; 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] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 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 |
'IT 공부 및 일상' 카테고리의 다른 글
C언어 콘서트 14장 동적 메모리 Programming 문제 (0) | 2018.12.11 |
---|---|
C언어 콘서트 12장 표준 입출력과 파일 입출력 Programming 문제 (0) | 2018.11.29 |
C언어 콘서트 11장 구조체 Programming 문제 (0) | 2018.11.25 |
C언어 콘서트 10장 문자와 문자열 Programming 문제 (0) | 2018.11.22 |
C언어 콘서트 9장 포인터 Programming 문제 (0) | 2018.11.21 |
- Total
- Today
- Yesterday
- 함수
- vmware
- 구글
- 서치콘솔
- 자바
- 애널리틱스
- 애드센스
- 동미참
- 예비군
- 애플
- MAC
- 가상머신
- 웹마스터도구
- 인공지능
- 이클립스
- 학생예비군
- 크롬
- 아나콘다
- C언어
- 윈도우10
- RSS
- sitemap
- 사이트맵
- 태움
- HTML
- 파이썬
- 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 |