01 다음 중 틀린 문장을 지적하고 올바르게 수정하라.
① 조건식의 값이 1일 때만 참으로 간주된다. → 0과 false가 아닌 모든 값은 참(true)으로 간주된다.
③ do...while 문에서 조건식의 값이 거짓이면 한 번도 수행되지 않는다. → 최소 한 번은 실행시킨 다음 조건식을 검사하기 때문에 적어도 한 번은 실행된다.
④ for 문에서 초기식, 조건식, 증감식이 전부 비어 있으면 안 된다. → for(;;) 형태로 사용할 경우 무한 루프가 만들어진다.
02 다음은 무한 반복을 구현한 소스이다. 올바르게 구현된 것을 모두 골라보자.
① while ( 1 ) { }
③ for ( ; 1 ; ) { } → 조건식 부분이 항상 참이다.
03 다음의 프로그램을 실행시키면 "Hello World!"는 몇 번이나 출력되는가?
#include <stdio.h>
int main()
{
int x;
for (x = 0; x < 10; x++)
{
if (x > 5)
continue;
if (x > 8)
break;
printf("Hello World! \n");
}
return 0;
}
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
6번.
04 다음의 프로그램에서 생성되는 출력 결과는 무엇인가?
(a)
0
3
6
9
(b)
0
3
6
9
(c)
0
2
4
6
8
(d)
10
9
8
7
6
5
4
3
2
1
0
(e)
*********
*이 9개가 출력되어야한다.
(f)
54321
05 동일한 결과를 생성하도록 for 루프는 while 루프로, while 루프는 for 루프로 변환하라.
(a)
int i = 10;
while (i >= 0)
{
printf("%d\n", i);
i--;
}
(b)
int i;
for (i = 10; i >= 0; i -= 3)
{
printf("%d\n", i);
}
06 다음의 코드가 실행을 완료하였을 변수 i의 최종값은 얼마인가?
(a) 2→5 →8 →11
즉, 답은 11.
(b) 0→1→2→3 →4→5→6→7→8→9→10
즉, 답은 10.
07 다음의 코드에서 잘못된 점이 있으면 지적하고 올바르게 수정하라. 논리적인 오류도 포함된다.
(a)
int i = 0;
while (i < 10)
{
printf("i의 값 : %d\n", i);
i++;
}
교재 오기인지 의도된 것인지 모르겠으나, i 값을 확인하는 형식 지정자를 추가하여 i 값을 확인하도록 수정했다.
그리고 i++ 와 같은 연산자가 없으면 무한 루프에 빠지기 때문에 덧셈 연산을 추가했다.
(b)
int i = 0;
while (i++ < 10)
{
printf("i의 값 : %d\n", i);
}
while 문 뒤에 있는 세미콜론을 제거했다.
이렇게 사용하는게 일반적이기 때문에 논리적 오류로 판단해서 잘못된 코드라고 판단하였다.
int i = 0;
while (i++ < 10);
{
printf("i의 값 : %d\n", i);
}
재미있게도 이 방식으로도 빌드/실행까지 정상적으로 된다.
일단 세미콜론이 존재하고, while문인 점 때문에 조건식 안에 있는 i++ 연산자는 계속 작동된다.
횟수 | 현재 i 값 | 조건식 | 조건식 종료 시점의 i 값 |
1 | 0 | (0 < 10) | 1 |
2 | 1 | (1 < 10) | 2 |
3 | 2 | (2 < 10) | 3 |
4 | 3 | (3 < 10) | 4 |
5 | 4 | (4 < 10) | 5 |
6 | 5 | (5 < 10) | 6 |
7 | 6 | (6 < 10) | 7 |
8 | 7 | (7 < 10) | 8 |
9 | 8 | (8 < 10) | 9 |
10 | 9 | (9 < 10) | 10 |
11 | 10 | (10 < 10) | 11 |
즉 10이 되는 시점에 조건식에 부합하지 않아 루프를 탈출하고, i++ 연산자 특성으로 인해 결국 i 값은 11이 된다.
그리고 이 i 값은 스코프 문을 통해 출력되기 때문에 최종적으로 11이 출력된다.
하지만 while 문의 조건식을 고려하면 11이 출력되는 건 의도하지 않은 동작이므로 잘못된 코드로 판단.
(c)
int i;
for ( i = 0; i < 10; i++ )
printf("i = %d\n", i);
저기서 i--이면 무한 루프가 되버리므로 수정을 했다.
(d)
float x;
for (x = 0.1; x <= 1.0; x += 0.1)
printf("%f\n", x);
논리적으론 문제가 전혀 없어보이지만, float과 같은 부동소수점 자료형은 0.1와 같은 수를 정확하게 저장하지 못하고, 약간의 오차를 포함해서 저장한다.
즉, 0.1로 저장되는 것 같지만 실제론 0.10000000000142... 와 같은 오차가 누적되기 때문에 정확하게 1.0이 될 수 없다.
(e)
int i = 0;
for ( ; i < 10; i++ )
printf("i = %d\n", i);
적어도 조건, 증감 시킬 값은 for 문이 시작되기 전에 초기화를 시켜야한다.
08 다음과 같은 코드에서 break 문이나 continue 문을 사용하지 않고 동일한 결과를 내도록 수정하여 보라.
(a)
int i;
for ( i = 0; i < 5; i++)
{
printf("%d\n", i);
}
(b)
int i;
for (i = 0; i < 10; i++)
{
if (i != 5)
printf("%d\n", i);
}
09 다음의 수학식을 계산하는 코드를 작성하라.
(a)
#include <stdio.h>
int main()
{
int result = 0;
for (int i = 1; i <= 30; i++)
{
result += i * i + 1;
}
printf("result = %d\n", result);
return 0;
}
(b)
#include <stdio.h>
int main()
{
int result = 0;
for (int i = 10; i <= 30; i++)
{
for (int j = 0; j <= 5; j++)
{
result += i + j;
}
}
printf("result = %d\n", result);
return 0;
}
'Drill > 프로그래밍언어' 카테고리의 다른 글
[프로그래밍언어]쉽게 풀어쓴 C언어 Express 7장 반복문 Programming (0) | 2025.03.16 |
---|---|
[프로그래밍언어]쉽게 풀어쓴 C언어 Express 6장 조건문 Programming (0) | 2025.01.28 |
[프로그래밍언어]쉽게 풀어쓴 C언어 Express 6장 조건문 Exercise (0) | 2025.01.27 |
[프로그래밍언어]쉽게 풀어쓴 C언어 Express 5장 수식과 연산자 Programming (0) | 2025.01.15 |
[프로그래밍언어]쉽게 풀어쓴 C언어 Express 5장 수식과 연산자 Exercise (0) | 2025.01.14 |