62쪽 5번
123456789.0e-5f 에서
%6.1f 가 6자리까지는 이해했는데 답에왜 5는 없이1234.6 인지.
%e는 중간에 7이 왜 업어지는 이해가 안됩니다.
108쪽 19번
hap2 (10*10)%4 -(10%9)+5 가 4인게 이해가 안됩니다.
0? - 6??
114쪽 32번
A의 아스키코드값이 65라는데 어찌구하는건가요?>
34번
왜 답은 5개를 쓰는지와 1일때 왜 0 인지 이해가안됩니다.
35번
디버깅을 알고 싶습니다.
117쪽 40번
hap를 계속더하면 1,3,6,10,15,으로 증가하는 것 같은데 왜 6이 되는지 이해가 안갑니다
234쪽 3번동그리미
B배열의 값이 50 52 54 46 48이 어떻게 되는지 자세한 설명 부탁드립니다.
267쪽 14번 동그라미
while(j<8-i) 왜 8이 되는지 이해가 안됩니다.
질문이 좀 많아도 자세한 답변부탁드립니다.ㅠㅠ
안녕하세요.
1)
안녕하세요.
float a = 123456789.0e-5f;
printf("소수점a = &6.1f 지수형a = %e\n", a, a);
123456789.0e-5f 에 의해 지수형태로 저장된 a의 값을 원래대로 변경하면 소수점 위치를 왼쪽으로 5칸 이동한 값인
1234.56789가 됩니다.
이 값을 6.1f로 출력하면
______ 소수점을 포함하여 6자리를 확보하여 소수점 1자리를 출력해야 하므로
____.6 이 됩니다. 소수점 첫 째자리까지 출력해야 하는데, 둘째 자리에서 반올림이 되어 .6이 출력되었습니다.
나머지 4자리에 정수 부분을 출력합니다. 만일 출력할 정수 부분보다 확보된 자리수가 적으면 정수는 모두 출력됩니다.
1234.6이 출력됩니다.
%e로 출력하면
소수점 자리수가 지정되지 않으면 f나 e는 모두 기본적으로 소수점 6자리로 출력합니다.
e는 정수 부분을 1자리만 출력하므로
1.234568 이 됩니다. 역시 소수점 마지막 6자리는 7째 자리에서 반올림 된 것이고
1.234568 은 원래의 값 1234.56789에서 소수점 위치가 왼쪽으로 3자리 이동했으므로 e+03이 되어
1.234568e+03으로 출력이 되는 것입니다.
2)
hap2 10 * 10 % 4 - 10 % 9 + 5
연산자 우선순위(60쪽)를 참고하면
산술 연산자는 * / % 가 + - 보다 우선합니다.
* / %는 우선순위가 같으므로 왼쪽에서 오른쪽 순으로 진행합니다. 이 기준에 따라
hap2 = (10*10) % 4 - (10%9) + 5 로 계산됩니다.
= 100 % 4 - 1 + 5
= 0 - 1 + 5
= 4
3)
컴퓨터에서 내부적으로 문자가 처리될 때 아스키코드 값으로 처리가 됩니다.
대문자 A는 65라는 값으로 표현이 됩니다. 각 문자마다 코드 값이 지정되 있지만 이 코드를 암기할 필요는 없습니다.
int ch = 'A';와 같이 문자를 정수형 변수에 저장하면 아스키 코드값으로 변환되어 저장된다는 것만 이해하시면 됩니다.
4)
먼저 i가 1인 상태에서 종료값을 비교합니다. i<=5에서 Yes이므로 반복문을 진입합니다.
system.out.printf("합은%d %4d입니다.\n", i, hap); 에 의해
출력은 : 합은1 0입니다.
그런 다음 증가값 부분의 수식을 순차적으로 진행하여
++i로 인해 i는 2가되고 hap += i에 의해 hap은 2가 됩니다.
이어서 종료값을 비교합니다. i<=5에서 Yes이므로 반복문을 진입합니다.
system.out.printf("합은%d %4d입니다.\n", i, hap); 에 의해
출력은 : 합은2 2입니다.
그런 다음 증가값 부분의 수식을 순차적으로 진행하여
++i로 인해 i는 3이되고 hap += i에 의해 hap은 5가 됩니다.
이어서 종료값을 비교합니다. i<=5에서 Yes이므로 반복문을 진입합니다.
system.out.printf("합은%d %4d입니다.\n", i, hap); 에 의해
출력은 : 합은3 5입니다.
그런 다음 증가값 부분의 수식을 순차적으로 진행하여
++i로 인해 i는 4가되고 hap += i에 의해 hap은 9가 됩니다.
이어서 종료값을 비교합니다. i<=5에서 Yes이므로 반복문을 진입합니다.
system.out.printf("합은%d %4d입니다.\n", i, hap); 에 의해
출력은 : 합은4 9입니다.
그런 다음 증가값 부분의 수식을 순차적으로 진행하여
++i로 인해 i는 5가되고 hap += i에 의해 hap은 14가 됩니다.
이어서 종료값을 비교합니다. i<=5에서 Yes이므로 반복문을 진입합니다.
system.out.printf("합은%d %4d입니다.\n", i, hap); 에 의해
출력은 : 합은5 14입니다.
그런 다음 증가값 부분의 수식을 순차적으로 진행하여
++i로 인해 i는 6이되고 hap += i에 의해 hap은 20이 됩니다.
이어서 종료값을 비교합니다. i<=5에서 No이므로 반복문을 벗어난 후 프로그램을 종료합니다.
5)
for(i = 1; i<=5 ; ++i); <- for문 뒤에 ; 이 있으면 아래 문장은 반복문에 포함되지 않습니다.
즉 for문 안의 i만 증가된 후 for문을 빠져나와
hap+=i가 수행되므로 for문을 빠져나온 후의 i 값인 6만 hap에 누적됩니다.
6)
각 자리의 값이 누적됩니다.
98765
87654
76543
위 3값을 각 자리마다 누적하면
맨 앞자리 값 3개를 누적하면
9+8+7 = 24
두 번째 자리 값 3개를 누적하면
8+7+6 = 21
....
이와 같이 각 자리를 누적하면
24, 21, 18, 15, 12가 되며 이와 같은 원리로 각각을 배열에 누적한 것이
50 52 54 46 48이 된 것입니다.
7)
j<8-i, 즉 j가 8-i보다 작을 때까지 반복 수행한다는 것은
i가 0일 때 j는 0~8 변경됩니다. 즉 data[0] ~ data[8]까지 변경되죠
이때 비교되는 값은 data[1] ~ data[9]가 되므로 data 배열의 값을 모두 컨트롤 하게 됩니다.
직접 값을 넣어서 디버깅을 수행해 보면서 각 변수의 값 변화를 살펴보면 좀 더 쉽게 이해될 수 있습니다.
오늘도 즐거운 하루 되세요.
-
*2017-03-30 10:39:25
안녕하세요.
1)
안녕하세요.
float a = 123456789.0e-5f;
printf("소수점a = &6.1f 지수형a = %e\n", a, a);
123456789.0e-5f 에 의해 지수형태로 저장된 a의 값을 원래대로 변경하면 소수점 위치를 왼쪽으로 5칸 이동한 값인
1234.56789가 됩니다.
이 값을 6.1f로 출력하면
______ 소수점을 포함하여 6자리를 확보하여 소수점 1자리를 출력해야 하므로
____.6 이 됩니다. 소수점 첫 째자리까지 출력해야 하는데, 둘째 자리에서 반올림이 되어 .6이 출력되었습니다.
나머지 4자리에 정수 부분을 출력합니다. 만일 출력할 정수 부분보다 확보된 자리수가 적으면 정수는 모두 출력됩니다.
1234.6이 출력됩니다.
%e로 출력하면
소수점 자리수가 지정되지 않으면 f나 e는 모두 기본적으로 소수점 6자리로 출력합니다.
e는 정수 부분을 1자리만 출력하므로
1.234568 이 됩니다. 역시 소수점 마지막 6자리는 7째 자리에서 반올림 된 것이고
1.234568 은 원래의 값 1234.56789에서 소수점 위치가 왼쪽으로 3자리 이동했으므로 e+03이 되어
1.234568e+03으로 출력이 되는 것입니다.
2)
hap2 10 * 10 % 4 - 10 % 9 + 5
연산자 우선순위(60쪽)를 참고하면
산술 연산자는 * / % 가 + - 보다 우선합니다.
* / %는 우선순위가 같으므로 왼쪽에서 오른쪽 순으로 진행합니다. 이 기준에 따라
hap2 = (10*10) % 4 - (10%9) + 5 로 계산됩니다.
= 100 % 4 - 1 + 5
= 0 - 1 + 5
= 4
3)
컴퓨터에서 내부적으로 문자가 처리될 때 아스키코드 값으로 처리가 됩니다.
대문자 A는 65라는 값으로 표현이 됩니다. 각 문자마다 코드 값이 지정되 있지만 이 코드를 암기할 필요는 없습니다.
int ch = 'A';와 같이 문자를 정수형 변수에 저장하면 아스키 코드값으로 변환되어 저장된다는 것만 이해하시면 됩니다.
4)
먼저 i가 1인 상태에서 종료값을 비교합니다. i<=5에서 Yes이므로 반복문을 진입합니다.
system.out.printf("합은%d %4d입니다.\n", i, hap); 에 의해
출력은 : 합은1 0입니다.
그런 다음 증가값 부분의 수식을 순차적으로 진행하여
++i로 인해 i는 2가되고 hap += i에 의해 hap은 2가 됩니다.
이어서 종료값을 비교합니다. i<=5에서 Yes이므로 반복문을 진입합니다.
system.out.printf("합은%d %4d입니다.\n", i, hap); 에 의해
출력은 : 합은2 2입니다.
그런 다음 증가값 부분의 수식을 순차적으로 진행하여
++i로 인해 i는 3이되고 hap += i에 의해 hap은 5가 됩니다.
이어서 종료값을 비교합니다. i<=5에서 Yes이므로 반복문을 진입합니다.
system.out.printf("합은%d %4d입니다.\n", i, hap); 에 의해
출력은 : 합은3 5입니다.
그런 다음 증가값 부분의 수식을 순차적으로 진행하여
++i로 인해 i는 4가되고 hap += i에 의해 hap은 9가 됩니다.
이어서 종료값을 비교합니다. i<=5에서 Yes이므로 반복문을 진입합니다.
system.out.printf("합은%d %4d입니다.\n", i, hap); 에 의해
출력은 : 합은4 9입니다.
그런 다음 증가값 부분의 수식을 순차적으로 진행하여
++i로 인해 i는 5가되고 hap += i에 의해 hap은 14가 됩니다.
이어서 종료값을 비교합니다. i<=5에서 Yes이므로 반복문을 진입합니다.
system.out.printf("합은%d %4d입니다.\n", i, hap); 에 의해
출력은 : 합은5 14입니다.
그런 다음 증가값 부분의 수식을 순차적으로 진행하여
++i로 인해 i는 6이되고 hap += i에 의해 hap은 20이 됩니다.
이어서 종료값을 비교합니다. i<=5에서 No이므로 반복문을 벗어난 후 프로그램을 종료합니다.5)
for(i = 1; i<=5 ; ++i); <- for문 뒤에 ; 이 있으면 아래 문장은 반복문에 포함되지 않습니다.
즉 for문 안의 i만 증가된 후 for문을 빠져나와
hap+=i가 수행되므로 for문을 빠져나온 후의 i 값인 6만 hap에 누적됩니다.
6)
각 자리의 값이 누적됩니다.
98765
87654
76543
위 3값을 각 자리마다 누적하면
맨 앞자리 값 3개를 누적하면
9+8+7 = 24
두 번째 자리 값 3개를 누적하면
8+7+6 = 21
....
이와 같이 각 자리를 누적하면
24, 21, 18, 15, 12가 되며 이와 같은 원리로 각각을 배열에 누적한 것이
50 52 54 46 48이 된 것입니다.
7)
j<8-i, 즉 j가 8-i보다 작을 때까지 반복 수행한다는 것은
i가 0일 때 j는 0~8 변경됩니다. 즉 data[0] ~ data[8]까지 변경되죠
이때 비교되는 값은 data[1] ~ data[9]가 되므로 data 배열의 값을 모두 컨트롤 하게 됩니다.
직접 값을 넣어서 디버깅을 수행해 보면서 각 변수의 값 변화를 살펴보면 좀 더 쉽게 이해될 수 있습니다.
오늘도 즐거운 하루 되세요.