c언어 반복문 '*' (삼각형,피라미드, 다이아몬드) 출력 예제

c언어를 공부하게되면 반복문을 배울때쯤 되면 배우는 보편적인 필수 코스가 있습니다. 그것은 바로 구구단과 '*' 예제입니다. 구구단 같은 경우에는 직접 실습을 하면서 배우는 경우가 많고 '*' 예제는 초반에 아주 쉬운 '*' 예제를 학습하고 나중에 뒷풀이 문제에서는 "'*'을 활용해 피라미드를 만들어보시오!" 나 "'*'을 활용해 다이아몬드를 만들어 보시오!" 이런식의 문제를 많이 보게됩니다.. c언어 뿐만 아니라 다른 프로그래밍 책에서도 비슷한것을 볼 수 있습니다. 

그래서 그런지 반복문의 기초를 배웠다면 꼭 숙제나 과제식으로 받아보는 문제가 됩니다.. 

1. 삼각형 '*'을 출력하는 예제 

첫번째 줄에는 별이 1개, 두번째 줄에는 별이 2개 ~~~ "별이 ~ 5개!" 가 출력되는 프로그램을 먼저 만들어보겠습니다. 우선 첫번째 줄에 별이 하나 있고 두번째줄에는 별이 2개 있는 프로그램은 어떻게 만들 수 있을까?? 

 

바로 반복문을 1회 돌때마다 별을 찍어주는 횟수를 증가시켜 주면됩니다. 어떻게 가능한가?? 

바로 a값의 반복문 속에 a값보다 작거나 같을동안 반복하는 반복문을 하나 더 만들어 주면 됩니다.  두번째 for문을 보면 b=0; b<=a; b++) b의 값이 a값보다 작거나 같으면 반복문을 수행하게 되는데 a값이 0일때 b값의 0과 동일 두번째 for문을 한바퀴를 돌고  첫번째 반복문의 2회차에는 두번째 for문은 b값이 a값보다 작거나 같을때 까지 2회 동작을 하게되어 '*'을 두번찍고 빠져나오게 됩니다. 

 

#include <stdio.h>


int main(void)
{
	int a;
	int b;

	for (a = 0; a < 5; a++) 
	{
		for (b = 0; b <= a; b++) {
			printf("*");
		}
		printf("\n");
	}


	return 0;
}

 

2. '*'을 이용한 피라마드 만들기 

5 X 5칸에 '*' 피라미드를 찍으려면 어떻게 해야할까? 처음 피라미드를 만들어야 되는 공식을 만들려고 하는데 감이 전혀 안잡히나요?? 그렇다면 쪼개보겠습니다.

 

우선 공백만을 쪼개어 보겠습니다. 

	for (a = 0; a < 5; a++) 
	{
		for (b=a; b <= 5-1; b++) {
			printf(" ");
		}
    } 

공백의 규칙은 1번 줄에서는 4개, 2번줄에서는 3개, 3번 줄에서는 2개, 4번 줄에서는 1개의 공백을 출력하는 반복적인 규칙을 사용하고 있습니다. 1회 돌때마다 공백의 개수를 하나씩 감소시켜주는 반복문을 먼저 생성해줍니다. 

		for (c = 0; c <=(a*2); c++) {
			printf("*");
		}

*의 출력 규칙은 어떻게 생겼나요?? 별의 출력 규칙은 1, 3, 5, 7, 9 의 갯수로 출력하고 있습니다. 1회에는 1개를 2회에는 3개를 3회에는 5개를 출력할려면 어떻게 해야할까? 바로 1회차에 도는 a값에 2를 곱해주면 됩니다. 1회차 0*0 = 0 반복문 1회 실행 , 2회차 1*2 = 2 반복문 3회 실행 -> 쭉쭉쭉 반복문을 증가시켜줍니다. 

int main(void)
{
	int a;
	int b;
	int c;

	for (a = 0; a < 5; a++) 
	{
		for (b=a; b <= 5-1; b++) {
			printf(" ");
		}
		for (c = 0; c <=(a*2); c++) {
			printf("*");
		}
		printf("\n");
	}


	return 0;
}

전체 소스를 보면 한개의 for문은 공백을 또다른 for문은 '*'을 출력하는 반복문을 만들고 이런 반복문이 끝나면 줄바꿈을하고 다시 전체 반복문을 한번더 수행 하게 됩니다. 

 

3. 입력한 개수만큼 '*'을 이용한 피라마드 만들기 

그러면 이제 피라미드를 출력해봤으니 입력에 따라서 피라미드의 층수를 증가시키는 프로그램을 만들어 보겠습니다. scanf 함수를 사용해서 입력받은 층 수만큼 피라미드를 만들어줘야하는데? 어디를 수정해 줘야 할까?? 

5줄의 피라미드를 만들었을때는 5 보다 작을 동안 공백은 5-1 보다 작을동안 동작하도록 설정했었습니다.  이 부분을 입력받은 숫자가 들어있는 변수로 변경해주면 끝~ 아주 간단한 방법으로 정해진 개수의 피라미드 층에서 입력받은 만큼 출력하는 피라미드를 만들 수 있게 되는 것입니다. 

 

4. "*"을 활용한 다이아몬드 만들기 

