아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
빈티지한매사촌80
빈티지한매사촌8021.04.16

C언어 코딩 어디가 문제인건가요?

교수님께서 내주신 과제인데 일단 사진대로 하면 복잡하다고 A+,A0 =4학점, B+,B0 = 3점, C+,C0 = 2점, D+,D0 = 1점, F = 0점 이런 식으로 수정해주셨습니다. credit은 문제에 나와있는 3학점 2학점 이부분입니다. 점수랑 학점 입력해주고 a, b, c값 뽑아주고 평균 구해주는 코드입니다. 근데 실행시키면 실행이 안되거나 뭘 입력해도 최종 출력값이 1이 나옵니다 대체 어디가 잘못된거죠? ㅠㅠ

#include <stdio.h>

void main()

{

int score1, score2, score3, credit1, credit2, credit3, a, b, c, A, B, C, D, F;

float average;

scanf_s("%d, %d, %d, %d, %d, %d", &score1, &score2, &score3, &credit1, &credit2, &credit3);

A = 4, B = 3, C = 2, D = 1, F = 0; A = 4, B = 3, C = 2, D = 1, F = 0;

if (score1 >= 90)

a = credit1 * A;

else if (score1 >= 80)

a = credit1 * B;

else if (score1 >= 70)

a = credit1 * C;

else if (score1 >= 60)

a = credit1 * D;

else

a = credit1 * F;

if (score2 >= 90)

b = credit2 * A;

else if (score2 >= 80)

b = credit2 * B;

else if (score2 >= 70)

b = credit2 * C;

else if (score2 >= 60)

b = credit2 * D;

else

b = credit2 * F;

if (score3 >= 90)

c = credit3 * A;

else if (score3 >= 80)

c = credit3 * B;

else if (score3 >= 70)

c = credit3 * C;

else if (score3 >= 60)

c = credit3 * D;

else

c = credit3 * F;

average = (a + b + c) / (credit1 + credit2 + credit3);

printf("평균 평점은 %f\n", average);

}

55글자 더 채워주세요.
답변의 개수
3개의 답변이 있어요!
  • 정말 열심히 과제을 수행하고 있네요..ㅎ

    문장자체에는 이상이 없어요.

    콘솔창에서 입력을 할때 입력형식을 잘못 썼습니다.

    scanf_s("%d, %d, %d, %d, %d, %d", &score1, &score2, &score3, &credit1, &credit2, &credit3);

    문장에서 6개의 정수를 입력받을때 구분자를 , 로 구분하겠다고 포맷을 작성했어요

    그럼 입력할때도 ,로 정수의 구분을 줘야 합니다.

    100,100,100,3,3,3 이렇게요

    그리고 아직 배열은 배우지 않으신거지요?

    나중에 배열을 배우고 반복문으로 처리하면 훨씬 효율적인 코딩이 되겠네요.ㅎ


  • 탈퇴한 사용자
    탈퇴한 사용자21.04.17

    일단 scanf 아래 초기화 해주는 부분이 중복으로 되어 있습니다.

    A = 4, B = 3, C = 2, D = 1, F = 0; A = 4, B = 3, C = 2, D = 1, F = 0;

    중복을 제거를 일단 하세요.

    실행하는 동작을 보니 100 100 100 3 3 3 과 같이 입력을 하셨습니다.
    하지만 scanf의 입력 받는 형태는 괄호를 써서 표현했습니다.

    "%d, %d, %d, %d, %d, %d"

    따라서 숫자를 저 형태로 입력을 해야 합니다.

    100, 100, 100, 3, 3, 3

    이렇게 실행을 하면 아래와 같은 결과가 나옵니다.

    만약 100 100 100 3 3 3 과 같이 입력을 위해서는 포맷을 아래와 같이 바꾸면 됩니다.

    "%d %d %d %d %d %d"

    추가로 if 문의 경우 { } 없이 사용하고 있는데 이런 경우 잠재적으로 버그를 만들 수 있어서 안티패턴으로 생각하고 있습니다. 아래처럼 사용하시기를 권장드립니다.

    if (score1 >= 90) { a = credit1 * A; } else if (score1 >= 80) { a = credit1 * B; } else if (score1 >= 70) { a = credit1 * C; } else if (score1 >= 60) { a = credit1 * D; } else { a = credit1 * F; }

    리팩토링

    아직 함수를 배우셨는지 모르지만 본문의 코드를 보면 중복되는 if ~ else if 등의 문장이 세 군데가 보입니다.

    해당하는 부분을 함수로 만들어보면 아래와 같습니다.

    int calculate(int score, int credit) { int A, B, C, D, F; A = 4, B = 3, C = 2, D = 1, F = 0; if (score >= 90) { return credit * A; } else if (score >= 80) { return credit * B; } else if (score >= 70) { return credit * C; } else if (score >= 60) { return credit * D; } else { return credit * F; } }

    점수와 학점을 넘겨서 계산을 할 수 있는 것이지요.

    따라서 a, b, c 는 아래와 같이 사용이 가능해집니다.

    a = calculate(score1, credit1); b = calculate(score2, credit2); c = calculate(score3, credit3);

    전체 코드

    #include <stdio.h> int calculate(int score, int credit) { const int A = 4; const int B = 3; const int C = 2; const int D = 1; const int F = 0; if (score >= 90) { return credit * A; } else if (score >= 80) { return credit * B; } else if (score >= 70) { return credit * C; } else if (score >= 60) { return credit * D; } else { return credit * F; } } int main(int argc, const char * argv[]) { int score1, score2, score3, credit1, credit2, credit3, a, b, c; float average; scanf("%d %d %d %d %d %d", &score1, &score2, &score3, &credit1, &credit2, &credit3); a = calculate(score1, credit1); b = calculate(score2, credit2); c = calculate(score3, credit3); average = (a + b + c) / (credit1 + credit2 + credit3); printf("평균 평점은 %f\n", average); return 0; }

    버그 픽스

    리팩토링 후 테스트를 진행해보았는데 코드상 자주 실수하는 부분이 있어서 아래와 같은 값을 넣었습니다.

    80 100 100 3 3 3

    이렇게하면 소숫점으로 평균이 나와야 하는데 3.000000 이 나옵니다.

    이유는 정수와 정수의 연산은 결과가 정수로 나오기 때문에 소수점 부분이 안보입니다.
    따라서 이것을 방지하기 위해 피연산자를 실수형으로 변환을 해주어야 합니다.

    average = (a + b + c) / (credit1 + credit2 + credit3);

    average = (a + b + c) / (float)(credit1 + credit2 + credit3);

    처럼 바꾸면 됩니다. (앞 부분을 바꾸어도 됩니다.)

    이렇게 하면 평점 평균이 3.666667 가 나옴을 알 수 있습니다.


  • 안녕하세요

    보니까 scanf_s 에서 문자 입력받을때의 오류가 있는것으로 보입니다.

    scanf_s("%d, %d, %d, %d, %d, %d", &score1, &score2, &score3, &credit1, &credit2, &credit3);

    에서 %d 뒤에 쉼표가 있는데 해당 문자를 빼시면 제대로 된 값이 입력될 것입니다.

    즉, 쉼표를 뺀,

    scanf_s("%d %d %d %d %d %d", &score1, &score2, &score3, &credit1, &credit2, &credit3);

    이렇게 한번 바꿔 보시는 것을 추천합니다.