实现一个自动生成小学四则运算题目的命令行程序

Posted sumilekaedei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现一个自动生成小学四则运算题目的命令行程序相关的知识,希望对你有一定的参考价值。

Github项目地址:https://github.com/sumilekaedei/Myapp.git

题目:实现一个自动生成小学四则运算题目的命令行程序。

          自然数:0, 1, 2, …。

  • 真分数:1/2, 1/3, 2/3, 1/4, 1’1/2, …。
  • 运算符:+, ?, ×, ÷。
  • 括号:(, )。
  • 等号:=。
  • 分隔符:空格(用于四则运算符和等号前后)。
  • 算术表达式:

e = n | e1 + e2 | e1 ? e2 | e1 × e2 | e1 ÷ e2 | (e),

其中e, e1和e2为表达式,n为自然数或真分数。

  • 四则运算题目:e = ,其中e为算术表达式。

效能分析:分别对1、2、3个运算符的式子进行讨论,列出其中可能出现的情况,对其中没有提到出现的情况进行改进。

设计实现过程:其中又一个主函数和五个子函数构成,子函数间也会相互调用。主函数中,调用生成问题的函数,然后生成问题函数调用随机函数和生成答案函数,生成答案的函数也会调用生成问题函数和辗转相除的函数。

代码说明:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

char getSignal()//运算符
int random(int a)//随机数 
int gcd(int x,int y)//辗转相除法 
int answers(int y,int num,int num1,int num2,int num3,int num4,char signal1,char signal2,char signal3,int r)//生成答案 
int question(int y,int r)//生成题目
{
    FILE *fp;//srand((unsigned)time(0));
    int get;
    int num,num1,num2,num3,num4;
    char signal1,signal2,signal3;
    signal1=getSignal();
    signal2=getSignal();
    signal3=getSignal();
    num1=random(r);
    num2=random(r);
    num3=random(r);
    num4=random(r);
    num=rand()%3+1;
    if(num==1)
    {
         answers(y,num,num1,num2,num3,num4,signal1,signal2,signal3,r);
         fp=fopen("Exercises.txt","a");
         fprintf(fp,"题目%d:%d %c %d = 
",y,num1,signal1,num2);
         fclose(fp);
    }
    if(num==2)
    {
         answers(y,num,num1,num2,num3,num4,signal1,signal2,signal3,r);
         fp=fopen("Exercises.txt","a");
         fprintf(fp,"题目%d:%d %c %d %c %d = 
",y,num1,signal1,num2,signal2,num3);
         fclose(fp);
        }
    if(num==3)
    {
         answers(y,num,num1,num2,num3,num4,signal1,signal2,signal3,r);
         fp=fopen("Exercises.txt","a");
         fprintf(fp,"题目%d:%d %c %d %c %d %c %d = 
",y,num1,signal1,num2,signal2,num3,signal3,num4);
         fclose(fp);
    }
    return 0;
} 
int main()
{
    srand((unsigned)time(0));
    FILE *fp;
    fp=fopen("Exercises.txt","w");
    fclose(fp);
    fp=fopen("Answers.txt","w");
    fclose(fp);
    int n,r;
    int y=1;
    char argv1[3];
    char argv2[3];
    //n=10,r=10;
    scanf("%s",argv1);//-n
    scanf("%d",&n);;
    scanf("%s",argv2);//-r
    scanf("%d",&r);
    if(!strcmp(argv1,"-n")&&!strcmp(argv2,"-r"))
    {
        while(n>0)
        {
            question(y,r);
            y++;
            n--;
        }
    }
    else printf("输入错误!");
    return 0;
}

 

测试运行:

技术分享图片

 

技术分享图片

技术分享图片

技术分享图片

 

技术分享图片

技术分享图片

技术分享图片

 

PSP2.1表格:

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

   

· Estimate

· 估计这个任务需要多少时间

720

2160

Development

开发

   

· Analysis

· 需求分析 (包括学习新技术)

240

720

· Design Spec

· 生成设计文档

60

80

· Design Review

· 设计复审 (和同事审核设计文档)

120

150

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

90

90

· Design

· 具体设计

120

150

· Coding

· 具体编码

600

1440

· Code Review

· 代码复审

120

300

· Test

· 测试(自我测试,修改代码,提交修改)

240

240

Reporting

报告

   

· Test Report

· 测试报告

30

30

· Size Measurement

· 计算工作量

15

20

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

30

30

合计

 

1665

3330

 项目小结:这次的项目,开始看题目以为很简单,但是到了实际做的时候,因为需求比较多,做起来非常困难,而且其中又很多自己原来没有学会的做法。而且这个程序做的不太好,虽然勉强能实现基本功能,但是括号、题目中有真分数等功能没有能实现,而且其中也有很多bug没有得到有效解决。

 

以上是关于实现一个自动生成小学四则运算题目的命令行程序的主要内容,如果未能解决你的问题,请参考以下文章

结对项目----实现一个自动生成小学四则运算题目的命令行程序

小学四则运算

小学四则运算生成Java实现 (彭迪彬 李尤)

四则运算题目生成程序

四则运算

超级无敌小学四则运算题目程序