#17 - 구조체 [쉬움]

2019. 1. 12. 23:36카테고리 없음

728x90

문제
한 학생의 평점(GPA)을 계산하고자 한다.
다음과 같은 결과가 나오도록 구조체를 통해 평점을 계산하는 프로그램을 작성하시오.

단, 구조체 멤버는 과목명, 학점수, 성적으로 한다.
성적은 4.5점 만점을 기준으로 한다. (A+: 4.5점부터 F: 0.0점까지 총 9단계의 등급이 있다.)


핵심 개념
구조체 선언과 활용: 기존 배열의 개념으로는 서로 다른 종류의 자료형을 가진 값들을 한데 묶어 활용할 수 없다. 구조체는 다양한 자료형을 가진 변수들을 묶어 사용할 수 있으므로 그러한 한계를 극복할 수 있다.
문자열 비교: 문자열이 서로 같은지를 비교하기 위해 필요한 함수가 있음을 알아야 한다. 하나의 문자에 대해서는 ASCII 코드 개념을 활용할 수 있지만, 문자열은 그것이 가능하지 않기 때문이다.
         



<Main 함수>

ㅡ 전체적으로 특별한 내용은 없다. 중요한 것은 line 57의 calcGPA 함수와 그 근간을 이루는 구조체이다.
ㅡ line 54: 매크로를 활용하여 구조체 안의 멤버값을 출력하고 있다.



<구조체>

ㅡ 태그명이 각각 '_INFO'와 'GP'인 2개의 구조체를 선언했다. '_INFO' 구조체에는 결과에 출력되기도 하는 학생의 수강 정보가 저장되고, 'GP' 구조체는 평점을 계산하는데 필요한 환산 점수표를 저장하고 있다.
ㅡ line 11: 과목명의 길이가 긴 경우도 있기 때문에 char subject [30]; 대신 char* subject ; 를 사용할 수도 있다.
ㅡ line 13: 공백포함 n개의 문자를 포함한 문자열을 선언하기 위해서는 (n+1) 크기의 배열이 필요하다. 마지막에 NULL 문자가 들어가야하기 때문이다.
ㅡ line 14 & line 23: 매크로 'SIZE'와 'GPA_TYPE'으로 학생의 수강 개수와 평점 산출 방식에 대한 literal을 대체하였다.



<calcGPA>

평점은 각 과목의 학점수와 성적을 곱한 값을 모두 더하고, 그 값을 총 학점수로 나누는 것으로 구할 수 있다. 이는 흔히 아는 (산술)평균의 개념보다는 가중산술평균의 개념으로 이해하는 것이 적절하다.
ㅡ line 38: Sub 를 0부터 1씩 늘려가며 (Sub +1)번째 과목에 대한 평점 계산 수행을 시행한다.
ㅡ line 39: 총 학점수를 구하기 위해 각 과목의 학점수를 더한다.
ㅡ line 41- 44: (Sub +1)번째 과목의 성적을 성적 환산 점수표에서 찾아 점수로 환산하여 반영하는 과정이다.
        
strcmp 함수는 인수에 놓인 두 문자열을 비교하여 같으면 0을 반환한다. 그러나 if문은 조건문이 참(TRUE, 1)인 경우에 대하여 이후 명령을 수행하기 때문에 앞에 NOT을 의미하는 느낌표(!)를 붙인 것이다. 만약 위의 설명이 잘 이해가 가지 않는다면 if문의 조건으로 (strcmp(SCORE(Sub ), GP[i].score)==0)을 사용해도 괜찮다. 그렇게 성적 환산 점수표에서 해당 과목의 성적을 찾았다면, 그 환산 점수와 해당 과목의 학점수를 곱하여 GP_sum 에 저장한다. 
ㅡ line 47: GP_sum / credit_sum 을 통해 GPA 값을 반환한다.






728x90