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


    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.8while (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小时

    • 改进情况:

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

    参考资料

  • 相关阅读:
    【转】sublime text 2中Emmet插件8个常用的技巧
    程序猿崛起3——这一次,我用行动说话
    《Effective Java》学习笔记——积累和激励
    程序猿崛起2——互联网时代下的新潮流和新活法
    【非技术】做好属于自己的作品,然后让世界所有人都记住你
    【非技术】实现理想的第一步就是做自己
    【原创】程序猿崛起
    人生苦短,我用python——当我在玩python的时候我玩些什么
    一个新人如何学习在大型系统中添加新功能和Debug
    一个应届毕业生入职30天后的工作总结——作息
  • 原文地址:https://www.cnblogs.com/wbiao21/p/6617146.html
Copyright © 2020-2023  润新知