结对编程项目-四则运算
1.需求分析
- 根据输入的题目数能自动打印出同数目的题目
- 在每次答题后可以显示是否正确
- 错误的答题可以显示正确答案
- 答题后显示正确数目数
- 结束是询问是否再来一次
2.设计思路
- 如何解决能让程序自动输出数学题目的问题
1.首先我们假定一个数学运算:
A + B = C
,在此运算中C是由用户输入的,而A , B ,“+”,则应该是由计算机生成的。根据上述,我们想到了Random类(第3章),随机产生数字A 和 B,这是我们开始纠结“+”,是不是也让其随机产生(+ , * , /),讨论之后决定搁置,因为技术不够决定作为项目外的扩展。
2.由于放弃了随机产生运算符的“荒唐”想法,我们换了一种思路,能否先确定几种运算规则如:
A + B = ;A * B = ;A / B =
,让后在由系统随机选取其中一种。对此我们想到了switch语句(第4章),几种规则的运算就相当于switch分支,每条分支代表一种运算。
3.确定使用switch语句后,我们就得确定switch语句首先得计算的表达式,表达式的值等于运算规则数,不宜过多4~6个。
于是我们再次运用Random类
int num = in.nextInt(6)
,所以随机产生的0~5六个数都有相应的语句匹配。4.输出题目的问题解决后,打印出用户想要的题目数量,我们决定使用Do语句
首先
int num1 = in.nextInt
读入用户输入的数字,然后使用do(int num2 = 0;num 2 < num1;num2++)
- 解决了产生数学问题的主要问题后,其余要求便十分简单了 1.解决答题后显示正确与否,并显示正确答案
我们使用 if-else语句,在switch语句中每个分支,我们加入如下“语句”
首先要让计算机计算我们所随机产生的数学题目,让后比较用户输入是否结果等于正确值,在判断该输出何种语句
例如:
if ( D /用户输入/ == A + B) System.out.println ("true"); sum = sum + 1; else { System.out.println ("Wrong") int num3 = A + B; System.out.println ("right answer:" + num3); } 同时在每个分支中加入sum = sum + 1
sum表示作对的题目数,只要在最后打印出sum的值就可。2.做题结束是询问是否在来一次。
在整个do语句上加入while语句,使用标记值来确定是否退出,如PP4.8.
- 这是我们此次的思路简图:
3.实现过程中的关键代码解释
- 这次实验所用的所有代码都来自第3,4章的内容:
//进行X次循环,X为用户所要求的题目数,于此产生X道题目
for (int i = 0; i < X; i++)
//产生一种运算
switch (num3) { case 0: int a,b; a = in.nextInt(21) - 10; b = in.nextInt(21) - 10; System.out.println (a + "+"+ b+ "=" +"?"); int d = out.nextInt(); if (d == a + b) {System.out.println ("true"); sum = sum + 1; } else System.out.println ("wrong"); break; ....... }
//整体看
while (...) { do(...) { switch(..) { if(...) } } }
4.遇到的困难及解决方法
- 当我们解决了自动生成数学题目的问题后,以为一切都轻松了,但没想到测试时才发现最难得是分数运算的问题,比如:
2/3+4/5=?
但程序打出这个题目时,我们输入22/15时,程序显示wrong
,因为这是2/3=0,4/5=0,这就很尴尬了。于是我们上网查了查发现计算机中没有分数····,这就有点不明白谢老师什么意思了?,由于这项任务是分给了王旌含,所以他在博问上提了出来;; Daniel Cai 给了我们一个小小的思路,将分子分母分开计算,(好吧,后面的求最大公约数的问题确实没弄懂,有些语句还没了解),然后,我们两个又卡住了,因为用户在计算输入时是要肯定输入:22/15,那要怎样才能让计算机比较输入数与计算结果是否相等呢?难道要将输入的结果与计算结果分子分母拆开来一个个比较吗?想到这,我们又有了一个思路(做中学嘛),我们将用户输入不用(int)而用(string),因为我们想到了书中的程序4.8检查一个字符串是否是回文时,他将字符串的第一和最后一个逐个对比left = 0; right = str.length() - 1; while(str.charAt(left) == str.charAt(right) && left < right)
于是我们抓住这一点: 【1】首先我们将分子 = N,分母 = M, String wb = new String(n+"/"+m);然后定义一个wb,保险起见,我们先charAt和length,发现wb 如我们所想那样为:22/15 【2】然后我们string wc = out.nextLine();
;一开始我们这样想的```System.out.println(wc == wb);但结果显示为false,为什么?这么烦?我们又想到了娄老师和谢老师给的链接提到的“栈”“堆”的概念,总之我们觉得他们不等就对了,所以才诞生将这两个字符串逐个字符比较的想法。 【3】while (wb.charAt(left) == wc.charAt(left) && left < right) { left++; } if (left == right) System.out.println ("true"); 【4】就这样我们转变了分数的比较方法,不比较大小,转而比较字符。 【5】于是我们先写了个小程序试验了一下 运行之后为 【6】将其植入进去运行了下又发现问题了 【7】所以现将老版本贴出来.......(不全)
《程序设计与数据结构》第4周学习总结
教材学习内容总结
第四章:学会使用if-else语句,switch语句,while语句,do语句,for语句
第七章:主要学习定义使用数组和关于命令行参数的知识
教材学习中的问题和解决过程
1.问题:程序4.2中出现的各种不解
详述:1.首先4.2程序的总体思路是将用户输入的字符串,按照从中间聚拢的方式依次判断字符是否“==”。 2.关于left = 0
,right = str.length()
,应该是字符串字符的排序是从0开始的吧,这就有点像数组索引是从0开始的一般吧。2.问题:程序7.5的问题
详述:
代码调试中的问题和解决过程
- 1.PP4.8中要求使用标记值来决定用户是否想要退出,于是想到了程序4.8
while (another.equalsIqnoreCase("Y"))
但是依据4.8的内容,但最后运行的时候却直接跳过了输入的一步,致使程序结束并未进行循环。 所以,我更改了while中的条件 后来很多同学都出先相同问题
- 代码量截图:
上周考试错题总结
1.Linux Bash中,查找当前目录中前天创建的Java文件的命令是(find . -name *.java -ctime 2)
总结: 对于find命令不够熟悉,实验楼中介绍了find
,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。 find 命令的路径是作为第一个参数的, 基本命令格式为 find [path] [option] [action]-mtime n: n 为数字,表示为在n天之前的”一天之内“修改过的文件
-mtime +n: 列出在n天之前(不包含n天本身)被修改过的文件 -mtime -n: 列出在n天之内(包含n天本身)被修改过的文件 newer file: file为一个已存在的文件,列出比file还要新的文件名2.使用JDB进行调试时查看源代码的命令是(list)
总结: JDB调试应用不过关,
结对及互评
和我一小组的是王旌含,这次咋们一起研究了四则运算,虽然最后还是有点问题,很尴尬,但已经有了小默契,能很好分工,但还得继续努力。点评过的同学博客和代码
其他(感悟、思考等,可选)
这周学习难度突然有点大了,但跟着自己的节奏来倒也学的不慌不乱,有所收获。保证每天都有一个小时以上看书实验的时间。
谢老师的结对编程项目,给了我和王旌含一个挑战,特别是分数,简直弄疯了,博客园中的博问提了又提.... 有时候换个角度思考,柳暗花明又一村。 有时候没有困不困难,只有想不想做,你做了,可以说难,没做的人也可以说困难,但关键看自己是否有收获,但····真的有点难了··· 班上一些同学很努力,能力很强,得向他们学习。学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 070/200 | 1/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 30/38 | |
第三周 | 620/1000 | 3/7 | 51/60 | |
第四周 | 1200/1300 | 4/9 | 78/90 |
参考:,
计划学习时间:XX小时
实际学习时间:XX小时
改进情况:
(有空多看看)