标题:大佬们帮忙看下为啥会出现死循环
只看楼主
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);
}
搜索更多相关主题的帖子: printf sum flag rand while 
2018-06-10 15:03
liaohs
Rank: 4
等 级:业余侠客
威 望:7
帖 子:61
专家分:292
注 册: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
等 级:业余侠客
威 望:7
帖 子:61
专家分:292
注 册:2017-11-26
得分:0 
用scanf字符串输入代替getchar。
用strcmp字符串比较代替字符比较。
2018-06-10 16:07
幻紫灵心
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山咔咔里面
等 级:贵宾
威 望:53
帖 子:395
专家分:2640
注 册: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编辑过]


saber,别哭.
2018-06-10 17:47



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




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

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