01. 다음과 같은 간단한 기능을 하는 함수들을 작성하고, 사용자로부터 임의의 값을 입력받을 후에 작성한 함수들을 테스트하여 보자.
(a) 주어진 정수가 짝수이면 1을 반환하고 홀수이면 0을 반환하는 함수 int even(int n)
(b) 주어진 정수의 절대값을 구하는 함수 int absolute(int n)
(c) 주어진 정수가 음수이면 -1을, 양수이면 1을 0이면 0을 반환하는 함수 int sign(int n)

#include <stdio.h>
int even(int n);
int absolute(int n);
int sign(int n);
int main() {
int a;
printf("정수를 입력하시오: ");
scanf("%d", &a);
printf("even()의 결과: %d \n", even(a));
printf("absolute()의 결과: %d \n", absolute(a));
printf("sign()의 결과: %d \n", sign(a));
}
int even(int n) {
if (n % 2 == 0) {
return 1;
}
return 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;
}
}
02. 두 개의 정수 n, m을 입력받아서 n이 m의 배수이면 1을 반환하고 그렇지 않으면 0을 반환하는 함수 is_multiple(int n, int m)를 작성하고 테스트하여 보자.

#include <stdio.h>
int is_multiple(int n, int m);
int main() {
int n, m;
printf("첫 번째 정수를 입력하시오: ");
scanf("%d", &n);
printf("두 번째 정수를 입력하시오: ");
scanf("%d", &m);
if (is_multiple(n, m)) {
printf("%d은 %d의 배수입니다.", n, m);
}
else {
printf("%d은 %d의 배수가 아닙니다.", n, m);
}
}
int is_multiple(int n, int m) {
if (n % m == 0) {
return 1;
}
return 0;
}
03. 두 개의 실수 중에서 더 큰 수를 반환하는 함수 get_bigger()를 다음과 같이 작성하고 이것을 이용해서 사용자로부터 받은 실수 두 개 중에서 더 큰수를 출력하는 프로그램을 작성하여본다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
double get_bigger(double a, double b);
int main() {
double a, b;
printf("실수를 입력하시오: ");
scanf("%lf %lf", &a, &b);
printf("큰 수는 %.1lf입니다.", get_bigger(a, b));
}
double get_bigger(double a, double b) {
return a > b ? a : b;
}
04. 전달된 문자가 알파벳 문자인지 아닌지를 검사하는 함수 check_alpha()를 작성하고 이것을 호출하여서 사용자가 입력한 문자가 알파벳('a'에서 'z'까지)인지를 판단하여 출력하는 프로그램을 작성하라.

#include <stdio.h>
void check_alpah(char c);
int main() {
char c;
printf("문자를 입력하시오: ");
scanf("%c", &c);
check_alpah(c);
}
void check_alpah(char c) {
if (c >= 'a' && c <= 'z') {
printf("%c는 알파벳 문자입니다.",c);
}
else {
printf("%c는 알파벳 문자가 아닙니다.", c);
}
}
05. 원의 면적을 구하는 문제를 함수로 작성하여 보자. 다음과 같은 식을 이용하라. 원의 면적을 구하는 함수 cal_area(double radius)를 작성하고 함수를 호출하려 원의 면적을 출력하는 전체 프로그램을 완성하라.

#include <stdio.h>
#define PI 3.141592
void cal_area(double radius);
int main() {
double r;
printf("원의 반지름을 입력하시오: ");
scanf("%lf", &r);
cal_area(r);
}
void cal_area(double radius) {
printf("원의 면적은 %.2lf입니다.", radius * radius * PI);
}
06. 함수 is_leap( int year ) 함수로 작성하고 이 함수를 사용하여서 사용자가 입력한연도가 윤년인지를 출력하는 프로그램을 작성하라.

#include <stdio.h>
void is_leap(int year);
int main() {
int year;
printf("연도를 입력하시오: ");
scanf("%d", &year);
is_leap(year);
}
void is_leap(int year) {
if ((year % 4 == 0 && year % 100 != 0)|| (year % 400 == 0)) {
printf("%d년은 윤년입니다.", year);
}
else {
printf("%d년은 윤년아닙니다.", year);
}
}
07. 실수를 정수로 변환하면 소수점 이하는 잘려서 없어지게 된다. 예를 들어서 6.999를 정수로 변환하면 6이 된다. 실수에 0.5을 더하여 소수점 이하를 버리는 반올림 연산을 수행하는 함수 round(double f)를 작성하고 테스트하라. 단 f 는 양수라고 가정하라.

