01. 덧셈, 뺄셈, 곱셈, 나눗셈을 지원하는 계산기 프로그램을 작성하여 보자. 각 연산들이 몇 번식 계산되었는지를
기억하게 하자. 각 연산을 지원하는 함수들은 자신이 호출된 횟수를 화면에 출력한다.
(1) 정적 지역 변수를 사용하여 프로그램을 작성하라
(2) 전역 변수를 사용하여 프로그램을 작성하라.

(1)
#include <stdio.h>
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
int divide(int a, int b);
int main() {
int a, b, result;
char n;
while (1) {
printf("연산을 입력하시오: ");
scanf("%d%c%d", &a, &n, &b);
if (n == '+') {
result = add(a, b);
}
else if (n == '-') {
result = subtract(a, b);
}
else if (n == '*') {
result = multiply(a, b);
}
else if (n == '/') {
result = divide(a, b);
}
else {
printf("잘못된 연산을 입력했습니다. \n");
continue;
}
printf("연산의 결과: %d \n", result);
}
}
int add(int a, int b) {
static int x = 0;
x++;
printf("덧셈은 총 %d번 실행되었습니다. \n", x);
return a + b;
}
int subtract(int a, int b) {
static int x = 0;
x++;
printf("뺄셈은 총 %d번 실행되었습니다. \n", x);
return a - b;
}
int multiply(int a, int b) {
static int x = 0;
x++;
printf("나눗셈은 총 %d번 실행되었습니다. \n", x);
return a / b;
}
int divide(int a, int b) {
static int x = 0;
x++;
printf("곱셈은 총 %d번 실행되었습니다. \n", x);
return a * b;
}
(2)
static int 변수명 대신
함수밖에 int 변수명을 선언하면된다.
02. 주사위를 던져서 각각의 면이 몇 번 나왔는지를 출력하는 프로그램을 작성하라. 주사위의 면은 난수를
이용하여 생성한다. 주사위를 던지는 함수 get_dice_face()를 만들고 각각의 면이 나올 때마다 그 횟수를 정적 지역
변수를 이용하여 기억하게 하라. get_dice_face() 호출 횟수가 100이 되면 각 면의 횟수를 출력한다.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int dice() {
static int count[6] = { 0 };
static int call = 0;
count[rand() % 6 ]++;
call++;
if (call == 100) {
for (int i = 0; i < 6; i++) {
printf("%d -> %d\n", i+1, count[i]);
}
return 0;
}
else
return 1;
}
int main() {
srand((unsigned)time(NULL));
int n;
do {
n = dice();
} while (n);
}
03. 로그인 시에 아이디를 검사하는 함수 int check()를 작성해서 테스트하라. check()가 한번 호출될 때마다 비밀
번호를 질문하고 일치 여부를 0과 1로 반환한다. 비밀번호는 숫자 1234로 고정되어 있다고 가정한다. check()가
3번 이상 호출되고 아이디가 일치하지 않으면 check()는 “로그인 시도 횟수 초과“ 메시지를 출력한다. check()
함수 안에 정적 변수를 선언하여 사용해보자

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int check() {
static int count = 0;
int user;
int pass = 1234;
count++;
printf("비밀번호: ");
scanf("%d", &user);
if (pass == user)
return 1;
else if (count >= 3)
return -1;
else
return 0;
}
int main() {
int n;
do {
n = check();
} while (n == 0);
if (n == 1)
printf("로그인 시도 완료");
else
printf("로그인 시도 횟수 초과");
}
04. 본문에서 설명한 바와 같이 정적 변수는 초기화를 딱 한 번만 수행하는 경우에도 사용된다. 난수를 생성하여
반환하는 함수 get_random()을 작성하여 테스트하라. get_random()이 처음으로 호출되는 경우에는 srand를 호출
하여서 난수의 시드를 초기화하고 그렇지 않으면 rand()를 호출하여 난수를 반환한다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void get_random() {
static int i = 0;
if (i == 0) {
printf("초기화 실행 \n");
srand((unsigned)time(NULL));
i = 1;
}
printf("%d \n", rand());
}
int main() {
for (int i = 0; i < 3; i++) {
get_random();
}
}
05. math.c 파일 안에 전역 변수 pi는 3.14로 초기화된다. main.c에서는 extern 키워드를 사용하여 math.c에 정의된 pi의 값을 출력하는프로그램을 작성해보자.

