『Lena's by ☆볶기!!』: Restart !!

Rorolena
1-5 프로그램 흐름을 조절하는 법

-/1. 분기/-

간단한 if의 사용
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // 정보를 보관할 변수 정의
 int age; // 나이

 // age 값을 입력 받는다.
 // (입력 받는 법 진도미달, 집적 대입한다)
 age = 20; // 20세

 // 조건에 따라서 다른 문자열을 출력한다.
 if (age <= 19)
 {
  cout << "미성년자입니다.\n";
 }
 else
 {
  cout << "성인입니다.\n";
 }

 return 0;
}
-----------------------------------------------------------------------
point

1. if 사용방법
if(조건)
{
조건이 true일때 실행
}
else
{
앞선 조건이 false이고 지금 조건이 true일때 실행
}

tip

1. if를 else 없이 이용할수 있다.
else가 없을 경우 true인 경우에는 {}안의 소스를 실행하고
false일 경우에는 그다음 소스로 통과하게 된다.

2. if else문을 이용함에 있어 true나 false인 경우에
실행할 코드가 한 줄 밖에 없다면 {}(중괄호)를 적어주지 않아도 된다.

else if의 사용
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // 정보를 보관할 변수 정의
 int age; // 나이

 // age 값을 입력 받는다.
 // (입력 받는 법 진도미달, 집적 대입한다)
 age = 19; // 19세

 // 조건에 따라서 다른 문장열을 출력한다.
 if (age <= 18)
 {
  cout << "미성년자입니다.\n";
 }
 else if (age == 19)
 {
  cout << "아쉽네요\n";
 }
 else
 {
  cout << "성인입니다.\n";
 }

 return 0;
}
-----------------------------------------------------------------------
point

1. else if ()
else if ()문은 if 와 else 사이에 사용해서
if에서 충족하지 못한 값에 재조건을 걸어줄수있다.
사용 방법은 다음과같이 사용할수 있다.
 else if (age == 19)
 {
  cout << "아쉽네요\n";
 }

tip

1. else if ()문은 if와 else사이에 몇개든 사용할수있다.
if (조건)
{
 // 처리
}
else if (조건)
{
 // 처리
}
else if (조건)
{
 // 처리
}else
{
 // 처리
}

2. else if ()문의 경우도  true나 false인 경우에
실행할 코드가 한 줄 밖에 없다면 {}(중괄호)를 적어주지 않아도 된다.

3. else if ()문에서도 else if ()문 이후에
처리할 코드가 없을경우 else 문을 적어주지 않아도 된다.

if와 else만으로 else if를 표현
-----------------------------------------------------------------------
if (age >= 20)
 cout << "성인입니다\n";
else
{
 if (male == true)
  cout << "성인이 아니면서 남자입니다.\n";
}
-----------------------------------------------------------------------
point

1. else if ()문과 동일한 작업을 하고있지만
else if () 문은 else if라는 별도의 키워드가 존재한다.
즉 동일한 작업이라도 방식이 틀리다.

2. 위와같은 방식으로 작성을 할경우
else 후에 더이상 else는 올수없다.
단 {}(중괄호)안의 if 후에는 else를 사용할수 있다.

3. 위와같은 방식을 이용할경우 읽는이의
가동성과 컴퓨터의 작업률이 떨어진다.

논리 연산자로 표현
---------------------------------------------------------------------
if (age >= 20)
 cout << "성인입니다.\n";

if (!(age >= 20) && male == true)
 cout << "성인이 아니면서 남자입니다.\n";
-----------------------------------------------------------------------
point

1. if의 조건문에 논리 연산자를 이용할수 있다.

2. 단 위와같이 이미 더이상 비교가 필요없는
조건을 비교하는것은 컴퓨터의 작업률을 떨어트린다.

tip

1. 들여쓰기와 컴퓨터의 해석
들여쓰기란 글을 작성할 때 문단의 처음을 띄어서 쓰는 것을 의미한다.
하지만 이는 프로그램 실행과는 아무런 관계가 없고 단지
개발자간의 가독성과 이해성, 편의성을 높이기 위함이다.

2. if와 관련한 대표적인 실수
if뒤에 세미콜론을 찍는 실수
if (score == 100);
 cout << "축하합니다.~!!\n";

위와같은 코드는 항상 축하 메시지를 출력하게 된다.
이유인즉 if 선언과 동시에 세미콜론을 찍어 마감시켰기 때문이다.
위의 코드를 풀어쓰면 아래와 동일하다
if (score == 100)
{
}
cout << "축하합니다.~!!\n";

