chapter9 프로그래밍 연습

milpy·2022년 6월 2일
0

C 기초 플러스 6판

목록 보기
14/18

01

두 double형 값중 작은 것을 리턴하는 min(x,y)라는 함수를 고안하고, 간단한 드라이버로 그 함수를 테스트하라.

#include <stdio.h>

double min(double, double);

int main(void)
{
	int ck = 0;
	double x, y;
    
	while(ck != 2)
	{
		printf("두 개의 부동소수점 수를 입력하시오 : ");
		ck = scanf("%lf %lf", &x, &y);

		if(ck != 2) while(getchar() != '\n');
	}
	
	printf("(%.3lf, %.3lf)중에 작은수는 %.3lf입니다.\n", 
		x, y, min(x, y));

	return 0;
}

double min(double x, double x)
{
	return (x > y)? x : y;
}

02

사용자가 요청한 문자를 i열에서 j열까지 출력하는 chline(ch, i, j)이라 는 함수를 고안하고, 간단한 드라이버로 그 함수를 테스트하라.

#include <stdio.h>

void chline(char, int, int);

int main(void)
{
	char ch;
	int i, j, ck;

	printf("문자를 하나 입력하시오 : ");
	ch = getchar();

	while(getchar() != '\n');
	
	while(1)
	{
		printf("i열과 j열을 입력하시오 : ");
		ck = scanf("%d %d", &i, &j);

		if(ck == 2) break;
		else while(getchar() != '\n');
	}

	chline(ch, i, j);

	return 0;
}

void chline(char ch, int i, int j)
{
	int min = (i < j)? i : j;
	int max = (i > j)? i : j;

	for(int idx = 1; idx <= max; idx++)
	{
		putchar((idx < min)? ' ' : ch);
	}
	putchar('\n');
}

03

하나의 char형과 두 개의 int형을 전달인자로 사용하는 함수를 작성하라.
이 함수는 그 문자를 출력한다.

#include <stdio.h>

void print_ch(char, int, int);

int main(void)
{
	char ch;
	int i, j, ck;

	printf("문자를 하나 입력하시오 : ");
	ch = getchar();

	while(getchar() != '\n');
	
	while(1)
	{
		printf("i열과 j행을 입력하시오 : ");
		ck = scanf("%d %d", &i, &j);

		if(ck == 2) break;
		else while(getchar() != '\n');
	}

	print_ch(ch, i, j);

	return 0;
}

void print_ch(char ch, int i, int j)
{
	for(int x = 0; x < j; x++)
	{
		for(int y = 0; y < i; y++)
			putchar(ch);
		putchar('\n');
	}
			
}

04

두 수의 조화 평균(harmonic mean)은 두 수의 역을 취해서, 그들의 평균값을 구하고, 다시 그 평균값의 역을 취하여 구한다. 두 개의 double형 전달인자를 사용하고, 두 수의 조화 평균을 리턴하는 함수를 작성하라.

#include <stdio.h>

double harmonic(double n1, double n2);

int main(void)
{
	double n1, n2;

	printf("2개의 부동소수점수를 입력하시오.\n");
	scanf("%lf %lf", &n1, &n2);

	printf("%.3lf와 %.3lf의 조화 평균은 %.3lf입니다.\n",
		n1, n2, harmonic(n1, n2));

	return 0;
}

double harmonic(double n1, double n2)
{
	double value;
	double en1, en2, aver;

	en1 = (1.0 / n1);
	en2 = (1.0 / n2);
	aver = (en1 + en2) / 2;
	value = (1.0 / aver);

	return value;
}

05

두 double형 변수의 내용을 두 값 중 최대값으로 변경하는 larger_of()라는 함수를 작성하고 테스트하라. 예를 들면, larger_of(x,y)는 x와 y를 둘 다 두 값 중 최대값으로 재설정 한다.

#include <stdio.h>

void larger_of(double *,double *);