#include <stdio.h>
int round(double f);
int main() {
double a;
printf("실수를 입력하시오: ");
scanf("%lf", &a);
printf("반올림한 값은 %d입니다.", round(a));
}
int round(double f) {
return (int)(f + 0.5);
}
08. 월급에 붙는 소득세를 계산하는 함수 get_tax(int income)를 작성하고 테스트하여 보자. 과표 구간은 1000만 원 이하 8%, 1000만 원 초과는 10%로 되어 있다고 가정한다. 사용자로부터 소득을 입력받아서 세금을 계산하는 프로그램을 작성하라.

#include <stdio.h>
int get_tax(int income);
int main() {
int income;
printf("소득을 입력하시오(만원):");
scanf("%d", &income);
printf("소득세는 %d만원입니다.", get_tax(income));
}
int get_tax(int income) {
int extra, money, tax;
if (income > 1000) {
extra = income - 1000;
money = 1000;
}
else {
extra = 0;
money = income;
}
tax = money * 0.08 + extra * 0.1;
}
09. 각도를 받아서 사인값을 반환하는 함수 sin_degree(double degree)를 작성하고 이 함수를 호출하여서 0도부터 180도까지, 10도 단위로 사인값을 출력하여보자.

#include <stdio.h>
#include <math.h>
#define PI 3.141592
double sin_degree(double degree);
int main() {
for (double i = 0; i <= 180; i += 10) {
printf("sin(%lf)의 값은 %lf \n", i,sin_degree(i));
}
}
double sin_degree(double degree) {
return sin(PI * degree / 180);
}
10. 난수(random number)는 컴퓨터를 이용한 문제 해결에서 많이 사용된다. 특히 수학적인 분석이 너무 복잡한 경우에 시뮬레이션을 사용하면 실제로 제품을 제작하기 않고서도 많은 실험을 할 수 있다.10에서 90까지의 정수를 무작위로 반환하는 함수 randint()를 작성하고 10번 호출하여보자. 힌트: (a~ b)까지 범위 구하기 ( a + rand()%(b-a+1))

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int randint() {
return 10 + rand() % 81;
}
int main() {
srand((unsigned)time(NULL));
for (int i = 0; i < 10; i++) {
printf("%d ", randint());
}
}
11. 사용자와 컴퓨터가 주사위 게임을 한다고 하자. 주사위를 각 3번씩 굴려서 주사위 점수를 합한다. 함친 점수가 높은 쪽이 이긴다고 하자.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int randint() {
int sum = 0, a;
for (int i = 0; i < 3; i++) {
a = 1 + rand() % 6;
sum += a;
if (i == 2) {
printf("%d", a);
}
else {
printf("%d, ", a);
}
}
return sum;
}
int main() {
int user, com;
srand((unsigned)time(NULL));
printf("사용자 주사위=(");
user = randint();
printf(")=%d \n", user);
printf("컴퓨터 주사위=(");
com = randint();
printf(")=%d \n", com);
if (user > com) {
printf("사용자 승리");
}
else if (user == com) {
printf("사용자와 컴퓨터 비김");
}
else {
printf("컴퓨터 승리");
}
}
12. 양의 십진수를 받아서 가장 상위 자리수를 반환하는 함수 get_first_digit(int n)를 작성하라. 예를 들어서 1099999이라면 1을 반환하여야 한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void print(int n) {
if (n <10)
printf("가장 상위 자리수는 %d입니다.", n);
else
print(n / 10);
}
int main() {
int n;
printf("정수를 입력하시오 : ");
scanf("%d", &n);
print(n);
}
#include <stdio.h>
int get_first_digit(int n) {
while (n > 9) {
n /= 10;
}
return n;
}
int main() {
int a;
printf("정수를 입력하시오: ");
scanf("%d", &a);
printf("가장 상위 자리수는 %d입니다.", get_first_digit(a));
}
13. 두 점사이의 거리를 계산하는 함수를 작성하여 보자. 2차원 공간에서 두 점 와 사이의 거리를 계산하는 get_distance(double x1, double x2, double y1, double y2)를 작성하시오. 다음과 같은 두 점 사이의 거리를 계산하는 공식을 사용하라. 제곱근은 sqrt() 라이브러리 함수를 사용하라.