=를 사용한 실수
if (score = 100)
 cout << "축하합니다.~!!\n";
이 경우 역시 점수에 상관 없이 축하 메시지가 출력된다.
이유인즉 score에 100이라는 값을 대입하기 때문이다.
이런 실수 방지 책으로 아래와 같이 작성하면
if (100 == score)
 cout << "축하합니다.~!!\n";

상수에 값을 대입할 수는 없기 떄문에 컴퓨터가 오류 메시지를
발생하여 실수를 빠르게 찾아낼 수 있다.

switch_case의 사용
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // 시험 점수
 // (임의의 값을 대입한다.)
 int score = 2;

 // 점수에 따른 적절한 메세지를 출력
 switch(score)
 {
 case 0:
  cout << "밀려 쓰셨군요~\n";
  break;
 case 1:
  cout << "조금 더 노력하세요~\n";
  break;
 case 2:
  cout << "안타깝네요~\n";
  break;
 case 3:
  cout << "멋있어요~\n";
  break;
 }

 return 0;
}
-----------------------------------------------------------------------
point

1. switch()문은 조건문에 따른 필요한 소스로의 안내를 바로하여준다.
즉 case 2: 필요할경우 if와 달리 case 2:의 소스까지 도달하는
소스를 처리하지 않고 바로 안내하여준다.
이런 처리방식은 if보다 컴퓨터 작업률 상승에 좋다.

2. break; 문은 각 해당하는case문의 소스를 처리후
빠져나가는 문구로서 필요에따라 사용하지 않을수있다.
다만 break; 문이 있을때까지 그아래의 모든 소스를
처리할것이다.

tip

1. break; 문을 필요에따라 사용하지 않을경우
case 0;
case 1;
case 2;
 코드
 break;

위와같이 묵어서 이용할수 있다.

default의 사용
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // 시험 점수
 // (임의의 값을 대입한다.)
 int score = 5;
 
 // 점수에 따른 적절한 메세지를 출력
 switch(score)
 {
 case 0:
  cout << "밀려 쓰셨군요~\n";
  break;
 case 1:
  cout << "조금 더 노력하세요~\n";
  break;
 case 2:
  cout << "안타깝네요~\n";
  break;
 case 3:
  cout << "멋있어요~\n";
  break;
 default:
  cout << "올바르지 않은 점수입니다.!!\n";
 }

 return 0;
}
-----------------------------------------------------------------------
point

1. default:문은 else 처럼 지정된 범위 밖의 값을
처리 할 수 있는 기능을 가지고있다.
또한 if문처럼 범위 밖의 값을 처리할 필요가 없다면
default:문을 쓰지 않아도 된다.

2. 일반적으로 default:문은 가장 마지막에
위치하므로 break를 넣어주지 않지만
만약 case: 블럭 사이에 적어 default: 블럭 아래쪽에
또 다른 case 블럭이 있다면 반드시 break를 넣어주어야 한다.
(default;문은 보통 가장 아래쪽에 위치하는 것이
일반 적이며, 소스를 이해하기에도 좋다.)

switch_case를 if로 바꿔보자
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // 시험 점수
 // (임의의 값을 대입한다.)
 int score = 5;

 // 점수에 따른 적절한 메시지를 출력
 if (0 == score)
  cout << "밀려 쓰셨군요~\n";
 else if (1 == score)
  cout << "조금 더 노력하세요~\n";
 else if (2 == score)
  cout << "안타깝네요~\n";
 else if (3 == score)
  cout << "멋있어요~\n";
 else
  cout << "올바르지 않은 점수입니다.!!\n";

 return 0;
}
-----------------------------------------------------------------------
point

1. 위의 switch_case를 if로 바꿔 코드를 작성해보았다.
작업 결과는 같지만 switch문으로 해결되는 경우는
switch문으로 작성하는것이 좋다.

tip

1. switch/case와 if의 비교
모든 switch/cased는 if, else if, else로 바꿀 수 있다.
다만 그럼에도switch/cased를 사용하는 이유는
작동원리상 switch/cased좀더 가볍기 때문이다.
물론 switch/cased로는 구연이안되 if문이 반듯이 필요한 경우가 많다.
if문의 장점은 값대신에 변수를 사용 할수 있다는것과
case 뒤에는 상수만 올 수 있다는 점때문이다.

