ttttwr

导航

完成软件构造实验1后的总结与感受

序言

作为一个大三学生,我在大三的下学期才开始学习软件构造课程,在一个全是大二学生的教室里,真是显得格格不入啊o((⊙﹏⊙))o.
对我来说,实验一的内容虽然在之前没有系统性地学习过,但是在其他课程和自学的过程中,我大都已经有所涉猎,因此,我认为实验一的内容较为简单,我在下面主要记录一些在实验过程中比较重要的部分,剩下的篇幅我则写了一些我个人的感受与想法。

实验部分

P1

P1部分中我们的任务是编写一个读入并判断一个矩阵是否为幻方。这个任务看似简单,但是还是存在难点:如何判断数字之间是否不是以\t作为分割

  • 思路
    • 首先,我只考虑了错误使用空格作为分隔符的情况,如果使用的是逗号等分割方式,在我的代码里是按照非法数字进行处理的(主要原因是测试矩阵中只出现了这一种错误的分割方式)。
    • 如果我们使用类似Scanner中提供的nextInt()方法进行读取的话,实际上是无法判断数字之间的分隔符的,因为Scanner不会区分空格和\t,而是把它们都作为有效的分隔符。
    • 因此,我们可以在当发现某一行的数字数量与预计的不符时,判断如果同时使用空格和\t进行分割会不会就与预计数量一致了。当出现这种情况时,我们就可以提示用户分割符错误。下面的就是关键代码片段:
      str = line.split("\t");
      if (str.length != n) {
          if(line.split("\t| +").length != str.length) // 使用正则表达式,匹配\t或者是多个空格
          {
              System.out.println("Illegal input, integers are not divided by tab.");
          }else{
              System.out.println("Illegal input, not a square.");
          }
          return false;
      }
      

P2

P2部分的任务是依据Spec编写代码,通过调用tutle包提供的方法来移动小乌龟,实现函数的主要难度是在于算法,由于不是算法课,在这里就不赘述了。
实际上我认为最有趣的还是Problem 8: Personal art,在这个部分,我们可以使用之前编写好的函数绘制一个自己的图案。在一开始,我的想法是绘制同一中心的三到n边型,最终我们就可以看到随着边数的增多,多边形越来越趋近于一个圆。但是在经过测试之后,我发现视觉效果并不好,所以我干脆直接绕圈绘制了一圈这样的“多边形圆”,最后画出了一个花球,具体的代码和图像结果如下:

public static void drawPersonalArt(Turtle turtle) {
    // 旋转绘制7次同一中心点的3~20边形
    int dis = 80; // 多边形的顶点到中心点的距离
    for (int k = 0; k < 7; k++){
        for (int i = 3; i <= 20; i++) {
            int length = (int) (2 * dis * Math.sin(Math.PI / i));
            for (int j = 0; j < i; j++) {
                turtle.forward(length);
                turtle.turn(180 - (double) (180 * (i - 2)) / i);
            }![](https://img2024.cnblogs.com/blog/3400841/202404/3400841-20240401191523047-383972049.png)

            turtle.turn(360 - (calculateRegularPolygonAngle(i + 1) - calculateRegularPolygonAngle(i)) / 2);
        }
    }
}

P3

P3的任务和P2相似,也是编写代码和了解算法,使用简单的广度优先算法就可以实现。

实验感受

  1. Java编程语言是否对你的口味?与你熟悉的其他编程语言相比,Java有何优势和不足?
    1. Java编程不能算是完全对我的口味吧,Java的确是一个好的语言,也是一个当前,尤其是在国内使用得相当多的语言,但是我更加喜欢我的入门编程语言——C#。不过现在很多功能的实现也是Java更加方便,可用的包也更多,例如现在的云原生技术。因此,总的来说,我喜欢C#,但也喜欢Java,C#更像生活,Java更像工作。
    2. Java与C#的对比一直都是一个热门的话题,不过几年前,微软开源了.Net,最近的.Net8也添加了许多新的功能,在某些情况下的性能也逐渐变得更优于Java了。如果单从语言的角度来看的话,C#的语法糖更多,添加新语法、功能也更加积极,另外还有诸如C#可以使用指针等区别,在此就不具体讨论了。总而言之,二者在不同的方面互有胜负吧。
  2. 关于Eclipse或IntelliJ IDEA,它们作为IDE的优势和不足
    我从入门编程以来,一直都有接触Jetbrains的IDE,一开始是使用微软的Visual Studio和Jetbrains的Rider组合使用,VS体积大启动慢,在不编写窗口应用时,我更倾向于使用Rider。之后在逐渐学习了解各种语言的过程中,我也使用了Pycharm、IDEA等Jetbrains家的IDE。在我看来,IDEA已经是一个很不错的IDE了,我现在的学习需求它都能满足,其功能也十分齐全;也许在未来,我需要使用更多的功能时才会发现其不足吧,目前,它在我的心中还是十分完美的。
  3. 关于Git和GitHub,是否感受到了它在版本控制方面的价值
    当然,在我接触编程以来,Git就已与我“纠缠”到了一起。一开始我从Github了解代码、获取开源应用,到之后我自己搭建Git(Gitea)服务器对我自己的代码进行版本管理。我没有经历、使用过SVN等早先的版本管理软件,因此Git就是我所了解和使用的唯一一个版本管理软件,我也可以说是在它的帮助下成长起来的,其教育价值不言而喻。作为一个版本管理软件,它在版本管理方面也做的十分好,听说现在的公司都会优先考虑使用Git,可以说它已经在版本管理方面一统天下了。
  4. 关于CMU和MIT的作业,你有何感受
    这两个作业的题目我认为十分有趣,turtle的可视化,有向图的实际应用,都在不是很难的情况下让我学习了Java编程。除开英文有一定的阅读困难外,都还挺不错的。
  5. 关于本实验的工作量、难度、deadline
    本实验的工作量还是有些多的,毕竟P2有那么多个Problem,读题都得花不少时间,不过在难度上倒是没什么问题。Deadline的话…我在实验课开始前就做得差不多了,只要课下有时间的话,问题不大。
  6. 关于初接触“软件构造”课程
    其实我已经是大三学生了,并且也算是加入到了实验室中,到目前课程讲授的知识我都有所了解(考试可就另说了),感觉有些熟悉,也有些陌生吧,熟悉的是大致的技术,陌生的是具体的知识点。希望在后面的学习和实验中能做到我的最好吧。

posted on 2024-04-01 19:28  TTTTWR  阅读(4)  评论(0)    收藏  举报