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

본문내용

어떤 일이 발생하는가? 어떤 컴파일러는 sqrt(-1.0)과 같은 호출에 대해 실행시간 오류를 발생시키고, 어떤 컴파일러는NaN(Not a number)라는 값 을 리턴한다. 사용자 컴퓨터는 어떤 값을 리턴하는가? 다음 코드를 포함하는 프로그램을 작 성하여 실행해 보아라.
printf("sqrt(-1.0) = %f\n", sqrt(-1.0));
☞ NaN이 출력된다.
21. pow(x, x)를 호출할 때 x의 값이 너무 크면 실행시간 오류가 발생되거나, pow(x, x) 값을 printf()로 출력할 경우 Inf 또는 Infinity가 출력된다. 사용자 컴퓨터에서 다음 문장을 사용하 여 실행 오류나 Inf 또는 Infinity를 출력하지 않는 가장 큰 x 값을 찾아보아라. 힌트: for 문 을 사용하여라.
printf("pow(%.1f, %.1f) = %.7e\n", x, x, pow(x, x));
1 #include
2 #include
3
4 int main(void)
5 {
6 int i=200;
7 float x;
8
9 for(x=1.0; x 10 printf("pow(%.1f,%.1f) = %.7e\n",x,x,pow(x,x));
11
12 return 0;
13 }
☞ 실행하면 143까진 숫자가 나오고 144부터 Infinity가 출력된다.
22. 전통적인 C에서 float은 double로 자동 승격된다. ANSI C에서는 수학 수식에서 float을 double로 승격할 수 있지만, 요구사항은 아니다. 대부분의 ANSI C 컴파일러는 수식에서 확장 없이 float을 사용하는 것으로 조사되었다. 다음 코드를 사용하여 사용자 시스템에서는 어떻게 동작하는지를 확인하여 보아라.
1 #include
2
3 int main(void)
4 {
5 float x=1.0,y=2.0;
6
7 printf("%s%u\n %s%u\n %s%u\n",
8 "sizeof(float) = ",sizeof(float),
9 "sizeof(double) = ",sizeof(double),
10 "sizeof(x+y) = ",sizeof(x+y));
11 return 0;
12 }
실행하면sizeof(float) = 4 , sizeof(double) = 8
sizeof(x+y) = 4 가 출력되다.
23. 전통적인 C에서, long float 형과 double 형은 동의어이다. 그러나, long float은 타이핑하기 어려워서 일반화되지 못하였고, 자주 사용되지도 않았다. ANSI C에서는 long float 형이 제거 되었다. 그럼에도 불구하고 많은 ANSI C 컴파일러에서 여전히 long float 형을 사용할 수 있 다. 사용자의 컴파일러에서도 이것이 사용 가능한지를 조사해 보아라.
☞ 우리 시스템에서는 사용불가능하다.
24. 다음 코드를 포함하는 try_me 프로그램을 작성하여라.
int c;
while ((c = getchar()) != EOF)
putchar(c);
그리고 몇 줄의 문장이 들어 있는 infile이라는 파일을 생성하여라. 그런 다음 infile의 내용을 outfile로 복사하기 위해 다음 명령어를 수행하고, outfile 파일을 확인해 보아라.
try_me < infile > outfile
이제 변수 c를 int 형에서 char 형으로 변경한 후 위의 명령을 다시 수행하여 보아라. 어떤 시스템에서는 동작하고, 어떤 시스템에서는 동작하지 않을 것이다. 사용자 시스템은 어떠한가?
☞ 우리 시스템에서는 동작 가능하다. 단 outfile을 미리 만들지 말아야 한다.
25. 수학 코드에서 fabs() 대신 abs()를 사용하면 이상한 결과를 얻을 것이다. 다음 프로그램을 수행 해 보아라.
1 #include
2 #include
3 #include
4
5 int main(void)
6 {
7 double x=-2.357;
8
9 printf("abs(x) = %e\n",abs(x));
10 printf("fabs(x)= %e\n",fabs(x));
11 return 0;
12 }
어떤 컴파일러는 경고 메시지를 내지만, 어떤 것은 내지 않을 것이다. 사용자 컴퓨터에서 컴파일 할 때 경고 메시지를 내는가? 작은 프로그램에서는 이와 같은 오류를 쉽게 찾을 수 있지만, 큰 프로그램에서는 찾기가 매우 힘들 것이다.
경고 매세지를 내지 않고 abs(x) = 6.359366e-314 , fabs(x)= 2.357000e+00 와 같은 결과를 출력하다.
26. C에서 16진 상수로는 대문자, 소문자, 또는 둘 다 사용할 수 있다. 다음 코드를 보자.
int a = 0xabc;
int b = 0xABc;
int c = 0XABC;
printf("a = %d b = %d c = %d\n", a, b, c);
어떤 값이 출력되겠는가? 이 코드를 포함하는 프로그램을 작성하여 확인하여 보아라.
☞ 0x시작되는 16진수이고, int선언을 했으므로 16진의 정수로 받아 들이게 된다.
이를 출력값에서 %d로 즉, 10진 정수로 바꾸어 a=2748 b=2748 c=2748 이 출력된다.
27. 다음 코드는 컴퓨터에 종속적이다. 예상 이외의 결과가 출력된다면, 왜 그런지를 설명하여라.
1 #include
2
3 int main(void)
4 {
5 char c=0xff;
6
7 if (c==0xff)
8 printf("Truth!\n");
9 else
10 printf("This needs to be explained!\n");
11 return 0;
12 }
☞ 컴파일 하면 다음과 같은 경고메세지가 뜬다.
warning: comparison is always false due to limited range of data type
결과를 실행하면 This needs to be explained! 가 프린트 된다.
char 형은 1byte 므로 0xff를 담지 못한다.(0xff는 255이다.) 그러므로 else 문이 프린트 된 것 같다.

키워드

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