그래서 작업에 따라서 switch/cased를 사용하는 것이 보다
이해하기 쉽고 간결한 코드를 만들 수 있다.
만약에 그 변수가 가질 수 있는 값이 새로 추가되었다면
case를 하나 추가하면 되고, 반대의 경우 라면 case를 빼주면 된다.
또한 다른 개발자가 이 소스를 보면 '한 변수의 값에 따라서
서로 다른 일을 하는구나' 라고 바로할 수 있다.

case 안에서 변수를 정의했을 때의 문제점
-----------------------------------------------------------------------
int main()
{
 // switch/case의 입력으로 쓰일 변수
 char c = 'B';

 // 경우에 따라 구분한다.
 switch(c)
 {
 case 'A':
  char my_grade = 'A';

  // 여기서 my_grade를 사용해서 무엇인가 한다.

  break;
 case 'B':
  // char your_grade = my_grade;

  break;
 }

 return 0;
}
-----------------------------------------------------------------------
point

1. C++에서는 어디에서나 변수를 정의할 수 있다.
물론 case 안에서도 가능하다.

2. 위와같은 방식으로 case안에 변수를 선언하면
case 'B':블럭의 처리를 위해 case 'A':블럭은
실행하지 않으므로 my_greade는 초기화할 수 없다.
또한 위의 코드와 같이   // char your_grade = my_grade;
주석 처리를 하여 my_grade 사용하는 코드가 없는 경우라도
오류 메시지가 발생한다는 점을 알수있다.

tip

1. 위의 오류를 방지 하기 위해서는 {}(중괄호)를 처주면된다.
 case 'A':
  {
  char my_grade = 'A';

  // 여기서 my_grade를 사용해서 무엇인가 한다.

  break;
 }

위와 같이 수정할 수 있다.

삼항 연산자의 사용
-----------------------------------------------------------------------
int main()
{
 // a, b에 임의의 값을 넣는다.
 int a = 3;
 int b = 5;
 int c;

 // a, b 중 큰 값을 c에 넣는다.
 c = a > b ? a : b;

 return 0;
}
-----------------------------------------------------------------------
point

1. 삼항 연산자는 C++에서 유일하게 3개의 피연산자를 입력 받는
연산자라 삼항 연산자라 한다. 간단히 설명하자면
한 줄에 다 쓸 수 있는 if, else라고 표현할 수 있다.

2.  c = a > b ? a : b;는 각각 조건이, 참인 경우에 실행하는 수식,
거직인 경우에 실행하는 수식으로 구분한다.
a > b 조건
a : b; 조건이 true인 경우에는 a를 조건이 false인 경우에는 b를실행한다.
이를 풀어 써본다면 아래와 같다.
// a, b중 큰 값을 c에 넣는다.
if (a > b)
 c = a;
else
 c = b;

goto의 사용
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // ILoveYou라고 찍힌 곳으로 이동한다.
 goto ILoveYou;

 // 이곳을 뛰어넘는지 시험
 cout << "이 문자열이 출력되면 안됩니다.\n";

ILoveYou:
 cout << "여기는 ILoveYou 다음입니다.\n";

 return 0;
}
-----------------------------------------------------------------------
point

1.  goto ILoveYou;적은후 ILoveYou:라는 레이블을 위치 시키면
goto ILoveYou;에서 ILoveYou:넘어갈수있다.
물론 여러 개의 레이블을 만드는 것도 가능하다.

tip

1. goto를 사용하지 말라
구조적 프로그래밍이라는 패러다임이 전성기를 누리면서
goto를 사용하지 말 것이 강조되어 왔다.
goto를 많이 사용하게 되면 소스 코드의 가독성 저하와 동시에
관리하기도 힘들어지며 처리율또한 떨어지기 떄문에 실행의 흐름을
이동시킬 필요가 있다면 반복 명령들을 사용하는 것이 좋다.

다만 매우 흔하지는 않지만 반복이 2~3개 이상으로 중첩해 있다면
완전히 빠져 나오게 만드는 것이 간단하지 않다.
이때 goto를 사용해서 한번에 모든 반복을 빠져나가는 것이
간결하고 쉬운관리와 좋은 처리율을 보여주기도 한다.
이경우는 goto를 피할 필요는 없다.

-/2. 반복/-

while의 사용
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 int i = 1;
 int sum = 0;

 // 'i = 10'을 만족하는 동안만 반복한다.
 while (i <= 10)
 {
  // 현재까지의 합에 i를 더한다.
  sum += i;

  // i에 1을 더한다.
  ++i;
 }

 // 결과 출력
 cout << "현재 i의 값 = " << i << "\n";
 cout << "1~10 까지의 합 = " << sum << "\n";

 return 0;
}
-----------------------------------------------------------------------
point