int main(void)
{
	int ck;
	double x, y;

	while(1)
	{
		printf("두 개의 부동소수점 수를 입력하시오 : ");
		ck = scanf("%lf %lf", &x, &y);

		if(ck == 2) break;
		else{
			while(getchar() != '\n');
		}
	}

	printf("바꾸기 전 (%lf, %lf)\n", x, y);
	larger_of(&x, &y);
	printf("바꾸기 후 (%lf, %lf)\n", x, y);

	return 0;
}

void larger_of(double *x, double *y)
{
	*x = (*x > *y)? *x : *y;
	*y = *x;
}

06

세 개의 double형 변수들의 주소를 전달인자로 취하여 첫 번째 변수에는 가장 작은 변수의 값을, 두 번째 변수에는 중간 값을, 세번째 변수에는 가장 큰 값을 갖는 함수를 작성하고 테스트하라.

#include <stdio.h>

void swap(double *,double *);

int main(void)
{
	int ck;
	double x, y, z;

	while(1)
	{
		printf("세 개의 부동소수점 수를 입력하시오 : ");
		ck = scanf("%lf %lf %lf", &x, &y, &z);

		if(ck == 3) break;
		else while(getchar() != '\n');
	}

	printf("바꾸기 전 (%lf, %lf, %lf)\n", x, y, z);
	if(x > y) swap(&x, &y);
	if(x > z) swap(&x, &z);
	if(y > z) swap(&y, &z);
	printf("바꾸기 후 (%lf, %lf, %lf)\n", x, y, z);

	return 0;
}

void swap(double *x, double *y)
{
	double temp = *x;
	*x = *y;
	*y = temp;
}

07

표준 입력으로부터 파일의 끝까지 문자들을 읽는 프로그램을 작성하라. 이 프로그램은 각각의 문자들에 대해 글자인지 아닌지 보고해야 한다. 또한 그것이 글자라면 그 글자의 알파벳 순서를 보고해야 한다. 예를 들어, c나 C는 둘다 글자이고 알파벳 순서는 3이다. 하나의 문자를 전달인자로 사용하고, 그것이 글자이면 그 글자의 알파벳 순서를 리턴하고, 아니면 -1을 리턴하는 함수를 작성하여 프로그램에 사용하라.

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int get_alpha_cnt(char );

int main(void)
{
	int ck;
	char ch;

	while((ck = scanf("%c", &ch)) != EOF && ck != 0)
	{
		printf("%c : %d\n", ch, get_alpha_cnt(ch));
	}

	return 0;
}

int get_alpha_cnt(char ch)
{
	int ck;
	int num = -1;

	char Alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	char alpha[] = "abcdefghijklmnopqrstuvwxyz";

	if(islower(ch))
	{
		for(int i = 0; i < strlen(alpha); i++)
			if(ch == alpha[i])
			{
				num = i;
				break;
			}
	}
	else if(isupper(ch))
	{
		for(int i = 0; i < strlen(Alpha); i++)
			if(ch == Alpha[i])
			{
				num = i;
				break;
			}
	}

	return num;
}

08

'6장: C의 제어문: 루프'의 리스트 6.20은, 하나의 double형 수를 양의 정수만큼 멱승하여 그 결과를 리턴하는 power() 함수를 보여준다. 음의 정수 멱승까지 처리할 수 있도록 그 함수를 수정하라. 또한 0의 어떤 멱승은 0이고, 어떤수의 0승은 항상 1이라는 것을 그 함수에 포함시켜라.
(0의 0승은 정의되지 않았고 1의 값을 사용중이라고 리포트 해야 한다.) 루프를 사용하라. 작성한 함수를 간단한 프로그램으로 테스트하라.

#include <stdio.h>

double power(double ,int);

