首页 > 技术文章 > 实现“小学生算术题出题器”

kingsman 2016-03-10 18:48 原文

本次作业要求:(1)出题器可以随机出四则运算。(2)真分数的运算。以下为程序运行截图:

 

根据使用说明来输入整数题目的数量,以及分数题目的数量,这里分别以5道题为例。

如果回答正确就会提示“回答正确”,回答错误则会提示“回答错误”。所有题目全部回答完毕将会给出得分情况。

为了便于打印,将所有的算术题存到了文本中。

以上为该程序的内容和使用详情,以下为程序源代码:

Coding链接(https://coding.net/u/Kingsman/p/xiaoxuesuanshu/git/blob/master/%E5%B0%8F%E5%AD%A6%E7%AE%97%E6%9C%AF)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
    int add(int);
    int sub(int);
    int mult(int);
    int divi(int);
    int max(int,int);
    int gys(int,int);

int main()
{
    FILE *fp;fp=fopen("count.txt","a+");
    srand((unsigned)(time(NULL)));
    int i,m,n;int answer,t,right=0,score=0;
    printf("\t\t\t\t\t欢迎使用小学四则运算出题器\n使用说明:请根据提示输入题目的数量,需要多少道分数题。\n\t  整数除法题目如果存在余数请输入余数。\n\t  真分数计算题的答案先输入分子再输入分母。");
    printf("\n请输出整数题目数量:\n");
    scanf("%d",&n);
    printf("\n请输入分数题目数量:\n");
    scanf("%d",&t);
    for(m=0;m<n;m++)                                                   //整数计算
    {
        i=rand()%4+1;
        switch(i)
        {
            case 1:answer=add(1);
            if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
            case 2:answer=sub(1);
            if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
            case 3:answer=mult(1);
            if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
            case 4:answer=divi(1);
            if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
        }
    }
    for(m=0;m<t;m++)                                                     //分数计算
    {
         i=rand()%4+1;
        switch(i)
        {
            case 1:answer=add(2);
            if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
            case 2:answer=sub(2);
            if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
            case 3:answer=mult(2);
            if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
            case 4:answer=divi(2);
            if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
        }
    }
    printf("共有%d道题,答对%d道,总得分:%d\n",n+t,right,score);               //输出
    fclose(fp);
    return 0;
}
int max(int a,int b)
{
    if(a>=b)return a;
    else return b;
    }                                            //求最大值
int gys(int a,int b)
{
    if(a%b)return gys(b,a%b);
    return b;
}                                                //求最大公约数
int add(int q)
{
    FILE *fp;fp=fopen("count.txt","a+");                                                                                                            //加法
    if(q==1)
    {
    srand((unsigned)(time(NULL)));
    int a=rand()%100+1,b=rand()%100+1;int answer;
    printf("%d + %d =",a,b);
    fprintf(fp,"%d + %d =\n",a,b);
    scanf("%d",&answer);
    if(a+b==answer)
    return 1;
    else return 0;
    }
    if(q==2){
        int e,f,x,y,z,x1,x2,x3,x4,a=rand()%15+1,b=rand()%13+1,c=rand()%13+1,d=rand()%15+1;
        char ch;
        srand((unsigned)(time(NULL)));
        x1=a+b-max(a,b);
        x2=max(a,b);
        x3=c+d-max(c,d);
        x4=max(c,d);
        x=gys(x1,x2);
        x1=x1/x;
        x2=x2/x;
        x=gys(x3,x4);
        x3=x3/x;
        x4=x4/x;
        printf("%d/%d + %d/%d =",x1,x2,x3,x4);
        fprintf(fp,"%d/%d + %d/%d =\n",x1,x2,x3,x4);
        scanf("%d%c%d",&e,&ch,&f);                                                                                                               //e为分子,f为分母
        y=(x2*x4)/gys(x2,x4);                                                                                                                                   //同分分母 y
        x=(x1)*y/x2+(x3)*y/x4;                                                                                                                               //同分分子 x
        z=gys(x,y);
        if(z==1)
        {
            if(x==e&&y==f)return 1;
            else return 0;
            }
            else if(x/z==e&&y/z==f)
            return 1;
            else return 0;
    }
}
int sub(int q)
{
    int p;
    FILE *fp;
    fp=fopen("count.txt","a+");
    if(q==1)
    {
    srand((unsigned)(time(NULL)));
    int a=rand()%100+1,b=rand()%100+1;
    int answer;
    if(a>b)
    printf("%d - %d =",a,b);
    else
    {
        p=a;
        a=b;
        b=p;
        printf("%d - %d =",a,b);
    }
    fprintf(fp,"%d - %d =\n",a,b);
    scanf("%d",&answer);
    if(a-b==answer)
    return 1;
    else return 0;
    }
    if(q==2)
    {
        int e,f,x,y,z,x1,x2,x3,x4,a=rand()%15+1,b=rand()%15+1,c=rand()%15+1,d=rand()%15+1;
        char ch;
        srand((unsigned)(time(NULL)));
        x1=a+b-max(a,b);
        x2=max(a,b);
        x3=c+d-max(c,d);
        x4=max(c,d);                                                            
        x=gys(x1,x2);
        x1=x1/x;
        x2=x2/x;
        x=gys(x3,x4);
        x3=x3/x;x4=x4/x;
        x=gys(x2,x4);
        y=x1*x4/x;
        z=x3*x2/x;
        if(y-z<0)
        {
            x=x1;
            x1=x3;
            x3=x;
            x=x2;
            x2=x4;
            x4=x;
            }
        printf("%d/%d - %d/%d =",x1,x2,x3,x4);
        fprintf(fp,"%d/%d - %d/%d =\n",x1,x2,x3,x4);
        scanf("%d%c%d",&e,&ch,&f);                                    
        y=(x2*x4)/gys(x2,x4);                                                                                                                              //同分分母 y
        x=(x1)*y/x2-(x3)*y/x4;                                                                                                                           //同分分子 x
        z=gys(x,y);
        if(z==1)
        {
            if(x==e&&y==f)
            return 1;
            else return 0;
            }
            else if(x/z==e&&y/z==f)
            return 1;
            else return 0;
    }
}
int mult(int q)
{
    FILE *fp;
    fp=fopen("count.txt","a+");
    if(q==1){
    srand((unsigned)(time(NULL)));
    int a=rand()%60+1,b=rand()%60+1;
    int answer;
    printf("%d * %d =",a,b);
    fprintf(fp,"%d * %d =\n",a,b);
    scanf("%d",&answer);
    if(a*b==answer)
    return 1;
    else return 0;
    }
    if(q==2){
        int e,f,x,y,z,x1,x2,x3,x4,a=rand()%15+1,b=rand()%15+1,c=rand()%15+1,d=rand()%15+1;
        char ch;
        srand((unsigned)(time(NULL)));
        x1=a+b-max(a,b);
        x2=max(a,b);
        x3=c+d-max(c,d);
        x4=max(c,d);                                                   //x1是被乘数分子,x2被乘数分母,x3乘数分子,x4乘数分母
        x=gys(x1,x2);
        x1=x1/x;
        x2=x2/x;
        x=gys(x3,x4);
        x3=x3/x;
        x4=x4/x;
        printf("%d/%d * %d/%d =",x1,x2,x3,x4);
        fprintf(fp,"%d/%d * %d/%d =\n",x1,x2,x3,x4);
        scanf("%d%c%d",&e,&ch,&f);                                      //e为分子,f为分母
        y=x2*x4;                                                                                                                                                     //同分分母 y
        x=x1*x3;                                                                                                                                                      //同分分子 x
        z=gys(x,y);
        if(z==1)
        {
            if(x==e&&y==f)
            return 1;
            else return 0;
            }
            else if(x/z==e&&y/z==f)
            return 1;
            else return 0;
    }
}
int divi(int q){
    FILE *fp;
    fp=fopen("count.txt","a+");
    if(q==1)
    {
    srand((unsigned)(time(NULL)));
    int a=rand()%40+1,b=rand()%20+1;
    int answer,re;
    printf("%d / %d =",a,b);
    fprintf(fp,"%d / %d =\n",a,b);
    if(a%b==0)
    {
        scanf("%d",&answer);
        if(a/b==answer)
        return 1;
        else return 0;
        }
    else
    {
        scanf("%d",&answer);
        printf("余数为:");
        scanf("%d",&re);
        if(a/b==answer&&a%b==re)
        return 1;
        else return 0;
        }
    }
    if(q==2)
    {
         int e,f,x,y,z,x1,x2,x3,x4,a=rand()%15+1,b=rand()%15+1,c=rand()%15+1,d=rand()%15+1;
         char ch;
        srand((unsigned)(time(NULL)));
        x1=a+b-max(a,b);
        x2=max(a,b);
        x3=c+d-max(c,d);
        x4=max(c,d);                                              //x1是被乘数分子,x2被乘数分母,x3乘数分子,x4乘数分母
        x=gys(x1,x2);
        x1=x1/x;
        x2=x2/x;
        x=gys(x3,x4);
        x3=x3/x;
        x4=x4/x;
        printf("(%d/%d) / (%d/%d) =",x1,x2,x3,x4);
        fprintf(fp,"(%d/%d) / (%d/%d) =\n",x1,x2,x3,x4);
        scanf("%d%c%d",&e,&ch,&f);                                //e为分子,f为分母
        y=x2*x3;                                                                                                                                                     //同分分母 y
        x=x1*x4;                                                                                                                                                      //同分分子 x
        z=gys(x,y);
        if(z==1)
        {
            if(x==e&&y==f)
            return 1;
            else return 0;
            }
            else if(x/z==e&&y/z==f)
            return 1;
            else return 0;
    }
}

 

推荐阅读