1.덧셈, 뺄셈, 곱셈, 나눗셈을 지원하는 계산기 프로그램을 작성하여 보자. 이번에는 각 연산들이 몇 번씩 계산되었는지를 기억하게 하자. 각 연산을 지원하는 함수들은 자신이 호출된 횟수를 화면에 출력한다.
(a) 정적 지역 변수를 사용하여 프로그램을 작성하라.
(b) 전역 변수를 사용하여 프로그램을 작성하라.
#include <stdio.h>
int add(int x,int y);
int sup(int x,int y);
int mul(int x,int y);
int dvd(int x,int y);
void main()
{
int n1,n2;
char op;
while(1)
{
printf("연산식 입력:");
scanf("%d %c %d",&n1,&op,&n2);
fflush(stdin);
switch(op)
{
case '+':
printf("연산결과: %d\n",add(n1,n2));
break;
case '-':
printf("연산결과: %d\n",sup(n1,n2));
break;
case '*':
printf("연산결과: %d\n",mul(n1,n2));
break;
case '/':
printf("연산결과: %d\n",dvd(n1,n2));
break;
}
}
}
int add(int x,int y)
{
static int count=0;
count++;
printf("덧셈 연산이 %d번 실행되었습니다.\n",count);
return x+y;
}
int sup(int x,int y)
{
static int count=0;
count++;
printf("뺄셈 연산이 %d번 실행되었습니다.\n",count);
return x-y;
}
int mul(int x,int y)
{
static int count=0;
count++;
printf("곱셈 연산이 %d번 실행되었습니다.\n",count);
return x*y;
}
int dvd(int x,int y)
{
static int count=0;
count++;
printf("나눗셈 연산이 %d번 실행되었습니다.\n",count);
return x/y;
}
#include <stdio.h>
static int count_add;
static int count_sup;
static int count_mul;
static int count_dvd;
int add(int x,int y);
int sup(int x,int y);
int mul(int x,int y);
int dvd(int x,int y);
void main()
{
int n1,n2;
char op;
while(1)
{
printf("연산식 입력:");
scanf("%d %c %d",&n1,&op,&n2);
fflush(stdin);
switch(op)
{
case '+':
printf("연산결과: %d\n",add(n1,n2));
break;
case '-':
printf("연산결과: %d\n",sup(n1,n2));
break;
case '*':
printf("연산결과: %d\n",mul(n1,n2));
break;
case '/':
printf("연산결과: %d\n",dvd(n1,n2));
break;
}
}
}
int add(int x,int y)
{
count_add++;
printf("덧셈 연산이 %d번 실행되었습니다.\n",count_add);
return x+y;
}
int sup(int x,int y)
{
count_sup++;
printf("뺄셈 연산이 %d번 실행되었습니다.\n",count_sup);
return x-y;
}
int mul(int x,int y)
{
count_mul++;
printf("곱셈 연산이 %d번 실행되었습니다.\n",count_mul);
return x*y;
}
int dvd(int x,int y)
{
count_dvd++;
printf("나눗셈 연산이 %d번 실행되었습니다.\n",count_dvd);
return x/y;
}
2.주사위를 던져서 각각의 면이 몇 번 나왔는지를 출력하는 프로그램을 작성하라. 주사위의 면은 난수를 이용하여 생성한다. 주사위를 던지는 함수 get_dice_face()를 만들고 이 함수 안에서 각각의 면이 나올 때마다 그 횟수를 정적 지역 변수를 이용하여 기억하게 하라. get_dice_face() 호출 횟수가 100의 배수일 때마다 면이 나온 횟수를 출력한다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int get_dice_face(int num);
void main()
{
int num=0;
srand((unsigned)time(NULL));
get_dice_face(num);
}
int get_dice_face(int num)
{
int i;
static int count1=0;
static int count2=0;
static int count3=0;
static int count4=0;
static int count5=0;
static int count6=0;
for(i=0;i<1000;i++)
{
num=rand()%6+1;
if(num==1)
count1++;
if(num==2)
count2++;
if(num==3)
count3++;
if(num==4)
count4++;
if(num==5)
count5++;
if(num==6)
count6++;
if((i+1)%100==0)
printf("%d %d %d %d %d %d\n",count1,count2,count3,count4,count5,count6);
}
return num;
}
3.정적 지역 변수가 사용되는 하나의 용도는 함수가 처음 호출될 때 초기화를 딱 한번만 수행하는 것이다. inited는 정적 변수이기 때문에 다음번의 호출에서도 그 값을 유지한다. 따라서 초기화 코드는 함수가 처음 호출될 때 한번만 실행된다. 이러한 구조를 사용하여 맨 처음 호출되는 경우에만 초기화를 수행하는 난수 발생 함수 get_random()을 작성하여 테스트하라.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int get_random(void);
void main()
{
printf("%d\n", get_random());
printf("%d\n", get_random());
printf("%d\n", get_random());
printf("%d\n", get_random());
printf("%d\n", get_random());
}
int get_random()
{
static int inited=0;
if(inited==0)
{
printf("초기화\n");
srand((unsigned)time(NULL));
inited=1;
}
return rand();
}
4.다음과 같은 무한 수열을 계산하는 순환적인 프로그램을 작성하라.
#include <stdio.h>
double recursive(double n);
void main()
{
double n;
printf("실수를 입력하세요:");
scanf("%lf",&n);
printf("recursive(%.0f)의 결과: %.2f\n",n,recursive(n));
}
double recursive(double n)
{
printf("recursive(%.0f)\n",n);
if(n<=1) return 1.0;
else return 1.0/n+recursive(n-1);
}
5.은행 계좌에서 저축하고 인출하는 프로그램을 작성하여 보자. save(int amount) 함수는 저금할 금액 amount를 받아서 save(100)과 같이 호출된다. draw(int amount)은 예금인출을 나타낸다. 사용자에게 메뉴를 보여주고 저축 또는 인출을 선택하게 한다.
#include <stdio.h>
void save(int amount);
void draw(int amount);
int money=0;
void main()
{
int num,amount;
printf("******* 메뉴 선택*******\n");
printf(" 1:저축 2:인출 3:종료 \n");
printf("**************************\n");
do
{
printf("메뉴를 선택하시오:");
scanf("%d",&num);
if(num==1)
{
printf("저축할 금액:");
scanf("%d",&amount);
save(amount);
}
else if(num==2)
{
printf("인출할 금액:");
scanf("%d",&amount);
draw(amount);
}
else if(num==3)
break;
else
printf("잘못 입력하셨습니다\n");
printf("\n");
}while(1);
}
void save(int amount)
{
money=money+amount;
printf("현재 잔액은 %d입니다.\n",money);
}
void draw(int amount)
{
if(money>=amount)
{
money=money-amount;
printf("현재 잔액은%d입니다.\n",money);
}
else
{
printf("잔액이 부족합니다.\n");
money=money;
printf("현재 잔액은 %d입니다\n",money);
}
}
6.오른쪽과 같은 n번째 삼각수를 계산하는 함수 get_tri_number(int n)을 순환 호출을 이용하여 작성하여 보자.
#include <stdio.h>
int get_tri_number(int n);
void main()
{
int n;
printf("정수를 입력하세요:");
scanf("%d",&n);
printf("get_tri_number(%d)의 결과: %d\n",n,get_tri_number(n));
}
int get_tri_number(int n)
{
printf("get_tri_number(%d)\n",n);
if(n<=1) return 1;
else return n+get_tri_number(n-1);
}
7.이항 계수(binomial coefficient)를 계산하는 순환 함수를 작성하라. 이항 계수는 다음과 같이 순환적으로 정의된다. 반복 함수로도 구현해보라.
#include <stdio.h>
int recursive(int n,int k);
void main()
{
int n,k;
printf("n과 k값을 입력하세요.\n");
printf("큰 숫자를 먼저써주세요:");
scanf("%d %d",&n,&k);
printf("이항계수의 결과: %d\n",recursive(n,k));
}
int recursive(int n,int k)
{
if(k==0||k==n)
return 1;
else
return recursive(n-1,k-1)+recursive(n-1,k);
}
8. 순환 호출을 이용하여 정수의 각 자리수를 출력하는 함수 show_digit(int x)를 작성하고 테스트하라. 즉 정수가 1234이면 화면에 1 2 3 4와 같이 출려한다. 함수는 일의 자리를 출력하고 나머지 부분을 대상으로 다시 같은 함수를 순환 호출한다. 예를 들어서 1234를 10으로 나누면 123이 되고 4는 1234를 10으로 나눈 나머지이다.
#include <stdio.h>
int show_digit(int x);
void main()
{
int x;
printf("정수를 입력하시오:");
scanf("%d",&x);
show_digit(x);
printf("\n");
}
int show_digit(int x)
{
if(x<10)
return printf("%d ",x);
else
show_digit(x/10);
return printf("%d ", x%10);
}
'프로그래밍 > C언어' 카테고리의 다른 글
숫자 야구게임 (0) | 2017.09.20 |
---|---|
쉽게 풀어쓴 C언어 Express 8장 Programming (0) | 2017.09.20 |
시간을 지연시켜 화면에 출력하는 명령어 (0) | 2017.09.20 |
화면을 지우는 DOS명령어 (0) | 2017.09.20 |
쉽게 풀어쓴 C언어 Express 7장 Programming (2) | 2017.09.20 |