int main(void)
{
	double x, xpow;
	int exp;

	printf("어떤 수와, 원하는 정수 거듭제곱수를");
	printf(" 입력하시오.\n끝내려면 q를");
	printf(" 입력하시오.\n");

	while(scanf("%lf %d", &x, &exp) == 2)
	{
		xpow = power(x, exp);
		printf("%.3g의 %d승은 %.5g입니다.\n", x, exp, xpow);
		printf("두 수를 입력하시오. 끝내려면 q를 입력하시오.\n");
	}
	printf("거듭제곰 구하기가 재미 있었나요? -- 안녕!\n");

	return 0;
}

double power(double n, int p)
{
	double pow = 1.0f;
	int i = 0;
	int pm = (p > 0)? 1 : -1;

	for( ; i != p; i+=pm)
	{
		pow = (p > 0)? (pow * n) : (pow / n);
	}

	return pow;
}

09

문제 (08)을 다시하라. 이번에는 재귀함수를 사용하라.

#include <stdio.h>

double power(double ,int);

int main(void)
{
	double x, xpow;
	int exp;

	printf("어떤 수와, 원하는 정수 거듭제곱수를");
	printf(" 입력하시오.\n끝내려면 q를");
	printf(" 입력하시오.\n");

	while(scanf("%lf %d", &x, &exp) == 2)
	{
		xpow = power(x, exp);
		printf("%.3g의 %d승은 %.5g입니다.\n", x, exp, xpow);
		printf("두 수를 입력하시오. 끝내려면 q를 입력하시오.\n");
	}
	printf("거듭제곰 구하기가 재미 있었나요? -- 안녕!\n");

	return 0;
}

double power(double n, int p)
{
	double pow = 1.0f;

	if(p == 0) return 1.0;
	pow = power(n, (p > 0)? (p - 1) : (p + 1));
	pow = (p > 0)? (pow * n) : (pow / n);

	return pow;
}

10

리스트 9.8의 to_binary()함수를 일반화 시켜, 2-10 범위의 두 번째 전달인자를 사용하는 to_base_n() 함수를 작성하라. to_base_n() 함수는 첫 번째 전달인자를 두 번째 전달인자의 진수 표기로 출력해야 한다. 예를 들면, to_base_n(129,8)은 201을 출력해야 한다. 201은 129의 8진수 표기이다. 완전한 프로그램으로 이 함수를 테스트하라.

#include <stdio.h>

void to_base_n(unsigned long ,int);

int main(void)
{
	unsigned long number;
	int ginsoo;

	printf("진수로 표기할 정수 하나를 입력하시오(끝내려면 q): \n");

	while(scanf("%lu", &number) == 1)
	{
		printf("몇 진수를 표기할 것인지 입력하시오.\n");

		while(scanf("%d", &ginsoo) != 1)
			while(getchar() != '\n');

		printf("%d진수 표기: ", ginsoo);
		to_base_n(number, ginsoo);
		putchar('\n');
		printf("진수로 표기할 정수 하나를 입력하시오(끝내려면 q):\n");
	}
	printf("종료!\n");

	return 0;
}

void to_base_n(unsigned long n, int g)
{
	int r;

	r = n % g;
	if(n >= g)
		to_base_n(n/g, g);
	printf("%d", r);

	return;
}

11

피보나치 수를 구하는 Fibonacci() 함수를 재귀 대신에 루프를 사용하여 작성하고, 함수가 제데로 동작하는지 테스트하라.

#include <stdio.h>

void Fibonacci(int );

int main(void)
{
	int num;

	printf("피보나치 수를 어디까지 출력할 것인지 입력하시오.\n");

	while(scanf("%d", &num) != 1)
		while(getchar() != '\n');
	
	Fibonacci(num);

	return 0;
}

void Fibonacci(int num)
{
	int n1 = 1, n2 = 1, n3;

	for(int i = 0; i < num; i++)
	{
		if(i < 2)
			printf("1 ");
		else
		{
			n3 = (n1 + n2);
			n1 = n2;
			n2 = n3;
			printf("%d ", n3);
		}
	}
	putchar('\n');
}

0개의 댓글