별찍기
예제로 도형출력
지난시간 배운 예제를 가지고, 직각삼각형을 출력할 수 있을까? 반복문을 배우면 거의 반드시 들어가는 문제로, 많은 분들이 배우실 때 어려움을 겪는 문제다. 여기서 논리를 파악하자면, 가로를 내부 반복문이고, x축이라고 본다면, 세로는 외부 반복문이고, y축이 된다. 이때 x와 y의 수의 차이에 따라서 ‘개행’이 되냐 아니냐에 차이인데, 이정도가 도형을 출력하는 논리다.
이 도형 출력의 코드는 엄청 쉽다. 단지, 내부 반복문에서 for(x = 0; x < 5; x++)를 for(x = 0; x <= y; x++)로 x <= y로 바꿔주면 된다.
x가 1이 될 때 y가 1이 되고, 2가 되면 개행이 되는 포인트가 되며, 이게 반복 되므로 결국 x는 y보다 같거나 작게 될 수밖에 없기 때문이다. 그러므로, 맨 처음 x가 0이므로 x <= y가 성립해서, “*\t” 출력, ++x로 x가 1이 되므로 다음 반복에는 x <= y에서 1 <= 0 이 되므로 반복문이 끝나고 putchar('\n');이 된다. 그리고 외부 반복문에서, ++y로 y가 1이 돼서 다음 내부 반복문은 2번 출력이 된다. 그리고 다시 개행이 되고, 외부 반복문에서 ++y로 y가 2가 되는....... 이게 반복돼서 결국은 *로 직각삼각형 모양의 도형 꼴을 출력할 수 있게 된다. 물론 여기서 y < 8을 하면 y축으로 8행까지 직각삼각형 꼴로 출력되고, (y < 상수)의 조건식을 건들어서 원하는 크기의 도형을 출력하는 것까진 쉽게 연계 할 수 있을 것이다.
실제로 이정도 이해하면 중첩된 반복문을 이용해서 직각삼각형 도형을 출력할 수 있다. 하지만, 완벽하게 도형을 출력하기에는 해결해야 될 문제가 있다.
추가 문제
위의 예제는 * [개행] * * [개행] * * * [개행] ....... 으로 이어지는 직각삼각형 도형을 출력하는 코드다. 그러나 직각삼각형의 반대로 출력이 되게 하려면 어떻게 해야 될까? (빈칸) (빈칸) * [개행] (빈칸) * * [개행] * * * [개행] 같은 형식으로 오른쪽으로 밀려 쓰는 것 같은 모양으로 말이다. 영상에서 이정도 까지 소화할 수 있으면 비로소 도형을 제대로 출력할 수 있다고 생각해도 좋다고 했다. 그만큼 위보다 난이도가 좀 더 정교하고 어려운데, if문을 이용하는 것이 영상에서의 힌트다.
여기서 내가 쓴 코드는 이렇다.(마찬가지로 헤더파일, main함수 선언은 생략)
int x = 0, y = 0;
for(y = 0; y < 5; ++y) {
for(x= 0; x <= 5; ++x) {
if (x < y) putchar('\t');
else printf("*\t");
}
putchar('\n'); }