-
3-1 학점 계산 프로그램Computer Science/Boostcourse CS50 2021. 12. 24. 02:31728x90
저번 시간에 배열을 알아보았고, 이를 응용해 성적에 따라서 학점을 출력해 주는 프로그램을 작성해보았습니다.
프로그램을 작성하면서 느꼈던 것은 다시 봐도 main 함수의 코드를 줄이고 최대한 함수화를 시켜주는 것이
중요하다는 생각이 들었습니다. main 함수 내 코드가 길어지게 된다면 저 자신은 몰라도 다른 사람이 코드를 보았을 때, 가독성이 떨어지고 각각의 코드가 어떤 기능을 담당하는 코드인지 헷갈릴 수 있기 때문입니다.
#include <stdio.h> #include <stdlib.h> #define DATA_SIZE 9 const char* Student_grades[DATA_SIZE] = {"A+", "A", "B+", "B", "C+", "C", "D+", "D", "F"}; const int Student_scores[DATA_SIZE] = {95, 90, 85, 80, 75, 70, 65, 60, 0}; void Grade_table(); // 학점 테이블 void Grade_print(int score); // 성적에 맞는 학점 출력 int main() { int score; printf("학점 프로그램\n"); printf("종료를 원하면 \"-1\"을 입력\n"); printf("[학점 테이블]\n"); Grade_table(); while(1) { printf("성적을 입력하세요 (0 ~ 100) : "); scanf("%d",&score); if(score == -1) { printf("학점 프로그램을 종료합니다.\n"); exit(0); } else if(score<0 || score>100) { printf("%d 성적을 올바르게 입력하세요. 범위는 0 ~ 100 입니다.\n", score); continue; } Grade_print(score); } return 0; } void Grade_table() { int i; printf("점수: "); for(i = 0; i<DATA_SIZE; i++) { printf("%d\t",Student_scores[i]); } printf("\n학점: "); for(i = 0; i<DATA_SIZE; i++) { printf("%s\t",Student_grades[i]); } printf("\n"); } void Grade_print(int score) { int i; for(i = 0; i<DATA_SIZE; i++) { if(score>=Student_scores[i]) { printf("학점은 \'%s\' 입니다.\n",Student_grades[i]); break; } } }
이제 위의 전체적인 코드를 자세하게 살펴보겠습니다.
#include <stdio.h> #include <stdlib.h> #define DATA_SIZE 9 const char* Student_grades[DATA_SIZE] = {"A+", "A", "B+", "B", "C+", "C", "D+", "D", "F"}; const int Student_scores[DATA_SIZE] = {95, 90, 85, 80, 75, 70, 65, 60, 0};
종료 숫자인 -1을 입력하였을 때 프로그램을 바로 종료할 수 있게 exit() 함수를 사용하기 위해서 stdlib.h 을 포함시켜주었고, 학생들의 점수와 학점의 범위를 9 구간으로 구분해 줘야 하므로 DATA_SIZE라는 기호 상수로 정의하여 배열의 사이즈로 사용하였습니다.
아래는 모든 함수에서 사용이 가능한 학점 테이블에 대한 배열의 변수를 학점, 점수로 char형과 int형 두 개를 선언해 주었으며, 학점 테이블을 그대로 변경 없이 사용하는 것이라서 변수를 const로 상수화 시켜주었습니다.
void Grade_table(); // 학점 테이블 void Grade_print(int score); // 성적에 맞는 학점 출력 int main() { int score; printf("학점 프로그램\n"); printf("종료를 원하면 \"-1\"을 입력\n"); printf("[학점 테이블]\n"); Grade_table(); while(1) { printf("성적을 입력하세요 (0 ~ 100) : "); scanf("%d",&score); if(score == -1) { printf("학점 프로그램을 종료합니다.\n"); exit(0); } else if(score<0 || score>100) { printf("%d 성적을 올바르게 입력하세요. 범위는 0 ~ 100 입니다.\n", score); continue; } Grade_print(score); } return 0;
Grade_table, Grade_print은 학점 테이블의 내용과 성적을 입력했을 때 구간별로 학점을 출력해 주는 함수입니다.
main 함수에는 점수를 입력받아야 하므로 score라는 변수를 선언해 주었고, 프로그램 실행 시 학점 테이블의
내용을 가장 먼저 알려주어야 하기에 Grade_table 함수를 호출해 주었습니다.
while 문을 살펴보면, 성적을 먼저 물어본 후 입력한 수가 '-1'일 경우 프로그램이 종료되게끔 if 문을 이용하였으며 0점 미만 또는 100점을 초과하는 점수는 없어야 하기 때문에 조건을 걸어 주고 다시 입력받을 수 있게 continue를 이용하여 바로 while 문의 처음으로 돌아가게 해주었습니다. 제대로 입력을 받은 경우 구간별 학점 출력 함수가 호출되고 나서 성적에 따른 학점을 출력하게 됩니다. 이 과정은 -1을 입력하기 전까지 계속 반복합니다.
void Grade_table() { int i; printf("점수: "); for(i = 0; i<DATA_SIZE; i++) { printf("%d\t",Student_scores[i]); } printf("\n학점: "); for(i = 0; i<DATA_SIZE; i++) { printf("%s\t",Student_grades[i]); } printf("\n"); }
Grade_table 함수는 위에서 전역 변수로 선언해 준 Student_grades, Student_scores 배열을 이용하여 학점 테이블의 내용을 반복문으로 출력해 주는 코드를 작성해 주었습니다.
void Grade_print(int score) { int i; for(i = 0; i<DATA_SIZE; i++) { if(score>=Student_scores[i]) { printf("학점은 \'%s\' 입니다.\n",Student_grades[i]); break; } } }
while 문에서 입력받은 score를 인자로 전달받고 score와 Student_scores을 비교하여 범위에 적합한 점수를 출력해 주는 Grade_print 함수를 마지막으로 작성하였는데, 이때 인덱스 0번째에 해당되는 데이터가 배열에서 가장 큰 점수인 95부터 시작하므로 if 문을 여러 개 작성할 필요 없이 간결하게 반복문을 통해 순차적으로 어느 범위에 해당하는지 확인할 수 있었습니다.
소스코드의 실행 결과는 다음과 같습니다.
이렇듯 배열을 활용하여 비슷한 종류의 데이터들을 묶어 하나의 변수로 관리할 수 있으니 굉장히 편리하다는 점을 확인할 수가 있었습니다.
일차원 배열뿐만 아니라 이차원 배열을 이용해서도 관련된 정보들을 그룹핑하여 관리해보는 프로그램들을 작성해보는 것도 배열의 이해도를 높이는 데에 있어 많은 도움이 될 것 같습니다. 감사합니다.
728x90'Computer Science > Boostcourse CS50' 카테고리의 다른 글
4. 알고리즘 (0) 2021.12.24 3-2 배열 Queue 구현 (0) 2021.12.24 3. 배열 (0) 2021.12.24 2-2 음식메뉴 소개 프로그램 (0) 2021.12.24 2-1 재고량 관리 프로그램 (0) 2021.12.24