C循环跳过输入的迭代

时间:2016-03-02 18:52:10

标签: c

这是一个非常简单的程序,用于计算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;   
    }

3 个答案:

答案 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