brunch

You can make anything
by writing

C.S.Lewis

by 시몬 Apr 06. 2021

취미로 C++ 공부하기 - 2

++, --, 반복문과 구구단 만들기, 피라미드 쌓기

이 글은 유튜브 나도코딩님의 C언어 무료강의 를 보고 학습한 내용을 정리하였습니다.


이 글은 연재중인 취미로 C++ 공부하기 - 1의 다음편입니다.


오늘은 ++의 개념과 반복문 for, while, do while에 대해 공부했고, 해당 내용을 토대로 프로그래머들 사이에서는 별찍기라고 불리우는 피라미드 쌓기를 응용해서 복습했다.


++, --

b와 b++, ++b와 b--, --b의 차이


처음 들으면 가가 가가가 같은 느낌이다


먼저 int b = 20을 통해 b에 20을 넣어보자.

b = b + 1;은 20이었던 b에 + 1을 하여 21로 만든다는 뜻인데, 이런 뜻과 b++는 비슷하지만 다르다.

한장으로 요약해봤다. 서술하자면, 출력과 데이터의 증감타이밍의 차이인 것 같다

1. b++ : b를 먼저 출력하고 데이터상으로 b에 +1을 한 값을 저장 

   [ 20을 출력하고 저장은 21로 저장, 다음 출력시에는 21로 출력됨 ]

2. b-- : b를 먼저 출력하고 데이터상으로 b에 -1을 한 값을 저장

    [ 20을 출력하고 저장은 21로 저장, 다음 출력시에는 19로 출력됨 ]

3. ++b : b를 출력하기 전에 b에 +1을 한 후 출력

    [ 21을 출력하고 저장도 21로 저장, 다음 출력시에도 21로 출력됨 ]

4. --b : b를 출력하기 전에 b에 -1을 한 후 출력

    [ 19를 출력하고 저장도 19로 저장, 다음 출력시에도 19로 출력됨 ]


이는 반복문을 배우기 위해 중요한 개념이라고 하면서 먼저 설명해주셨다.

이제 본격적으로 반복문을 맛볼 차례.


반복문

for, while, do while


반복문은 기본적으로 조건이 도달할 때 까지 반복문 안의 내용을 컴퓨터에게 반복시키는 코드를 말하는데, 이이에는 for, while, do while의 세가지 단어가 존재한다.



for문

for문은 공식은 for (선언; 조건; 증감) { }의 형태를 띄는데, 하나하나 차례로 알아보자

1. int i라는 변수에 1을 추가하고 (선언)

2. i가 10보다 작거나 같다면 (조건)

3. i를 1 증가시킨다 (증감) 의 공식을 통해 

4. for 문 안의 내용을 조건에 이탈하기 전까지 반복하게 만드는 것


결과적으로 i에 1을 넣었고, 10 이하가 될 때까지 1씩 증가시키기 때문에 

총 10번의 Hello World i의 문장이 출력되게 된다.



while문

while문의 공식은 whlie (조건) { }의 형태를 띈다.

1. int i = 1;을 통해 i에 1을 먼저 선언한 후 while문을 작성한다.

2. i가 10보다 작거나 같다면

3. while문 안의 printf("Hello World %d\n", i++); 를 통해 Hello World i 를 출력시키는데

4. 출력 후에 i++ 를 통해 i의 값을 1씩 늘려줬으니

5. 10번 반복 후에 i의 값이 10이 되면 멈추게 된다.


결과적으로 for 문과 같이 총 10번의 Hello World i의 문장이 출력되게 된다.



do while문

do while문의 공식은 do { } while (조건); 인데, 영어의 문법과 가장 비슷하지 않나라고 생각된다.

(해라, 조건에 부합하지 않을때까지)

1. 동일하게 int i = 1; 를 통해 i에 1을 먼저 선언한 후

2. do를 통해 printf의 문장을 출력하게 한 후, i의 값을 1씩 증가시키며

3. while (i <= 10);을 통해 조건을 걸어줘서 i의 값이 10 이하가 되면 중지시키게끔 한다.


결과는 for, while과 동일하게 총 10번의 Hello World i의 문장이 출력되게 된다.


2중 반복문

반복문의 응용

오로치마루의 삼중나생문(...)



반복문 안의 반복문

반복문 안에 반복문을 넣을 수 있는데, 다음과 같은 예제를 풀어보자.

여기서부터 슬슬 난이도가 올라가기 시작한다.


먼저 바깥을 감싸고 있는 첫 for문이, 1을 담고있는 i가 3이하가 될때까지 반복되는 줄 알았는데, 아니었다.

첫번째 반복문의 printf가 먼저 출력되고, 두번째 반복문의 반복이 끝날때까지 첫번째 반복문은 동작하지 않는다. 글로 설명하려고 하니 복잡하니 결과를 먼저 보자 (나도 영상으로 들었을 때는 이해하지 못했다..)

