for문을 중첩해서 사용하면 2차원 평면을 다룰 수 있다.
for문 별찍을때 헷갈리지 않으려면
for(초기식; 조건식; 변화식)
이라는것을 꼭 상기하자.
사각형 별 출력하기
#include <stdio.h>
int main()
{
for (int i = 0; i < 5; i++) // 세로줄을 담당한다.
{
for (int j = 0; j < 5; j++) // 내용물을 담당한다.
{
printf("*");
}
printf("\n");
}
return 0;
}
컴파일한 화면을 보려면 아래 더보기를 눌러주세요.
외부 for문은 세로 줄을 담당한다. 그리고 내부 for문은 내용물(가로)을 담당한다.
외부 for문이 0부터 4까지 5번을 쭉 내려가는 것으로 짜여져 있으며.
내부 for문은 j가 0부터 4까지 하나씩 차면서 반복문이 되어 별이 5개가 차면 자동으로 다음으로 넘어가 개행된다.
이로써 사격형 별이 출력되었다.
계단 모양 출력하기
#include <stdio.h>
int main()
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j <= i; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
컴파일한 화면을 보려면 아래 더보기를 눌러주세요.
계단 모양 출력하기.
외부 for문은 역시 세로줄을 치느라 여념이 없으시다.
내부의 for문의 조건식이 약간 바뀌었다.
j <= i 이렇게 되어있을 것이다.
i는 최초에 0의 값을 가지고, j도 최초에 0의 값을 가지기 때문에 j는 i보다 작거나 같다가 되어야 한다..
일단 세로행의 숫자대로 계단이 찍히기 때문에 j는 i보다 작아야한다. 그래야 그때마다 for문을 탈출하여
계단식으로 찍을 수 있다.
반대편 계단 모양 출력하기
여기서는 스스로 조건을 붙여보았다.
입력한 만큼 계단식으로 출력할 수 있도록 고려해보았다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int h;
scanf("%d", &h);
for (int i = 0; i < h; i++)
{
for (int j = 0; j < h - i - 1; j++)
{
printf(" ");
}
for (int k = h - i; k <= h; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
컴파일한 화면을 보려면 아래 더보기를 눌러주세요.
1. 먼저 h라는 변수를 선언하고 입력받을 수 있게 만들어둔다.
2. for문의 세로 지지대를 세운다.
3. 이제 공백을 어떻게 구조할 것인가가 중요하다.
- 공식을 살펴본다. 나는 공책에 그려서 수열을 계산했다. 이게 편하다.
- 공백이 생기는 공식은 (h - i - 1) 이다. (모르겠으면 그려서 계산해보자.)
4. 계산이 끝났다면 공백을 채우는 for문을 작성해보자.
- j는 0부터 시작한다. 그리고 j가 h-i-1보다 작으면 for문이 계속 유지된다
- 루프가 돌때마다 j는 1씩 상승하며 공백이 하나 생긴다.
- (j < h-i-1)이 참일때까지 반복된다. 즉 j가 3일때까지만 해당 루프가 반복된다.
- 여기서는 0, 1, 2, 3 순으로 돌아가므로 결국 공백은 4개가 채워진다.
5. 이제는 별을 그려야 한다.
- 별 그리는 공식도 한번 그려본다.
- h가 5라고 가정해보자. 처음 루프에서는 i가 0이므로
- (h - i - 1)에서 공백이 다 그려졌으니, 공백을 제외한 남은 층은 (h - i)을 통해 구할 수 있다.
[[ i는 내부 for문이 다 돌때마다 1씩 증가하게 된다. ]]
- 그렇다면 변수 k를 하나 더 선언한다. 그 변수가 h - i 라면 h가 될 때까지 k를 1 증가시키면서
- *을 출력한다. 이제 k가 h까지 다 왔다면 자연스레 내부 for문을 모두 빠져나온다.
6. 내부 for문을 빠져나오며 외부 for문에서 개행을 하게된다.
역계단
이번엔 좀 힐링스럽다.
구현하기가 편했다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int h;
scanf("%d", &h);
for (int i = 0; i < h; i++)
{
for (int j = 0; j < h - i; j++)
{
printf("*");
}
printf("\n");
}
}
컴파일한 화면을 보려면 아래 더보기를 눌러주세요.
1. 변수 h를 선언하고 입력할 수 있게 함.
2. 입력된 변수 h에 맞게 세로축을 세움.
3. 별 갯수는 h - i 의 공식을 가지고 있는 바, 그대로 내부 for문을 구조화함.
4. 한 사이클이 돌면 개행시킴.
역계단 반대편
쉬울줄만 알았는데 생각보다 헤멨다.
그래도 해결하는 속도가 점점 빨라지네? ㅎㅎ
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int h;
scanf("%d", &h);
for (int i = 0; i < h; i++)
{
for (int j = 0; j < i; j++)
{
printf(" ");
}
for (int k = 0; k < h - i; k++)
{
printf("*");
}
printf("\n");
}
return 0;
}
컴파일한 화면을 보려면 아래 더보기를 눌러주세요.
1. 늘 하던대로 세로 기둥을 세워준다.
2. 공백이 먼저 나올 수 있게 코딩한다.
- i의 갯수대로 공백이 있으니, i를 기준으로 조건식을 짠다.
3. 공백이 채워졌다면 남은 칸은 *로 채워야 한다.
- 별이 찬 갯수는 높이 - 공백이다. 공백의 갯수는 i이다.
4. k가 h - i보다 커질때까지 *을 출력하는 for문이 진행되게 설계한다.
5. 개항하고 마무리 한다.
와 쉬운줄로만 알았는데 생각보다 머리를 쓴다.
이 단순한것도 머리를 쓰는데
다른 알고리즘은 어떨까?
그래도 다 정복할 마인드로 간다.
다음 포스팅은 피라미드, 역피라미드, 모래시계간다!!!!!!!
'C, C++' 카테고리의 다른 글
C언어 코딩도장(goto 사용하기) (0) | 2022.04.28 |
---|---|
[C언어] for문 별 찍기 2편 (0) | 2022.04.28 |
C언어 코딩도장(break, continue로 반복문 제어하기) (0) | 2022.04.27 |
C언어 코딩도장(do while 반복문으로 최소 한번은 실행하기) (0) | 2022.04.27 |
C언어 코딩도장(while 반복문) (0) | 2022.04.27 |