두 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;
}
사용자가 요청한 문자를 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');
}
하나의 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');
}
}
두 수의 조화 평균(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;
}
두 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;
}
세 개의 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;
}
표준 입력으로부터 파일의 끝까지 문자들을 읽는 프로그램을 작성하라. 이 프로그램은 각각의 문자들에 대해 글자인지 아닌지 보고해야 한다. 또한 그것이 글자라면 그 글자의 알파벳 순서를 보고해야 한다. 예를 들어, 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;
}
'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;
}
문제 (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;
}
리스트 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;
}
피보나치 수를 구하는 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');
}