도솔비 2019. 7. 8. 15:15

예제로 도형출력

지난시간 배운 예제를 가지고, 직각삼각형을 출력할 수 있을까? 반복문을 배우면 거의 반드시 들어가는 문제로, 많은 분들이 배우실 때 어려움을 겪는 문제다. 여기서 논리를 파악하자면, 가로를 내부 반복문이고, x축이라고 본다면, 세로는 외부 반복문이고, y축이 된다. 이때 xy의 수의 차이에 따라서 개행이 되냐 아니냐에 차이인데, 이정도가 도형을 출력하는 논리다.

이 도형 출력의 코드는 엄청 쉽다. 단지, 내부 반복문에서 for(x = 0; x < 5; x++)for(x = 0; x <= y; x++)x <= y로 바꿔주면 된다.

x1이 될 때 y1이 되고, 2가 되면 개행이 되는 포인트가 되며, 이게 반복 되므로 결국 xy보다 같거나 작게 될 수밖에 없기 때문이다. 그러므로, 맨 처음 x0이므로 x <= y가 성립해서, “*\t” 출력, ++xx1이 되므로 다음 반복에는 x <= y에서 1 <= 0 이 되므로 반복문이 끝나고 putchar('\n');이 된다. 그리고 외부 반복문에서, ++yy1이 돼서 다음 내부 반복문은 2번 출력이 된다. 그리고 다시 개행이 되고, 외부 반복문에서 ++yy2가 되는....... 이게 반복돼서 결국은 *로 직각삼각형 모양의 도형 꼴을 출력할 수 있게 된다. 물론 여기서 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'); }