week2的作业弄到现在week3才开始着手做,所幸截止日期还有几天。

Coding.net源码仓库地址:https://git.coding.net/Agustin_Leonard_DPS/Calculation.git

计划

明确需求及相关因素,指明时间成本和依赖关系

首先,我们这个作业给出了他的需求如下:

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

  • 为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3÷5+2=2.6,2-5+10=7等算式。

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

  • 当程序接收的参数为4时,以下为一个输出文件示例。

其中,这个作业要求用java语言编写,由于java语言有一段时间没有用(平时多用C),所以找来了以前java的课本复习一下……

开发

分析需求

在生成的n道题中,要求有:

①运算数字:在0~100范围;

②运算符:要有3~5个,且至少要有两种不同的运算符;

③结果&过程:不得出现负数和非整数;

④格式:输出文件为txt形式,即“result.txt”。

生成设计文档(暂无)

设计复审(暂无)

代码规范

与《构建之法》P70所的代码风格规范略有不同,如缩进为Tab,这是个人习惯,在以后的设计过程中会慢慢改正。

具体设计

这个项目开发并不复杂,其中Main和Lib构架设计如下:

Lib:

其中,生成题目的方法有多种,我参考了许征航同学的博客,他是在生成题目的过程中多加限制,确保生成的题目绝对符合规范。此外,我还想到了两种方法:

①在生成题目的过程中,每添加一个运算符和运算数就进行一次判定,判断每个步骤的结果和最终结果是否都符合规范,如果不符合,返回上一步,重新随机生成运算符和运算数;

②先生成若干道题目,编写算法对每个题目都进行一次判定,完全符合规范的题目则通过并添加到“result.txt”文件中,若不符合规范则不添加,重新生成。

我想使用①方法与许征航同学的方法相结合,在少量限定生成的符号与运算数时,每个步骤进行一次判定。

                                                          

                                                                        编辑于

2018-03-21)

具体编码

实践永远高于理论,设计时的方案总要通过实践来测试是否可行。其中我修改了许多方案,其中包括多加多层嵌套(if-else)判定,并且多加一个方法用以判断该运算是否符合要求。

最后式子运算的方法总是出错,借用了同学的方法,最后大致成功了,但是或多或少还是有一点bug,出于自己羸弱的代码能力和deadline,这些个问题以后请教同学后慢慢解决。

lib文件:

package src;
import java.io.*;
public class Lib {
private static char[] sign = new char[] {'+', '-', '*', '÷'};public static int Random(int min, int max){
return (int) (Math.random()*(max - min) + min + 0.5);
}
public static void CreateQues(String Ques[] ,int QuesNum ) {/*创建问题,QuseNum是问题数,OpNum是每个问题的运算符数 */
char Sign[] = new char[20];/*运算符*/
int Num[] = new int [20];/*运算数*/for(int i = 0;i<QuesNum;i++) {
Num[0] = Random(1,100);
int OpNum = Random(3,5);int result[] = new int [10];/*储存算式中每个不走的运算结果*/
for(int j = 0;j<OpNum;j++) {
int flag = 1;
addSignNum(Sign,Num,j);
if(j==0)
{
result[j] = calQues(Num,Sign[j],j);
flag = isCorrect(Num,Sign[j],j);
if(flag == -1) {
result[0]= Num[0];j--;continue;
}
}
else if (j>0)
{
if (Sign[j]=='*'||Sign[j]=='÷')
{
if(j == 1)
result[0] = Num[0];
else
result[j-1] = result[j-2];
result[j] = calQues(Num,Sign[j],j);
flag = isCorrect(Num,Sign[j],j);
if(flag == -1) {
result[j] = result[j-1];j--;continue;
}
result[j] = calQues(result,Sign[j-1],j-1);
flag = isCorrect(result,Sign[j-1],j-1);
if(flag == -1) {
result[j] = result[j-1];j--;continue;
}
}
if(Sign[j]=='-'||Sign[j]=='+')
{
if(result[j-1]<0) {
j=j-2;continue;}
result[j] = Num[j+1];
result[j] = calQues(result,Sign[j],j-1);
flag = isCorrectPlus(result[j]);
if(flag == -1) {
result[j] = result[j-1];j--;continue;
}
}
}}
/*for(int k=0;k<result.length;k++)
System.out.println(result[k]);-*/
String question = "" + Num[0];
for(int k = 0;k<OpNum;k++)
question = question + Sign[k] + Num[k+1];
question = question + "=" +calQuestion(question);
System.out.println(question);
Ques[i] = question;
}
}
public static void addSignNum(char a[] , int b[],int c) {
if(c!=0 &&(a[c-1]== '*'||a[c-1]== '÷')) a[c] = sign[Random(0,1)];
else a[c] = sign[Random(0,3)];
if(a[c] == '÷') b[c+1] = Random(2,10);
else b[c+1] = Random(0,100); /*这里考虑到除号后面不能为0,进行一步限制*/
}
public static int calQues(int a[],char b,int c) {
if(b == '+') return a[c]+a[c+1];
else if(b == '-') return a[c]-a[c+1];
else if(b == '*') return a[c]*a[c+1];
else if(b == '÷') return a[c]/a[c+1];
return -1;
}
public static int isCorrect(int a[],char b,int c) {
int flag = 1;
if(b == '-'&& a[c] - a[c+1]<0) flag = -1;
if(b == '÷'&& a[c] % a[c+1]!=0) flag = -1;
return flag;
}
public static int isCorrectPlus(int a) {
if(a<0) return -1;
else return 1;
}
static public void filePrint(String[] Ques, int QuesNum, String path) throws IOException{
FileOutputStream fs = new FileOutputStream(new File(path));
PrintStream p = new PrintStream(fs);
p.println("2016012033");
for(int i=0; i<QuesNum; i++)
p.println(Ques[i]);
p.close();
}
static private int calQuestion(String question){
char[] ch = new char[50];
char[] oc = new char[15];
int[] num = new int[15];
int temp = 0, pn = -1, pc = -1;
ch = question.toCharArray();for(int i=0; i<ch.length; i++){
if(Character.isDigit(ch[i])) {
temp = temp*10 + ch[i]-'0';
if(i == ch.length-1)
num[++pn] = temp;
}
else {
num[++pn] = temp;
temp = 0;while(pc!=-1 && getw(oc[pc]) >= getw(ch[i]) ) {
int num1 = num[pn--];
int num2 = num[pn--];
char ch1 = oc[pc--];
num[++pn] = calc(num2, num1, ch1);
}//if(pc == -1) oc[++pc] = ch[i];
oc[++pc] = ch[i];
}
}while(pc != -1) {
int num1 = num[pn--];
int num2 = num[pn--];
char ch1 = oc[pc--];
num[++pn] = calc(num2, num1, ch1);
}return num[0];
}
static private int getw(char c){
if(c=='*' || c=='÷') return 2;
else if(c=='+' || c=='-') return 1;
else return -1;
}static private int calc(int a, int b, char c) {//System.out.println("" + a +c + b);if(c == '+') return a + b;
else if(c == '-') return a - b;
else if(c == '*') return a * b;
else if(c == '÷') return a / b;
else return -1;
}
}

main文件:

package src;import java.io.IOException;import java.util.*;public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);String path = "result.txt";String[] Ques = new String[100];int QuesNum;System.out.println("现在!让我们决定要多少道(0~100)四则运算题,然后我们把它们rua出来!");QuesNum = input.nextInt();Lib.CreateQues(Ques, QuesNum);try {Lib.filePrint(Ques, QuesNum, path);}catch(IOException ioe) {ioe.printStackTrace();}input.close();}}

总结