위에서 피라미드를 만들기 위한 반복문의 규칙성에 대해서 알아봤습니다. 피리미드의 규칙은 공백은 -1씩 감소 별은 2배 -1 씩 증가 하는 규칙성을 가지고 있었습니다. 그렇다면 다이아몬드의 규칙은?? 처음 위의 피라미드 공식처럼 공백을 -1씩 감소 별은 2배 -1씩 증가를 출력하고 다시 뒤집어 공백을 +1씩 별은 2배-1씩 감소 시켜주면 되겠죠?? 한번 거꾸로 뒤집어봅시다. 

 

for (a = 5; a > 0; a--)
	{
		for (b = a; b <= 5; b++) {
			printf(" ");
		}
    }

만약 5줄의 피라미드를 만들었다면 a의 값이 5까지 모두 회전한 상태에서 끝나게 됩니다. 그렇다면 역으로 5가 0이 될때까지 반복하는 소스를 만들면 됩니다. a값은 5 = a가 0보다 클 동안 반복문을 작동시켜주면 됩니다. 위의 피라미드를 만들때와 소스는 비슷합니다. 반복문의 a가 5부터 시작해 감소되기 때문에 공백을 출력하는 반복문의 b값이 5 -> 4 -> 3-> 2 -> 1 순으로 줄어들게 되어 반복하는 횟수가 1회씩 증가하게 되는 것입니다. 

		for (c = 0; c <= ((a-1) * 2); c++) {
			printf("*");
		}

별의 출력은 a값에 1을 빼고난 값에 곱하기 2를 해준 값보다 c값이 작은동안 반복하게 해줍니다. 첫 조건식의 a값이 줄어들기 때문에 *을 출력하는 횟수또한 줄어들게됩니다. 

 

#include <stdio.h>


int main(void)
{
	int a;
	int b;
	int c;


	for (a = 0; a < 5; a++) 
	{
		for (b=a; b < 5; b++) {
			printf(" ");
		}
		for (c = 0; c <=(a*2); c++) {
			printf("*");
		}
		printf("\n");
	}

	for (a = 5; a > 0; a--)
	{
		for (b = a; b <= 5; b++) {
			printf(" ");
		}

		for (c = 0; c <= ((a-1) * 2); c++) {
			printf("*");
		}

		printf("\n");
	}



	return 0;
}

 

해당 소스를 가지고 출력을 해본 결과로 보면 출력의 5번,6번 줄에 똑같은 수의 별이 생겨 피라미드 두개를 붙여놨을 뿐 다이아 몬드처럼 옆구리가 뾰족하게 보여지지는 않습니다. 이렇때는 어떻게 해야될까?? 

 

	for (a = 5-1; a > 0; a--)
	{
		for (b = a; b <= 5; b++) {
			printf(" ");
		}

		for (c = 0; c <= ((a-1) * 2); c++) {
			printf("*");
		}

		printf("\n");
	}

이건  두번째 역 피라미드를 생성할때 a값을 위의 피라미드 반복횟수 보다 -1 낮춰 반복문을 설정해주면 됩니다. 

 

5. 정수를 입력받아 입력받은 개수만큼 다이아몬드 만들기

위에 소스를 가지고 정수를 입력받아 다이아몬드 크기를 변경하는 프로그램을 만들어보자!  4번 다이아 몬드까지 모두 만들었다면 3번과 결합해 정수를 입력받아 다이아몬드를 만들어보시면 좋습니다. 아래는 입력받은 정수를 가지고 다이아몬드를 만드는 소스 입니다.  소스코드를 보지않고 한번 만들어보시는 것을 추천드립니다.

 

int main(void)
{
	int a;
	int b;
	int c;
	int num;
	printf("다이아몬드의 크기입력:");
	scanf("%d", &num);

	for (a = 0; a < num; a++)    //숫자 5를 num 변수로 변경
	{
		for (b=a; b < num; b++) { //숫자 5를 num 변수로 변경
			printf(" ");
		}
		for (c = 0; c <=(a*2); c++) {
			printf("*");
		}
		printf("\n");
	}

	for (a = num -1; a > 0; a--) //숫자 5를 num-1 변수로 변경
	{
		for (b = a; b <= num; b++) { //숫자 5를 num 변수로 변경
			printf(" ");
		}

		for (c = 0; c <= ((a-1) * 2); c++) {
			printf("*");
		}

		printf("\n");
	}



	return 0;
}

 

댓글(5)

  • 2020.06.04 20:29 신고

    핡!
    학교 입학하고 C언어 건너뛰고 바로 C++하면서 첫날 다이아몬드 만들라고 한 조교가 생각나네요 :D
    잘 읽었습니다!

    • 2020.06.04 22:55 신고

      그렇다면 대학교에 왔으니 기본기는 할 줄 안다고 가정하고 넘어간 것 같네요 ㅎㅎ
      ("알아서 그 수준까지는 만들어")의 느낌.. 저는 고등학교때 포인터와 알고리즘까지 배워서 대학가서는 띵까띵까 했네요 ㅎㅎ

    • 2020.06.04 23:02 신고

      포인터를 고등학교떄..부럽네요 ㅎ

  • 2020.12.28 15:05

    비밀댓글입니다

    • 2021.01.01 00:30 신고

      답이 늦었네요 단순 * - > *** 로 본다면 별을 증가하는 반복문을 1 - > 3으로 2씩 증가 하는 반복문을 생각해보시기 바랍니다.
      반복문 (){
      반복문(){
      별을 찍는 반복문
      }
      줄바꿈
      }
      식으로 한번 생각해보시기 바랍니다~^^

Designed by JB FACTORY