문제 정의
for 루프를 사용하여 별(*)로 하트 모양 패턴을 그리고, 그 중앙에 이름을 출력하는 C 프로그램을 작성하는 것이 이 글의 목표입니다.
해결 방법
프로그램은 사용자로부터 두 가지 값을 입력받습니다. 하나는 하트 중앙에 출력할 이름이고, 다른 하나는 별을 출력할 행(줄)의 개수입니다. 입력받은 이름의 길이를 계산한 뒤, 하트의 윗부분과 아랫부분을 각각 별로 출력하고 마지막 줄 중앙에 이름을 배치하는 방식으로 동작합니다.
알고리즘
아래 알고리즘을 순서대로 따르면 for 루프만으로 하트 패턴 안에 이름을 출력할 수 있습니다.
- 필요한 변수들을 선언합니다.
- 실행 시점에 중앙에 출력할 이름을 입력받습니다.
- 출력할 행의 개수를 입력받습니다.
- strlen() 함수로 이름의 길이를 구합니다.
- 중첩 for 루프를 사용해 하트의 윗부분(두 개의 곡선)을 출력합니다.
- 역삼각형 형태로 하트의 아랫부분을 출력합니다.
- 아랫부분 첫 번째 줄에 이름을 중앙에 맞춰 화면에 출력합니다.
예제 코드
다음은 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*
*****************
***************
*************
***********
*********
*******
*****
***
*