01. 다음 소스에 대한 질문에 답하라.
double power(int x, int y) {
double result = 1;
int i;
for (i = 0; i < y; i++) {
printf("result=%f\n", result);
result *= x;
}
return result;
}
(a) 전처리 지시자 #ifdef을 사용하여 DEBUG가 정의되어 있는경우에만 화면 출력이 나오도록 해보자.
#define DEBUG
double power(int x, int y) {
double result = 1;
int i;
for (i = 0; i < y; i++) {
#ifdef DEBUG
printf("result=%f\n", result);
#endif
result *= x;
}
return result;
}
(b) #if를 사용하여 DEBUG가 2이고 LEVEL이 3인 경우에만 화면 출력이 나오도록 수정해보자.
#define DEBUG 2
#define LEVEL 3
double power(int x, int y) {
double result = 1;
int i;
for (i = 0; i < y; i++) {
#if DEBUG==2 && LEVEL 3
printf("result=%f\n", result);
#endif
result *= x;
}
return result;
}
int main() {
power(2, 10);
}
(c) 문장 (1)을 수정하여 소스 파일에서 현재의 행 번호가 함께 출력되도록 해보자.
#define DEBUG 2
#define LEVEL 3
double power(int x, int y) {
double result = 1;
int i;
for (i = 0; i < y; i++) {
#if DEBUG==2 && LEVEL 3
printf("현재 행 번호 %d : result=%f\n",__LINE__, result);
#endif
result *= x;
}
return result;
}
int main() {
power(2, 10);
}
(d) #if를 이용하여 문장 (1)을 주석 처리하여보자.
#define DEBUG 2
#define LEVEL 3
double power(int x, int y) {
double result = 1;
int i;
for (i = 0; i < y; i++) {
#if 0
#if DEBUG==2 && LEVEL 3
printf("현재 행 번호 %d : result=%f\n",__LINE__, result);
#endif
#endif
result *= x;
}
return result;
}
int main() {
power(2, 10);
}
02. 3개의 정수 중에서 최소값을 구하는 매크로 GET_MIN(x, y, z)를 정의하고 이것을 이용하여서 사용자로부터 받은 3개의 정수 중에서 최소값을 계산하여서 출력하는 프로그램을 작성한다.
#include <stdio.h>
#define GET_MIN(x,y,z) ((x)<(y)&&(x)<(z))?(x):((y)<(z)?(y):(z))
int main() {
int x, y, z;
printf("3개의 정수를 입력하시오: ");
scanf("%d %d %d", &x, &y, &z);
printf("최소값은 %d입니다. \n", GET_MIN(x, y, z));
}
03. 배열 원소의 값을 모두 지정된 값으로 초기화하는 ARRAY_INIT(array, size, value)를 작성하여 테스트하여보자.
#include <stdio.h>
#define ARRAY_INIT(array, size, value) {for(int i = 0; i < size; i++){ \
array[i] = value;}}
int main() {
int array[10];
int size = sizeof(array) / sizeof(array[0]);
ARRAY_INIT(array, 10, 0);
printf("[ ");
for (int i = 0; i < size; i++) {
printf("%d ", array[i]);
}
printf("] \n");
}
04. 원기둥의 부피는 PI * r^2 * h 이다. 사용자로부터 반지름과 높이를받아서 원기둥의 부피를 구하는 프로그램을 작성한다. 파이는 단순 매크로로 정의한다. 원기둥의 부피를구하는 공식은 함수 매크로로 정의한다.
#include <stdio.h>
#define PI 3.141592
#define VOLUME(r,h) { \
printf("원기둥의 부피: %.2f", PI * r *r *h);}
int main() {
int r, h;
printf("원기둥의 반지름을 입력하시오: ");
scanf("%d", &r);
printf("원기둥의 높이를 입력하시오: ");
scanf("%d", &h);
VOLUME(r, h);
}
05. c가 공백 문자(탭, 스페이스, 줄바꿈 문자)이면 참이되는 매크로 IS_SPACE(c)를 정의하여서 사용자가 입력한 문자열 중에서 공백문자의 개수를 출력하여보자.
#include <stdio.h>
#define SIZE 100
#define IS_SPACE(c) { \
int count = 0; \
for (int i = 0; i < SIZE-1; i++) \
if(c[i]== ' ' || c[i] == '\t' || c[i]== '\n') count++; \
printf("공백문자의 개수: %d", count);}
int main() {
char a[100];
printf("문자열을 입력하시오: ");
gets_s(a, SIZE);
IS_SPACE(a);
}
06. 정수값을 받아서 2진수 형태로 출력하는 함수 display_bit(int value)를 작성하여보자. 본문에서 정의한 함수 매크로 GET_BIT(n, pos)를 사용한다.
#include <stdio.h>
#define GET_BIN(n,i) (((n) >> (31-(i))) & 0x1)
void display_bit(int value);
int main() {
int a;
printf("정수값을 입력하시오: ");
scanf("%d", &a);
display_bit(a);
}
void display_bit(int value) {
for (int i = 0; i < 32; i++) {
if (GET_BIN(value, i))
printf("1");
else
printf("0");
}
}
07. 사용자로부터 입력받은 정수를 비트 이동시키는프로그램을 작성하여보자. 먼저 정수 변수의 값을 입력받은 후에 이동시킬 방향, 이동할 거리를 사용자로부터 입력받는다. 비트 이동 전후에 정수의 값을 비트로 출력하도록 한다. 앞 문제에서 작성한 display_bit() 함수를 사용한다.
#include <stdio.h>
#define GET_BIN(n,i) ((n >> (31-i)) & 0x1)
#define RIGHT_BIN(a, r) ((a)>>(r))
#define LEFT_BIN(a, r) ((a)<<(r))
void display_bit(int value);
int main() {
int a, m, r;
printf("정수값을 입력하시오: ");
scanf("%d", &a);
printf("왼쪽 이동은 0, 오른쪽 이동은 1을 입력하시오: ");
scanf("%d", &m);
printf("이동시킬 거리: ");
scanf("%d", &r);
printf("이동 전: ");
display_bit(a);
printf("이동 후: ");
if (m == 1) {
display_bit(RIGHT_BIN(a, r));
}
else {
display_bit(LEFT_BIN(a, r));
}
}
void display_bit(int value) {
for (int i = 0; i < 32; i++) {
if (GET_BIN(value, i))
printf("1");
else
printf("0");
}
printf("\n");
}
08. 비트 연산자를 이용하여 대소문자를 변경할 수 있다. 대문자의 아스키 코드는 모두 여섯 번재 비트가 0이고 소문자의 경우에는 여섯 번재 비트가 모두 1이다. 따라서 XOR 연산을 이용하여 문자의 여섯 번째 비트를 바꿔주면 대소문자가 바뀌게 된다. 이 성질을 이용하여 사용자가 입력한 문자열의 대소문자를 바꾸는 프로그램을 작성하라.
#include <stdio.h>
#define CHANGE(x) ((0x01<<5)^(x))
int main() {
char a[100];
printf("문자열을 입력하시오: ");
gets_s(a, sizeof(a));
printf("결과 문자열: ");
for (int i = 0; a[i] != '\0'; i++) {
printf("%c", CHANGE(a[i]));
}
}
09. 암호화 방법 중의 한나는 암호화할 값을 키 값과 비트 XOR 연산을 하는 것이다. 원래의 값을 복원하려면 다시 비트 XOR 연산을 하면 된다. 이암호화 방법을 사용하여 사용자로부터 문자열을 암호화하고 다시 복호화하는 프록램을 작성하라. 다중 소스 파일 형태로 작성하라.
(유의할점: 복호화/암호화 하고 마지막에 꼭 '\0'를 넣어야한다. )
//header.h
#pragma once
#define CHANGE(x,k) (x)^(k)
void encode(char* a, char* b, char key);
void decode(char* b, char* c, char key);
//encoder.c
#include <stdio.h>
#include "header.h"
void encode(char* a, char* b, char key) {
int i;
for (i = 0; a[i] != '\0'; i++) {
b[i] = CHANGE(a[i], key);
}
b[i] = '\0';
}
void decode(char* b, char* c, char key) {
int i;
for (i = 0; b[i] != '\0'; i++) {
c[i] = CHANGE(b[i], key);
}
c[i] = '\0';
}
//main.c
#include <stdio.h>
#include "header.h"
int main() {
char a[100] = "I am a boy";
char b[100];
char c[100];
char key = 'K';
encode(a, b, key);
decode(b, c, key);
printf("%s가 %s로 엔코딩됨 \n", a, b);
printf("%s가 %s로 디코딩됨 \n", b, c);
}
10. 다음과 같은 2개의파일로 이루어진 프로그램을 자것ㅇ하고 컴파일하여 실행해보자.
- 정수 2개를 받아서 합계를 반환하는 함수 add(int x, int y)을가지고 있는 add.c
- add()를 호출하여 10과 20의 합을 계산하는 문장이 포함된 main.c
(extern을 써도 되고 생략해도 됨)
//main.c
#include <stdio.h>
extern int add(int x, int y);
int main() {
printf("합계 = %d \n", add(10, 20));
}
//add.c
int add(int x,int y){
return x + y;
}
11. 배열에관한 각종 연산을 포함하는 array.c를작성한다. 예를 들어서 배열 원소들의 합을 계산하는 함수 get_sum_of_array(), 배열 원소들을 화면에 출력하는 함수 print_array() 등의 함수를 포함하라. 다시 main.c 파일을생성하고 여기서 array.c에 포함된 함수들을 호출하여 보라. array.c가 제공하는 함수들의 원형은 array.h 헤더 파일에 저장한다.
//array.h
#pragma once
int get_sum_of_array(int *arr, int size);
void print_array(int *arr, int size);
//array.c
#include <stdio.h>
#include "array.h"
int get_sum_of_array(int *arr, int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}
void print_array(int *arr, int size) {
printf("[ ");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("] \n");
}
//main.c
#include <stdio.h>
#include "array.h"
int main() {
int array[10] = { 1,2,3,4,5,6,7,8,9,10 };
int size = sizeof(array) / sizeof(array[0]);
print_array(array, size);
printf("배열 요소의 합=%d", get_sum_of_array(array, size));
}
유의할점
int get_sum_of_array(int arr[]) {
int sum = 0;
for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) { // sizeof 연산 불가능, 매개변수를 통해 size 넘겨줘야함
sum += arr[i];
}
return sum;
}
12. 이제까지 학습한 내용을 바탕으로 화면에 달력을 출력하는 프로그램을 만들어보자. 화면에 현재월을 출력한다. 전처리기를 사용하여서 영어 버전과 한국어 버전을 작성해본다.
'C' 카테고리의 다른 글
[C언어 | SDL을 이용한 게임 작성] Visual Studio에서 SDL 개발 환경 설정하기 (0) | 2025.02.24 |
---|---|
[쉽게 풀어쓴 C언어 Express 개정 4판] 17장 Programming (0) | 2024.10.18 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 15장 Programming (0) | 2024.10.15 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 14장 Programming (12) | 2024.10.11 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 13장 Programming (6) | 2024.10.09 |