1. while ()문의 작동원리는
()의 조건이 true일동안 반복하며
{}(중괄호)안의 반복될 코드를 실행한다.

++i를 while의 조건 부분에서 해보자
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 int i = 0;
 int sum = 0;

 // 'i = 10'을 만족하는 동안만 반복한다.
 while(++i <= 10)
  sum += i; // 현재까지의 합에 i를 더한다.
 
 // 결과 출력
 cout << "현재 i의 값 = " << i << "\n";
 cout << "1~10 까지의 합 = " << sum << "\n";

 return 0;
}
-----------------------------------------------------------------------
point

1.  while(++i <= 10)와 같이 적어 줌으로써
 while (i <= 10)
 {
  // 현재까지의 합에 i를 더한다.
  sum += i;

  // i에 1을 더한다.
  ++i;
 }

와 같은 일을 한다.
단 조건 문에서 ++i를 할경우 기본적으로 1이 더해짐으로
int i = 0; 값을 0으로 초기화 해야 한다.

tip

1. ++i가 아니라 i++을 할경우 1을 더하기 전에
비교를 먼저 하기 때문에 11까지의 합이 구해진다.

2. --i를 이용한 1~10까지의 합구하기
 int i = 11;
 int sum = 0;

 // 'i = 10'을 만족하는 동안만 반복한다.
 while(--i)
  sum += i; // 현재까지의 합에 i를 더한다.

여기서  while(--i)는 정수 값 0이 bool 타입으로
해석될 때 fals가 된다는 점을 이용한것으로
풀어쓰면 while (--i != 0)과 동일하다.

3. while또한 {}(중괄호)에 한 문장만 들어 있다면,
{}(중괄호)를 쓰지 않아도 된다.

break로 반복 빠져나오기
-----------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 int i = 1;
 int sum = 0;

 // 무한정 반복한다.
 while (true)
 {
  // 현재까지의 합에 i를 더한다.
  sum += i;

  // i에 1을 더한다.
  ++i;

  // i의 값을검사한다.
  if (i > 10)
   break;
 }

 // 결과 출력
 cout << "현재 i의 값 = " << i << "\n";
 cout << "1~10 까지의 합 = " << sum << "\n";

 return 0;
}
-----------------------------------------------------------------------
point

1.  while (true)로 무한 반복을 시킨후
if (i > 10)로 조건을 검출 break; 빠져나간다.

tip

1. 프로그램을 작성하다 보면 실수로 무한루프에 빠지게 되는 경우가 생긴다.
이런경우 cpu연산에 부하가걸려 컴퓨터가 다운 될수도 있다.

for의 사용
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // 전체 합을 보관할 변수
 int sum = 0;

 // 1~10까지 반복하면서 더한다.
 for (int i = 1; i <= 10; ++i)
  sum += i; // 현재까지의 합에 i를 더한다.

 // 결과 출력
 cout << "현재 i의 값 = " << i << "\n";
 cout << "1~10 까지의 합 = " << sum << "\n";

 return 0;
}
-----------------------------------------------------------------------
point

1.  for (int i = 1; i <= 10; ++i)안에
초기화, 반복 조건, 증가연산이 한줄에 모두 들어간다.
단 조건은 true가 되야한다.

2. for의 초기화 부분의 변수 선언은 처음 한 번만 실행한다.

tip

1. 변수의 초기화
for의 초기화 부분에서 반드시 변수를 정의해야 하는 것은 아니다.
이전에 정의한 변수를 사용하는 것도 가능하다.
그러나 for의 초기화 부분에서 변수를 정의하는 것은 아주 편리한 기능이다.
그리고 이 기능은 C언어에는 없고 C++에만 있다.

2. for와 while의 비교
for()문은 반복작업을 위하여 초기화, 조건, 증가치를 한조건에 선언할수있다.
while 경우 초기화, 조건, 증가치를 따로따로 적어줘야하 한다.
초기화, 증가치가 필요하지 않는 경우 유용하다.
예를 들어 반복하는 코드 내에서 계산할 결과가
특정 값이 될 때까지 반복하는 경우를 생각해볼 수 있다.

3. for()문 이용방법
for 문안에 꼭 초기화, 조건, 증가치를 전부 선언하지 않아도 된다.
예로 아래와 같이 쓸수있다.
for (int i = 1; i <= 10;)
for(;;)
{
 break;
}

단 for (;;)와 같은 경우에는 while (true)와 마찬가지로
무한정 반복하기 때문에 break를 사용해서 빠져 나와야 한다.

