首页 > 技术文章 > 实验一 小学四则运算修改版

LHYwin 原文

 #include<stdio.h>
#include<stdlib.h>
#include<time.h>
int n;//记录输入的题目个数
int a,b,c,da;//a,b分别代表第一,第二操作数,c代表得数,da代表输入的答案
float score=0;//记录总分数
float j,k,L;//分别计算答对的分数
float lv;//计算答对的概率
//进行加法运算
void jia()
{
    int i;
    j=k=0;
    lv=0;
    printf(" 欢迎使用,以下是加法运算 ");
    printf("请输入题目数:");
    fflush( stdin );
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        a=rand()%100;
        b=rand()%100;
        c=a+b;
        printf(" %d+%d=? ",a,b);
        printf("请输入你的答案(答对一题5分):");
        fflush( stdin );
        scanf("%d",&da);
         if(da==c)  //判断答案是否正确
         {
            printf(" 恭喜你,答对了! ");
            j=j+5;

         }
        else
        {
            printf(" 抱歉,你答错了!你还有一次机会 ");
            printf(" %d+%d=? ",a,b);
            printf("请输入你的答案:");
            fflush( stdin );
            scanf("%d",&da);

            if(da==c)
            {
                printf(" 恭喜你,答对了! ");
                k=k+5;
            }
            else  printf(" 抱歉,你又答错了,正确答案是:%d+%d=%d ",a,b,c);
        }
    }
    score=j+k;
    lv=(score/(5*n))*100;
    printf(" 加法运算中所得的分数为%.f分 答对概率为百分之%.2f ",score,lv);
}
//进行减法运算
void jian()
{
    int i,temp;//temp是中间变量
    j=k=0;
    lv=0;
    printf(" 欢迎使用,以下是减法运算 ");
    printf("请输入题目数:");
    fflush( stdin );
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        a=rand()%100;
        b=rand()%100;
        if(a<b)//保证得出的数不是负数
        {
            temp=a;
            a=b;
            b=temp;
        }
        c=a-b;
        printf(" %d-%d=? ",a,b);
        printf("请输入你的答案:");
        fflush( stdin );
        scanf("%d",&da);
        if(da==c)
        {
            printf(" 恭喜你,答对了! ");
            j=j+5;
        }
        else
        {
            printf(" 抱歉,你答错了,你还有一次机会 ");
            printf(" %d-%d=? ",a,b);
            printf("请输入你的答案:");
            fflush( stdin );
            scanf("%d",&da);
            if(da==c)
            {
                printf(" 恭喜你,答对了! ");
                k=k+5;
            }
            else  printf(" 抱歉,你又答错了,正确答案为:%d-%d=%d ",a,b,c);

        }
    }
    score=(j+k);
    lv=(score/(5*n))*100;
    printf(" 减法运算中所得的分数为%.f分 答对概率为百分之%.2f ",score,lv);
}
//进行乘法运算
void chen()
{
    int i;
    j=k=0;
    lv=0;
    printf(" 欢迎使用,以下是乘法题 ");
    printf(" 请输入题目数:");
    fflush( stdin );
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        a=rand()%100;
        b=rand()%100;
        c=a*b;
        printf(" %d*%d=? ",a,b);
        printf("请输入答案:");
        fflush( stdin );
        scanf("%d",&da);
        if(da==c)
        {
            printf(" 恭喜你,答对了! ");
            j=j+5;
        }
        else
        {
            printf(" 抱歉,你答错了,你还有一次机会! ");
            printf(" %d*%d=? ",a,b);
            printf("请输入答案:");
            fflush( stdin );
            scanf("%d",&da);
            if(da==c)
            {
                printf(" 恭喜你,答对了! ");
                k=k+5;
            }
            else  printf(" 抱歉,又答错了,正确答案为:%d*%d=%d ",a,b,c);
        }
    }
    score=j+k;
    lv=(score/(5*n))*100;            
    printf(" 乘法运算中所得的分数为%.f分 答对概率为百分之%.2f ",score,lv); 
}

