클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

루프와 관계 표현식 4 : 단원 연습문제 풀기 본문

프로그래밍 언어/C++

루프와 관계 표현식 4 : 단원 연습문제 풀기

huenuri 2024. 8. 25. 13:31

이 단원을 학습하는데 오늘 0시부터 6시 반까지 총 6시간 반 정도 걸린 것 같다. 이제 연습문제를 푸는 일만 남아있다. 조금 어려워보이지만 시작해보자!
그리고 1시간 안에 문제를 다 풀고 7시 반에는 꼭 아침 운동을 갔다와서 수업 갈 준비를 해야겠다~


 

 

연습문제 풀기

 

1. 진입 조건 루프와 탈출 조건 루프는 어떠한 차이가 있으며, C++의 각 루프들은 어디에 해당하는가?

진입 조건 루프는 루프에 진입하자마자 조건 검사를 하는 것이고, 탈출 조건 루프는 루프 몸체를 먼저 실행하고 나중에 조건 검사를 하는 것이다.
C++의 루프는 for, while, do while이 있는데 for와 while은 진입 조건 루프이고, do while은 탈출 조건 루프이다.

  • 진입 조건 루프는 루프 몸체에 들어가기 전에 조건 검사 표현식을 평가하기 때문에 조건이 처음부터 false이면 루프 몸체를 한번도 실행하지 않는다.
  • 탈출 조건 루프는 루프 몸체를 실행한 다음에 조건 검사 표현식을 평가하기 때문에 조건이 처음부터 false로 되어 있더라도 루프 몸체를 한번은 실행한다.

 

 

2. 다음과 같은 코드 단편이 바르게 작동하는 프로그램의 일부라고 한다면, 예상되는 출력은 무엇인가?

int i;
for (i = 0; i < 5; i++)
	cout << i;
	cout << endl;

 

블록이 설정되어 있지 않아 for문은 첫번째 cout만 반복이 될 것이다. 그러니까 0, 1, 2, 3, 4가 출력되지만 띄어쓰기 없이 붙어서 출력된다.

 

 

 

3. 다음과 같은 코드 단편이 바르게 작동하는 프로그램의 일부라고 한다면, 예상되는 출력은 무엇인가?

#include <iostream>
using namespace std;
int main()
{
	int j;
	for (j = 0; j < 11; j += 3)
		cout << j;
	cout << endl << j << endl;
}

 

0에서 10까지 출력이 되는데, 마지막에 한줄을 띄고 제일 마지막에 출력이 되었던 j값이 한번 더 출력된다.

 

제일 마지막에 10이 출력될줄 알았는데 아니었다. 1이 하나 더 증가해서 11이 되는 것이다. 왜냐하면 j는 후치 증가니까, 출력이 되고 증가하여 값이 하나 올라가게 된다.
이 문제를 가지고 한참 동안 안풀려서 고민을 했는데, 이상하게도 식별자 FILL이 정의되어 있지 않다고 오류가 떴다. 알고 보니 파일을 c로 설정해서 그런 거였다.


추가 풀이

문제를 잘못 써서 엉뚱한 답이 나왔다. 지우지 않고 바로 이어서 다시 풀어보기로 했다. ++인줄 알았는데 알고 보니 +=3이었다. 이건 3씩 증가한다는 의미이다.
0369 이렇게 출력이 되고 마지막에 3이 한번 더 증가한 12가 다음 줄에 출력될 것이다.

 

 

 

4. 다음과 같은 코드 단편이 바르게 작동하는 프로그램의 일부라고 한다면, 예상되는 출력은 무엇인가?

#include <iostream>
using namespace std;
int main()
{
	int j = 5;
	while (++j < 9)
		cout << j++ << endl;

	return 0;
}

 

j의 초기값이 5이고, 9보다 작을 때까지 증가한 값을 출력하는 문제이다. 여기서 전치와 후치를 잘 봐야 하는데, 처음에 j가 먼저 증가했으니 6이 되었다. 출력문에서는 j가 후치이므로 6부터 7, 8, 9까지 출력이 된다.
9는 while문에 들어가지 않지만 8에서 나중에 증가한 값이므로 이렇게 출력될 것 같다.

 

