如何在C中循环整个代码块?

时间:2016-02-16 04:04:38

标签: c

所以基本上在计算之后,程序会提示用户是否要退出程序并且用户输入一个字符('y'或'n'),如果用户输入的数字或字母不是'y'或'n'然后程序将继续提示用户,直到他们输入其中一个字符。

我遇到的问题是即使输入'y'或'n',程序也会继续循环并提示用户。当我尝试fflush(stdin)它仍然无法正常工作

我想知道如果用户没有输入其中一个选项并且当他们输入正确时如何再循环语句,如何在“do while”循环中重复获取代码。最好不要再复制和粘贴整个集团。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>


int main()
{

    float x, t, term = 1 , sum = 1;
    int i;
    char d;

    printf("This program will compute the value of cos x, where x is user input\n\n");

    do {
        printf("Please input the value of x: ");
        while (scanf("%f", &x) != 1)
        {
            fflush(stdin);
            printf("Please input the value of x: ");
            scanf("%f", &x);
        }

        fflush(stdin);

        printf("\nPlease input the number of terms: ");
        while (scanf("%f", &t) != 1)
        {
            fflush(stdin);
            printf("\nPlease input the number of terms: ");
            scanf("%f", &t);
        }

        fflush(stdin);

        for (i=1; i<t+1; i++)
        {

            term =  -term *((x*x)/((2*i)*(2*i-1)));
            sum = sum+term;


        }

        printf("\nThe value of the series is %f", sum);
        printf("\n****************************************");
        printf("\nDo you wish to quit? (y/n): ");
        scanf("%c", &d);

        while (d != 'y' || d != 'n')
        {
            printf("\n****************************************");
            printf("\nDo you wish to quit? (y/n): ");
            scanf("%c", &d);
        }

    } while (d == 'n');

    if (d == 'y')
    {
        printf("terminating program");
        exit(0);
    }
    return (0);
}

4 个答案:

答案 0 :(得分:1)

除非你的格式字符串设置为丢弃它,否则

scanf()不会丢弃输入缓冲区中的换行符'\ n'。在您的代码中,输入浮点数并输入Enter后,换行符仍在缓冲区中。因此,对于提示Y \ N的代码,请使用此格式字符串忽略换行符

scanf(" %c",&d);

如果您这样做,可以删除fflush()调用。在你的情况下,看起来你的循环条件是错误的。

答案 1 :(得分:0)

这一行

while (d != 'y' || d != 'n')

错了。

这样想:

  

如果d不是'y'd不是'n'

,那么循环会运行

现在假设你放入了'y'

  

d'y'。如果d不是'y'd不是'n',则循环会运行。是d != 'y'吗?不是d != 'n'?是。因此循环必须运行。

您需要使用&&

while (d != 'y' && d != 'n')

此外,scanf不会丢弃换行符,因此请为所有scanf添加空格。

scanf("%c", &d); //change to scanf(" %c", &d);

答案 2 :(得分:0)

看看这部分 -

while (d != 'y' || d != 'n')
{
    printf("\n****************************************");
       printf("\nDo you wish to quit? (y/n): ");
            scanf("%c", &d);
}

  } while (d == 'n');

你正在使用while两次,我想你希望在这里有一个单独的条件..如果你要终止while,那么请确保有一个do参与其中。

答案 3 :(得分:0)

以下是我认为正确的代码,因为你有很多问题,所以我改变了很多:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>


int main()
{

    float x, t, term = 1 , sum = 1;
    int i;
    char d;

    printf("This program will compute the value of cos x, where x is user input\n\n");

    do {
        printf("Please input the value of x: ");
        while (scanf("%f", &x) != 1)
        {
            fflush(stdin);
            printf("Please input the value of x: ");//delete the repeat scanf
        }

        fflush(stdin);

        printf("\nPlease input the number of terms: ");
        while (scanf("%f", &t) != 1)
        {
            fflush(stdin);
            printf("\nPlease input the number of terms: ");
        }

        fflush(stdin);
        sum=0;//no initalization 
        for (i=1; i<t+1; i++)
        {

            term =  -term *((x*x)/((2*i)*(2*i-1)));
            sum = sum+term;


        }

        printf("\nThe value of the series is %f", sum);
        printf("\n****************************************");
        printf("\nDo you wish to quit? (y/n): ");
        scanf("%c", &d);

        while ((d != 'y' )&& (d != 'n'))//this logical expression is the right way
        {

            scanf("%c", &d);
            fflush(stdin);
            printf("\n****************************************");//I change the pos of print to avoid double printing
            printf("\nDo you wish to quit? (y/n): ");
        }

    } while (d == 'n');

    if (d == 'y')
    {
        printf("terminating program");
        exit(0);
    }
    return (0);
}

ps:对于你的计算部分,我不确定运行时的正确性:)