C++ 문법 뽀개기 ~ 1-6 반복문과 다중반복문

LIHA·2023년 11월 1일

C++

목록 보기
1/2
post-thumbnail

수업이 part1, part2가 있으니 디렉토리부터 만들어보자

윈도우 cmd의 디렉토리 관련 명령어

상위 폴더로 가고싶으면 cd ..
최상위 폴더 한번에 가려면 cd /
드라이브를 바꾸고 싶으면 그냥 d:, e:
디렉토리 만들려면 mkdir (원하는 디렉토리 이름)
-> 여러개면 mkdir 폴더명1,폴더명2,폴더명3 (쉼표 뒤에 공백넣어도 됨 폴더명에 포함되지않음)

증감연산자의 작동원리 - 왼→오 방향으로 읽어나간다고 생각하자.

  • 전위연산자 : 그 줄에서 바로 적용된다.
  • 후위연산자 : 그 줄이 아닌 다음 줄에서 적용된다.
    그 바로 다음 줄에 뭐가 없다면, 후위연산자가 붙은 그 변수가 다시 나올 때 적용된다.
#include <iostream>
using namespace std;
int main()

{
int melon = 3;

cout << "melon is " << ++melon << endl;
//이 멜론은 컴파일하면 바로 4가 찍힌다.
cout << "melon is " << melon++ << endl;
//이 멜론은 3이 찍힌다. 이 다음 어딘가에 melon이 또 오면 걔는 4개가 찍힐 것. 

return 0;
}

VS Code에서 한글 인코딩이 깨질 때 - 우하단 UTF-8을 EUC-KR로 바꾸자

우하단 UTF-8 클릭 > Reopen with Encoding 클릭 > EUC-KR 찾아서 선택
VS Code가 알아서 재시작 될 것임. 이후 컴파일하면 한글도 깨지지 않는다.

엇 벌써틀렸네 - for문에서 2배씩 증가시켜 주려면?

하루에 수박을 한 개씩 캐던 사람이 능률이 올라 두 개씩 캔다고 가정하고 코드를 수정해 봅시다.

내 생각:

    for (int i = 0; i < workingDays; i++)
    {
				// working...
        numOfWatermelons = 2*(numOfWatermelons++) ;
    }

결과: 작동하지 않았다. 수박 갯수는 입력값과 같았다.
이유: 잘 모르겠다. 왤까? 🤔
-> 이거 다시 컴파일해보니 얘도 0개가 나왔다. 아래와 이유가 같은 듯 하다.😭

내 생각 2:

numOfWatermelons = (2*numOfWatermelons++)
// 이건요? 이건 작동할까?

결과: 폭망. 수박이 0이 되었다.
이유: i = 0부터 시작하므로 0을 곱하면 i의 상한이 몇이든 0개가 나온다.

정답:

numOfWatermelons += 2;

내 nested for loop 왜 작동을 안하지?😰

// nestedforloop.cpp
#include <iostream>
using namespace std;

int main()
{
    int floor = 7;
    int rooms = 12;
    int i, j;

    cout << "최대 층수: " << floor << endl;
    cout << "층당 호실 수: " << rooms << endl;

    for (i = 1; i < floor < i++;)
    {
        cout << i << "층 입니다." << endl;
        for (j = 0; j < rooms < j++;)
        {
            cout << "호실: " << (i*100 + j) << endl;
        }
    }

    return 0;
}

이유: for문의 조건절을 잘못 썼다. 둘 다.

i < floor; / j < rooms; 로 세미콜론을 써야 하는데, 부등호를 써놨으니.
이거 문제 찾겠다고 디버거까지 설치한 내 멍충함이 레전드다...😩


완성본 1 - i, j를 1부터 쓴 경우

// nestedforloop.cpp
#include <iostream>
using namespace std;

int main()
{
    int floor = 7;
    int rooms = 12;
    int i, j;

    cout << "최대 층수: " << floor << endl;
    cout << "층당 호실 수: " << rooms << endl;

    for (i = 1; i < floor; i++)
    {
        cout << i << "층 입니다." << endl;
        for (j = 1; j <= rooms; j++)
        {
            cout << "호실: " << (i*100 + j) << endl;
            
            if (j == rooms)
            {
                cout << endl;
            }
        }

    }

    return 0;
}