#include <stdio.h>
#include <math.h>
double get_distance(double x1,double y1,double x2,double y2){
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
int main() {
double x, y, a, b;
printf("첫 번째 점의 좌표를 입력하시오: ");
scanf("%lf %lf", &x, &y);
printf("두 번째 점의 좌표를 입력하시오: ");
scanf("%lf %lf", &a, &b);
printf("두 점 사이의 거리는 %lf입니다.", get_distance(x, y, a, b));
}
14. 어떤정수가 소수 2개의 합으로 표시될 수 있는지를 검사하는 프로그램을 작성해보자. 이 문제는 함수를사용하지 않으면 구현하기가 상당히 어렵다. 컴퓨터는 반복을 굉장히 쉽게 한다는 것을 이용한다 정수라면 반복 횟수가 제한되기 대문에 모든 경의 수를 다검사할수 있다. 본문에서 작성한 is_prime()함수를 사용한다 .

#include <stdio.h>
int is_prime(int a) {
for (int i = 2; i < a; i++) {
if (a % i == 0) {
return 0;
}
}
return 1;
}
int main() {
int a;
printf("양의 정수를 입력하시오: ");
scanf("%d", &a);
for (int i = 2; i <= a - 2; i++) { // a - 1 이면 a = 1 + (a-1) 이 되기때문, 1은 소수가 될수 없음
if (is_prime(i) && is_prime(a - i)) {
printf("%d = %d + %d \n", a, i, a - i);
}
}
}
15. 오일러의 수 e는 자연 로그의 밑수로 사용된다. 이 값은 다음과 같은 식에 의하여 근사치를 구할 수 있다. 본문에 있는 팩토리얼 값을 계산하는 함수 tactorial()을 호출하여서 오일러의 수를 계산하는 프로그램을 작성하라.


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
double oil(int n) {
double sum = 1;
int term = 1;
for (int i = 1; i <= n; i++) {
term *= i;
sum += 1. / term;
}
}
int main() {
int n;
printf("어디까지 계산할까요: ");
scanf("%d", &n);
printf("오일러의 수는 %lf입니다.", oil(n));
}
#include <stdio.h>
int facotrial(int n) {
int result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
int main() {
int n;
double result = 0;
printf("어디까지 계산할까요: ");
scanf("%d", &n);
for (int i = 0; i <= n; i++) {
result += 1.0 / facotrial(i);
}
printf("오일러의 수는 %lf입니다.", result);
}
재귀함수
#include <stdio.h>
int fac(n) {
if (n < 1)
return 1;
else
return n * fac(n - 1);
}
double oil(int n) {
if (n < 1) {
return 1;
}
else
return 1. / fac(n) + oil(n - 1);
}
int main() {
int n;
printf("어디까지 계산할까요: ");
scanf("%d", &n);
printf("오일러의 수는 %lf", oil(n));
}
16. 은행에 설치되어 있는 ATM 장치를 프로그램으로 구현해보자. 가능하다면 소스의 많은 부분을함수로 구현해본다.

#include <stdio.h>
int money = 0;
void print();
void account();
void input();
void output();
int main() {
int a, money = 0;
while (1) {
print();
scanf("%d", &a);
if (a < 1 || a > 4) {
printf("메뉴에 없는 번호입니다. \n");
continue;
}
if (a == 1) {
account();
}
else if (a == 2) {
input();
}
else if (a == 3) {
output();
}
else {
break;
}
}
}
void print() {
printf("******* welcome to Express ATM ******* \n");
printf("<1> 잔액 \n");
printf("<2> 입금 \n");
printf("<3> 출금 \n");
printf("<4> 종료 \n");
printf("메뉴를 선택하시오: ");
}
void account() {
printf("잔고는 %d원입니다.\n\n", money);
}
void input() {
int a;
printf("입금 금액을 입력하시오: ");
scanf("%d", &a);
money += a;
account();
}
void output() {
int a;
printf("출금 금액을 입력하시오: ");
scanf("%d", &a);
if (money < a) {
printf("출금 금액이 잔고보다 많습니다.\n");
output();
}
account();
}'C' 카테고리의 다른 글
| [쉽게 풀어쓴 C언어 Express 개정 4판] 10장 Programming (4) | 2024.10.04 |
|---|---|
| [쉽게 풀어쓴 C언어 Express 개정 4판] 9장 Programming (3) | 2024.10.03 |
| [쉽게 풀어쓴 C언어 Express 개정 4판] 7장 Programming (2) | 2024.10.02 |
| [쉽게 풀어쓴 C언어 Express 개정 4판] 6장 Programming (4) | 2024.10.01 |
| [쉽게 풀어쓴 C언어 Express 개정 4판] 5장 Programming (1) | 2024.09.27 |