본문 바로가기

C++ 공부

C++ 숙제 (다이아몬드 모양으로 별 찍기)

사용자로부터 정수를 입력받아, 해당 크기에 맞는 다이아몬드 모양을 *로 출력하는 프로그램을 작성하시오.

예시


실습

방법 1. for문 하나로 구현하기

숙제 내용을 보고 먼저 조건식을 생각해내기 위해 메모장에 어떻게 식을 짜야 공백과 별이 알맞게 출력될지 생각해봤다.

a = 4일 때, (a는 사용자에게 입력받는 다이아몬드의 크기, j는 공백, k는 별)
i = 1 / j = 1 2 3 / k = 1
i = 2 / j = 1 2 / k = 1 2 3
i = 3 / j = 1 / k = 1 2 3 4 5
i = 4 / j = / k = 1 2 3 4 5 6 7
i = 5 / j = 1 / k = 1 2 3 4 5
i = 6 / j = 1 2 / k = 1 2 3
i = 7 / j = 1 2 3 / k = 1

#include <iostream>

using namespace std;

int main()
{
   int a = 0 , i, j, k;

   cout << "다이아몬드의 크기 : ";
   cin >> a;

   for (i = 0; i < (a * 2) - 1; i++) // 다이아몬드의 높이(크기)
   {
      for (j = 1; j <= a - (i+1); j++)
      {
         cout << "-";
      }
      for (k = 1; k <= (i+1) * 2 - 1; k++)
      {
         cout << "*";
      }

      cout << endl;
   }

   return 0;
}

 

1. 다이아몬드의 크기를 정해줄 변수 a와 for문에서 사용할 변수 i, j, k를 선언함.

int a = 0, i, j, k;

 

2. 다이아몬드의 크기를 사용자의 입력을 받음.

cin >> a

 

3. for문을 사용하여 i의 초기값 0, 실행 조건을 i < a * 2 - 1, 사후 동작을 i++로 하여 i 값이 1씩 늘어남.

for(i=0 ; i < (a*2)-1 ; i++)

{

}

 

4. 다이아몬드의 크기는 바깥 for문으로 정해졌고 공백과 별을 출력하는 for문 2개를 생성해야 하는데 시작이 공백으로 시작하기 때문에 공백을 출력하는 for문에 j의 초기값 1, 실행 조건을 j <= a - (i+1), 사후 동작을 j++로 작성함.("-"는 공백으로 바꿀예정)

for (j = 1; j <= a - (i+1); j++)
{
cout << "-";
}

 

5. 공백 출력이 끝나면 별을 출력하도록 공백 출력하는 for문의 밖에 for문을 하나 더 작성하여 k의 초기값 1, 실행 조건을 k <= (i+1) * 2 - 1; k++로 작성함.

for (k = 1; k <= (i+1) * 2 - 1; k++)
{
cout << "*";
}

 

6. 별까지 출력이 끝나면 줄바꿈을 함.

cout << endl;

 

위 코드로 실행을 하면 아래와 같은 결과가 나온다.

 

방법 1. 결과(상단부만 성공)


방법2. for문 2개 사용하여 다이아몬드의 상단부, 하단부로 나누어서 구현하기

하나의 for문으로 다이아몬드를 완성하고 싶었지만 다이아몬드의 크기와 위에서부터 중심까지는 출력이 원하는대로 되지만 아래부분이 되지 않았다.

그래서 바깥의 큰 for문을 2개로 나누어서 하나는 다이아몬드의 위부터 중심부분까지 출력, 다른 for문은 다이아몬드의 아래부분 출력 부분으로 나누면 될것 같아서 생각을 했다.

#include <iostream>

using namespace std;

int main()
{
	int a = 0, i, j, k;

	cout << "다이아몬드의 크기 : ";
	cin >> a;

	for (i = 0; i < a; i++) // 다이아몬드의 위~중심 높이
	{
		for (j = 1; j <= a - (i+1); j++) // 다이아몬드의 위~중심 공백 출력
		{
			cout << " ";
		}
		for (k = 1; k <= (i+1) * 2 - 1; k++) // 다이아몬드의 위~중심 별 출력
		{
			cout << "*";
		}

		cout << endl; // 별까지 출력 후 줄바꿈
	}
	for (i = 1; i <= a - 1; i++ ) // 다이아몬드의 아래 높이
	{
		for (j = 1; j <= i; j++) // 다이아몬드의 아래 공백 출력
		{
			cout << " ";
		}
		for (k = 1; k <= (a * 2) - (i * 2 + 1) ; k++) // 다이아몬드의 아래 별 출력
		{
			cout << "*";
		}

		cout << endl; // 별까지 출력 후 줄바꿈
	}

	return 0;
}

처음 코드에서 수정한 부분

1. 다이아몬드의 전체 높이를 구하는 조건식을 위~중심까지의 높이를 구하는 조건식으로 수정함.

for(i=0 ; i < (a*2)-1 ; i++) => for(i=0 ; i < a ; i++)

 

2. 다이아몬드의 아래 부분을 출력하기 위해 for문을 하나 추가하고 for문에 어떻게 조건을 주어야 알맞게 공백과 별을 출력할지 맨 처음 메모장에 적은 내용을 보고 생각을 함.

 

a가 4일 때,

i = 1 / j = 1 / k = 1 2 3 4 5
i = 2 / j = 1 2 / k = 1 2 3
i = 3 / j = 1 2 3 / k = 1

a가 5일 때,

i = 1 / j = 1 / k = 1 2 3 4 5 6 7
i = 2 / j = 1 2 / k = 1 2 3 4 5
i = 3 / j = 1 2 3 / k = 1 2 3

i = 4 / j = 1 2 3 4 / k = 1

i는 1부터 시작할 때 a-1까지 증가해야 다이아몬드 아래부분의 높이가 알맞게 형성됨. i = 1; i <= a-1 ; i++
j는 i와 같아질 때까지 증가함. j = 1; j <= i; j++
k는 (a*2) - (i*2+1)와 같아질 때까지 증가함. k = 1; k <= (a * 2) - (i * 2 + 1) ; k++

 

방법2. 결과

 

원하는 대로 다이아몬드가 출력이 됐다.

오래 걸렸지만 혼자 해냈다는게 기분이 좋았다.