[Programming] 쉽게 풀어쓴 C언어 Express 8장 풀이
01. 주어진 실수를 제곱하여 반환하는 함수 double square(double)을 작성한다. square() 함수를 테스트하는 프로그램을 작성하라.
Hint : double형을 입력받을 때는 scanf("%lf", &x)를 사용한다
#include <stdio.h>
#pragma warning (disable:4996)
double square(double x) {
return x * x;
}
int main() {
double x;
printf("정수를 입력하시오: ");
scanf("%lf", &x);
printf("주어진 정수 %lf의 제곱은 %lf입니다.\n", x, square(x));
}
02. 전달된 문자가 알파벳 문자인지 아닌지를 검사하는 함수 check_alpha()를 작성하고 이것을 호출하여서 사용자가 입력한 문자가 알파벳('a'에서 'z'까지)인지를 판단하여 출력하는 프로그램을 작성하라.
Hint : 문자를 입력받을 때는 ch = getchar()을 사용해도 좋다. scanf(" %c", &ch)를 사용해도 된다.
#include <stdio.h>
#pragma warning (disable:4996)
void check_alpha(char c) {
if (c >= 'A' && c <= 'z') {
printf("%c는 알파벳 문자입니다.\n", c);
}
else
printf("%c는 알파벳 문자가 아닙니다.\n", c);
}
int main() {
char c;
printf("문자를 입력하시오: ");
scanf("%c", &c);
check_alpha(c);
return 0;
}
05. 실수를 정수로 변환하면 소수점 이하는 잘려서 없어지게 된다. 예를 들어서 6.999를 정수로 변환하면 6이 된다. 실수에0.5를 더하여 소수점 이하를 버리는 반올림 연산을 수행하는 함수 round(double f)를 작성하고 테스트하라. 단 f는 양수라고 가정하라.
Hint : 반올림시키는 가장 간단한 방법은 (int)(f + 0.5) 이다.
#include <stdio.h>
#pragma warning (disable:4996)
double get_double() {
double f;
printf("실수를 입력하시오: ");
scanf("%lf", &f);
return f;
}
int get_int() {
int i;
printf("정수를 입력하시오: ");
scanf("%lf", &i);
return i;
}
int round(double f) {
return (int)(f + 0.5);
}
int main() {
double f = get_double();
printf("반올림한 값은 %d입니다\n", round(f));
return 0;
}
06. 다음과 같은 간단한 기능을 하는 함수들을 작성하고, 사용자로부터 임의의 값을 입력받은 후에 작성함 함수들을 테스트하여 보자.
(a) 주어진 정수가 짝수이면 1을 반환하고 홀수이면 0을 반환하는 함수 int even(int n)
(b) 주어진 정수의 절대값을 구하는 함수 absolute(int n)
(c) 주어진 정수가 음수이면 -1을, 양수이면 1을, 0이면 0을 반환하는 함수 int sign(int n)
Hint : 함수 원형을 먼저 정의한 후에 함수를 정희하도록 하자. 함수들을 구현할 떄, 조건 연산자 ?:를 사용하여도 된다.
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
int even(int n) {
return n % 2 == 0 ? 1 : 0;
}
int absolute(int n) {
return abs(n);
}
int sign(int n) {
return n < 0 ? -1 : (n > 0 ? 1 : 0);
}
int main() {
int x;
printf("정수를 입력하시오: ");
scanf("%d", &x);
printf("even()의 결과: ");
even(x) == 1 ? printf("짝수\n") : printf("홀수\n");
printf("absolute()의 결과: %d\n", absolute(x));
printf("sign()의 결과: ");
return sign(x) == -1 ? printf("음수\n") : (sign(x) == 1 ? printf("양수\n") : printf("0\n"));
return 0;
}
08. sin() 라이브러리 함수를 호출하여서 0도부터 180도까지 10도 단위로 사인 함수 값을 출력하여 보자. 추가적으로 아예 각도를 받아서 사인 값을 반환하는 함수 sin_degree(double degree)를 작성하여 문제를 해결할 수 있는가?
Hint : sin() 함수는 라디안으로 인수받는다. 따라서 라디안을 각도로 변화하여야 한다. 변환식은 (π * degree) / 180.0 이다. 또, sin() 함수를 이용하여면 <math.h>가 필요하다.
#include <stdio.h>
#include <math.h>
#pragma warning (disable:4996)
#define PI 3.141592
double sin_degree(double degree) {
return sin((PI * degree) / 180.0);
}
int main() {
for (float i = 0; i <= 180; i += 10) {
printf("sin(%f)의 값은 %f\n", i, sin_degree(i));
}
return 0;
}
11. 0.0부터 1.0까지의 난수를 반환하는 함수 f_rand()를 작성하고 5번 호출하여 본다.
Hint : rand() / (double)RAND_MAX 수식을 분석하여 보자
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#pragma warning (disable:4996)
double f_rand() {
return rand() / (double)RAND_MAX; //RAND_MAX: rand()의 최대값
}
int main() {
srand((unsigned)time(NULL));
for (float i = 0; i < 5; i++) {
printf("%f ", f_rand());
}
return 0;
}
13. 두 개의 정수 n, m을 입력받아서 n이 m의 배수이면 1을 반환하고 그렇지 않으면 0을 반환하는 함수 is_multiple(int n, int m)를 작성하고 테스트하여 보자.
Hint : 만약 n이 m의 배수이면 (n % m)이 0임을 이용하라
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
int is_multiple(int n, int m) {
if (n % m == 0)
return 1;
else
return 0;
}
int main() {
int n, m;
printf("첫번째 정수를 입력하시오: ");
scanf("%d", &n);
printf("두번째 정수를 입력하시오: ");
scanf("%d", &m);
if (is_multiple(n, m) == 1)
printf("%d는 %d의 배수입니다.\n", n, m);
else
printf("%d는 %d의 배수가 아닙니다.", n, m);
return 0;
}
18. 사용자로부터 2개의 숫자를 받아서 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산의 결과를 계산해주는 프로그램을 작성해보자. 다음과 같은 메뉴를 화면에 표시한다. 프로그램 작성시에 최대한 함수를 많이 사용해보자.
Hint : 메뉴를 화면에 표시하는 함수도 만들어서 사용해보자.
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
void print_menu() {
printf("==========================\n");
printf("MENU\n");
printf("==========================\n");
printf("1. 덧셈\n");
printf("2. 뺄셈\n");
printf("3. 곱셈\n");
printf("4. 나눗셈\n");
printf("5. 나머지\n");
}
int add(int x, int y) {
return x + y;
}
int sub(int x, int y) {
return x - y;
}
int mul(int x, int y) {
return x * y;
}
int division(int x, int y) {
return x / y;
}
int rest(int x, int y) {
return x % y;
}
int main() {
while (1) {
int select;
int x, y;
int result;
char retry;
print_menu();
printf("원하는 메뉴를 선택하시오(1-5): ");
scanf("%d", &select);
printf("숫자 2개를 입력하시오: ");
scanf("%d %d", &x, &y);
switch (select) {
case 1:
result = add(x, y);
break;
case 2:
result = sub(x, y);
break;
case 3:
result = mul(x, y);
break;
case 4:
result = division(x, y);
break;
case 5:
result = rest(x, y);
break;
}
printf("연산결과: %d\n", result);
printf("계속하려면 y를 누르시오: ");
scanf(" %c", &retry);
if (retry == 'y')
continue;
else
break;
}
return 0;
}