본문 바로가기

개발 공부/C++

따라하며 배우는 C++ 5. 흐름제어

 

따라하며 배우는 C++ 

 

5. 흐름제어

 

5,1 제어 흐름 개요 Control flow

 

 

 

 

 

halt(중단)에 대한 내용

exit은 디버깅할 때도 많이 쓰인다.

 

 

5.2 조건문 if

 

if(참) //참일 경우 실행

else //거짓일 경우 실행

 

if나 else 다음에 {}가 없다면 한 문장 이상을 실행시킬 수 없다.

 

if(1) //무조건 true. if문 안에선 0이 아니면 무조건 참으로 실행된다

 

if 간의 논리 관계가 애매한 경우는 권장하지 않는다. 중괄호를 하는 것이 좋다.

 

if문은 프로그램을 중단시킬 때도 사용할 수 있다.

 

 

이 때 if문 다음에 ; 가 있다면 if문 조건이 어떻게 되건 그냥 if문이 끝나 버린다.

 

위의 경우, x에 대입이 먼저 되고 대입이 끝난 x를 if문 조건에 넣어 버린다.

 

 

5.3 switch-case

 

이렇게 if문으로 쓸 수도 있지만 switch문으로 하면 더 간단해지는 경우도 있다.

 

 

if문과는 다르게 case 1이 걸리고 나서 그 case에 break가 없으면 뒤에 것이 모두 출력된다.

 

break를 사용해야 해당 case만 실행하고 끝낸다.

물론 의도적으로 break를 쓰지 않을 때도 있다.

 

case 안에 어떤 변수를 선언해도, swtich문 바로 전(즉 case들 직전)에 선언된 것처럼 작동한다.

 

이렇게 중괄호로 확실하게 묶는 것이 좋다.

case 외에 없는 경우에 대해서 default: 를 둘 수 있다.

 

5.4 goto

 

goto는 반복문의 원조라고 볼 수 있다.

label로 지정된 쪽으로 되돌아간다.

 

그러나 최근에는 지양되고 있다. 프로그래머들의 계획성을 강조하는 측면 때문에.

 

초기화를 하는 단계를 건너뛰므로 에러가 생긴다.

 

 

5.5 반복문 while

 

조건이 안 맞으면 실행되지 않음.

 

무한 루프.

 

 

 

 

unsigned일 경우에 음수가 되는 조건을 달면 overflow가 생길 수 있다.

양수가 되는 조건일 경우엔 괜찮다.

 

 

5.6 반복문 do-while

 

while문은 조건에 따라 한번도 돌지 않을 수 있지만 do-while은 반드시 한번은 실행된다.

 

do-while문이나 while문의 경우 조건에 해당하는 변수는 반드시 외부에서 선언해주어야 한다.

 

5.7 반복문 for

 

반복문은 반복 횟수가 정해져 있을 때 많이 쓴다.

 

for문은 count 선언(정의), 조건문, count 조작 순으로 이루어진다.

선언은 한 번만 실행된다. 첫 실행에서 선언부를 실행한 후, 조건을 비교한다. 그 다음 for의 본문을 실행한다.

그 후에 count 조작 순으로 이루어진다. 조작 후엔 바로 조건을 비교한다.

조작 후에 count가 조건과 맞지 않으면 for문을 나간다.

 

int count = 0;

for(; count<10; ++count)

{

   count<<count<<endl;

}

//이런 식으로 count를 외부 선언도 가능.

 

for(;true;++count)

   cout<<count<<endl;

 

for(; ; ++count)

   cout<<count<<endl;

 

//위 두 개의 경우 모두 무한 루프

 

 

 

5.8 break, continue

 

 

 

 

위와 아래의 작동은 같다. continue는 맞닥뜨리는 순간 for문 안의 다른 문장은 실행하지 않고

바로 count 조작 부분으로 이동한다.

 

위는 무한 루프의 안 좋은 예.

count가 5가 되면 계속 count++를 스루해 continue만 되므로, 무한 루프에 빠지게 된다.

while(++count<10); //이런 식으로 조건문에 ++를 넣는 방법도 있다.

 

 

 

 

 

 

5.9 난수 만들기 random numbers

 

가짜 난수 생성을 하는 코드.

이런 원리로 컴퓨터에서 난수 코드가 만들어진다.

 

 

위 코드는 계속 실행해도 똑같은 결과값을 만들어낸다.

seed 값을 다르게 해야 진정한 랜덤 값을 출력할 수 있다.

 

 

CPU에서 현재 시간을 가져와 seed 값을 계속 바꿔줄 수도 있다.

//디버깅할 때는 랜덤 수를 고정하는 것이 좋으므로 시드 값을 고정해주는 것이 좋다.

 

 

여기서 RAND_MAX는 랜덤 넘버를 사용할때 사용할 수 있는 가장 큰 숫자.

나누기는 보통 느리므로 나눈 숫자를 static으로 저장해 사용하는 것이 좋은 방법이다.

범위 내에서 난수를 생성하는 방법.

 

위와 같은 경우 0~3의 나머지에 5를 더하는 방법으로 5부터 8까지의 난수를 생성할 수 있다.

다만 위 같은 방법은 범위가 커질 경우 난수가 특정 범위에 몰리는 경우가 생길 수 있다.

 

 

5.10 std::cin 더 잘 쓰기

 

ignore(), clear(), fail();

 

#include <iostream>
using namespace std;

int getInt()
{
	cout << "Enter a integer number : ";
	int x;
	cin >> x;
	return x;
}

char getOperator()
{
	cout << "Enter an operator (+, -): ";
	char op;
	cin >> op;
	return op;
}

void printResult(int x, char op, int y)
{
	if (op == '+') cout << x + y << endl;
	else if (op == '-') cout << x - y << endl;
	else cout << "Invalid operator" << endl;
}
int main()
{
	int x = getInt();
	char op = getOperator();
	int y = getInt();
	printResult(x, op, y);
	return 0;
}


 

사용자가 하나만 입력하는 것이 아니라 두 가지를 입력하면

두 번째 입력은 버퍼에 남아 있다가 다음번 출력의 입력이 되어버린다.

 

 

이렇게 ignore로 32767 글자만큼의 입력을 무시할 수 있다.

 

cin.clear()는 버퍼 초기화

cin.fail()은 입력이 정상적이었는지 여부를 물음. 실패했다면 true 리턴