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
'College Computer Science > C Language' 카테고리의 다른 글
[C 프로그래밍 실습] Report 03 (0) | 2021.01.04 |
---|---|
[C 프로그래밍 실습] 구조체와 공용체 (Lab 09) (0) | 2021.01.04 |
[C 프로그래밍 실습] 중간고사 문제 (0) | 2021.01.03 |
[C 프로그래밍 실습] 문자와 문자열 (Lab 07) (0) | 2021.01.03 |
[C 프로그래밍 실습] 함수 2 (Lab 06) (0) | 2021.01.02 |
댓글