라떼는말이야

[C 기초] 채점 프로그램 만들기 본문

알고리즘/CS50

[C 기초] 채점 프로그램 만들기

MangBaam 2021. 3. 3. 10:00
반응형

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. 부가 설명

🔔 답안

#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;
}
반응형
Comments