프로그래밍/C언어

C언어콘서트 7장 프로그래밍 답/c언어콘서트 솔루션 7장

이번주에 2015. 5. 20. 21:38
반응형

1. 주어진 정수의 약수를 모두 찾아내는 함수 get_divisor() 함수를 작성하여 보자

 

#include <stdio.h> void get_divisor();  int main(void){  	get_divisor();  	return 0; }  void get_divisor() { 	int i; 	int num;  	printf("정수를 입력하여 주세요: "); 	scanf("%d", &num);  	for(i=1; i<num+1; i++) 	{ 		if(num%i == 0) 		printf("%d ", i);  	} }

2. 주어진 정수가 소수(prime number)인지를 검사하는 함수 prime()을 작성하여보자 이 함수를 이용하여 1부터 100사이에 존재하는 소수들을 모두 출력한다.

 

#include <stdio.h> void prime();  int main(void){  	int x=0; 	int y;  	prime();  	printf("\n");  	return 0; } void prime() { 	int x, y;  	for(x=2;x<=100;x++) 	{ 		for(y=2;y<x;y++) 		{ 			if(x%y==0) 			break; 		} 		if(x==y) 			printf("%d ",x); 	} }

3. 거듭제곱을 계산하는 함수를 작성하여보자. 정수nk를 받아서 n^k를 계산하는 함수 ipower()를 작성한다. 이 함수를 호출하여 3^0 부터 3^10까지의 값을 테이블의 형태로 출력하는 프로그램을 작성하여 보자  

#include <stdio.h> void ipower(int x,int y);  int main(){ 	 	int x, y; 	 	for (x = 3, y = 0; y <= 10; y++) 		ipower(x, y);  	printf("\n");  	return 0; }  void ipower(int x, int y) { 	int i,result; 	result = 1;  	for(i=0; i<y; i++) 		result = result * x;  	printf("%d ", result);  }

 

4. 두 점 사이의 거리를 계산하는 함수를 작성하여보자 2차원 공간에서 두점 (x1,y1)(x2,y2) 사이의 거리를 계산하는 dist_2d()를 작성하여 보자.

 

#include <stdio.h> #include <math.h> double dist_2d(double x1, double y1, double x2,double y2);  int main(void){  	double x1, x2, y1, y2; 		int result;  	printf("x1, y1을 입력하시오: "); 	scanf("%lf %lf", &x1, &y1); 	 	printf("x2, y2를 입력하시오: "); 	scanf("%lf %lf", &x2, &y2);  	result = dist_2d(x1,y1,x2,y2);  	printf("두 점사 사이의 거리는 %d입니다", result);  	return 0; }  double dist_2d(double x1, double y1, double x2,double y2) { 	double result;  	result = sqrt(pow((x1-x2),2.0) +pow((y1-y2),2.0));  	return result; }

 

5. 주차장의 요금을 계산하여 보자

 

#include <stdio.h> int cal_parking_charge(int time);  int main(void){  	int time, pay; 	printf("주차한 시간을 입력하시오: "); 	scanf("%d", &time); 	pay = cal_parking_charge(time); 	printf("요금은 %d원입니다.\n", pay); 	return 0; } int cal_parking_charge(int time) { 	int result, pay,day,hour; 	if(time <= 2) 		return 3000; 	else if(time == 3) 		return 5000; 	else if (time>3 && time<=24) 		return 6000; 	else 	{ 		day = time / 24; 		hour = time % 24; 		if(hour>=4) 		{ 			day++; 			hour = 0; 		}  		result = day * 6000 + hour * 2000; 	} }

 

 

6. 2차 방정식의 근을 계산하는 함수 quad_eqn()를 작성하여보자. quad_eqn()함수는 a,b,c를 나타내는 double형의 3개의 인수를 받는다. 판별식이 양수인 경우에만 근을 출력하고 판별식의 값이 음수이면 근이 없다는 메시지를 출력한다.

 

#include <stdio.h> #include <math.h> void quad_eqn(double a, double b, double c); int main(void){  	double a, b, c; 	printf("2차 방정식의 계수를 입력하시오.\n"); 	printf("a: "); 	scanf("%lf", &a); 	printf("b: "); 	scanf("%lf", &b); 	printf("c: "); 	scanf("%lf", &c); 	quad_eqn(a, b, c);  	return 0; } void quad_eqn(double a, double b, double c) { 	double x, y; 	x = (-b+sqrt(b*b-4*a*c)) / 2*a; 	y = (-b-sqrt(b*b-4*a*c)) / 2*a;  	if((b*b-4*a*c)>0) 	{ 		x = (-b-sqrt(b*b-4*a*c)) / 2*a; 		y = (-b+sqrt(b*b-4*a*c)) / 2*a; 		printf("근은 %.lf와 %.lf입니다.\n", x, y); 	} 	else 		printf("근이 없습니다.\n"); }

7. 간단한 동전 던지기 게임을 시뮬레이션하여보자. 컴퓨터가 동전을 던지고 사용자는 앞뒤를 말한다 난수가 짝수이면 앞면으로 간주하고 홀수이면 뒷면으로 간주한다.

 

#include <stdio.h> #include <stdilib.h> #include <time.h> void input(); void com_rand(); int num=0; int main(void){  	input(); 	com_rand(); } void input() { 	printf("앞 과 뒤 중 하나를 선택하시오\n"); 	printf("[1]-앞 / [2]-뒤 :"); 	scanf("%d", &num); } void com_rand() { 	int com; 	srand(time(0)); 	com = rand();  	if (com % 2 == 0) 		com = 1; 	else  		com = 0;  	if(com == num) 		printf("사용자가 이겼습니다.\n"); 	else 		printf("사용자가 졌습니다.\n"); }

