초기 네이버 기록/과거 공부 기록

오래 걸린 문제(성적 순 배열 및 막대 그래프 출력 문제)(씹어먹는C언어)

뜨거운 개발자 2023. 1. 7. 01:11
/*문제 1.입력 받는 학생들의 성적이 높은 순으로 정렬하는 프로그램을 만들자.
문제 2 입력받은 학생들의 성적을 막대 그래프로 나타내는 프로그램 만들자.*/
#include<stdio.h>
int main() {
	int score[10];//성적 입력용 배열
	int tmp;//임시 변수
	int student_num = sizeof(score) / sizeof(int);//학생의 숫자

	printf("10명의 학생들의 성적을 입력하세요\n");
	for (int i1 = 0; i1 < 10; i1++) {//학생 성적 입력

		printf("%d번째 학생의 성적은:", i1 + 1);
		scanf_s("%d", &score[i1]);
		if (score[i1] > 100 || score[i1] < 0) {//학생 성적이 올바른 숫자가 아닌경우 원래대로 돌려보냄
			printf("올바른 점수를 입력하세요\n");
			i1--;

		}
	}

	for (int i3 = 0; i3 < student_num; i3++) {
		printf("원래 %d 번 학생의 점수는 %d 점 입니다.\n ", i3 + 1, score[i3]);//원래 학생들의 배열을 출력
	}

	while (student_num) {//낮은 수를 오른쪽으로 이동 
		for (int i2 = 0; i2 < student_num; i2++) {

			if (score[i2] <= score[i2 + 1]) {//배열의 오른쪽이 같거나 더 크다면 둘의 위치를 바꾼다.
				tmp = score[i2];
				score[i2] = score[i2 + 1];
				score[i2 + 1] = tmp;
			}

		}
		student_num--;//for 문을 한번 실행할때마다 가장 오른쪽에 가장 작은수가 들어가므로 전체 학생수를 하나 줄인다.
	}

	for (int i4 = 0; i4 < 10; i4++) {
		printf("%d등은 %d점 입니다\n", i4+1, score[i4]);
		for (int i5 = 0; i5 < score[i4]/10; i5++) {//점수만큼 동그라미 반복 출력해서 그래프 생성 1의 자리 버림
			printf("●");
		}
		printf("\n");
	}
	return 0;
}
//이 답안은 아무리 다른 답을 찾으려고 노력해도 안 나와서 한분 껄 참고해서 쓴 답안이다...

원래 하고 싶었던 코드는 당신이 %d번째로 입력한 학생의 순위는%d등 이고 %d점 입니다. 였는데 쉽지가 않았다. 우선 각 학생의 입력한 순서를 기억하고 있으려면 이전에 정의 코드에서 바로 내려오거나 아에 다른 변수를 선언해서 넣어줘야 하는데 그렇게 하려면 숫자를 정렬시키는게 그 조건때문에 복잡해진다. 그래서 이렇게 출력하는 것 보다는 차라리 위의 방식으로 타협을 했다.

이 글은 코딩 꼬꼬마 시절에 푼 문제를 보관한 글로 네이버에 저장해둔 글을 옮긴 글입니다.
혹시나 참고하시는 부분에 이상한 부분이나 질문이 생긴다면 남겨주시면 친절히 답변 드리겠습니다.

728x90