c언어 02 반복문 (feat 이전 내용 복습)
#include <stdio.h>
int main(void)
{
for (int i = 2; i <= 9; i++)
{
for (int y = 1; y <= 9; y++)
{
printf("%dX%d=%d\n", i, y, i * y);
}
printf("\n");
}
return 0;
}
int main(void)
{
int floor;
printf("몇층으로 쌓으시겠습니까?(5~100)");
scanf_s("%d", &floor);
for (int t = 0; t < floor; t++)
{
for (int q = t; q < floor-1; q++)
{
printf("*");
}
for(int r=0; r<t*2+1; r++)
{
printf("$");
}
printf("\n");
}
return 0;
}
c언어 공부 2강이 찾아왔다. 2강의 내용들을 정리하기 전 저번에 배웠던 1강의 내용들을 다시 한번 간단히 요약하고 넘어갈 까 한다.
저번 시간엔
값을 컴퓨터에 넣어주려면 어떻게 해야 하지 ?==> 변수
내가 쓴 코드에 대해 설명해주려면 어떻게 해야 하지?==>주석
사용자로부터 입력한 값을 받으려면 어떻게 해야 하지? ==> 입력함수 (scanf_s)
값을 출력하려면 어떻게 하지? ==> 출력함수(printf)
뒤에 나오는 값에 대해 그 값은 이런 자료형이니까 이렇게 뽑아줘. 라고 하려면==>서식지정자(%d,,,etc)
이 파일을 컴퓨터가 알아먹게 통역해줘....==>전처리기 지시문(#include)
하나의 프로젝트에선 하나의 함수만 사용한다. 그리고 이 함수안에서 작업할 거임. ==> main함수
컴퓨터야 사용자가 값을 입력하거들랑 그 값을 내가 이미 이름붙인 이 메모리주소로 넣어주렴.==>&변수명
잠깐 이 코드는 무효로 할게요.==> 주석
--------------------------------------------------------------------------------------------------------------------------------------------------------------
이번엔 반복문이 주요키워드이다.
반목문 그리고 증감연산자에 대해 다루고 그걸루다가 피라미드 만들기를 할것이다.
우선 반복문........
예를 들어보자.....
10번 hello world를 출력하라는 지시를 받았다고 치자.
어려운 일은 아니다.
직접 10번 칠 수도 있고
한번 치고 복붙을 할수도 있다.
아마 대게 후자의 방법으로 할 것이다.
근데 200번 아니 1000번 하라고 하면?
이건 좀 아닌데?
싶은 생각이 들것이다.
복붙을 해도 엄청나게 성가신 작업이다.
컴퓨터는 인간의 수고를 덜기 위해 탄생한 존재이기에 이런 것도 역시 컴퓨터에게 떠넘기는 것이 맞다.
"컴퓨터야 이 문장 200번 출력해줘."
이 한줄로 앞의 지시사항을 처리해낼 수 있다면 얼마나 좋을까?
그것이 실제로 가능하다.
이를 위해선 반복문과 증감연산자를 알아야 한다.
int main(void)
{
for (int h = 0; h <= 9; h++)
{
printf("halo world%d\n",h);
}
return 0;
}
이렇게 하면
요렇게 된다. 아 물론 캡쳐엔 짤렸지만 당연히 #include랑 <stdio.h>는 해야 한다.
반복문은 for문 while문 do while문 이렇게 3가지의 종류가 있다.
그 중 for문에 대해 위에서 보여준 사례로서 보여줬다.
while문은
#include <stdio.h>
int main(void)
{
int i = 1;
while (i <= 10);
printf("halo world%d\n", i++);
return 0;
}
이렇게 쓴다. 출력하면 for문과 같다.
그렇다면 for문과 while문의 차이는 무엇일까?
for든 while이든 작동원리는 같다.
말하자면
1 변수를 선언
2 변수에 대한 조건 설정
3 조건을 충족하는 동안 변수가 증가 또는 감소'
4 조건을 충족하는 동안 뭐할건지
이렇게 반복문 세팅이 끝났으면
5 조건을 확인함
6 변수가 조건에 맞으면 증감ㄱㄱ 조건에 맞지 않으면 반복문 탈출
7 함수실행
8 다시 조건확인 조건에 맞으면 증감ㄱㄱ 조건에 맞지 않으면 반복문 탈출
9 다시 함수 실행
정리하면 for는 1,2,3번을 소괄호에 4번을 중괄호에
while은 1번은 밖에 2번은 소괄호에 3번 4번은 중괄호에
근데 do while이란 것이 또 있다. 이건 무엇일까?
간단하다 do먼저 하고 while이 그 다음이란 뜻이다.
기존 while에선 4번이 중괄호에 있었다.while+()가 먼저 오고 그 다음 중괄호에 있었다.
그러나 do while에선 달라진다.
밖에다가 변수 선언하고 do하고 중괄호에다가 4번 3번 먼저 하고 while하고 ()에다가 2번을 한다.
이제 대망의 하이라이트 이중반복문이다.
for안에 for가 하나 더 있는 것이다.
이중반복문은 이미 가장 먼저 올린 피라미드모양의 산이 캡쳐된 사진 밑에 있는 내용이다.
이중반복문은 구구단과 피라미드 만들기로 학습을 하였다.
2*1
2*2
2*3
.
.
.
3*1
3*2
3*3
.
.
.
구구단을 출력하라고 지시를 받았다. 직접 다 타이핑을 할 것인가?
2단부터 9단까지..... 다?
그러긴 싫다......
그래서 이중반복문으로 컴퓨터에게 떠넘기는 것이다.
구구단이든 피라미드이든 본질적으로 원리는 비슷하다.
자
위의 구구단은 2단 3단 4단 5단 해서 9단까지 일단 크게 8번의 큰 반복이 필요하다.
그리고 그 각 단안에는 곱하기1부터 곱하기9까지 9번의 작은 반복이 필요하다.
큰 반복을 위한 반복문 안에
작은 반복을 위한 반복문을 작성하면 된다.
#include <stdio.h>
int main(void)
{
for (int i = 2; i <= 9; i++)
{
for (int y = 1; y <= 9; y++)
{
printf("%dX%d=%d\n", i, y, i * y);
}
printf("\n");
}
return 0;
}
이 코드를 예시로 삼으면
큰 반복에 변수의 시작은 2이다. (2단부터 시작하니까) 그리고 9단까지 8번의 큰 반복을 해야 하기에
변수의 시작은 2 그리고 9보다 작거나 같을때까지 반복을 설정해준다.
그 안에 들어있는 작은 반복의 경우
시작은 1이다. 그리고 9까지 해야 한다.
고로 변수의 시작은 1 그리고 변수가 9보다 작거나 같을때까지 반복을 설정해준다.
이번엔 피라미드를 예로 들어보자.
큰 반복으로 우선 피라미드의 각 층을 만들어준다. 입력함수로 사용자로부터 값을 입력받고 그 값만큼 우선 층을 만든다.
큰 반복의 변수는 0으로 시작해 사용자가 설정한 변숫값까지 반복이다.
그리고 그 큰 반복으로 층이 만들어졌다면 각 층 안에서 몇개씩 들어갈지가 작은 반복으로 설정된다.
#include <stdio.h>
int main(void)
{
for (int i = 0; i < 5; i++)
{
for (int c = 0; c <= i; c++)
{printf("$");}
printf("\n");
}
return 0;
}
이건
이런 모양이 된다.
이것도 큰 반복과 작은 반복이다.
큰 반복으로 층을 만들어주고
각 층에 몇개씩 들어갈 지를 설정해주는 작업이다.
맨 밑부터 1층이라 쳤을때
5층엔 하나
4층엔 두개
3층엔 세개
4층엔 네개
5층엔 다섯개
이렇게 들어가게 해야 한다.
이를 컴퓨터가 알아먹게 말하면
5층엔 0
4층엔 0 1
3층엔 0 1 2
4층엔 0 1 2 3
5층엔 0 1 2 3 4
이게 무슨 말이냐면은
컴퓨터는 내가 변수에 걸어준 조건에 부합하는 동안은 반복을 실행한다
고로 5층엔 1번 수행하니까
1번 반복을 해야 하고
4층엔 2번 수행하니까
2번 반복해야 한다.
작은 반복의 시작값이 0이라면
5층은 0보다 작거나 같을때 >0
4층은 1보다 작거나 같을때 >0 1
즉 작은반복의 변수는 이 변수값일때는 이것보다 작거나 같게
이 변수값일때는 이것보다 작거나 같게
이래야 한다.
작은 반복의 변수야 당연히 변할 터이지만 문제는 이것에 해당하는 것도 계속 변하는 무언가여야 한다.
변하고 있는 거?
바로 위의 큰 반복을 보자......
큰 반복의 변수는 0에서 시작해 4까지 그 변수의 변숫값이 변하고 있다. 이걸 활용하자.
작은반복의 변수가 c
큰 반복의 변수가 i
i가 0일때 5층일때 c는 0 0보다 작거나 같음
i가 1일때 4층일때 c는 0 1 1보다 작거나 같음
i가 2일때 3층일때 c는 01 2 2보다 작거나 같음
아 발견하였다.
c가 i보다 작거나 같으면 된다.
이를 표현하면
for(int c=0; c<=i; c++) 이러고 그 작은 반복이 실행되는 동안 특수문자를 찍어주는 함수를 실행하면 된다.
다만 그냥 하면 각 층간의 구분이 안되니
층을 만들어준 큰 반복에다가 각 층 별로 줄바꿈을 출력하는 함수를 넣어주면
위와 같이 삼각형을 출력할 수 있다.
또 다른 삼각형을 만들어보자.
#include <stdio.h>
int main(void)
{
for (int v = 0; v < 5; v++)
{
for (int b = v; b <= 4; b++)
{
printf("#");
}
for (int e = 0; e <= v; e++)
{
printf("*");
}
printf("\n");
}
return 0;
}
이걸 만드는 과정은 이걸 생각하면 된다.
컴퓨터의 타이핑은 좌에서 우지 우에서 좌가 아니다.
고로 자연스럽게 좌에서 우로 하나씩 늘어나는 앞의 삼각형과 달리 이 삼각형은 자연스럽게 만들 수는 없다.
그래서 생각해낸 것이 공백을 만들어주자. 자연스럽게 이 삼각형을 만들 수는 없어도
앞에 자리가 있다면 별은 뒤로 밀릴 것이다.
그 자리를 만들어주고 그 자리에 공백만 넣어주면 위의 삼각형을 만들 수 있다. 참고로 위의 삼각형은 공백 대신 #을 넣었다. 이 #을 공백으로 바꿔주면 된다.
그럼 3개의 반복문이 필요하다.
우선 층을 만들어줄 큰 반복문
그리고 그 안에 각 층마다
*을 찍을 작은 반복문
#을 찍어줄 작은 반복문
#반복문은 위의 거랑 똑같지만 차이가 있다면
앞에 자리를 만들어주기 위해서 #반복문으로 하나의 역삼각형을 만들어준다는 뜻이다.
갈수록 #이 줄어야 한다.
5층엔 #이 4개 #이 4보다 작거나 같으면 된다
4층엔 #이 3개 #이 3보다 작거나 같으면 된다
3층엔 #이 2개 #이 2보다 작거나 같으면 된다.
2층엔 #이 1개 #이 1보다 작거나 같으면 된다.
1층엔 #이 0개 #이 0보다 작거나 같으면 된다.
이럴땐 변수의 시작을 어디서 시작해서 어디까지 할건지를 생각하면 편하다.
#을 만들기 위한 반복문과
*을 만들기 위한 반복문을 살펴보자.
변수의 시작이 정해져있거나 아니면 어디까지 할건지에 관한 부분이 정해져 있다.
기본적인 구조가 둘 중 하나의 조건은 정해져있고 하나의 조건에 따라 변화가 생긴다.
0으로 시작해 어디까지 할건지에 따라 1개 2개 3개 이렇게 가거나
어디서 시작하는 지에 따라 4보다 작거나 같은 범위에서 4개 3개 2개 이렇게 가거나
두개 다 두가지 조건중 하나를 큰 변수의 변수를 이용하여 변화를 하고 있고
다만 #반복문의 경우 큰 변수의 변수가 0으로 시작하는데 0보다 작거나 같은 경우로 가면
5층에 시작을 4개부터 시작할 수가 없어서
0으로 시작하고 01234 가려면 4보다 작거나 같아야 한다
건드릴 부분은 시작부분에서 건드렸으니 어디까지 할건지에 관한 부분은 4로 고정시키면
0으로 시작할때 01234
1로 시작할 때 1234
2로 시작할 때 234
3으로 시작할 34
이렇게 만들 수 있다.
이렇게 만든 것이 *과 #이 혼합된 위의 삼각형이다.