zoukankan      html  css  js  c++  java
  • 2016012006小学四则运算练习软件项目报告

    项目源码地址:https://git.coding.net/cuixh998/week2homework2.git

    目录中的result.txt文件见测试效果。

    1.需求分析

    软件基本功能要求如下:

    Ⅰ程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。

    Ⅱ每个练习题至少要包含2种运算符。所出的练习题在运算过程中不得出现负数与非整数。

    Ⅲ练习题生成好后,将学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。

    软件附加功能要求如下:

    Ⅰ支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。

    Ⅱ扩展程序功能支持真分数的出题与运算(只需要涵盖加减法即可)。注意在实现本功能时,需支持运算时分数的自动化简,比如 1/2+1/6=2/3,而非4/6,且计算过程中与结果都须为真分数。

    2.功能设计

    Ⅰ基本功能:满足软件基本功能要求的前提下,实现四则运算的功能,并能够将题目输出到文本文件中。

    Ⅱ扩展功能:可以生成可以真分数的运算表达式,且分数可以自动化简。

    3.设计实现

    编码过程中只用了一个类通过调用不同的方法处理问题,实现程序的功能。

    4.算法详解

    部分代码如下,加入了一些注释,主要是采用了边生成边计算的方法。

      1 flag=0;//上一个符号为乘除,赋值1
      2         temp=0;//存储乘除多项式临时结果
      3         int count=0;//目前在计算的是第count+1个多项式
      4         for(i=0;i<number-1;i++) {//第一次循环,确定乘除号两边的数字
      5             if(fh[i]==3||fh[i]==4) {
      6                 if(flag==0&&fh[i]==4) {
      7                     czs[i]=1+(int)(Math.random()*99);
      8                     while(judge(czs[i])==false){
      9                         czs[i]=1+(int)(Math.random()*99);
     10                     }
     11                     czs[i+1]=1+(int)(Math.random()*99);
     12                     while(czs[i]%czs[i+1]!=0) {
     13                         czs[i+1]=1+(int)(Math.random()*99);
     14                     }
     15                     flag=1;
     16                     temp=czs[i]/czs[i+1];
     17                 }
     18                 else if(flag==0&&fh[i]==3){
     19                     czs[i]=1+(int)(Math.random()*99);
     20                     czs[i+1]=1+(int)(Math.random()*99);
     21                     flag=1;
     22                     temp=czs[i]*czs[i+1];
     23                 }
     24                 else if(flag==1&&fh[i]==3) {
     25                     czs[i+1]=1+(int)(Math.random()*99);
     26                     temp*=czs[i+1];
     27                 }
     28                 else {
     29                     czs[i+1]=1+(int)(Math.random()*99);
     30                     while(temp%czs[i+1]!=0) {
     31                         czs[i+1]=1+(int)(Math.random()*99);
     32                     }
     33                     temp/=czs[i+1];
     34                 }
     35             }
     36             else if(flag==1&&(fh[i]==1||fh[i]==2)){//初始化
     37                 ans[count++]=temp;
     38                 flag=0;
     39                 temp=0;
     40             }
     41         }
     42         if(flag==1) {//若最后一个符号为乘除
     43             ans[count++]=temp;
     44             flag=0;
     45             temp=0;
     46         }
     47         int finans=0;//最终结果
     48         count=0;
     49         for(i=0;i<number-1;i++) {//第二次循环,确定加减号两边的数字,并计算最终结果
     50             if(fh[i]==1||fh[i]==2) {
     51                 if(i==0) {
     52                     czs[i]=1+(int)(Math.random()*99);
     53                     finans=czs[i];    
     54                 }
     55                 else if(i==number-2) {
     56                     if(fh[i-1]==1||fh[i-1]==2) {
     57                         czs[i]=1+(int)(Math.random()*99);
     58                         if(finans==0&&fh[i-1]==2) {
     59                             fh[i-1]=1;
     60                         }
     61                         finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]);
     62                         while(finans<0) {
     63                             finans=finans+czs[i]+czs[i];
     64                             czs[i]=1+(int)(Math.random()*99);
     65                             finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]);
     66                         }
     67                     }
     68                     //
     69                     czs[i+1]=1+(int)(Math.random()*99);
     70                     if(finans==0&&fh[i]==2) {
     71                         fh[i]=1;
     72                     }
     73                     finans=((fh[i]==1)?finans+czs[i+1]:finans-czs[i+1]);
     74                     while(finans<0) {
     75                         finans=finans+czs[i+1]+czs[i+1];
     76                         czs[i+1]=1+(int)(Math.random()*99);
     77                         finans=((fh[i]==1)?finans+czs[i+1]:finans-czs[i+1]);
     78                     }
     79                 }
     80                 else {
     81                     if(fh[i-1]==1||fh[i-1]==2) {
     82                         czs[i]=1+(int)(Math.random()*99);
     83                         if(finans==0&&fh[i-1]==2) {
     84                             fh[i-1]=1;
     85                         }
     86                         finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]);
     87                         while(finans<0) {
     88                             finans=finans+czs[i]+czs[i];
     89                             czs[i]=1+(int)(Math.random()*99);
     90                             finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]);
     91                         }
     92                     }
     93                 }
     94             }
     95             else {
     96                 if(i==0) {
     97                     while(fh[i+1]==3||fh[i+1]==4) {
     98                         i++;
     99                         if(i==number-2) {
    100                             break;
    101                         }
    102                     }
    103                     finans=ans[count++];
    104                 }
    105                 else {
    106                     finans=(fh[i-1]==1)?finans+ans[count++]:finans-ans[count++];
    107                     if(finans<0) {
    108                         fh[i-1]=1;
    109                         finans=finans+ans[count-1]+ans[count-1];
    110                     }
    111                     if(i>=number-2) {
    112                         break;
    113                     }
    114                     while(fh[i+1]==3||fh[i+1]==4) {
    115                         i++;
    116                         if(i>=number-2) {
    117                             break;
    118                         }
    119                     }
    120                 }
    121             }
    122         }

    5.测试运行

    结果如图。

    6.部分代码片段

    首先是建立一个数组,其中包含0到100的所有素数,同时,通过数组满足程序基本功能的限制,即 3到5的随机数,最多5个操作数,乘除多项式结果,最多2个,最多四个运算符,符号若存在不同则改为1,并先行随机生成,再让符号保证不相同并随机替换。

     1 public static void work(int x) {
     2 //        int sushu[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
     3 //        int length=sushu.length;
     4         int number=3+(int) (Math.random()*3);
     5         int[] czs=new int[5];
     6         int[] ans=new int[2];
     7         int[] fh=new int[4];
     8         int i;
     9         int flag=0;
    10         int temp;
    11         for(i=0;i<number-1;i++) {
    12             fh[i]=1+(int) (Math.random()*4);
    13             if(fh[i]!=fh[0]) {
    14                 flag=1;
    15             }
    16         }
    17         if(flag==0) {
    18             while((temp=1+(int) (Math.random()*4))!=fh[0]) {
    19                 fh[(int) (Math.random()*(number-1))]=temp;
    20                 break;
    21             }
    22         }

    7.总结

    编程前:因为自己的java基础不好,有一种畏难心理,小心谨慎的分析项目需求以及如何一步步去实现它,而且需要使用java语言,必须拾起课本重新走一遍,压力挺大的,总觉得自己做不好。

    编程过程中:可以说是困难重重了,接二连三的问题扑面袭来,主要体现在哪里?1.编码严重不足,动手能力没有得到充分的锻炼,导致“眼高手低”。2.java基础差,不断的去翻书,去百度,去请教舍友大佬们。3.项目经验不足,不是很熟悉整个流程,仅保留在书本方面的知识。

    测试阶段:一步一步去检查,测试,报错之后一点点找原因,让人头大,甚至想回炉重造,干脆重新弄算了,但也得到了舍友的很大帮助,有时就是这样,或许自己发现不了的问题,在别人眼里,一看就能看出来。怎么说呢,最终成功运行的时候挺激动的,感觉增加了自己的经验,心里边有了些自信,多了些动力,也是打算多做一些java的题来提高自己的编码能力了。

    8.PSP展示

  • 相关阅读:
    jmeter压力测试报错:java.net.BindException: Address already in use: connect
    C# 对话框总结(转载)
    C# 文件操作方法大全(转载)
    C#实现进度条progress control(转载)
    在Windows下架设FTP服务器
    .Net环境下,使用installutil.exe注册、删除windows服务
    用双网卡实现跨网段访问(转载)
    HTTP协议详解(转载)
    学习开发web服务(转载)
    C# 实现http协议的GET和POST请求(转载)
  • 原文地址:https://www.cnblogs.com/cuixh998/p/8643659.html
Copyright © 2011-2022 走看看