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);
}
정말 열심히 과제을 수행하고 있네요..ㅎ
문장자체에는 이상이 없어요.
콘솔창에서 입력을 할때 입력형식을 잘못 썼습니다.
scanf_s("%d, %d, %d, %d, %d, %d", &score1, &score2, &score3, &credit1, &credit2, &credit3);
문장에서 6개의 정수를 입력받을때 구분자를 , 로 구분하겠다고 포맷을 작성했어요
그럼 입력할때도 ,로 정수의 구분을 줘야 합니다.
100,100,100,3,3,3 이렇게요
그리고 아직 배열은 배우지 않으신거지요?
나중에 배열을 배우고 반복문으로 처리하면 훨씬 효율적인 코딩이 되겠네요.ㅎ
일단 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 과 같이 입력을 하셨습니다.
"%d, %d, %d, %d, %d, %d"
하지만 scanf의 입력 받는 형태는 괄호를 써서 표현했습니다.따라서 숫자를 저 형태로 입력을 해야 합니다.
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);
이렇게 한번 바꿔 보시는 것을 추천합니다.