8. 간단한 메뉴 시스템을 작성하여보자. 다음과 같은 메뉴를 선택하고 사용자로부터 입력을 받아서 입력이 올바른지 검사한다.

 

#include <stdio.h> void print_menu(); void get_menu_number(int num); void output_menu(); int num;  int main(void){  	  	print_menu();  	get_menu_number(num);  	return 0; } void print_menu() { 	printf("1. 햄버거\n"); 	printf("2. 치즈버거\n"); 	printf("3. 샌드위치\n"); 	printf("4. 종료\n");  	printf("원하는 메뉴를 선택하시오: "); 	scanf("%d", &num); }  void get_menu_number(int num) { 	if(num>0 && num<5) 		output_menu(); 		 	else 		print_menu(); }  void output_menu() {  switch(num) 	{ 		case 1: printf("선택한 메뉴는 햄버거입니다.\n"); 				break; 		case 2: printf("선택한 메뉴는 치즈버거입니다.\n"); 				break; 		case 3: printf("선택한 메뉴는 샌드위치입니다.\n"); 				break; 		case 4: break;  		default: printf("다시 입력해주세요\n"); 				break; 	} }

9. 덧셈, 뺄셈, 곱셈, 나눗셈을 지원하는 계산기 프로그램을 작성하여보자 이번에는 각 연산들이 몇 번씩 계산되었는지를 기억하게 하자. 각 연산을 지원하는 함수들은 자신이 호출된 횟수를 화면에 출력한다. 정적 지역변수를 사용하여 프로그램을 작성하여보자.

 

#include <stdio.h> int add(int x, int y); int sub(int x, int y); int mul(int x, int y); int div(int x, int y);  int main(void){  	int x,y, result; 	char op;  	while(1){  	printf("연산을 입력하시오: "); 	scanf("%d %c %d", &x, &op, &y);  	switch(op) 	{ 		case '+': 			result = add(x, y); 			break; 		case '-': 			result = sub(x , y); 			break; 		case '*': 			result = mul(x, y); 			break; 		case '/': 			result = div(x, y); 			break; 		 		printf("연산 결과: %d\n", result); 	} 	} 	 	return 0; }  int add(int x, int y) { 	static int cnt; 	cnt++; 	printf("덧셈은 총 %d번 실행되었습니다.\n", cnt); 	return x + y; }  int sub(int x, int y) { 	static int cnt; 	cnt++; 	printf("뺄셈은 총 %d번 실행되었습니다.\n", cnt); 	return x - y; }  int mul(int x, int y) { 	static int cnt; 	cnt++; 	printf("곱셈은 총 %d번 실행되었습니다.\n", cnt); 	return x * y; }  int div(int x, int y) { 	static int cnt; 	cnt++; 	printf("나눗셈은 총 %d번 실행되었습니다.\n", cnt); 	return x / y; }

10. 돈만 생기면 저금하는 사람을 가정하자. 이 사람을 위한 함수 save(int amount)를 작성하여보자. 이 함수는 저금할 금액을 나타내는 하나의 인수 amount만을 받으며 save(100)과 같이 호출된다. save()는 현재까지 저축된 총액을 기억하고 있으며 한 번 호출될 때마다 총 저축액을 화면에 출력한다. (a) 전역변수를 이용하여 구현하여라

 

#include <stdio.h> void save(int amount); int sum; int main(void){ int amount=0; while(1){ printf("얼마를 저축하시겟습니까?(종료는 -1): "); scanf("%d", &amount); if(amount == -1) break; else save(amount); } return 0; } void save(int amount) { sum += amount; printf("지금까지 총 저축액은 %d입니다.\n", sum); } (b) 정적 지역변수를 사용하여 구현하려라 void save(int amount) { static int sum; sum += amount; printf("지금까지 총 저축액은 %d입니다.\n", sum); }

(c) 예금을 인출하는 함수 draw(int amount)도 작성하여 보자. save()와 draw()를 동시에 사용하려면 저금액은 어떤 종류의 변수로 표현하여야 하는가 sum를 전역변수로 선언해야 한다

 

void draw(int amount) { 	sum -= amount; 	printf(“출금액은 %d입니다\n", amount); 	printf("지금까지 총 저축액은 %d입니다.\n", sum); }

11. 재귀호출을 이용하여 정수의 각 자릿수를 출력하는 함수 show_digit(int x)를 작성하고 테스트하여보자 즉, 정수가 1234이면 화면에 1 2 3 4와 같이 출력한다. 함수는 일의 자리를 출력하고 나머지 부분을 대상으로 다시 같은 함수를 재귀 호출한다. 예를 들어 1234의 4를 출력하고 나머지 123을 가지고 다시 같은 함수를 재귀호출한다 1234를 10으로 나누면 123이 되고 4는 123를 10으로 나눈 나머지이다.

 

#include <stdio.h> void show_digit(int x);  int main(void) {     int x;     printf("정수 입력 : ");     scanf("%d", &x);     show_digit(x);          return 0; } void show_digit(int x) {     if(x > 0) 	{ 	show_digit(x/10); 	printf("%d ", x%10); 	} }

11. 다음을 계산하는 재귀적인 프로그램을 작성하여 보자.

 

#include <stdio.h> #include <math.h> int recursive(int n);  int main(void) { 	int n;  	printf("정수를 입력하세요: "); 	scanf("%d", &n); 	printf("%d\n", recursive(n));  	return 0; }  int recursive(int n) { 	if(n==1)  		return 1; 	else  	return n*n*n+recursive(n-1); }

 

반응형