Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 for 루프로 하트 패턴 중앙에 이름 출력하기


문제 정의

for 루프를 사용하여 별(*)로 하트 모양 패턴을 그리고, 그 중앙에 이름을 출력하는 C 프로그램을 작성하는 것이 이 글의 목표입니다.

해결 방법

프로그램은 사용자로부터 두 가지 값을 입력받습니다. 하나는 하트 중앙에 출력할 이름이고, 다른 하나는 별을 출력할 행(줄)의 개수입니다. 입력받은 이름의 길이를 계산한 뒤, 하트의 윗부분과 아랫부분을 각각 별로 출력하고 마지막 줄 중앙에 이름을 배치하는 방식으로 동작합니다.

알고리즘

아래 알고리즘을 순서대로 따르면 for 루프만으로 하트 패턴 안에 이름을 출력할 수 있습니다.

  1. 필요한 변수들을 선언합니다.
  2. 실행 시점에 중앙에 출력할 이름을 입력받습니다.
  3. 출력할 행의 개수를 입력받습니다.
  4. strlen() 함수로 이름의 길이를 구합니다.
  5. 중첩 for 루프를 사용해 하트의 윗부분(두 개의 곡선)을 출력합니다.
  6. 역삼각형 형태로 하트의 아랫부분을 출력합니다.
  7. 아랫부분 첫 번째 줄에 이름을 중앙에 맞춰 화면에 출력합니다.

예제 코드

다음은 for 루프를 사용하여 하트 패턴 안에 이름을 출력하는 C 프로그램의 전체 코드입니다.

#include <stdio.h>
#include <string.h>
int main(){
    int i, j, n;
    char name[50];
    int len;
    printf("Enter your name: ");
    gets(name);
    printf("Enter no of rows: ");
    scanf("%d", &n);
    len = strlen(name);
    // Print upper part of the heart shape with stars
    for(i=n/2; i<=n; i+=2){
        for(j=1; j<n-i; j+=2){
            printf(" ");
        }
        for(j=1; j<=i; j++){
            printf("*");
        }
        for(j=1; j<=n-i; j++){
            printf(" ");
        }
        for(j=1; j<=i; j++){
            printf("*");
        }
        printf("\n");
    }
    // Prints lower triangular part with stars
    for(i=n; i>=1; i--){
        for(j=i; j<n; j++){
            printf(" ");
        }
        // Print the name on screen
        if(i == n){
            for(j=1; j<=(n * 2-len)/2; j++){
                printf("*");
            }
            printf("%s", name);
            for(j=1; j<(n*2-len)/2; j++){
                printf("*");
            }
        }else{
            for(j=1; j<=(i*2)-1; j++){
                printf("*");
            }
        }
        printf("\n");
    }
    return 0;
}

코드 동작 원리

하트의 윗부분은 변수 i가 n/2부터 n까지 2씩 증가하면서 왼쪽 곡선과 오른쪽 곡선을 나란히 출력합니다. 아랫부분은 i가 n부터 1까지 감소하며 먼저 공백을 찍은 후, 첫 번째 줄(i == n)에서는 (n*2-len)/2개의 별 사이에 이름을 삽입하고, 나머지 줄에서는 (i*2)-1개의 별을 출력해 역삼각형 모양을 완성합니다.

참고: 예제에서 사용한 gets() 함수는 버퍼 오버플로 위험 때문에 C11 표준에서 제거되었습니다. 실제 프로젝트에서는 fgets(name, sizeof(name), stdin)처럼 fgets()를 사용하는 것이 훨씬 안전합니다.

실행 결과

위 프로그램을 컴파일하여 실행하면 다음과 같은 출력을 확인할 수 있습니다.

Enter your name: Tutorials POint
Enter no of rows: 10
      ***** *****
     ******* *******
    ********* *********
     **Tutorials POint*
     *****************
      ***************
       *************
        ***********
         *********
          *******
           *****
            ***
             *