로그인 바로가기 하위 메뉴 바로가기 본문 바로가기
난이도
입문

모두를 위한 컴퓨터 과학 (CS50 2019)

임시 이미지 David J. Malan (데이비드 J. 말란)
http://www.boostcourse.org/cs112/forum/48130
좋아요 15504 수강생 34435

안녕하세요, 팀미션 해결하다가 질문이 생겨서 여쭤봅니다!

제가 작성한 코드를 실행해보면 숫자 입력에 대해서는 오류없이 잘 돌아가는데

문자입력에 대해서는 무한루프 돌면서 오류가 납니다!

scanf로 입력받고 나서 if문과 함께 isdigit(score)쓰는 방법도 고려해보았으나 잘 되지 않았습니다.

문자입력을 받을 때 또한 오류없이 "성적을 올바르게 입력하세요"를 띄우고 싶은데

어떻게 코딩하면 좋을지 잘 모르겠습니다. 

문자열 입력을 어떤 방법으로 방지할지 조언 부탁드려요! 

그리고 코드에서 개선해야 할 점 있으면 조언 부탁드립니다!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cs50.h>
#include <ctype.h>

int CalculateGrade(void);


int main(void)
{
    CalculateGrade();
}



int CalculateGrade(void)
{
    // 학점과 기준 점수 선언
    
    char *grades[] = {"A+", "A", "B+", "B", "C+", "C", "D+", "D", "F"};
    int scores[] = {95, 90, 85, 80, 75, 70, 65, 65, 60, 0};

    int n = sizeof(grades) / 8; // 문자 하나 당 1바이트 = 8비트


    // 학점 테이블

    printf("학점 프로그램\n");
    printf("종료를 원하면 \"999\" 를 입력\n");
    printf("[학점 테이블]\n");

    for (int i = 0; i < n; i++)
    {
        printf("점수 : %d\t", scores[i]);
    }

    printf("\n");

    for (int i = 0; i < n; i++)
    {
        printf("학점 : %s\t", grades[i]);
    }

    printf("\n");


    // 성적 입력 받기

    int score;
    string grade;

    while(1)
    {
        printf("성적을 입력하세요 ( 0 ~ 100 ) : ");
        scanf("%d", &score);
        
        // 0 - 100 범위일 때
        
        if (score>=0 && score<=100)
        {
            for (int a = 0; a < 9; a++)
            {
                if (score >= scores[a])
                {
                    printf("학점은 %s 입니다.\n", grades[a]);
                    break; 
                }
            }
        }
        
        // 학점 프로그램 종료

        else if (score == 999)
        {
            printf("학점 프로그램을 종료합니다.\n");
            break;
        }
        
        // 0-100 범위를 벗어날 때 유효성 체크

        else
        {
            printf("** %d 성적을 올바르게 입력하세요. 범위는 0 ~ 100 입니다.\n", score);
        }

    }


    return 0;
}