| 网站首页 | 业界新闻 | 群组 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 259 人关注过本帖
标题:大佬们帮忙看下为啥会出现死循环
只看楼主 收藏
SakuraD
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-5-6
结帖率:50%
  已结贴   问题点数:10  回复次数:4   
大佬们帮忙看下为啥会出现死循环
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
void menu()
{printf("*****欢迎进入小学生四则运算*****\n");
printf("1.加法\n");
printf("2.减法\n");
printf("3.乘法\n");
printf("4.除法\n");
printf("5.退出\n");
printf("按'Q'退出并重新选择运算方式");
}
void plu()
{int a,b,sum,c,flag=1;
char key;
do
{srand((unsigned)time(NULL));
a=rand(90)+10;
b=rand(90)+10;
sum=a+b;
printf("\n%d+%d=",a,b);
do
{scanf("%d",&c);
if(sum==c)
{printf("回答正确,请继续\n");break;}
else printf("回答错误,请重新回答\n");
}while(1);
printf("按任意键继续按'Q'返回重新选择运算方式");
if((key=getchar())=='Q')
flag=0;
}while(flag);
}
void sub()
{int a,b,sum,c,flag=1;
char key;
do
{srand((unsigned)time(NULL));
a=rand(90)+10;
b=rand(90)+10;
sum=a-b;
printf("\n%d-%d=",a,b);
do
{scanf("%d",&c);
if(sum==c)
{printf("回答正确,请继续\n");break;}
else printf("回答错误,请重新回答\n");
}while(1);
printf("按任意键继续按'Q'返回重新选择运算方式");
if((key=getchar())=='Q')
flag=0;
}while(flag);
}
void mul()
{int a,b,sum,c,flag=1;
char key;
do
{srand((unsigned)time(NULL));
a=rand(90)+10;
b=rand(90)+10;
sum=a*b;
printf("\n%d*%d=",a,b);
do
{scanf("%d",&c);
if(sum==c)
{printf("回答正确,请继续\n");break;}
else printf("回答错误,请重新回答\n");
}while(1);
printf("按任意键继续按'Q'返回重新选择运算方式");
if((key=getchar())=='Q')
flag=0;
}while(flag);
}
void divi()
{int a,b,sum,c,flag=1;
char key;
do
{srand((unsigned)time(NULL));
a=rand(90)+10;
b=rand(90)+10;
while(a%b!=0)
{a=rand(90)+10;
b=rand(90)+10;
}
sum=a/b;
printf("\n%d/%d=",a,b);
do
{scanf("%d",&c);
if(sum==c)
{printf("回答正确,请继续\n");break;}
else printf("回答错误,请重新回答\n");
}while(1);
printf("按任意键继续按'Q'返回重新选择运算方式");
if((key=getchar())=='Q')
flag=0;
}while(flag);
}
main()
{int key1;
do
{menu();
scanf("%d",&key1);
switch(key1)
{case 1:plu();
break;
case 2:sub();
break;
case 3:mul();
break;
case 4:divi();
}
}while(key1!=5);
}
2018-06-10 15:03
liaohs
Rank: 4
等 级:业余侠客
威 望:6
帖 子:61
专家分:276
注 册:2017-11-26
  得分:5 
一个程序中不应同时使用scanf和getchar,因为
getchar经常读到scanf输入后的换行苻。


2018-06-10 15:51
SakuraD
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-5-6
  得分:0 
回复 2楼 liaohs
能指导一下怎么改吗,新手上路不会改
2018-06-10 15:59
liaohs
Rank: 4
等 级:业余侠客
威 望:6
帖 子:61
专家分:276
注 册:2017-11-26
  得分:0 
用scanf字符串输入代替getchar。
用strcmp字符串比较代替字符比较。
2018-06-10 16:07
幻紫灵心
Rank: 2
来 自:山咔咔里面
等 级:论坛游民
帖 子:21
专家分:92
注 册:2018-3-30
  得分:5 
把你的代码整个复制下来改了一下,这个可以正常运行了。
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
void menu()
{
    printf("*****欢迎进入小学生四则运算*****\n");
    printf("1.加法\n");
    printf("2.减法\n");
    printf("3.乘法\n");
    printf("4.除法\n");
    printf("5.退出\n");
}
void plu()
{
    int a,b,sum,c,flag=1;
    char key;
    do
    {    srand((unsigned)time(NULL));
        a=rand()%100;
        b=rand()%100;
        sum=a+b;
        printf("\n%d+%d=",a,b);
        do
        {   
            if(scanf("%d",&c)!=1)
                {flag=0;return;}
            if(sum==c)
            {printf("回答正确,请继续\n");break;}
            else printf("回答错误,请重新回答\n");
        }while(1);
            printf("输入非整数返回菜单\n");
        if((key=getchar())=='Q')
            {flag=0;while(getchar()!='\n');}
    }while(flag);
}
void sub()
{
    int a,b,sum,c,flag=1;
    char key;
    do
    {    srand((unsigned)time(NULL));
        a=rand()%100;
        b=rand()%100;
        sum=a-b;
        printf("\n%d-%d=",a,b);
        do
            {
            if(scanf("%d",&c)!=1)
                {flag=0;return;}
            if(sum==c)
            {printf("回答正确,请继续\n");break;}
            else printf("回答错误,请重新回答\n");
        }while(1);
        printf("输入非整数返回菜单\n");
    }while(flag);
}
void mul()
{
    int a,b,sum,c,flag=1;
    char key;
    do
    {    srand((unsigned)time(NULL));
        a=rand()%100;
        b=rand()%100;
        sum=a*b;
        printf("\n%d*%d=",a,b);
        do
        {   
            if(scanf("%d",&c)!=1)
                {flag=0;return;}
            if(sum==c)
            {printf("回答正确,请继续\n");break;}
            else printf("回答错误,请重新回答\n");
        }while(1);
        printf("输入非整数返回菜单\n");
    }while(flag);
}
void divi()
{
    int a,b,sum,c,flag=1;
    char key;
    do
    {srand((unsigned)time(NULL));
    a=rand()%10;
    b=rand()%10;
    while(a%b!=0)
    {a=rand()%100;
    b=rand()%100;
    }
    sum=a/b;
    printf("\n%d/%d=",a,b);
    do
    {
        if(scanf("%d",&c)!=1)
            {flag=0;return;}
        if(sum==c)
        {    printf("回答正确,请继续\n");break;}
        else printf("回答错误,请重新回答\n");
        }while(1);
        printf("输入非整数返回菜单\n");
    }while(flag);
}
main()
{
    int key1;
    do
    {   
        menu();
        scanf("%d",&key1);
        switch(key1)
        {    case 1:plu();
            break;
            case 2:sub();
            break;
            case 3:mul();
            break;
            case 4:divi();
        }
        while(getchar()!='\n');
    }while(key1!=5);
}

用这个可以读取缓冲区的非法字符解决你说的死循环问题
while(getchar()!='\n');

另外别的地方感觉错误也不少的样子。。。你用的除法是整除,和小学除法不一样的

[此贴子已经被作者于2018-6-10 17:52编辑过]

2018-06-10 17:47







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

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