본문 바로가기

프로그래밍/C언어

쉽게 풀어쓴 C언어 Express 9장 Programming

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("nk값을 입력하세요.\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와 같이 출려한다. 함수는 일의 자리를 출력하고 나머지 부분을 대상으로 다시 같은 함수를 순환 호출한다. 예를 들어서 123410으로 나누면 123이 되고 4123410으로 나눈 나머지이다.

 

#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);

}