1. 주어진 실수를 제곱하여 반환하는 함수 double square(double)을 작성한다. square() 함수를 테스트하는 프로그램을 작성하라.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
double square(double); // 실수를 제곱하여 반환하는 함수
int main(void) {
double n;
printf("실수를 입력하시오: ");
scanf("%lf", &n);
printf("주어진 실수 %lf의 제곱은 %lf입니다.\n", n, square(n));
return 0;
}
double square(double n) {
return n * n;
}
2. 전달된 문자가 알파벳 문자인지 아닌지를 검사하는 함수 check_alpha()를 작성하고 이것을 호출하여서 사용자가 입력한 문자가 알파벳('a'에서 'z'까지)인지를 판단하여 출력하는 프로그램을 작성하라.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int check_alpha(char); // 'a' ~ 'z'의 알파벳이면 1, 그렇지 않으면 0 반환
int main(void) {
char c;
printf("문자를 입력하시오: ");
scanf(" %c", &c);
if (check_alpha(c))
printf("%c는 알파벳 문자입니다.\n", c);
else
printf("%c는 알파벳 문자가 아닙니다.\n", c);
return 0;
}
int check_alpha(char input) {
if (input < 97 || input>129)
return 0;
else
return 1;
}
3. 원의 면적을 구하는 문제를 함수로 작성하여 보자. 다음과 같은 식을 이용하라. 원의 면적을 구하는 함수 cal_area(double radius)를 작성하고 함수를 호출하여 원의 면적을 출력하는 전체 프로그램을 완성하라.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define PI 3.141592
double cal_area(double); // 원의 면적을 구하는 함수
int main(void) {
double radius;
printf("원의 반지름을 입력하시오: ");
scanf("%lf", &radius);
printf("원의 면적은 %lf입니다.\n", cal_area(radius));
return 0;
}
double cal_area(double r) {
return PI * r * r;
}
4. 우리는 앞에서 윤년을 구하는 알고리즘을 학습하였다. 이것을 함수 is_leap(int year) 함수로 작성하고 이 함수를 사용하여서 사용자가 입력한 연도가 윤년인지를 출력하는 프로그램을 작성하라.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int is_leap(int); // 윤년(366일)이면 1, 그렇지 않으면(365일) 0 반환
int main(void) {
int year;
printf("연도를 입력하시오: ");
scanf("%d", &year);
if (is_leap(year))
printf("%d년은 366일입니다.\n", year);
else
printf("%d년은 365일입니다.\n", year);
return 0;
}
int is_leap(int y) {
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
return 1;
else
return 0;
}
5. 실수를 정수로 변환하면 소수점 이하는 잘려서 없어지게 된다. 예를 들어서 6.999를 정수로 변환하면 6이 된다. 실수에 0.5를 더하여 소수점 이하를 버리는 반올림 연산을 수행하는 함수 round(double f)를 작성하고 테스트하라.
단 f는 양수라고 가정하라.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int round(double); // 반올림 연산을 수행하는 함수
int main(void) {
double n;
printf("실수를 입력하시오: ");
scanf("%lf", &n);
printf("반올림한 값은 %d입니다.\n", round(n));
return 0;
}
int round(double x) {
return (int)(x + 0.5);
}
6. 다음과 같은 간단한 기능을 하는 함수들을 작성하고, 사용자로부터 임의의 값을 입력받은 후에 작성한 함수들을 테스트하여 보자.
(a) 주어진 정수가 짝수이면 1을 반환하고 홀수이면 0을 반환하는 함수 int even(int n)
(b) 주어진 정수의 절대값을 구하는 함수 int absolute(inti n)
(c) 주어진 정수가 음수이면 -1을, 양수이면 1을, 0이면 0을 반환하는 함수 int sign(int n)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int even(int); // 짝수면 1, 홀수면 0을 반환
int absolute(int); // 절대값 구하는 함수
int sign(int); // 음수면 -1, 양수면 1, 0이면 0을 반환
int main(void) {
int n;
printf("정수를 입력하시오: ");
scanf("%d", &n);
printf("even()의 결과: ");
if (even(n))
printf("짝수\n");
else
printf("홀수\n");
printf("absolute()의 결과: %d\n",absolute(n));
printf("sign()의 결과: ");
if (sign(n) >= 0)
printf("양수\n");
else
printf("음수\n");
return 0;
}
int even(int n) {
return (n % 2 == 0) ? 1 : 0;
}
int absolute(int n) {
return (n < 0) ? -n : n;
}
int sign(int n) {
if (n > 0) return 1;
else if (n < 0) return -1;
else return 0;
}
7. 월급에 붙는 소득세를 계산하는 함수 get_tax(int income)를 작성하고 테스트하여 보자. 과표 구간은 1000만 원 이하 8%, 1000만 원 초과는 10%로 되어 있다고 가정한다. 사용자로부터 소득을 입력받아서 세금을 계산하는 프로그램을 작성하라.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int get_tax(int); // 소득세를 계산하는 함수
int main(void) {
int income; // 소득
printf("소득을 입력하시오(만원):");
scanf("%d", &income);
printf("소득세는 %d입니다.\n", get_tax(income));
return 0;
}
int get_tax(int income) {
int tax = 0;
if (income <= 1000) {
tax= income * 0.08;
}
else { // 소득이 1000만 원 초과이면 1000만 원이 넘는 부분만 10%적용, 나머지는 8% 적용
tax = (1000 * 0.08) + (income - 1000) * 0.1;
}
return tax;
}
8. sin() 라이브러리 함수를 호출하여서 0도부터 180도까지 10도 단위로 사인 함수 값을 출력하여 보자. 추가적으로 아예 각도를 받아서 사인값을 반환하는 함수 sin_degree(double degree)를 작성하여 문제를 해결할 수 있는가?
HINT - sin() 함수는 라디안으로 인수를 받는다.
#include<stdio.h>
#include<math.h>
#define PI 3.141592
int main(void) {
double radian;
for (double i = 0.; i <= 180.; i += 10.) {
radian = (PI * i) / 180.0; // 각도를 라디안으로 변환하는 식
printf("sin(%lf)의 값은 %lf\n", i, sin(radian));
}
return 0;
}
#include<stdio.h>
#include<math.h>
#define PI 3.141592
double sin_degree(double); //각도를 받아서 사인값을 반환하는 함수
int main(void) {
for (double i = 0.; i <= 180.; i += 10.) {
printf("sin(%lf)의 값은 %lf\n", i, sin_degree(i));
}
return 0;
}
double sin_degree(double degree) {
double radian = (PI * degree) / 180.0;
return sin(radian);
}
9. 난수(random number)는 컴퓨터를 이용한 문제 해결에서 많이 사용된다. 특히 수학적인 분석이 너무 복잡한 경우에 시뮬레이션을 사용하면 실제로 제품을 제작하지 않고서도 많은 실험을 할 수 있다. Visual Studio의 경우, rand()가 한번 호출될 때마다 0에서 32767까지의 정수를 같은 확률로 선택하여 반환한다. rand() 함수를 이용하여 0 또는 1 값을 무작위로 반환하는 함수 b_rand()를 작성하고 5번 호출하여 보자.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int b_rand(); // 0 또는 1 값을 무작위로 반환하는 함수
int main(void) {
srand((unsigned)time(NULL));
for (int i = 0; i < 5; i++)
printf("%d ", b_rand());
return 0;
}
int b_rand() {
return rand() % 2;
}
10. 앞에서 작성한 b_rand() 함수를 이용하여 간단한 동전 던지기 게임을 시뮬레이션하여 보자. 컴퓨터가 동전을 던지고 사용자는 앞뒤를 말한다. 컴퓨터는 b_rand()를 이용하여 생성된 난수가 1이면 동전의 앞면으로 간주하고 0이면 동전의 뒷면으로 간주한다.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int b_rand(); // 0 또는 1 값을 무작위로 반환하는 함수
int main(void) {
int num;
char answer;
srand((unsigned)time(NULL));
while (1) {
printf("앞면 또는 뒷면(1 또는 0):");
scanf("%d", &num);
if (num == b_rand())
printf("맞았습니다.\n");
else
printf("틀렸습니다.\n");
getchar(); // 버퍼 비우기
printf("계속하시겠습니까?(y 또는 n):");
answer = getchar();
switch (answer) {
case 'y':
continue;
break;
case 'n':
printf("프로그램을 종료합니다.\n");
return 0;
}
}
return 0;
}
int b_rand() {
return rand() % 2;
}
11. 0.0부터 1.0까지의 난수를 반환하는 함수 f_rand()를 작성하고 5번 호출하여 본다.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
double f_rand(); // 0.0 ~ 1.0까지의 난수를 반환하는 함수
int main(void) {
srand((unsigned)time(NULL)); // 시드 설정
for (int i = 0; i < 5; i++)
printf("%lf ", f_rand());
return 0;
}
double f_rand() {
return (double)rand() / RAND_MAX;
}
12. 화면에 세로로 막대 그래프를 그리는 프로그램을 작성하여 보자. 인수의 값만큼의 별표 문자를 출력하는 함수 print_value(int n)을 작성하라. 반복적으로 사용자로부터 값을 입력받아서 print_value()를 호출하여 입력값만큼 막대를 그리는 프로그램을 완성하라 사용자가 음수를 입력하면 반복을 중단하라.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void print_value(int); // 인수의 값만큼의 별 문자를 출력하는 함수
int main(void) {
int n;
while (1) {
printf("값을 입력하시오(종료는 음수): ");
scanf("%d", &n);
if (n < 0) {
printf("프로그램을 종료합니다.\n");
break;
}
print_value(n);
}
}
void print_value(int n) {
for (int i = 0; i < n; i++)
printf("*");
printf("\n");
}
13. 두 개의 정수 n, m을 입력받아서 n이 m의 배수이면 1을 반환하고 그렇지 않으면 0을 반환하는 함수 is_multiple(int n, int m)를 작성하고 테스트하여 보자.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int is_multiple(int n, int m); // n이 m의 배수이면 1, 그렇지 않으면 0을 반환
int main(void) {
int n, m;
printf("첫 번째 정수를 입력하시오:");
scanf("%d", &n);
printf("두 번째 정수를 입력하시오:");
scanf("%d", &m);
if (is_multiple(n, m))
printf("%d은(는) %d의 배수입니다.\n", n, m);
else
printf("%d은(는) %d의 배수가 아닙니다.\n", n, m);
return 0;
}
int is_multiple(int n, int m) {
return (n % m == 0) ? 1 : 0;
}
14. 두 점 사이의 거리를 계산하는 함수를 작성하여 보자. 2차원 공간에서 두 점 사이의 거리를 계산하는 get_distance(double x1, double y1, double x2, double y2)를 작성하시오. 다음과 같은 두 점 사이의 거리를 계산하는 공식을 사용하라. 제곱근은 sqrt() 라이브러리 함수를 사용하라.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
double get_distance(double x1, double y1, double x2, double y2); // 두 점 사이의 거리를 계산하는 함수
int main(void) {
double x1, y1, x2, y2;
printf("첫 번째 점의 좌표를 입력하시오:(x, y)");
scanf("%lf %lf", &x1, &y1);
printf("두 번째 점의 좌표를 입력하시오:(x, y)");
scanf("%lf %lf", &x2, &y2);
printf("두 점 사이의 거리는 %lf입니다.\n", get_distance(x1, y1, x2, y2));
return 0;
}
double get_distance(double x1, double y1, double x2, double y2) {
return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
}
15. 주어진 정수가 소수인지를 검사하는 함수 is_prime()을 작성하라. 이 함수를 이용하여 2부터 100 사이의 모든 소수를 출력하라.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int is_prime(int n); // 주어진 정수가 소수이면 1, 그렇지 않으면 0을 반환
int main(void) {
for (int i = 2; i <= 100; i++) {
if (is_prime(i))
printf("%d ", i); // 소수이면 출력한다.
}
printf("\n");
return 0;
}
int is_prime(int n) {
for (int i = 2; i < n; i++) {
if (n % i == 0)
return 0;
}
return 1;
}
16. 오일러의 수 e는 자연 로그의 밑수로 사용된다. 이 값은 다음과 같은 식에 의하여 근사치를 구할 수 있다. 본문에 있는 팩토리얼 값을 계산하는 함수 factorial()을 호출하여서 오일러의 수를 계산하는 프로그램을 작성하라.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
long long factorial(int); // 팩토리얼을 계산하는 함수
int main(void) {
int n;
double e_num; // 오일러의 수
printf("어디까지 계산할까요: ");
scanf("%d", &n);
e_num = 1;
for (int i = 1; i <= n; i++) {
e_num = e_num + 1. / factorial(i);
}
printf("오일러의 수는 %lf입니다.\n", e_num);
return 0;
}
long long factorial(int n) {
long long result = 1; // 팩토리얼의 값은 매우 커질 수 있기 때문에 자료형을 long long으로 한다.
for (int i = 1; i <= n; i++)
result *= i;
return result;
}
17. 두 개의 부동 소수점 수가 근사적으로 같은 값이면 1을 반환하고 근사적으로 같지 않으면 0을 넘겨주는 함수 f_equal(a, b)을 작성하시오. 근사적으로 같다고 하는 것은 다음의 부등식을 만족하는 경우라고 가정한다.
#define _CRT_SECURE_NOWARNINGS
#include<stdio.h>
int f_equal(double, double); // 두 개의 부동 소수점 수가 근사적으로 같으면 1, 그렇지 않으면 0을 반환
double f_abs(double); // 부동 소수점 수의 절대값을 구하는 함수
double f_min(double, double); // 두 개의 부동 소수점 수 중 최소값을 반환
int main(void) {
double x, y;
printf("실수를 입력하시오: ");
scanf("%lf", &x);
printf("실수를 입력하시오: ");
scanf("%lf", &y);
if (f_equal(x, y))
printf("두 개의 실수는 근사적으로 같음\n");
else
printf("두 개의 실수는 서로 다름\n");
return 0;
}
int f_equal(double x, double y) {
if (f_abs(x - y) / f_min(f_abs(x), f_abs(y)) < 0.000001)
return 1;
else
return 0;
}
double f_abs(double x) {
return (x < 0) ? -x : x;
}
double f_min(double x, double y) {
return (x < y) ? x : y;
}
18. 사용자로부터 2개의 숫자를 받아서 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산의 결과를 계산해주는 프로그램을 작성해보자. 다음과 같은 메뉴를 화면에 표시한다. 프로그램 작성시에 최대한 함수를 많이 사용해보자.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void print_menu(); // 메뉴 출력 함수
int get_integer(); // 숫자 하나를 입력받아 그 값을 반환
int add(int, int); // 두 수의 합을 반환
int sub(int, int); // 두 수의 차를 반환
int mul(int, int); // 두 수의 곱을 반환
int div(int, int); // 두 수의 몫을 반환
int mod(int, int); // 나머지를 반환
int cal_integer(int x, int y, int op); // 두 수 x, y를 op에 따라 연산한 결과값을 반환
int main(void) {
int op, x, y, result;
char answer; // 계속할지 묻는 질문에 대한 답변을 저장하는 변수
while (1) {
print_menu();
printf("원하는 메뉴를 선택하시오(1-5):");
op = get_integer();
if (op == 1 || op == 2 || op == 3 || op == 4 || op == 5) {
printf("숫자 2개를 입력하시오: ");
x = get_integer();
y = get_integer();
}
else {
printf("다시 입력하세요!\n");
continue;
}
result = cal_integer(x, y,op);
printf("연산 결과 : %d\n", result);
printf("계속하려면 y를 누르시오:");
scanf(" %c", &answer);
if (answer == 'y')
continue;
else {
printf("프로그램을 종료합니다.\n");
break;
}
}
return 0;
}
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 get_integer() {
int n;
scanf("%d", &n);
return n;
}
int cal_integer(int x, int y, int op) {
int result;
switch (op) {
case 1:
result = add(x, y); break;
case 2:
result = sub(x, y); break;
case 3:
result = mul(x, y); break;
case 4:
result = div(x, y); break;
case 5:
result = mod(x, y); break;
}
return result;
}
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 div(int x, int y) { return x / y; }
int mod(int x, int y) { return x % y; }
'Category > C' 카테고리의 다른 글
쉽풀C - 10장 배열 (0) | 2023.02.06 |
---|---|
쉽풀C - 9장 함수와 변수 (0) | 2023.02.05 |
쉽풀C - 7장 반복문 (0) | 2023.02.03 |
쉽풀C - 6장 조건문 (1) | 2023.02.02 |
쉽풀C - 5장 수식과 연산자 (0) | 2023.02.01 |