标题:小白又双遇到问题了
只看楼主
fclzss
Rank: 2
等 级:论坛游民
帖 子:32
专家分:11
注 册:2018-11-7
结帖率:75%
已结贴  问题点数:20 回复次数:10 
小白又双遇到问题了
上次经过Tomorrw_I大神的解释知道了自己循环不出来的原因了(感谢大神),结果这次又遇到一个问题,自己感觉好像问题类似。

这次是计算调和平均数,自己设计的算法是 输入两个浮点数据,如果输入的类型不对则重新输入,结果又跟上次一样当输入字母时程序进入死循环,无法重新输入也无法跳出,然后我就想了个办法用while 和getchar结果成功了,但是我有点不明白其中的原因,请大神解释一下,感谢
图一 死循环的程序

图二 可行的程序

搜索更多相关主题的帖子: 原因 结果 输入 重新 死循环 
2018-11-09 21:22
fclzss
Rank: 2
等 级:论坛游民
帖 子:32
专家分:11
注 册:2018-11-7
得分:0 
回复 楼主 fclzss
死循环语句


#include<stdio.h>
float average_number(float a,float b);
int main(void)
{
    float num1,num2;
    int a,b;
    printf("this program caculate average.\n");
    printf("now please enter first num:");
    a=scanf("%f",&num1);
    while(a!=1)
    {
        printf("please enter a float number:");
        a=scanf("%f",&num1);
    }
    printf("now enter second number:");
    b=scanf("%f",&num2);
    while(b!=1)
    {
        printf("please enter a float number:");
        b=scanf("%f",&num2);
    }
    printf("%f\n", average_number( num1, num2));
    printf("bye\n");
    return 0;

}
float average_number(float a,float b)
{
    float aver;
    a=1/a;
    b=1/b;
    aver=a+b;
    aver=1/aver;
    return aver;
}
2018-11-09 21:23
fclzss
Rank: 2
等 级:论坛游民
帖 子:32
专家分:11
注 册:2018-11-7
得分:0 
回复 楼主 fclzss
可行语句

#include<stdio.h>
float average_number(float a,float b);
int main(void)
{
    float num1,num2;
    int a,b;
    printf("this program caculate average.\n");
    printf("now please enter first num:");
    a=scanf("%f",&num1);
    while(a!=1)
    {
        while(getchar()!='\n')
            continue;
        printf("please enter a float number:");
        a=scanf("%f",&num1);
    }
    printf("now enter second number:");
    b=scanf("%f",&num2);
    while(b!=1)
    {
        while(getchar()!='\n')
            continue;
        printf("please enter a float number:");
        b=scanf("%f",&num2);
    }
    printf("%f\n", average_number( num1, num2));
    printf("bye\n");
    return 0;

}
float average_number(float a,float b)
{
    float aver;
    a=1/a;
    b=1/b;
    aver=a+b;
    aver=1/aver;
    return aver;
}
2018-11-09 21:23
幻紫灵心
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山咔咔里面
等 级:贵宾
威 望:53
帖 子:395
专家分:2640
注 册:2018-3-30
得分:10 
就是一个缓冲区问题,读入类型和输入的类型不一样,读不进来,数据还留在缓冲区不会动,无限读也读不进来数据。
用while(getchar()!='\n');清除缓冲区一行数据,清除了再读就可以了。

saber,别哭.
2018-11-09 21:42
Tomorrw_I
Rank: 10Rank: 10Rank: 10
等 级:禁止访问
威 望:6
帖 子:406
专家分:1712
注 册:2018-10-16
得分:10 
大胸弟啊,为何你老是和这个问题过不去呢!
第一段死循环,给你讲过了!

给你讲下第二段吧!
    while(a!=1)
    {
        while(getchar()!='\n')                            在你输入一个字符之后,进入循环!  第一次运行,getchar读入了你输入的字符,然后这句的循环成立,continue,进入下次循环,你在输入字符后,打过一个回车,   这里读取了回车,  所以跳出循环!   
            continue;
        printf("please enter a float number:");     然后执行到这里,
        a=scanf("%f",&num1);                        接着,你输入数字。  a=1!!!  这个循环结束,a=1!!!!所以跳出了while(a!=1)  这个循环
    }

学C有用吗?
学C++有前途吗?
数据库有必要学吗?
……
别问,你还什么都不会,学就对了
……
2018-11-09 21:45
fclzss
Rank: 2
等 级:论坛游民
帖 子:32
专家分:11
注 册:2018-11-7
得分:0 
回复 3楼 fclzss
再一次给大神献上膝盖,我差不多懂了,是不是可以理解为数据在缓冲区成功读取一个就删掉一个,如果不成功则留在缓冲区,所以导致无限循环,看来我需要看一下缓冲区和数据流的知识了,大佬有什么推荐给我这个小白么
2018-11-09 21:53
fclzss
Rank: 2
等 级:论坛游民
帖 子:32
专家分:11
注 册:2018-11-7
得分:0 
回复 4楼 幻紫灵心
感谢大神,你昨天说的我明白了,再经过4楼和你今天的解释这个问题我就全懂了
2018-11-09 21:59
Tomorrw_I
Rank: 10Rank: 10Rank: 10
等 级:禁止访问
威 望:6
帖 子:406
专家分:1712
注 册:2018-10-16
得分:0 
printf("now please enter first num:");              请输入一个数字,
a=scanf("%f",&num1);                                老子就不,我就要输入一个字符。。    scanf:这个是啥,我不懂!   缓冲区:我这有个东西,你读下啊!   
    while(a!=1)                                       scanf:我读了啊,不是我的东西,我读不进去啊!      缓冲区:我这有个东西,你倒是读啊!!!!
    {                                                 scanf:我读了,我试了,就是读不进去啊!            缓冲区: 读不进去,不行,今天你必须读!!!
        printf("please enter a float number:");       请输入一个浮点数啊!!!   
        a=scanf("%f",&num1);                          scanf:缓冲区兄弟,我来读了!                      缓冲区:赶紧把你的东西取走!
    }                                                 scanf:咋又是这玩意,我说了这不是我的东西啊!    缓冲区:你大爷的,客户说这是你的东西!你必须读走!你不读走,我其他的快递没办法送啊,速度
                                                      scanf:。。。。。。。。。。。。。。              缓冲区:。。。。。。。。。。。。。
                                                      scanf:。。。。。。。。。。。。。。              缓冲区:。。。。。。。。。。。。。
                                                      scanf:。。。。。。。。。。。。。。              缓冲区:。。。。。。。。。。。。。

学C有用吗?
学C++有前途吗?
数据库有必要学吗?
……
别问,你还什么都不会,学就对了
……
2018-11-09 22:05
Tomorrw_I
Rank: 10Rank: 10Rank: 10
等 级:禁止访问
威 望:6
帖 子:406
专家分:1712
注 册:2018-10-16
得分:0 
回复 7楼 fclzss
感觉你在较劲

学C有用吗?
学C++有前途吗?
数据库有必要学吗?
……
别问,你还什么都不会,学就对了
……
2018-11-09 22:06
fclzss
Rank: 2
等 级:论坛游民
帖 子:32
专家分:11
注 册:2018-11-7
得分:0 
回复 8楼 Tomorrw_I
这个比喻真特么形象。这两天做的编程题目中全是要求要求有选择界面外加重复输入,做的我头晕,越想越不明白根本原因,大脑都快宕机了
2018-11-09 22:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-491120-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.639013 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved