这是一个非常简单的程序,用于计算cgpa。但是循环正在跳过对输入的迭代,并为每次跳过的迭代调用默认值。
#include <stdio.h>
#include <stdlib.h>
int main(){
float A=4.0, b=3.50, B=3.0, c=2.50,C=2.0;
float cgpa=0;
char grade;
for (int i=0; i<5;i++){
printf("\nEnter grade of your subject:\n");
grade = getchar( );
switch(grade){
case 'A':
cgpa=cgpa+A;
break;
case 'b':
cgpa=cgpa+b;
break;
case 'B':
cgpa=cgpa+B;
break;
case 'c':
cgpa=cgpa+c;
break;
case 'C':
cgpa=cgpa+C;
break;
default:
printf("\nSorry you have entered a wrong value please try again\n");
}}
printf("\n Your cgpa is:%f", cgpa/5);
return 0;
}
答案 0 :(得分:2)
当您调用getchar()
时,您从命令行(f.ex。A\n
)获得两个字符,但您一次只能获取一个字符。因此,第二次循环时会得到\n
。固定?在getchar()
- 案例之后再次switch
,同时省略结果。
此外,getchar()
会返回int
- 值,但您正在使用char
,这可能会导致奇怪的行为。
答案 1 :(得分:1)
当您输入一个字符然后按Enter键时,getchar()
接受字符,并且当循环再次开始时,由于您在上一次迭代中给出的回车键,{J}接受了\n
,所以.. ..每次输入一个字符然后点击输入......就会输入两个输入,因此会观察到这种行为。要解决此问题,请使用
scanf(" %c",&grade);
注意:此处space
前面有一个%c
以省略空格
而不是:
grade=getchar()
在循环中。
答案 2 :(得分:1)
以下代码干净利落地编译,并正确执行所需的算法并处理空格,如换行符和无效的等级值。
注意在实现适当的缩进和代码块分离时易于阅读
#include <stdio.h> // printf(), getchar()
#include <ctype.h> // toupper()
// MAX_GRADES makes it easy to adjust number of 'grade' inputs
#define MAX_GRADES (5)
int main()
{
// list variables one per line
// and it would be better if these were #defines
// instead of taking up stack space
float A=4.0f;
float b=3.50f;
float B=3.0f;
float c=2.50f;
float C=2.0f;
float cgpa=0.0f;
int grade; // << getchar() returns an integer not a character
for (int i=0; i<MAX_GRADES; i++)
{
printf("\nEnter grade of your subject:\n");
grade = getchar( );
if( 'A' <= toupper(grade) && 'Z' >= toupper(grade) )
{
switch(grade)
{
case 'A':
cgpa=cgpa+A;
break;
case 'b':
cgpa=cgpa+b;
break;
case 'B':
cgpa=cgpa+B;
break;
case 'c':
cgpa=cgpa+c;
break;
case 'C':
cgpa=cgpa+C;
break;
default:
printf("\nSorry you have entered a wrong value please try again\n");
i--; // adjust to not count bad input
break;
} // end switch
}
else
{
i--; // adjust to not count newline, non-alpha inputs, etc
}
} // end for
printf("\n Your cgpa is:%f", cgpa/MAX_GRADES);
return 0;
} // end function: main