[구름LEVEL]시험성적 평균과 등급 구하기
문제 소개
3개의 정수형인 점수들을 입력받아 평균을 내고, 100점부터 10점 단위로 차등하여 등급을 매기는 것이 목적이다.
#include <stdio.h>
int main() {
//점수 입력
int korean,math,eng = 0;
scanf("%d %d %d", &korean,&math,&eng);
//평균 계산 및 출력
int sum = korean+math+eng;
double ave = sum/3.0;
//소수점 3번째 자리에서 반올림처리
ave += 0.005;
ave *= 100;
int ave_tmp = ave;//묵시적 형변환(double -> int)
ave = ave_tmp/100.0;//묵시적 형변환
printf("%0.2lf ",ave);
//등급 계산 및 출력
int ave_int = ave/10;
switch(ave_int){
case 10:
printf("A");
break;
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:
printf("F");
}
return 0;
}
이번 문제의 핵심은 '반올림'이라고 생각한다. 반올림 기능을 구현하는 것이 이 문제의 핵심요소였다. 비록 별 1개짜리 문제이지만 저 반올림을 어떻게 구현할까 생각하는 데에 시간을 좀 쏟았다.
오늘 배운 것
1. C언어에서는 반올림 함수가 없다. 어떻게 구현할까
사실 math.h를 include하면 roundf()함수를 통해 반올림을 할 수 있기는 하다. 다만 나는 공부가 목적이니, 이 math헤더 없이 구현해본 것이다.
위의 본문에서는 소수점 3번째 자리에서 반올림을 한다. 그럼 0.005를 더해서 소수점 세 번째 자리가 10을 넘어갈 기회를 준다. 예를 들어 0.003이었다면 0.005를 더해봤자 0.008이어서 소수점 두 번째 자리에는 변화를 주지 못한다. 반면 0.007등의 숫자였다면 0.005를 더했을 때 0.012가 되어 소수점 두 번째 자리에 변화가 생긴다. 이를 이용하는 것이다.
<소수점 세 번째 자리에서 반올림하고싶다!>
-반올림시 버림 되는 경우
0.333(반올림했을 때 내림 되는 수) + 0.005 = 0.338(소수점 두 번째 자리에 변화 없음)
0.338 * 100 = 33.8
int(33.8) = 33
33/100 = 0.33 ->반올림하여 버림 처리됨
-반올림시 올림 되는 경우
0.666(반올림했을 때 올림 되는 수) + 0.005 = 0.671(소수점 두 번째 자리에 변화 있음)
0.671 * 100 = 67.1
int(67.1) = 67
67/100 = 0.67 ->반올림하여 올림 처리됨