float pi = 3.14;
#include <stdio.h>
extern float pi;
int main() {
printf("pi = %.2f",pi);
}
06. 1부터 n까지의 합(1+2+3+4+…+n)을 계산하는 문제를 순환 기법을 이용하여 작성해보자.

#include <stdio.h>
int hap(int n) {
if (n < 1) {
return 0;
}
else {
return n + hap(n - 1);
}
}
int main() {
int a;
printf("정수를 입력하시오: ");
scanf("%d", &a);
printf("1부터 %d까지의 합=%d", a, hap(a));
}
07. 순환 기법을 이용하여 지수 값을 계산하는 함수 power(int base, int power_raised)를 작성하고 테스트해보자.
power(2,3)가 호출되면 2^3을 계산하여 반환한다

#include <stdio.h>
int power(int a, int b) {
if (b < 1) {
return 1;
}
else {
return a * power(a, b - 1);
}
}
int main() {
int a, b;
printf("밑수: ");
scanf("%d", &a);
printf("지수: ");
scanf("%d", &b);
printf("%d^%d = %d \n", a, b, power(a, b));
}
08. 순환 호출을 이용하여 정수의 각 자리수를 출력하는 함수 show_digit(int x)를 작성하고 테스트하라. 즉 정수가
1234이면 화면에 1 2 3 4와 같이 출력한다. 함수는 일의 자리를 출력하고 나머지 부분을 대상으로 다시 같은
함수를 순환 호출한다. 예를 들어서 1234의 4를 출력하고 나머지 123을 가지고 다시 같은 함수를 순환 호출한다.

1234를 10으로 나누면 123이 되고 4는 1234를 10으로 나눈 나머지이다.
#include <stdio.h>
void print(int a) {
if (a > 0) {
print(a / 10);
printf("%d ", a % 10);
}
}
int main() {
int a;
printf("정수를 입력하시오: ");
scanf("%d", &a);
print(a);
}
09. 사용자로부터 여러 개의 문자를 받아서 역순으로 출력하는 프로그램을 작성해보자. 순환 호출을 이용해본다.

#include <stdio.h>
void reverse() {
static int a = 0;
char c = getchar();
if (c != '\n') {
if (a == 0) {
a = 1;
printf("역순문장: ");
}
reverse();
putchar(c);
}
}
int main() {
printf("문장을 입력하시오: ");
reverse();
}
10. 다음과 같은 수식의 값을 계산하는 순환적인 프로그램을 작성하라.
1/1+1/2+1/3+…+1/n

#include <stdio.h>
double reverse(int n) {
if (n < 1)
return 0;
else {
return 1.0 / n + reverse(n - 1);
}
}
int main() {
int a;
scanf("%d", &a);
printf("%lf",reverse(a));
}
11. 순환 호출을 이용하여 피보나치수열을 계산해 보자. 피보나치수열이란 다음과 같이 정의되는 수열이다.

#include <stdio.h>
int fib(int n) {
if (n <= 1)
return n;
else {
return fib(n - 1) + fib(n - 2);
}
}
int main() {
int result;
for (int i = 0; i <= 10; i++) {
result = fib(i);
printf("fib(%d) = %d \n", i, result);
}
}

#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판] 11장 Programming (0) | 2024.10.04 |
---|---|
[쉽게 풀어쓴 C언어 Express 개정 4판] 10장 Programming (2) | 2024.10.04 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 8장 Programming (1) | 2024.10.03 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 7장 Programming (0) | 2024.10.02 |
[쉽게 풀어쓴 C언어 Express 개정 4판] 6장 Programming (1) | 2024.10.01 |