실제로 빌드를 해보니 6과 8만 나왔다. 6이 나오는 건 이해가 되는데, 왜 이 빠져있는지 모르겠다.
이제 이해가 되었다. 처음에 6이 출력이 되는데 그 다음에 후치라 7이 되었고, 7이 된 다음에 전치이므로 8이 되는 것이다. 그러니까 7은 출력되기 전에 증가해서 8만 출력된다. 그리고 9는 조건에 안맞으므로 출력될 수 없다.


 

 

 

5. 다음과 같은 코드 단편이 바르게 작동하는 프로그램의 일부라고 한다면, 예상되는 출력은 무엇인가?

#include <iostream>
using namespace std;
int main()
{
	int k = 8;
	do
		cout << " k = " << k << endl;
	while (k++ < 5);
}

 

do while문이므로 조건식을 검사하기 전에 한번은 진입하게 된다. 이 조건은 do while문이 아니면 거짓이 되어 한번도 출력되지 않을 것이다. 왜냐하면 k가 5보다 작을 경우가 존재하지 않기 때문이다.
하지만 do while 루프에서는 k = 8이 한번 출력된다.

 

 

 

6. 카운터 변수의 값을 매 주기마다 2배로 증가시켜서 1 2 4 8 16 32 64를 출력하는 for 루프를 작성하라.

#include <iostream>
using namespace std;
int main()
{
	int i = 1;
	for (i = 1; i < 65; i*=2)
	{
		cout << i << " ";
	}
}

 

 

 

7. 루프 몸체에 여러 개의 구문을 넣으려면 어떻게 하는가?

중괄호 안에 구문을 넣어준다.

  • 여러 개의 구문을 한 쌍의 중괄호로 묶어 하나의 블록을 만들면 된다.

 

8. 다음은 적합한 구문인가? 틀리다면 이유는 무엇이며, 바르다면 어떠한 일을 수행하는가?

int x = (1, 024);

다음은 또 어떻게 되는가?

int y;
y = 1, 024;

 

첫번째 구문은 틀렸다고 생각한다. 숫자 사이에 콤마를 찍을 수 없기 때문이다. 두번째 구문 역시 가운데 콤마가 있는데, y 값은 나와있지 않아 024가 뭘 뜻하는지 모르는 상태이다.
이 구문이 바르게 역할을 한다면 y는 1이 출력될 것 같다.

이 문제는 틀려서 정답을 확인해보았다.

첫번째 구문은 적합하다. 표현식 1,024는 1과 024라는 두 표현식이 콤마 연산자로 결합된 것이다. 콤마 연산자는 오른쪽의 값이 가장 마지막에 출력되므로 024의 값이 전체 표현식의 값이 된다.
024는 8진수이므로 십진수로 변환하면 20이 된다.

두번째 구문은 맞게 잘 풀었다.

 

 

 

9. 문자를 입력받을 때 cin >> ch는 cin.get(ch)나 ch = cin.get()와 어떻게 다른가?

cin.get(ch)는 문자열을 입력할 때 공백이나 개행 문자까지도 모두 ch 변수에 저장하는 멤버 함수이다. 그러니까 어떤 문장을 입력하면 그대로 출력이 된다.
ch = cin.get()은 매개변수가 없을 때 그 다음 문자를 읽어 리턴한다. 둘은 별 차이는 없지만 무한 루프를 끝내고 싶을 때 이 함수를 사용하는 것 같다.


 

 

단원 연습문제를 풀고 나서

이렇게 해서 1시간에 걸쳐 9문제를 모두 풀어보았다. 문제를 풀고 나니 조금 아리송했던 개념들도 잡히고 for문도 while문도 자신감이 생겼다. 프로그래밍 언어가 너무나도 재미있다.

앞으로도 매일 꾸준히 공부하는 습관을 만들 수 있을 것 같다. 어제 하루와 오늘 새벽 정말 수고가 많았다~