5를 제외한 1~10의 합
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // 전체 합을 보관할 변수
 int sum = 0;

 // 1~10까지 반복하면서 더한다.
 for (int i = 1; i <= 10; ++i)
 {
  // i가 5인 경우는 그냥 넘어간다.
  if (5 == i)
   continue;

  // 현재까지의 합에 i를 더한다.
  sum += i;
 }

 // 결과 출력
 cout << "현재 i의 값 = " << i << "\n";
 cout << "5를 제외한 1~10 까지의 값 = " << sum << "\n";

 return 0;
}
-----------------------------------------------------------------------
point

1. continue;문을 이용하면 다시한번 반복을 실행 시킬수있다.
이에 if (5 == i)와 같은 조건을 삽입하면
연상중 일부를 빼고 연산할수도 있다.

tip

1. while이나 for도 if처럼 중괄 호안에 얼마든지
넣을수있어 중첩된 반복을 할수도 있다.

2. for, while문 뒤에 세미콜론을 붙이는 실수
while (i < 10); 와같이 적을 경우 다음코드는 아래와 같다.
while (i < 10);
{
}

이경우 원래 {}(중괄호)안에 들어있던 코드는
따로 처리가 되어 프로그램에 아무런 영향을
주지않거나 혹은 문재를 일으킬수 있다.

중첩된 반복을 사용한 구구단 프로그램
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main()
{
 // 2~9단까지 반복한다.
 for (int i =2; i <= 9; ++i)
 {
  // i단의 시작을 표시한다.
  cout << i << " 단 --------\n";

  // 1~9까지 반복한다.
  for(int j = 1; j <= 9; ++j)
  {
   cout << i << " x " << j << " = " << i * j << "\n";
  }
 }

 return 0;
}
-----------------------------------------------------------------------
point

1. for안에 for를 돌려 연산을 순차적으로 한후
차례로 연산된 cout으로 구구단이 출력된다.

do while의 사용
-----------------------------------------------------------------------
#include <iostream>
using namespace std;

int main();
{
 int i = 1; // 1부터 10까지 증가할 변수
 int sum = 0; // 전체 합을 보관할 변수

 // 'i< = 10'을 만족하는 동안만 반복한다.
 do
 {
  // 현재까지의 합에 i를 더한다.
  sum += i;

  // i에 1을 더한다.
  ++i
 } while (i <= 10);

 // 결과 출력
 cout << "현재 i의 값 = " << i << "\n";
 cout << "1~10 까지의 합 = " << sum << "\n";

 return 0;
}
-----------------------------------------------------------------------
point

1. do while은 무조건 한 번 반복한 후에 조건을 검사한다.

2. do while에는 for, while과 다르게
} while (i <= 10);와같이 끝에 세미콜론을 붙여주어야 한다.


tip

1. do while를 으용하면 조건과 관련한 값을
사용자로부터 받는 경우를 생각해볼 수 있다.
일단 값을 받아야 조건을 검사할 수 있다.
아래는 예제 코드이다.
// 사용자로부터 값을 받을 변수
int n;

do
{
 // 사용자로부터 값을 받는다.
// (자세한 것은 이후 과정에서 알수있다.)
cin >> n;
} while (10 != n);

2. 위와 같은 성질의 반복을 while이나 for를 사용하여 구현하려면,
똑같은 코드를 한 번 더 적어주어야 하는 문제가 발생한다.
아래는 예제 코드이다.
// 사용자로부터 값을 받을 변수
int n;

// 사용자로부터 값을 받는다.
// (자세한 것은 이후 과정에서 알수있다.)
cin >> n;

while (10 != n)
{
 // 사용자로부터 값을 받는다.
 // (자세한 것은 이후 과정에서 알수있다.)
 cin >> n;
}

이와 같이 동일한 코드가 중복해서 존재한다는 것은
개발자의 불편과 가독성 것 이상의 문제점을 내포하고 있다.
나중에 이 코드를 수정 할 일이 생긴다면
반드시 두 군데 모두 수정을 해주어야 한다.
이는 생각만큼 쉬운 일이 아니며 실제적으로 많은 문제를 발생시킨다.

'보관소 ▦ ━━ > 작업 기록' 카테고리의 다른 글

1-7 변수를 여러 개 모아놓은 변수  (0) 2008.07.05
1-6 <프로젝트> 성적표 Ver 1  (0) 2008.07.04
[프롤로그]  (0) 2008.06.14
슈팅게임 (시스탬 프로그래밍)  (3) 2008.06.14