A Book on C 3장 C

printf를 통해서 back space 하는 방법
printf("abc");
printf("%c", '\b');
라고 치면 출력 값은?
ab
가 출력된다.
64비트 int를 사용 방법.
unsigned __int64 ux = 20000000000000;
printf("%I64d \n", ux);
해보라~ 64비트로 사용 할 수 있다.
unsigned의 의미는 알고 대부분 알고 있다고 생각 하므로 필요 유무에 따라 사용하길 바란다.
의문점
-3.14159라는 것은 부동형 상수의 예가 안된다고 하는데..
이유를 모르겠다.. 나중에 꼭 찾아 봐야 할 부분..
#include <stdio.h>
int main(void)
{
printf("The size of some fundamental types is computed. \n\n");
printf("char : %3d byte \n", sizeof(char));
printf("short : %3d byte \n", sizeof(short));
printf("int : %3d byte \n", sizeof(int));
printf("long : %3d byte \n", sizeof(long));
printf("unsigned : %3d byte \n", sizeof(unsigned));
printf("float : %3d byte \n", sizeof(float));
printf("double : %3d byte \n", sizeof(double));
printf("long double : %3d byte \n", sizeof(long double));
unsigned int i;
printf("%d", i=3000000000);
return 0;
}
여기서 unsigned int 를 선언 해줬는데도 불구하고 i에 30억이 들어가지 않는 이유는 무엇때문일까?
변환과 캐스트
승격, 변환
예) a와 b가 모두 short 일때 a+b를 하게 되면 int형으로 형으로 승격 또는 변환 된다.
-----------문제 풀이 후 업뎃 예정---------
1.모든 실수를 컴퓨터에서 표현할 수 있는 것은 아니다. 따라서 컴퓨터에서 이용 가능한 실수는 매우 일부분이다. 이러한 예로서 다음 코드를 수행시키면, 두 개의 동일한 수를 출력할 것이다. double x = 123.45123451234512345; double y = 123.45123451234512300; /- last two digits zero *- printf(\"%.17f %.17f\\n\", x, y); 다른 수가 출력되게 하려면 y 값이 끝에서부터 몇 개가 0으로 끝나야 하는가? 설명해 보아라.

/- Pratice Problem 1 *-
#include <stdio.h>
int main(void)
{
double x = 123.45123451234512345;
double y = 123.45123451234512300;
printf("%.17f %.17f\n", x , y);
return 0;
}
0이 4개로 끝나게되면 다른 수가 나오게 된다.
현재 x에는 20개의 숫자가 들어가있고 17개를 출력하게 되는데 17번째가 달라지려면 20,19,18,17에 0이 들어가야 17번째가
달라질 수 있다.


2. 다음 수학 공식은 모든 x에 대해서 만족한다. sin2(x) + cos2(x) = 1 다음 프로그램을 수행하며 컴퓨터에서 이것이 항상 만족하는지 검사해 보아라. #include #include int main(void) { double two_pi = 2.0 * M_PI; /- in math.h *- double h = 0.1; /- step size *- double x; for (x = 0.0; x < two_pi; x += h) printf(\"%5.1f: %.15e\\n\", x, sin(x) * sin(x) + cos(x) * cos(x)); return 0; } 이 코드에서 %.15e를 %.15f로 수정하여 수행하면 어떻게 되겠는가? 설명하여라.

M_PI를 사용하기 위해서는
error C2065: 'M_PI' : 선언되지 않은 식별자입니다. 요런 에러가 떴다. 문제를 푸는중에-_-ㅋ
글에 나와있듯이 아래 디파인 되어있는 것들은 C/C++표준으로 디파인 된게 아니라
즉 M_PI를 사용해 주기 위해서.
#define _USE_MATH_DEFINES
라는 선언을 사용하여 M_PI를 사용 할수 있다.
항상 만족하지는 않는다.
x가 1.0일때, 1.6일때, 1.8, 1.9, 2.4 등등일때 결과 값은 1이라는 값이 나오지 않는다.
%.15e인 경우 반올림이 일어나지만 15번째 소수점 자리가 9가 아니고 
8이나 7이기 때문에 1.000이라고 출력이 되지 않는 것이다.
하지만 14로 고치게되면 마찬가지로 1.000000000이라는 값이 출력된다.
하지만 %.15f로 수정하는 경우에는
15번째 자리에서 반올림이 일어 나기때문에 1.00000000000이라는 값이 출력된다.


3.
sin(), cos(), tan()에 대한 삼각함수 값을 표로 출력하는 프로그램을 작성하여라. 표에서 각도는 0에서 까지 20단계로 한다.


#define _USE_MATH_DEFINES
#include <stdio.h>
#include <math.h>
int main(void)
{
double i;
double PiGap = M_PI/20;
printf("%10s%10s%10s\n","sin","cos","tan");
for(i=0; i<=180;i=i+9){
//printf("%5lf",i*(M_PI/180));
printf("%10.3lf", sin(i*(M_PI/180.0)));
printf("%10.3lf", cos(i*(M_PI/180.0)));
printf("%10.3lf", tan(i*(M_PI/180.0)));
printf("\n");
}
return 0;
}
로 코딩해서 돌리면 이상하게 중간에 저런 값이 들어간다-_-ㅋ
표로 만드는건 귀찮아서 하지 않았지만,, 값이 왜 저렇게 들어가는지 모르겠다.
나중에 다시 볼것!!


4. 소수점 이하 부분을 갖는 float 형이나 double 형을 출력할 때, printf() 함수가 절단을 수행하는지 반올림을 수행하는지를 알아보는 프로그램을 작성하여라. ANSI 표준은 반올림하도록 요구하나, 이것은 시스템에 종속적이다. 사용자 컴퓨터에서는 어떻게 수행하는가?


#include <stdio.h>
int main(void)
{
double TestNum=3.5779;
printf("%1.2lf",TestNum);
return 0;
}
로 출력 해보면
로 나온다. 3.58로 반올림 된 것을 알수 있다.


5. 

2의 거듭제곱 목록을 10진수, 16진수, 8진수로 출력하는 프로그램을 다음 코드를 사용하여 완성하여라. int i, val = 1; for (i = 0; i < 35; ++i) { printf(\"%15d%15u%15x%15o\\n\", val, val, val, val); val *= 2; } 무엇이 출력되는지를 보고 설명하여라. 2의 거듭제곱을 16진수나 8진수 표기법으로 표현하면 특별한 특성을 가진다. 어떤 특성인가?


#include <stdio.h>
#include <math.h>

int main(void){
int i, val = 1;
for(i=0; i<35; ++i){
printf("%15d%15u%15x%15o\n", val, val, val, val);
val *=2;
}

return 0;
}




보시다시피 10진수는 2배씩 증가하고 10억xxxxlimit을 넘는 경우 오버플로가 일어나지만 

unsigned의 경우 20억까지 잘 출력해준다.

16진수의 경우 8까지는 비트 변화가 없고 16일때 왼쪽으로 1비트씩 이동하고
8진수는 4까지는 비트 변화가 없고 8일때 왼쪽으로 1비트씩 이동하는 방식이다.


6.



덧글

  • Gyul 2011/03/26 19:54 # 삭제 답글

    여기서 unsigned int 를 선언 해줬는데도 불구하고 i에 30억이 들어가지 않는 이유는 무엇때문일까????

    printf("%d", i=3000000000);

    %d가 아니라 부호가 없는 10진수를 나타내는 %u가 되어야 하지 않을까???ㅋㅋㅋ
  • Sam Kim 2011/03/27 01:28 # 답글

    오 그렇군요 ㅋㅋ 감사합니다.~ usigned으로 출력 해줘야하는걸 깜빡했네요.ㅎㅎ
  • 123 2013/09/29 14:55 # 삭제 답글

    지나가던 학생입니다.
    3번에서 중간에 이상한 값이 들어가는 것은 tan(pi/2)의 값은 무한대이므로 오버플로가 일어나기 떄문이지 않을까요
댓글 입력 영역