//进行除法运算
void chu()
{
    int i;
    char dn;//用以保存除法运算符
    float an;//用以保存除法运算得出的答案
    int fenzi,fenmu;//fenzi是分子,fenmu是分母
    j=k=L=0;
    lv=0;
    printf(" 欢迎使用,以下是除法题 ");
    printf("请输入题数:");
    fflush( stdin );
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        a=rand()%100;
        b=rand()%99+1;//使得随机出现的数不会有0,保证了除数不会出现0情况,即不会出现无意义的情况
        c=a/b;
        if(a%b==0)  //判断数能否除尽,若a对b求余为0,则说明除得尽,以整数形式输入,否则则为除不尽,提示以分数输入
        {
               printf(" %d/%d=? ",a,b);
               printf(" 请输入你的答案:");
               fflush( stdin );
               scanf("%f",&an);
            if(an==c)
            {
                printf("恭喜你,答对了! ");
                j=j+5;
            }
            else
            {
                   printf("抱歉,你答错了,你还有一次机会! ");
                   printf(" %d/%d=? ",a,b);
                   printf(" 请输入你的答案:");
                   fflush( stdin );
                   scanf("%f",&an);
                   if(an==c)  
                   {
                       printf("恭喜你,答对了! ");
                       k=k+5;
                   }
                   else  printf("抱歉,你又答错了,正确答案为:%d/%d=%d ",a,b,c);
            }
        }
        else
        {
            //dn='/';//dn保存除法运算符
            printf(" %d/%d=? ",a,b);
            printf(" 请输入你的答案(请以分数形式输入) ");
            printf(" 请输入分子:");
            fflush( stdin );
            scanf("%d",&fenzi);
            printf("请输入分母:");
            fflush( stdin );
            scanf("%d",&fenmu);
            if(fenzi/fenmu==a/b)
            {
                printf("恭喜你,答对了! ");
                L=L+5;
            }
             
            else
                printf("抱歉,你答错了,正确答案为:%d/%d=%d ",a,b,c);
        }
    }
    score=(j+k+L);
    lv=(score/(5*n))*100;
    printf(" 除法运算中所得的分数为%.f分 中奖率为百分之%.2f ",score,lv);
}
int selectmenu()
{
    int choice;
    do
    {
        printf(" 1:加法运算 ");
        printf(" 2:减法运算 ");
        printf(" 3:乘法运算 ");
        printf(" 4:除法运算 ");
        printf(" 5:谢谢使用 ");
        printf("请选择(1-5):");
        fflush( stdin );
        scanf("%d",&choice);
        while(choice!=1&&choice!=2&&choice!=3&&choice!=4&&choice!=5)
        {
            printf("不存在该选项,请重新选择(1-5):");
            fflush(stdin);        //清空输入缓存区,否则字符会一直留在缓存区,使程序进入一个死循环
            scanf("%d",&choice);
        }
    }while((choice<0)||(choice>6));
    system("cls");    //清楚屏幕
    return choice;
}
void main()
{

    int choice;
    srand((unsigned)time(NULL));//随机产生0-99之间的随机数
    while(1)
    {
        switch(choice)
        {
        case 1:
            jia();                            
            break;
        case 2:
            jian();                                 
            break;
        case 3:
            chen();                             
            break;
        case 4:
            chu();
            break;
        case 5:    
            printf("谢谢使用");
            exit(0);

        }
        choice=selectmenu();
    }

结果:

总结:

1、解决了在菜单选择中如果输入的是字符的时候会提示出错,用的是fflush()函数,由于要清除的是存在缓冲区内的字符,因此用fflush(stdin),

stdin就是标准输入,一般就是指键盘输入到缓冲区里的东西,scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:

① 遇空格、“回车”、“跳格”键;

② 遇宽度结束;

③ 遇非法输入;

scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中 解决就要在scanf()函数之后加个fflush(stdin)。

2、解决了上一回没有解决的问题:当出现结果除不尽的情况时,用户输入的数没有以分数形式输入时,不知如何设置提示输入错误,尝试用while语句来判断时,如果输入整型,无论结果是否对都会提示对了

解决办法:将分数分开来输入,依次提示输入分子与分母。

推荐阅读