a book on c 5장 연습문제 풀이
본 자료는 5페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
해당 자료는 5페이지 까지만 미리보기를 제공합니다.
5페이지 이후부터 다운로드 후 확인할 수 있습니다.

본문내용

음과 같이 수정하여라.
static int a = 1, b = 2, c = 3;
이제 이 파일의 하단에 있는 변수들은 정적 외부 변수이므로, 이 변수들은 main()에서 사용될 수 없다. 그래서, main()에서 참조하는 외부 변수를 찾을 수 없고, 컴파일러는 오류 메시지를 출력할 것이다. 과연 그러한가? (대부분의 컴파일러가 그럴 것이다.)
우리의 컴파일러는 경고 메시지를 출력하지만 실행 파일을 만들어 내며, 결과도 출력한다.
문제 21.
전통적인 C에서 변수를 선언할 때, 기억영역 클래스 명시자와 형 명시자를 임의의 순서대로 기술하는 것이 가능하다. 예를 들어, 다음 두 선언은 같은 의미이다.
register int i;
int register i;
ANSI C는 기억영역 클래스 명시자를 먼저 쓰도록 되어 있다. 그럼에도 불구하고, 대부분의 ANSI C 컴파일러는 두 가지 다 처리할 것이다. (그렇지 않다면, 전통적인 C 코드를 컴파일할 수 없다.) 여러분의 컴파일러는 역순으로 기술된 것을 처리할 수 있는지 검사해 보아라.
=>우리 시스템의 컴파일러도 두 가지 경우를 모두 처리한다.
문제 22.
다음 프로그램이 어떻게 동작하는지 설명해 보아라.
#include
#include
#define FOREVER 1
#define STOP 17
int main(void)
{
void f(void);
while (FOREVER)
f();
return 0;
}
void f(void)
{
static int cnt = 0;
printf("cnt = %d\n", ++cnt);
if (cnt == STOP)
exit(0);
}
cnt변수가 static으로 선언이 되었으므로 f()함수가 호출되었을 때 그 값을 계속 유지하여 함수에 다시 들어갈 때 이전 값을 계속 사용할 수 있도록 하였다. cnt값이 17이 될 때 프로그램을 종료한다.
문제 23.
을 주어진 양의 정수라 하자. 이때 은, i = 0, 1, 2, ...에 대하여, 다음과 같이 정의된다.
가 짝수이면, ;
홀수이면,
이 수열은 값이 1일 때 멈추게 된다. 이런 방법으로 생성되는 수를 "hailstones"라고 한다. hailstones를 생성하는 프로그램을 작성하여라. 함수 헤드는 다음과 같다.
void hailstones(int n)
{
.....
이 함수는 n에 의해 생성되는 수열을 계산하고 출력해야 한다. 예를 들면, 이 프로그램의 출력은 다음과 같은 형태이어야 한다.
Hailstones generated by 77 :
77 232 116 58 29 88
44 22 11 34 17 52
26 13 40 20 10 5
16 8 4 2 1
Number of hailstones generated : 23
생성되는 모든 수열은 유한함을 알 수 있다. 일반적으로 이것이 참인지는 미해결 문제이다.
1 #include
2
3 int hailstones(int);
4
5 int main(void)
6 {
7 int ni;
8
9 printf("input int: ");
10 scanf("%d",&ni);
11
12 hailstones(ni);
13 return 0;
14 }
15
16 int hailstones(int ni)
17 {
18 int cnt=0;
19 while (ni != 1) {
20 if (ni%2 == 0)
21 ni = ni/2;
22 else
23 ni = ni * 3 + 1;
24 cnt++;
25 printf("%5d",ni);
26 if (cnt%6 == 0)
27 putchar('\n');
28 }
29 printf("\nNumber of hailstones generated: %d\n",cnt+1);
30 return 0;
31 }
문제 24.
표준 라이브러리에 있는 난수 발생기 rand()를 사용하여 동전 던지기를 모의 실험하는 프로그램을 작성하여라. 수식 rand() % 2를 사용하여 int 값 0이나 1을 생성하여라. 앞면은 1로, 뒷면은 0으로 나타낸다고 하자. 이 프로그램을 1,000번, 10,000번, 100,000번 수행하고, 앞면이 계속 나오는 경우의 가장 긴 수열과 101010...과 같이 앞면과 뒷면이 번갈아 계속해서 나오는 경우의 가장 긴 수열을 조사하여라. 확률 이론을 알고 있다면, 이 모의 실험이 이론에 근거함을 알 수 있다. 주의: 어떤 전통적인 C 시스템에서, 함수 rand()의 성능은 아주 나쁘다. 즉, 앞면과 뒷면이 번갈아 계속 나오는 하나의 긴 순열을 얻을 것이다. 여러분이 사용하는 ANSI C 시스템이 특정한 수식을 사용한다면, 이 연습 문제는 아주 흥미 있는 문제는 아닐지도 모른다.
1 #include
2 #include
3
4 int main(void)
5 {
6 int n,cnt;
7 printf("1000이나 10000이나 100000중 한 수를 입력하시오: \n");
8 scanf("%d",&n);
9
10 for (cnt=0; cnt 11 printf("%d",rand()%2);
12 if (cnt%50 == 0)
13 putchar('\n');
14 }
15 putchar('\n');
16 return 0;
17 }
문제 27.
하노이 탑 프로그램을 수행해 보아라. n개의 원반이 A 탑에 있을 때, 이 문제를 풀기 위해 몇 번의 이동이 필요한가? n이 64일 때, 매일 한 원반만 이동한다면, 모든 원반을 C로 옮기기 위해 몇 년이 걸리겠는가? 만일 수도사가 1초에 원반 하나를 옮길 수 있다면, 세상이 끝나기 전에 모든 원반을 옮길 수 있을까?
만약 기둥1에5개의 원판을 기둥3으로 옮길려면 2의5승 -1 의 이동횟수가 필요하다! 즉 32-1=31번인것이다. 그러니깐 n=64이라면 2의64승-1의 이동횟수가필요한것이다.
계산결과 18446744073709551615 의 횟수가필요하다. 이를 365로 나누면 50539024859478223년이 필요하다.

키워드

  • 가격2,000
  • 페이지수15페이지
  • 등록일2004.06.16
  • 저작시기2004.06
  • 파일형식한글(hwp)
  • 자료번호#256529
본 자료는 최근 2주간 다운받은 회원이 없습니다.
다운로드 장바구니