王彪20162321 2016-2017-2 《程序设计与数据结构》第4周学习总结

时间:2021-10-02 10:34:15

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.

  • 这是我们此次的思路简图:
    王彪20162321 2016-2017-2 《程序设计与数据结构》第4周学习总结

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】于是我们先写了个小程序试验了一下
    王彪20162321 2016-2017-2 《程序设计与数据结构》第4周学习总结
    运行之后为
    王彪20162321 2016-2017-2 《程序设计与数据结构》第4周学习总结
    【6】将其植入进去运行了下又发现问题了
    王彪20162321 2016-2017-2 《程序设计与数据结构》第4周学习总结
    【7】所以现将老版本贴出来.......(不全)
    王彪20162321 2016-2017-2 《程序设计与数据结构》第4周学习总结

《程序设计与数据结构》第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.8while (another.equalsIqnoreCase("Y"))
    但是依据4.8的内容,但最后运行的时候却直接跳过了输入的一步,致使程序结束并未进行循环。
    所以,我更改了while中的条件
    王彪20162321 2016-2017-2 《程序设计与数据结构》第4周学习总结
    后来很多同学都出先相同问题博问

代码托管

  • 代码量截图:
    王彪20162321 2016-2017-2 《程序设计与数据结构》第4周学习总结

上周考试错题总结

  • 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小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料