27.0 for 반복문으로 Hello, world! 100번 출력하기
Hello,world! 를 100번 출력하려면 어떻게 해야할까?
가장 쉬운 방법은 printf를 100번 쓰는 것이나, 별로 효율적이지 못하다.
따라서 이런 반복적인 코드를 획기적으로 줄여주는 반복문을 작성하게 되는데, 아래는 for문의 코드 작성 방법이다.
for 에 초기식을 정해주고 조건식과 변화식을 차례대로 선언하여 코드를 시작해주고
괄호에 반복할 코드를 정해준다. 만약 조건에 맞다면 초기식------>
조건식->코드->변화식->조건식 순으로 계속 반복되게 할 수 있다.
**for 반복문
for를 사용하여 100번 출력하는 코드이다.
for를 써주고 괄호안에 초기식으로 int i=0이라고 변수를 선언해준다. 그리고 조건식으로 i<100 으로 작성하여
i가 100보다 작다면 실행하고 크다면 종료하게 한다.
그리고 변화식을 i++ 로 작성하여 루프가 한바퀴 돌 때마다 i의 값을 1씩 올려준다. 따라서
i= 0부터 99까지, 100번 실행하여 hello, world! 100번 출력된다.
이번엔 조금 변형해서 루프를 실행한 횟수만큼 i를 출력하는 코드이다.
for문을 10번 반복하여 i에 10이라는 값을 넣고 for문이 끝나면 다음코드인 printf로 i의 갯수를 출력하는 것이다.
i는 보통 0으로 시작하나, 정해진 수만큼만 실행하면 됨으로 다른수로 지정해도 상관없다. 예를 들자면
i를 1로 지정해준 대신 100번 실행하기위해 99까지였던 제한을 100도 되도록 조건을 바꿔주는 방법이있다.
**감소
또 다른 예로 i를 100으로 지정해 증가대신 감소를 시키는 방법도 있다.
i++를 i--로 바꾸면서 점점 감소하는 코드로 바뀌게되는데, 100번 실행 하려면 0이던 i 를 100으로 지정하고, i>0으로 바꿔 i가 0보다 작으면 끝나게 만들었다.
**세미콜론 X
for문은 if 와 마찬가지로 ;를 쓰면 안된다. 이유는 for문이 끝나지 않았는데 끝났다고 인식하게 되기 때문이다.
**괄호 생략
if문은 하위 코드에 괄호를 씌워 어디까지인지 구분하게 되는데 짧은 코드는 생략해도 자동으로 구분한다.
for문도 마찬가지로 짧은코드에는 괄호를 쓰지 않아도 된다.
****입력한 만큼 반복하기
아래코드는 입력한 만큼 반복되게 하는 것으로 i<100 의 부분에 변수를 지정하여 입력하면 된다.
**두개의 변수 지정
이번엔 하나의 변수가 아닌 두개의 변수로 지정하는 방법이다.
콤마로 구분하고 나머지는 동일하다.
j += 2 : j 에 2를 더해줌
**무한루프
for문의 초기값과 조건식 , 변화식을 모두 생략하여 작성할경우 무한정으로 코드가 실행된다.
취소하는 방법은 ctrl + c 를 통해 취소할 수 있다.
**연습문제
조건식만 쓰면 되는데 2 5, 4 4 , 8 3 , 16 2 , 32 1 의 규칙은 왼쪽은 2씩 곱하고 오른쪽은 -1씩 줄어든다.
왼쪽을 i로 오른쪽을 j 로 변수를 두개 선언하여 작성하면 된다.
(int i=1 , int j=5 ; i<64 , j>0 ; i*=2 , i--)
**심사문제
심사문제는 아래와 같다.
char 문자형은 보통 아스키코드로 인식되어 연산이 가능하다. 따라서 a+1 을 하게되면 a의 아스키코드인 97에 1을 더한 값인 98, 즉 b가 오게된다. for를 이용해서 이 문제를 풀면 되는데
입력한 함수부터 이므로 초기식을 i=al 로 지정해 입력한 부분부터 시작하게 한다.
i도 char로 한 이유는 int로 할 경우 프린트를 했을때 아스키 코드 값이 나오기 때문이다.
조건식은 z 까지 출력인데 문자이므로 ''를 붙여주었다.
마지막 변화식은 하나씩 증가해야하므로 +=를 통해 1을 증가 시켜 주었는데 ++을 써도 가능하다.
& unit.31
**중첩 반복문
for를 이용하면 다양한 코드를 작성할 수 있는데,
프린트와 함꼐 사용하여 이런 계단형을 출력할 수도 있다.
만드는 방법은 생각보다 간단한데, 쉽게 생각하자면
하나의 for는 별을 출력하는 역할이고, 다른 하나는 엔터의 역할을 한다고 생각하면 된다.
예를들어 서로다른 값을 반복해서 출력하는 문장을 만들때의 코드이다.
먼저 안쪽 for 문의 j값 출력을 5번 반복하고, 바깥쪽 for의 i 출력을 마치면, 다시 위로 올라가 j를 재출력 하게된다.
결과는
이런식으로 나오게 된다.
이런 이중 for문은 좌표처리 등의 일에 사용된다.
**사각형 별 출력
이전의 이중 반복문을 이용하여 사각형을 출력해보자
안쪽 for문이 별을 5개 출력하는 역할, 바깥쪽 for문이 줄바꿈을 해주고 안쪽 for문을 다시 실행시켜주는 역할을 한다.
여기서는 가로 세로 모두 5로 지정하였다.
결과로는 이런 모양이 나오게 된다.
**계단형으로 출력하기
이번에는 계단형으로 출력해보자.
이전과는 다르게 점점 별의 갯수가 늘어나게 작성하면 된다.
이 방법은 조금 더 어려운데, if를 넣어주어서 안쪽 for문이 정해진 별만 출력하게 해야 하기 때문이다.
i가 0 일때는 별 한번 , i 가 1일때는 별 두번... 이걸 코드로 변환하면
if ( j<=i ) 이다
i=0일때 j 는 1번 반복이어야 하기 때문에 j<=i 로 작성해 주었다.
== 가 아닌 <= 인 이유는 첫번째 시작은 문제없어도
다음 줄에서는 i가 1이고 j는 0부터 다시 시작이기 때문에 계단형이 아닌 대각선이 출력된다.
**대각선으로 별 출력하기
대각선은 이전 계단형 출력에서 언급한 == 를 사용하면 대각선이 출력된다.
**연습문제
이전에 언급했던 계단형을 거꾸로 작성해준다.
if ( j<i )
printf( " " );
else
printf( " * " );
**심사문제
삼각형으로 별을 출력하는 문제로
위에서 언급한 부분을 모두 사용한다.
삼각형을 반으로 나눠서 출력하는데 높이를 나타내는 변수 height를 받고, if를 활용해 별을 출력하는 for 문이 height-1 번 반복하여 공백을 출력하고, 아닐때는 별을 출력하도록 하면 된다. 그리고 남은 반쪽은 계단형 출력과 같이 작성해 주면 된다. -1을 안해주면 첫 출력시 빈칸이 하나 더 나와서 밀려서 출력됨으로 -1을 붙여주었다.
공백을 출력하고 , 아닐때에는 별을 출력해주고.. 한번 반복할때마다 i-- 를 해서 빈칸의 출력개수를 줄여줍니다.
그리고 반대쪽의 계단형을 출력해주면 된다. 이때 height를 그냥 써버리면 처음 위에서 출력한 첫번째 별과 겹치기에 height-1을 해 주어야 한다.
출력 결과는 이렇다.
이번 문제를 풀면서 걸리는 점이나 까먹었던점.
--
for (int j = h-1; j >= 0; j--)
{
if (j > i)
printf(" ");
else
printf("*");
이 부분에서 if를 사용해 역계단형의 반대를 출력하는 것에서 j 와 i 사이의 부등호 사용하는 부분이 헷갈렸다.
-- 사실 내가 작성한 코드는
이것인데 두번째 for 문에서 h가 아닌 h-1을 작성하지 않아서 한칸 밀려 작성된것을 몰랐다.
세번째 for 문에서 코딩도장은 i 대신 height-1을 작성하고 , if문을 for 문 안에 하나 더 작성해 주었는데
출력에는 둘 다 문제가 없었다.
i를 사용하는 위의 코드가 if문이 추가적으로 더 사용되지 않으니 더 효과적이지 않을까 소심하게 말해본다...
'멘토링 (codeup & 코딩도장 & 기타 문제)' 카테고리의 다른 글
멘토링 (codeup 1089~1091 , 1093~1095) + 제곱수 문제 (0) | 2021.05.03 |
---|---|
멘토링 (codeup c언어 기초 100제) 1079~1081번 & 코딩도장) (0) | 2021.04.30 |
c언어 멘토링 04 .27 (0) | 2021.04.27 |
멘토링(codeup c언어 기초 100제) 1074~1077번 + 추가문제 (0) | 2021.04.27 |
멘토링(codeup c언어 기초 100제) 1010~1017, 1051~1052, 1063~1064, 1068~1070번 (0) | 2021.04.23 |