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. 이제까지 학습한 내용을 바탕으로 화면에 달력을 출력하는 프로그램을 만들어보자. 화면에 현재월을 출력한다. 전처리기를 사용하여서 영어 버전과 한국어 버전을 작성해본다. 

 

+ Recent posts