Еще несколько замечаний по вашему коду:
int checkMark(int x)
{
while(x<0 || x>100) //While x is a negative number:
{
printf("Invalid entry.Try again:");
scanf("%d",&x);
}
if(x>0 && x<=100)//If x is a positive number:
x=x;
return x;
}
должно быть скорее:
#define MIN_GRADE 0
#define MAX_GRADE 100
int checkMark(int x)
{
while(x<MIN_GRADE || x>MAX_GRADE)
{
printf("Invalid entry.Try again:");
scanf("%d",&x);
}
return x;
}
Обратите внимание, что я:
удалены бесполезные комментарии
удалены магические числа (0 и 100)
удален бесполезный тест (если вы выйдете из цикла while, x будет в {0, ..., 100}
допускается x
равным 0
удалено идемпотентное назначение (x=x
не делает ничего полезного ...)
Тогда:
float getMark(void)
{
float mark=0,assignMark=0,midMark=0,examMark=0,finalMark=0;
char letterGrade;
printf("Enter assignment grade:");
scanf("%d",mark);
^ Как уже упоминалось, вы должны использовать %f
и &mark
в этом scanf
.
checkMark(mark);
^ Здесь должно быть mark = checkMark(mark);
, если вы хотите, чтобы переменная mark
в этом коде была обновлена. Это связано с тем, что значение mark
передается функции, а не ссылкой на переменную mark
. Другое решение состоит в том, чтобы передать такую ссылку, но я не думаю, что вы готовы к этому:)
assignMark=mark;
printf("\nEnter midterm mark:");
scanf("%f",&mark);
checkMark(mark);
midMark=mark;
printf("\nEnter exam mark:");
scanf("%f",&mark);
checkMark(mark);
examMark=mark;
^ Одинаковые замечания для всех этих строк
finalMark=computeFinalGrade(assignMark,midMark,examMark,finalMark);
^ Передача finalMark
в качестве параметра здесь абсолютно бесполезна. Это должно быть finalMark = computeFinalGrade(assignMark, midMark, examMark);
, тебе не кажется?
letterGrade=computeLetterGrade(finalMark);
printf("The final grade for the course is %.1f, and the letter grade is %c.\n",finalMark,letterGrade);
return 0;
}
Как уже упоминалось ранее, вам не нужно передавать какое-либо значение finalGrade
в computeFinalGrade
, вам должно быть достаточно просто:
float computeFinalGrade(float assign, float midterm, float finalExam)
{
return 0.2*assign + 0.3*midterm + 0.4*finalExam; // this could even be a macro
}
Наконец, в computeLetterGrade
вы делаете много избыточных тестов, и ваш поток управления испорчен этим назначением переменной, плюс вам следует использовать char
вместо int
. Попробуйте вместо этого:
char computeLetterGrade(float finalGrade)
{
if(finalGrade>=80) return 'A';
// Since we did not return, necessarily finalGrade < 80
if(finalGrade>=70) return 'B';
if(finalGrade>=60) return 'C';
if(finalGrade>=50) return 'D';
// All other ifs failed, therefore finalGrade < 50
return 'E';
}
Возможно, вам придется исправить некоторые вещи, которые я не упомянул, но по крайней мере вы должны быть ближе к своим целям с некоторыми из этих исправлений.