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

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 = \n",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 = \n",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 = \n",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没有得到有效解决。在编写程序的时候,最主要的问题就是对随机出现的运算符进行讨论,因为出现了很多种情况,在编写过程中容易出现遗漏,或者算法不正确等情况,导致最后得到的答案不同,基本上处理方法都是调试,观察程序运行到哪步出现错误,然后对算法出错的那段代码进行修改。在随机函数的调用当中,srand((unsigned)time(0));这句话的使用如果出现在循环当中,就会导致输出的结果全部都是相同的,这句话要放在循环之外就能解决问题。

posted on 2018-09-30 12:38  kaedei丶  阅读(1010)  评论(1编辑  收藏  举报