완성본 2 - i, j를 0부터 쓴 경우

// nestedforloop.cpp
#include <iostream>
using namespace std;

int main()
{
    int floor = 7;
    int rooms = 12;
    int i, j;

    cout << "최대 층수: " << floor << endl;
    cout << "층당 호실 수: " << rooms << endl;

    for (i = 0; i < floor; i++)
    {
       cout << i + 1 << "층 입니다." << endl;
        for (j = 0; j < rooms; j++)
        {
            cout << "호실: " << (i+1)*100 + (j + 1) << endl;           
        }
        if (j == rooms)
        {
            cout << endl;
        }

    }

    return 0;
}

위 두 완성본은 등호의 차이, if(j==rooms)의 위치 차이가 있다.

  • if(j==rooms) 의도: 끝 호실일 때 한줄 띄워서 너무 다닥다닥 나오지 않게 하려는 것)

[완성본 1]

  • 등호가 있는 이유:
    j=1로 시작해서, 없으면 2호부터 나온다.
  • if(j==rooms)가 j for문 안에 있는 이유:
    j=1로 시작해서, 밖에 있으면 증감연산자 때문에 j == rooms인 호수가 13이 되므로 for문은 영원히 13호까지 가지 않아 띄어쓰기가 안 먹힌다.

[완성본 2]

  • 등호가 없는 이유:
    j=0으로 시작해서, 있으면 0호부터 나온다.
  • if(j==rooms)가 j for문 밖에 있는 이유:
    j < rooms라서 등호 없어서, 안에 있으면 증감연산자 작동하지 않아 12호까지 가지 않으므로 띄어쓰기가 안 먹힌다.

연습문제의 꽃, 별 찍기

강사님의 조언

코드를 절대 먼저 작성하려고 하지 말고 먼저 생각을 해보는게 정말 중요하다.
초보때 항상 하던 실수가 코드부터 작성하려고 했던 것이다.
무엇을 작성해야 할지 결정하고 코드를 작성하는 게 좋다.

별찍기도 사실은 구구단과 비슷한 메커니즘인데, 별찍기는 n번째 줄에 n개의 별이 있다.
구구단으로 생각해보면, i단에 9까지가 아니라 i까지 있는 셈 - 즉, i의 영향을 받는 구조라는 것.
이걸 생각하면 i의 범위는 상수로 정해주고(원하는 줄만큼 찍을거니까), j의 범위는 i에 따라 달라지도록 넣어주면 된다.


내 별찍기 코드:

#include <iostream>
using namespace std;

int main()
{
    int i,j;

    for (i = 1; i < 12; i++)
    {
        cout << endl;
        for (j = 1; j < i; j++)
        {
            cout << "*";
        }
    }

    return 0;
}

결과:

*
**
***
****
*****
******
*******
********
*********
**********

별찍기 코드와 결과에서 짚고 갈 점

1. 나는 i < 12를 썼는데 왜 별은 10줄까지만 나왔을까?
→ i < 12로 등호가 없으니 11까지만 갈것, j < i로 또한 등호가 없으니 10까지만 갈것. 얘는 사실 내가 짠 코드대로 나온 것임.

2. 나는 그 n까지 가게 하고 싶은데?
→ 그러면 i, j의 범위에 모두 등호를 넣어주면 된다. 내 코드에서 범위에 등호를 넣고 다시 보자.

등호를 넣은 코드:

#include <iostream>
using namespace std;

int main()
{
    int i,j;

    for (i = 1; i <= 12; i++)
    {
        cout << endl;
        for (j = 1; j <= i; j++)
        {
            cout << "*";
        }
    }

    return 0;
}

결과:

*
** //2
***
**** //4
*****
****** //6
*******
******** //8 
*********
********** //10
***********
************ //12

~~(사실 쉽진 않다)~~

1부터 입력한 수까지의 합을 알고 싶어요 - 제 3의 변수가 필요해

역시 온갖 패착과 악습(?)을 몸소 실천하는 나는 이번에도 코드부터 짜보려고 하다가 와장창창 실패해버리는 훈훈한 상황을 겪었다.

profile
갑자기 왜 춤춰?

0개의 댓글