이처럼 첫번재 for문 : i의 printf가 먼저 출력되고, 그 다음 줄의 for문의 반복이 조건에 벗어나기 전까지 첫번째 for문은 반복이 진행되지 않는다. 반복문 안의 내용이 모두 마무리가 되기 전까지는 반복이 되지 않는 개념으로 이해해야 할 것 같다. 이 개념은 이 후의 피라미드 쌓기에서 굉장히 중요하게 작용하더라.



2중 반복문의 응용

구구단을 만들어보자, 결과를 안보고 만들었는데 성공한 내용이다 (!)

먼저 구구단은 n X m = nm의 형태를 띄게 된다. 따라서 변수는 n과 m으로, 두가지의 변수를 활용해 2중반복문을 구성해 구구단을 만들 수 있다.

1. 구구단은 2단부터 시작하므로 먼저 int i = 2를, i가 9 이하가 될 때까지 순차적으로 1씩 늘려주고,

2. int j = 1을 통해 2 X 1 = 2의 형태를 만든다.

3. 마지막으로 printf("%d X %d = %d\n"), i, j, i*j);를 통해 순차적으로 늘려주게 되면 구구단이 완성된다.


여담으로는, 그냥 생각의 흐름대로 코딩을 진행했는데 성공해서 매우 기분이 좋은 순간이었다.


다중반복문

피라미드 만들기 (다중 반복문의 응용)

먼저 다음과 같은 별 형태를 2중반복문을 이용해 만들어보라고 하더라.


*

**

***

****

*****

별이 한줄에 하나, 두번째 줄에 둘, 세번째 줄에 셋, 네번째 줄에 넷, 다섯번째 줄에 다섯개..


1. 첫번째 반복문에는 줄바꿈으로 마무리하고, 그 안의 반복문에서 별의 개수를 결정해야할 것 같다.

2. 5줄이니까 첫번째 반복문의 조건은 i < 5가 되어야 하고, 1씩 증가시키면 

    첫번째 반복문은 for ( int i = 0; i < 5; i++) {  } 으로 처리가 같았다.

3. 이제 두번째 반복문으로 별의 개수를 찍는 일만 남았는데, 각 층수와 같은 개수의 별이니까 

    똑같이 j < 5로 진행하면 될 줄 알았다.


응 실패 (좌) / 모범답안 (우)

조건에 첫번째 반복문의 변수와 비교할 수 있다는 건 생각하지 못했다. (j <= 1) 


i와 j에 0을 넣어두고, j가 i보다 작거나 같을때까지 *을 찍으면, 

첫 동작에서는 0 / 0 이니까 별이 1개, 두번째에서는 0 / 1이니까 줄바꿈, 

세번째에서는 1 / 0이니까 별이 1개, 1 / 1이니까 별이 2개, 1 / 2니까 줄바꿈, 

유튜브에서 캡처해온 화면이다 (그저 빛..)

안에 있는 반복문이 끝나기 전까지 바깥의 반복문은 실행하지 않고, 조건에 부합하면 안의 내용을 무시하고 for문을 탈출한다는 개념을 유념해야 하더라. 그리고 될때까지 주먹구구식으로 이건가? 하면서 고치면서 코딩하면 더 꼬이고, 개발자분들이 말씀하시는 순서를 머리속에서 잡고 코드를 쳐나가기 시작하라는 게 이건가 싶었다.


비슷한 느낌으로 

        *

      **

    ***

  ****

*****

시행착오를 겪어가며 상단의 모양을 만들었고, 최종적으로 '피라미드를 쌓아라' 프로젝트를 진행했다.


피라미드를 쌓아라

문제는 다음과 같다. 

사용자가 scanf_s를 통해 숫자를 입력하면, 해당 숫자만큼의 *로 구성된 피라미드가 쌓이는 형태인데 위에서 시도했던 별 찍기를 잘 응용한다면, 할 수 있을 것 같은 느낌이 들었다.

당연히 성공하진 못했다(...), 영상을 통해 회고하고, 논리의 순서를 정리한 결과

1. 먼저 floor라는 변수를 선언, scanf_s를 통해 floor의 값을 입력받고

2. 첫번째 반복문에서 피라미드의 층수만큼 반복을 돌릴 것을 결정

3. 두번째 반복문들에서 한 층 단위의 빈칸과 별의 갯수를 결정하게 된다.

4. 이제 두번째 반복문들의 조건을 설정하는 것이 가장 중요한데,

    먼저 빈칸은 입력받은 층보다 1층만큼 적은 수량의 빈칸이 있어야 최하단이 빈칸 없이 *로 가득차게 되고,

    *은 최상단에는 1개만 있고, 홀수단위로 늘어나야 피라미드의 모양이 완성된다.


이 영롱한 자태를 보라





응용한다고 다이아몬드도 만들었는데, 분량조절에 실패해서 이미지만 첨부함 (...)


결과와 설명을 듣고 나니 이해가 됐지만, 요구사항을 듣고, 논리의 순서를 머릿속에서 정리하고, 코딩을 통해 구현해 내려면 아직 한참 멀었으며, 현업에서 일하시는 개발자분들은 이런 일들을 직접 실현하고 있다는 생각이 들어 내심 대단하다는 생각이 들었다.









작가의 이전글 취미로 C++ 공부하기 - 1
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari