본문 바로가기
College Computer Science/C Language

[C 프로그래밍 실습] 변수 유효범위 (Lab 08)

by 2den 2021. 1. 3.
728x90

<Lab 08 문제 유형 요약>

 

  • Program 1 : 변수 유효범위 확인
  • Program 2 : 재귀함수 실행마다 호출 출력 
  • Program 3 : 컴퓨터와 가위바위보하기
  • Program 4 : 1부터 100 사이의 숫자(난수) 맞추기
  • Program 5 : 반복문, 재귀함수로 최대공약수 Greatest Common Divior, GCD 구하기
  • Program 6 : 전역/지역 변수, 정적 지역 변수 유효범위 확인

 


 

Program 1

 

다음은 프로젝트를 구성하는 파일 main.c sub.c이다. 다음에서 각각 설명하는 변수를 선언할 영역을 구분하여 예제 프로그램을 만들어 보고, 필요한 경우 임의의 초기 값을 넣어 컴파일 해보시오.

  • 모든 파일에서 참조할 수 있는 int형 변수 number를 파일 sub.c에 선언
  • 함수 subOne()에서 사용할 변수 i 선언
  • 함수 subTwo()에서 사용할 변수 j 선언
  • 파일 main.c에서만 참조할 수 있는 double형 변수 data를 선언
  • 전역변수 number를 파일 main.c에서 참조하기 위한 선언
  • 함수 main()에서 사용할 int 형 레지스터 변수 count 선언
  • 함수 function()에서 사용할 int 형 정적 변수 amount 선언
// main.c

#include <stdio.h>

void subOne();
void subTwo();
extern int number;

int main(void)
{
  double data;
  register int count;
}

void function(void)
{
  static int amount;
}
// sub.c

int number;

void subOne(void)
{
  int i;
}

void subTwo(void)
{
  int j;
}

 

 

Program 2

 

다음이 만족하도록 1부터 n까지의 합을 구하는 재귀함수를 구현하여 그 결과를 알아보는 프로그램을 작성하시오.

 

  • 양의 정수 n은 표준입력으로 받는다.
  • 재귀호출 함수내에 정적 지역변수를 사용하여 재귀함수의 총 호출 횟수를 출력

#include <stdio.h>

int sum12n(int n)
{
  static int cnt = 1;
  printf("%d번 호출\n", cnt);
  if (n==1) return n;
  else
  {
    cnt++;
    return n + sum12n(n-1);
  }
}

int main()
{
  int n=0;
  printf("1부터 n까지의 합을 재귀호출 함수로 계산합니다.\n양의 정수 n을 입력하시오 >> ");
  scanf("%d", &n);

  printf("sum = %d\n",sum12n(n));
  return 0;
}

 

 

Program 3

 

다음의 실행 화면을 참고하여 사용자와 프로그램이 가위, 바위, 보 게임을 시뮬레이션하는 프로그램을 작성하시오.

 

  • 컴퓨터의 가위, 바위, 보는 하나의 난수를 발생하여 사용한다.
  • 사용자는 가위, 바위, 보 중에서는 하나를 입력한다.
  • 종료(3) 이 입력 될 때까지 계속 진행한다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  int host;
  int guest;
  int exit = 0;
  
  srand((unsigned)time(NULL));
  while(1)
  {
    if (exit) break;
    printf("가위바위보 게임\n");
    printf("가위(0), 바위(1), 보(2), 종료(3) >>");
    scanf("%d", &guest);
    host = rand()%3;

    switch(guest)
    {
      case 0 :
        printf("당신은 가위이고, ");
        if (host == 0)
        {
          printf("컴퓨터는 가위입니다.\n");
          printf("비겼습니다.\n");
        }
        else if (host == 1)
        {
          printf("컴퓨터는 바위입니다.\n");
          printf("컴퓨터의 승리입니다.\n");
        }
        else if (host == 2)
        {
          printf("컴퓨터는 보입니다.\n");
          printf("당신의 승리입니다.\n");
        }
        break;
      case 1 :
        printf("당신은 바위이고, ");
        if (host == 0)
        {
          printf("컴퓨터는 가위입니다.\n");
          printf("당신의 승리입니다.\n");
        }
        else if (host == 1)
        {
          printf("컴퓨터는 바위입니다.\n");
          printf("비겼습니다.\n");
        }
        else if (host == 2)
        {
          printf("컴퓨터는 보입니다.\n");
          printf("컴퓨터의 승리입니다.\n");
        }
        break;
      case 2 :
        printf("당신은 보이고, ");
        if (host == 0)
        {
          printf("컴퓨터는 가위입니다.\n");
          printf("컴퓨터의 승리입니다.\n");
        }
        else if (host == 1)
        {
          printf("컴퓨터는 바위입니다.\n");
          printf("당신의 승리입니다.\n");
        }
        else if (host == 2)
        {
          printf("컴퓨터는 보입니다.\n");
          printf("비겼습니다.\n");
        }
        break;
      case 3:
        printf("종료\n");
        exit = 1;
        break;
      default :
        printf("잘못 입력했습니다. 다시 입력하세요.\n");
        break;
    }
    printf("\n");
  }
  return 0;
}

 

 

Program 4

 

다음 조건을 만족하도록 1에서 100까지의 하나의 난수를 생성하고 사용자가 이 값을 맞추는 프로그램을 작성하시오.

 

  • 1에서 100까지의 하나의 난수를 발생하여 저장
  • 시스템이 정한 number를 사용자가 맞출 때까지 계속 진행
  • 사용자가 정답을 맞추지 못하는 경우는 다음과 같이 힌트를 준다.
  • 함수는 main()과 하나 이상의 함수를 정의하여 사용하시오. setNumber(), printHigher(), printLower(), printAnswer() 등등

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int printLower(int guest, int max, int min) {
  min = guest + 1;
  printf("%d와 %d 사이의 수를 다시 입력하세요 >> ", min, max);
  return min;
}

int printHigher(int guest, int max, int min) {
  max = guest - 1;
  printf("%d와 %d 사이의 수를 다시 입력하세요 >> ", min, max);
  return max;
} 

int main(void) {
  srand(time(NULL));
  int num = rand()%99+1;
  int max = 100, min = 1;
  int cnt = 1, guest=0;

  printf("1~100 정수가 결정되었습니다. 맞춰보세요 >> ");

  while(1) {
    scanf("%d", &guest);

    if(num>guest)
    {
      printf("(시도횟수 %d번) ", cnt);
      min = printLower(guest, max, min);
    }
    else if (num<guest)
    {
      printf("(시도횟수 %d번) ", cnt);
      max = printHigher(guest, max, min);
    }
    else {
      printf("축하합니다! 시도 %d번만에 %d를 맞혔습니다.\n", cnt, num);
      break;
    }
    cnt ++;
  }
  return 0;
}

 

 

Program 5

 

최대 공약수(Greatest Common Divior, GCD)를 구하는 프로그램을 아래 실행 결과를 참고하여 반복문과 재귀 호출 함수를 각각 이용하여 쓰시오.

 

#include <stdio.h>

int rGDC(int num1, int num2)
{
  if (num2==0) return num1;
  return rGDC(num2, num1%num2);
}

int iGDC(int num1, int num2)
{
  int igdc = 0;

  int temp;
  if (num1<num2)
  {
    temp = num1;
    num1 = num2;
    num2 = temp;
  }

  for (int i=1; i<num1; i++)
  {
    if (num1%i==0 && num2%i==0)
    {
      igdc=i;
    }
  }
}

int main()
{
  int num1 = 0;
  int num2 = 0;

  printf("2개의 정수를 입력하시오 >> ");
  scanf("%d %d", &num1, &num2);

  printf("%d와 %d의 Recursion GCD = %d\n", num1, num2, rGDC(num1, num2));
  printf("%d와 %d의 Iteration GCD = %d\n", num1, num2, iGDC(num1, num2));

  return 0;
}

 

 

Program 6

 

다음 프로그램의 결과를 예측해 보고, 프로그램을 실행하여 예측한 결과가 맞는지 확인하시오

 

전역/지역 변수 n

#include <stdio.h>
int n = 100;
int main(void)
{
    int n = 200 ;
    printf("%d ", n) ;

    for (n = 0; n < 2; n++) {
        int n = 300;
        n += 30;
        printf("%d ", n ) ;
    }
    printf("\n") ;

    return 0 ;
}

 

정적 지역 변수 amount

#include <stdio.h>

int save(int);

int main(void) 
{
     printf("%d ", save(100)) ;
     printf("%d ", save(300)) ;
     printf("%d\n", save(500)) ;

     return 0;
}

int save(int money) 
{
    static int amount;
    return amount += money;
}

 

전역 변수 g와 정적 지역 변수 s

#include <stdio.h>

int g = 1;
int sub(void); 

int main(void) 
{
    int b = 5;

    printf("%d ", sub() );
    printf("%d ", sub() );
   printf("%d\n", g + b);

    return 0;
}

int sub(void) 
{
    static int s = 10;
    return s++ + g++;
}

 

정적 전역/지역 변수

#include <stdio.h>

void func(void);
static count = 5;

int main(void)
{
    while (count--)
        func();

    return 0;
}

void func(void)
{
    static i = 5;
    printf("%d %d\n", ++i, count);
}

 

728x90

댓글