Recent Posts
Recent Comments
라떼는말이야
[C 기초] 채점 프로그램 만들기 본문
반응형
www.notion.so/3a9a0340419e4f5f94100761dee2b9df
✔︎ 샘플미션. 채점 프로그램을 만들어보자!
1. 미션 제목
www.notion.so
1. 미션 제목
- 채점 프로그램을 만들어보자!
2. 지시문
학생들의 답안을 채점하는 프로그램을 작성하시오.
- 모든 문제는 객관식으로 1 ~ 5 사이의 정답을 가짐
- 10 문제에 대한 학생의 답을 매개변수 (arguments) 를 이용하여 입력
- 문제의 정답은 배열 (arrays) 를 이용하여 초기화 (아래 문제 정답 참조)
- 답안의 유효성을 체크 (답안의 개수: 10, 답의 범위: 1 ~ 5), 맞지 않으면 오류를 출력
- 답안의 개수가 틀린 경우, “문제는 10 문제입니다. 현재 {n} 개의 답안을 제출했습니다. 10 개의 답안을 제출하시오.”
- 답의 범위가 틀린 경우, “답의 범위는 1 ~ 5 입니다. 범위 외의 답안이 있습니다.”
- 문제당 10점으로 채점하고, 학점은 아래 “학점” 을 참고
- 정상 출력은 정답 수와 점수를 출력하고, 학점도 같이 출력
Table 1 - 학점
유효성 체크 1: 답안 수 == 10유효성 체크 2: 1 <= 답 <= 5
문제 정답 예시: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5
3. 핵심 개념
#배열 #분기문 #반복문 #매개변수 #표준출력 #atoi #stdlib #break
4. 부가 설명
- char to int (atoi: stdlib.h): https://ko.wikipedia.org/wiki/Stdlib.h
- 표준입출력: https://www.tutorialspoint.com/cprogramming/c_input_output.htm
- break: https://www.tutorialspoint.com/cprogramming/c_break_statement.htm
- malloc: http://www.cplusplus.com/reference/cstdlib/malloc/
- strlen: http://www.cplusplus.com/reference/cstring/strlen/
🔔 답안
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int NUMBER_OF_ANSWERS = 10;
const int ANSWERS[NUMBER_OF_ANSWERS] = {1, 2, 3, 4, 5, 1, 2, 3, 4, 5};
const int NUMBER_OF_GRADES = 9;
const int SCORES[NUMBER_OF_GRADES] = {95, 90, 85, 80, 75, 70, 65, 60, 0};
const char *GRADES[NUMBER_OF_GRADES] = {"A+", "A", "B+", "B", "C+", "C", "D+", "D", "F"};
int* charArrayToIntArray(char *target[], const int length);
int getNumberOfCollectAnswers(const int answers[], const int target[], int length);
int calculateScore(int numberOfCollectAnswers);
void printAnswers(char *who, const int target[], int length);
char* calculateGrade(int totalScore, const int scores[], const char *grades[], int length);
int main(int argc, char *argv[]) {
if (argc != (NUMBER_OF_ANSWERS + 1)) {
printf("문제는 10 문제입니다. 현재 %d 개의 답안을 제출했습니다. 10개의 답안을 제출하시오.\n", argc - 1);
printf("ex) ./mission02 4 4 3 5 2 5 1 2 4 3\n");
return -1;
}
int *studentAnswers = charArrayToIntArray(argv, argc);
for (int i = 0; i < NUMBER_OF_ANSWERS; i++) {
if (studentAnswers[i] >= 0 && studentAnswers[i] <= 5) {
continue;
} else {
printf("답의 범위는 1 ~ 5 입니다. 범위 외의 답안이 있습니다.\n");
return -1;
}
}
printf("학점평가 시작\n");
int numberOfCollectAnswers = getNumberOfCollectAnswers(ANSWERS, studentAnswers, NUMBER_OF_ANSWERS);
int totalScore = calculateScore(numberOfCollectAnswers);
char *grade = calculateGrade(totalScore, SCORES, GRADES, NUMBER_OF_GRADES);
printAnswers("정답", ANSWERS, NUMBER_OF_ANSWERS);
printAnswers("학생", studentAnswers, NUMBER_OF_ANSWERS);
printf("정답 수: %d\n", numberOfCollectAnswers);
printf("점수: %d\n", totalScore);
printf("학점: %s\n", grade);
return 0;
}
int* charArrayToIntArray(char *target[], const int length) {
int *result = malloc(sizeof(int) * NUMBER_OF_ANSWERS);
for (int i = 0; i < NUMBER_OF_ANSWERS; i++) {
result[i] = atoi(target[i + 1]);
}
return result;
}
int getNumberOfCollectAnswers(const int answers[], const int target[], int length) {
int numberOfCollectAnswers = 0;
for (int i = 0; i < length; i++) {
if (answers[i] == target[i]) {
numberOfCollectAnswers++;
}
}
return numberOfCollectAnswers;
}
int calculateScore(int numberOfCollectAnswers) {
return numberOfCollectAnswers * 10;
}
void printAnswers(char *who, const int target[], int length) {
printf("%s : ", who);
for (int i = 0; i < length; i++) {
printf("%d\t", target[i]);
}
}
char* calculateGrade(int totalScore, const int scores[], const char *grades[], int length) {
char *grade;
for (int i = 0; i < length; i++) {
if (totalScore >= scores[i]) {
grade = malloc(sizeof(char) * strlen(grades[i]));
strcpy(grade, grades[i]);
break;
}
}
return grade;
}
반응형
'알고리즘 > CS50' 카테고리의 다른 글
[C] 버블 정렬 (0) | 2021.03.07 |
---|---|
[C] Queue 만들기 쉬운 버전 (0) | 2021.03.06 |
[C] 누락된 숫자 찾아내기 (0) | 2021.03.05 |
[C 기초] 학점 계산 프로그램 (0) | 2021.03.04 |
[C 기초] 오늘의 메뉴 출력 (0) | 2021.03.02 |
[C 기초] 원금과 이자의 합계 출력하는 함수 (0) | 2021.03.01 |
[C 기초] 재고 관리 프로그램 (0) | 2021.02.28 |
CPU가 1초에 사용하는 비트 수 (0) | 2021.02.27 |
Comments