C언어

[C언어] 막대그래프 출력하기

yujin0517 2021. 9. 13. 17:16

콘솔창에 막대그래프 출력하기

-> 학생들의 점수를 입력받아 막대그래프로 표현하기

 

<코드 작성하기>

  1. 학생 수 입력하기 (입력받은 학생 수로 메모리 동적 할당받기)
  2. 학생들의 점수 입력하기
  3. 입력받은 학생들의 점수를 막대그래프로 출력하기

 

입력받은 점수를 막대그래프로 출력하기 위해서  ┌┐(시작), ││(중간), ┴┴ (끝)등의 기호가 필요하다.

100점부터 시작해서 0점까지 막대그래프가 출력된다.

만약 학생의 점수가 60점이면 막대그래프의 60점 부분에서 ┌┐기호가 출력되어야 하고, 0점을 만나기 전까지 ││기호가 출력되며, 0점을 만나면 ┴┴ 기호로 마무리한다. 

이렇게 출력하기 위해서 조건문을 사용하면 된다.

==> 막대그래프 출력 결과

 

<구현하기>

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>  //system("cls") = 화면 클리어

int main() {
	int cnt = 0;
	int* arrScore = 0;

	printf("학생 수를 입력하세요 : ");
	scanf_s("%d", &cnt);

	arrScore = (int*)malloc(sizeof(int) * cnt);  //메모리 동적할당 받기

	for (int i = 0; i < cnt; i++) {
		printf("%d번 학생 점수 입력 : ", i + 1);
		scanf_s("%d", arrScore + i);
	}

	system("cls");

	for (int i = 0; i < cnt; i++) {
		printf("%d번 학생 점수 : %d점\n", i + 1, arrScore[i]);
	}

	for (int i = 10; i > 0; i--) {
		printf("%3d │", i * 10);  //3d 자릿수 맞추기 최대 100점 세자리이므로 3d
		//i를 10부터 시작, i에 10을 곱하여 점수를 표현 
		for (int j = 0; j < cnt; j++) {
			int  num = arrScore[j] / 10;  //i와 값을 비교하기 위해 점수를 10으로 나눠줌
			if (num >= i) {  //점수를 10으로 나눈 값이 i보다 크거나 같을 때
				if (num == i) { printf("  ┌┐ "); }  //같으면 시작을 표시하는 ┌┐ 기호 출력
				else { printf("  ││ "); }  //0점을 만나기 전까지 ││ 기호 출력
			}
			else {
				printf("     ");
			}
		}
		printf("\n");
	}

	printf("%3d └─", 0);  //0점 표시
	for (int i = 0; i < cnt; i++) {
		if (arrScore[i] != 0) {  //0점이 아닌 점수가 입력된 부분에만 ─┴┴─ 기호로 출력
			printf("─┴┴─ ");
		}
		else {
			printf("─────");  //0점이 입력된 부분에는 ───── 기호로 출력
		}
	}

	printf("\n");
	printf("      ");
	for (int i = 0; i < cnt; i++) {
		printf(" %d번 ", i + 1);
	}
	printf("\n");

	printf("==>   ");
	for (int i = 0; i < cnt; i++) {
		printf(" %d점", arrScore[i]);
	}
	printf("\n");
	free(arrScore);  //메모리 해제 

	return 0;
}

 

막대그래프를 출력하기 위해 처음부터 ┌┐, ││, ┴┴ 등의 기호를 사용하면 어렵게 느껴지기에 

시작, 중간, 끝 구분이 없는 다른 기호를 사용하여 모양을 먼저 만들어보는 것이 중요하다고 생각합니다. 

저도 처음에는 ★기호를 사용하여 모양을 먼저 잡고 조건문을 사용하여 하나씩 고쳐 완성하였습니다. 

 

감사합니다!

 

2021. 09.13