整出一个四则运算题出题系统其实不难(我之前一篇博客:http://www.cnblogs.com/longaotian/p/8526473.html),不过当时的要求少,而且不限语言,我自然用的是我熟练的C语言,但是在加了这么多条件和限制后,这两个问题的难度就不是一个等级的了。同时受限于自身的代码能力(被自己菜哭了)……其中仍然会有一些bug如偶尔还是会出现结果为负数的情况,这些我会在以后的课余时间里请教同学并且修复这些问题。在这里要感谢许征航同学的帮助,他帮我找出了我的代码里许多导致bug的地方并提出一些修改建议,在这个过程中我也学到了许多,如控制变量并且进行简单的单元测试等,获益良多。

PSP展示

  花费时间(单位:h) 花费时间百分比(%)
计划 0.5     1  
明确需求 0.5   1
开发 24.6 90
需求分析 0.5 1
代码规范 0.1 0.2
具体设计 3 11
具体编码 18 66
代码复审&测试 3 11
报告 2 4
测试报告 1   2
计算工作量 0.5 1
事后总结 0.5 1

dpackage src;import java.io.*;public class Lib {private static char[] sign = new char[] {'+', '-', '*', '÷'};public static  int Random(int min, int max){        return (int) (Math.random()*(max - min) + min + 0.5);    }public static void CreateQues(String Ques[] ,int QuesNum ) {/*创建问题,QuseNum是问题数,OpNum是每个问题的运算符数 */char Sign[] = new char[20];/*运算符*/int  Num[] = new int [20];/*运算数*/for(int i = 0;i<QuesNum;i++) {Num[0] = Random(1,100);int OpNum = Random(3,5);
int result[] = new int [10];/*储存算式中每个不走的运算结果*/for(int j = 0;j<OpNum;j++) {int flag = 1;addSignNum(Sign,Num,j);if(j==0) {result[j] = calQues(Num,Sign[j],j);flag = isCorrect(Num,Sign[j],j);if(flag == -1) {result[0]= Num[0];j--;continue;}}else if (j>0){if (Sign[j]=='*'||Sign[j]=='÷'){if(j == 1)result[0] = Num[0];elseresult[j-1] = result[j-2];result[j] = calQues(Num,Sign[j],j);flag = isCorrect(Num,Sign[j],j);if(flag == -1) {result[j] = result[j-1];j--;continue;}result[j] = calQues(result,Sign[j-1],j-1);flag = isCorrect(result,Sign[j-1],j-1);if(flag == -1) {result[j] = result[j-1];j--;continue;}}if(Sign[j]=='-'||Sign[j]=='+'){if(result[j-1]<0) {j=j-2;continue;}result[j] = Num[j+1];result[j] = calQues(result,Sign[j],j-1);flag =  isCorrectPlus(result[j]);if(flag == -1) {result[j] = result[j-1];j--;continue;}}}}/*for(int k=0;k<result.length;k++)System.out.println(result[k]);-*/String question = "" + Num[0];for(int k = 0;k<OpNum;k++) question = question + Sign[k] + Num[k+1];question = question + "=" +calQuestion(question);System.out.println(question);Ques[i] = question;}}public static void addSignNum(char a[] , int b[],int c) {if(c!=0 &&(a[c-1]== '*'||a[c-1]== '÷')) a[c] = sign[Random(0,1)];else a[c] = sign[Random(0,3)];if(a[c] == '÷') b[c+1] = Random(2,10);else b[c+1] = Random(0,100);    /*这里考虑到除号后面不能为0,进行一步限制*/}public static int calQues(int a[],char b,int c) {if(b == '+') return a[c]+a[c+1];else if(b == '-') return a[c]-a[c+1];else if(b == '*') return a[c]*a[c+1];else if(b == '÷') return a[c]/a[c+1];return -1;}public static int isCorrect(int a[],char b,int c) {int flag = 1;if(b == '-'&& a[c] - a[c+1]<0) flag = -1;if(b == '÷'&& a[c] % a[c+1]!=0) flag = -1;return flag;}public static int isCorrectPlus(int a) {if(a<0) return -1;else return 1;}static public void filePrint(String[] Ques, int QuesNum, String path) throws IOException{        FileOutputStream fs = new FileOutputStream(new File(path));        PrintStream p = new PrintStream(fs);        p.println("2016012033");        for(int i=0; i<QuesNum; i++)            p.println(Ques[i]);        p.close();    }    static private int calQuestion(String question){        char[] ch = new char[50];        char[] oc = new char[15];         int[] num = new int[15];        int temp = 0, pn = -1, pc = -1;  //temp用于存放中间数值,pn用于在num数组中模拟栈顶, pc用于在ch数组中模拟栈顶                ch = question.toCharArray();                for(int i=0; i<ch.length; i++){            if(Character.isDigit(ch[i])) {                temp = temp*10 + ch[i]-'0';                 if(i == ch.length-1)                    num[++pn] = temp;   //最后一个数入栈            }            else {                num[++pn] = temp;       //temp入栈                temp = 0;                                while(pc!=-1 && getw(oc[pc]) >= getw(ch[i]) ) {                    int num1 = num[pn--];                    int num2 = num[pn--];                    char ch1 = oc[pc--];                    num[++pn] = calc(num2, num1, ch1);                }                                //if(pc == -1) oc[++pc] = ch[i];                oc[++pc] = ch[i];            }        }                while(pc != -1) {            int num1 = num[pn--];            int num2 = num[pn--];            char ch1 = oc[pc--];            num[++pn] = calc(num2, num1, ch1);        }                return num[0];    }    static private int getw(char c){        if(c=='*' || c=='÷') return 2;        else if(c=='+' || c=='-') return 1;        else return -1;    }        static private int calc(int a, int b, char c) {                //System.out.println("" + a +c + b);                if(c == '+') return a + b;        else if(c == '-') return a - b;        else if(c == '*') return a * b;        else if(c == '÷') return a / b;        else return -1;    }}

转载于:https://www.cnblogs.com/longaotian/p/8614557.html

2016012033 小学四则运算练习软件项目报告相关推荐

  1. 2016012101小学四则运算练习软件项目报告

    2016012101小学四则运算练习软件项目报告 Coding.net源码仓库地址:https://git.coding.net/naiteu/sgwq.git 一.需求分析 1,程序可以接收一个参数 ...

  2. 小学四则运算练习软件项目报告

    小学四则运算练习软件项目报告 作业源代码地址:https://git.coding.net/weijn/SiZe.git 一.需求分析 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题. 每个 ...

  3. 2016012090+小学四则运算练习软件项目报告

    2016012090+小学四则运算练习软件项目报告 Coding.net原码仓库地址:https://git.coding.net/Ai_Code/Work.git 目录: 一.需求分析 二.功能设计 ...

  4. 201571030107 小学四则运算练习软件项目报告

    本文转载自:http://www.javaxxz.com/thread-359437-1-1.html 201571030107 小学四则运算练习软件项目报告 项目Github地址 Arithmeti ...

  5. 201571030334 小学四则运算练习软件项目报告

    小学四则运算练习软件项目报告 Github的仓库主页链接地址:https://github.com/huicunzhang/sizeyunsuan 一.需求分析: 1. 程序可接收一个输入参数n,然后 ...

  6. 2016012028+小学四则运算练习软件项目报告

    任务1源码可直接克隆的仓库地址: (HTTPS)https://git.coding.net/zhaoliguaner/Calculate.git (SSH)git@git.coding.net:zh ...

  7. 2016012007+小学四则运算练习软件项目报告

    此次作业的源码地址:https://git.coding.net/ClausKE/Calculator1.git 写在前面:这次的作业完成得不易,在跟一些同学的交流中对这次作业有了更多的理解,在咨询了 ...

  8. 201571030138 小学四则运算练习软件项目报告

    项目gihub地址 fateiceb 项目过程 1.需求分析 基本功能 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间. 为了让小学 ...

  9. 2016012023+小学四则运算练习软件项目报告

    零.coding链接 https://git.coding.net/hiawei/homework1.1.git 一.需求分析程序为四则运算生成器 用户为小学生 1.功能需求: 输入参数N,随机产生N ...

最新文章

  1. 百度智能小程序开源联盟正式成立 小程序开发创业又一新风向标
  2. 字符串中连续出现最多的子串 amp; 字符串中最长反复子串
  3. 二叉树 跳表_面试题之跳表
  4. ARM和NEON指令 very gooooooood.............
  5. [Redux/Mobx] redux-saga和redux-thunk有什么本质的区别?
  6. [html] HTML全局属性(global attribute)有哪些(包含H5)?
  7. 火车头php接口制作,火车头接口
  8. AMD平台下在Windows虚拟机中安装Mac10.8.3的注意事项
  9. Android系统性能调优工具介绍
  10. 学习总结-《父与子的编程之旅》chapter 10
  11. 企业网ARP欺骗网关攻击与伪DHCP分析与处理
  12. php barcode设置黑条宽度,打印机字体的安装问题 BarCode Pro 6.0修改线条宽度 BarCode pro打EAN13条形码...
  13. 数字逻辑电路期末复习与常见问题
  14. python之小说下载器version2.0
  15. 如何把录音生成二维码,用微信扫一下就能听?分享语音音频转二维码的方法和技术原理
  16. 用 Python 在股票交易中实现布林带策略
  17. 微信尝试刷掌支付;苹果 WWDC 将于 6 月 6 日开幕;Qt Creator 10 发布|极客头条
  18. JavaScript里的两个等于号和三个等于号的区别
  19. 普乐蛙7D动感影院|6d动感电影院|7d动感影院设备
  20. docker虚拟化之订制python环境

热门文章

  1. 第13届蓝桥杯Scratch选拔赛真题集锦
  2. VS2012fopen报错处理
  3. beta阶段第五次scrum meeting
  4. 如何做好百度广告联盟
  5. 百度广告联盟api probuf协议对接
  6. Speak2Me英语口语学习系统
  7. Android游戏-飞机星空大战(Android studio)
  8. 【Oracle】Oracle创建触发器
  9. 漏洞分析Heartbleed Attack Lab(自用、记录)
  10. 从奋斗,蜗居,裸婚,到北爱。