| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 542 人关注过本帖
标题:新手求助,请大家看看是什么问题!
只看楼主 加入收藏
budong998
Rank: 2
等 级:论坛游民
帖 子:25
专家分:15
注 册:2010-7-18
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:9 
新手求助,请大家看看是什么问题!
刚刚学习C语言一个月,是用谭浩强视频都程自学的.学到循环控制了.为了巩固一下所学的,就自己写了几句,但是有问题,有时会死循环.TC写的.
所写的程序大致目的是:输入一个算式(+,_,*,/)和算式的结果,计算机判结果对错。一个算式连错三次计算机给结果,并记录错与对的题数和每题的平均错次数。下面把程序贴出来分析一下,当我输入错误,成2+5++*,也就是后面多回两个符号就成了死循环了。
#include "stdio.h"
main()
{
   float a,b,c,d;
   int e=0,f=0,g=0,n=0;     
   char x,y;                    /*定义运算符号*/
   begin:
   printf("input count, example: 0+0=0 \n");   /*显示输入提示*/
   scanf("%f%c%f%c%f",&a,&x,&b,&y,&c);   /*输入算式,格式为0.0+0.0=0.0*/
   if(y=='='&&(x=='+'||x=='-'||x=='*'||x=='/')) /*判断运算符是否正确*/        
   {
      go: switch(x)
      {
         case  '+':  d=a+b; break;
         case  '-':  d=a-b; break;
         case  '*':  d=a*b; break;
         case  '/':   d=a/b; break;
      }
      if(d==c)   /*判断计算结果*/   
      {
         e++; f=0;         /*正确结果计数;错误结果小于三次时计算正确,错误次数置0*/
        printf("right %d number! \n input 'e' key to exit! any key continue! \n",e);   /*显示计算正确次数,并提示输入e退出或继续*/
         getchar();                                /*选择是否继续*/           
         if(getchar()!='e')   goto begin;   /*用户输入不为e时返回开始,否则退出程序*/
     }
      else
     {
         f++; n++;           /*本题计算错误计数与全部题计算错误计数*/
        printf("error %d !redo:\n%f%c%f=",f,a,x,b);  /*显示本题错误次数与算式*/
         scanf("%f",&c);    /*重新输入计算结果*/
         if(f==3)              /*如果本题计算出现3次错误*/
        {
           printf("fool!\n%f%c%f=%f\n redo the count:\n",a,x,b,d);    /*显示正确结果,并提示再做题*/
            g++;  f=0;          /*累计错误数,并把本题错误次数置0*/
           goto begin;         /*本题结束,返回到开始*/
         }
         goto go;              /*本题错误小于三次时,返回到判断计算结果*/
      }
   }
   else
     {
      printf(" the sign is error!\n");  goto begin;   /*运算符错误返回开始*/
    }
   printf("right %d.error %d,each count done wrong  %d times!\n",e,g,n/(e+g));/*退出程序时显示对和错的题数,并显示平均每题错误次数*/
   system("pause");
}
搜索更多相关主题的帖子: C语言 计算机 
2010-07-18 19:54
budong998
Rank: 2
等 级:论坛游民
帖 子:25
专家分:15
注 册:2010-7-18
收藏
得分:0 
怎么没人回我呢?各位大帮个忙看看嘛.
2010-07-18 21:25
peace1221
Rank: 2
等 级:论坛游民
帖 子:32
专家分:35
注 册:2010-7-9
收藏
得分:0 
你那最后一句是什么意思啊?
2010-07-18 21:35
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:10 
scanf()会造成死循环的凶手 下面解析:

while(a!=1)
 scanf("%d",&a);
这个代码 如果输入非数字时会出现死循环 原因如下:
本来是如果输入非1时 应该可以再输入 再判断
但是scanf()对输入非数字时 判断为非法值
它就不会读取它,此非数字会留在缓冲区中,当下一次调用
scanf()时,它会去读缓冲区的数据,而缓冲区的数据就是刚才
输入的非数字,所以又进入了循环,从而进入了死循环

解决方法是1:在输入的时候判断一下是否为合法值

if(scanf()==0) 时是输入非法值
解决方法2:清空缓冲区
  在scanf()后面加上fflush(stdin);清空输入缓冲区

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-18 21:39
budong998
Rank: 2
等 级:论坛游民
帖 子:25
专家分:15
注 册:2010-7-18
收藏
得分:0 
回复 3楼 peace1221
暂停才能在屏幕上显示结果呀.
2010-07-18 21:59
budong998
Rank: 2
等 级:论坛游民
帖 子:25
专家分:15
注 册:2010-7-18
收藏
得分:0 
回复 4楼 do8do8do8
谢谢do8!我试试看.
2010-07-18 22:00
budong998
Rank: 2
等 级:论坛游民
帖 子:25
专家分:15
注 册:2010-7-18
收藏
得分:0 
回复 4楼 do8do8do8
谢谢你!按你说的我在scanf()后面加了fflush(stdin);以后,死循环没有了,但新的问题又来了.
 printf("right %d number! \n input 'e' key to exit! any key continue! \n",e);   /*显示计算正确次数,并提示输入e退出或继续*/
         getchar();                                /*选择是否继续*/           
         if(getchar()!='e')   goto begin;   /*用户输入不为e时返回开始,否则退出程序*/
这句不对了,当直接输入e回车不能退出.又回到begin了.但是先按下回车,再输e就可以继续后面不返回begin.
麻烦你再帮忙看看,讲解一下是什么原因?谢谢!


[ 本帖最后由 budong998 于 2010-7-18 22:46 编辑 ]
2010-07-18 22:34
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:10 
回复 7楼 budong998
那是你用了两个getchar(),把if()前面的那个getchar()删掉即可。

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-19 08:57
guxingzhe
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-7-12
收藏
得分:0 
问题很好啊
2010-07-19 10:08
budong998
Rank: 2
等 级:论坛游民
帖 子:25
专家分:15
注 册:2010-7-18
收藏
得分:0 
回复 8楼 do8do8do8
去掉一个getchr可以了。谢谢你的帮助!
2010-07-19 13:42
快速回复:新手求助,请大家看看是什么问题!
数据加载中...
 
   



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

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