哈工大软件构造lab1心得

本文记录了一次Java编程实验,包括实现MagicSquare的合法性检查和生成,以及TurtleGraphics图形绘制。在MagicSquare部分,讨论了错误检查、算法实现与优化。在TurtleGraphics部分,介绍了drawSquare、drawRegularPolygon等方法的实现,以及convexHull算法用于计算点集的凸包。此外,还涉及了Git的使用和解决编码问题的经验。
摘要由CSDN通过智能技术生成

1 实验环境配置

       根据lab0的指导,下载安装了git。原先安装的是eclipse2020和jdk15,基于对jdk低版本的要求,重新安装了jdk10.0.2,并更新eclipse至2021-03。

       这里花了一些时间,因为eclipse和jdk的版本匹配问题,后来发现可以在创建项目时设置项目对应的jdk版本而解决。

 

2 具体过程

2.1 Magic Squares

       实验的任务包括:①编写isLegalMagicSquare()方法,判断一个n×n矩阵是不是一个Magic Square,若是返回true,不是则返回false;②解读给出的用于生成Magic Square的generateMagicSquare()方法,并对其进行完善,增加判断输入n是否合法、将生成的Magic Square存储到6.txt的功能。

2.1.1 isLegalMagicSquare()

       首先,创建文件流,读取文本。再利用readLine(),计算行数。

      接着依次测试3个错误。测试错误1:行列数不相等。利用readLine()产生行的循环,再利用split()在每一行分割字符从而判断每一行有几个字符(即得该行的列数)。测试错误2:矩阵中含有非正整数。利用readLine()和split()方法,以行为循环,切分字符,一个一个检查字符中是否存在”.”、”-”,来判断是否存在非整数或负数。测试错误3:数字之间并非使用\t分割。利用readLine()和split()方法,以行为循环,切分字符,利用Integer.valueOf()方法一个一个地将数值存储到矩阵matrix的对应位置,并对该过程添加try catch,Integer.valueOf()方法遇到空格会触发异常,能够筛选非"\t"的情况。

       错误判断完毕,接下来判断是否为Magic Square。建立数组存储行之和、列之和、对角线之和,并初始化为0,再利用循环计算它们的值。判断第一个行之和、列之和、对角线之和之间是否相等,不等则返回false,相等则进入行之和、列之和、对角线之和内部之间是否相等的判断。

2.1.2 generateMagicSquare()

       首先是对给出的以下问题的思考:

       

 

       前者是由于数组越界,会出现访问row[n]的情况,而row的长度为n,最多可访问至row[n-1];后者则是因为n为负数,在数组中访问下标为负数,直接报错。

       而在给出的generateMagicSquare方法中,首先判断输入的n是否为偶数或者负数,若是则返回false;若不是,则继续进行生成MagicSquare。

       分析所给的代码:(1)依次填入1,2,...,n*n,并首先将1放在第一行的正中间;(2)将下一个数值放入前一个元素的右上方(3)若位置被占用,即轮到了第k*n+1个(k为整数,且k<n),则将其放到前一个元素的正下方的格子,并继续进行(2)过程。

       流程图如下:

                     

       最后按照要求对该方法进行了补充完善,增加判断输入n是否合法、将生成的Magic Square存储到6.txt的功能。

 

2.2 Turtle Graphics

       主要是了解并利用turtle内的一些方法(如forward, turn等),完成TurtleSoup.java中待实现的方法。

   (1)drawSquare方法较为简单,只需利用forward, turn方法,画一个正方形。(2)calculateRegularPolygonAngle, calculatePolygonSidesFromAngle, drawRegularPolygon用于计算正多边形内角、边数和画出正多边形。(3)calculateBearingToPoint 和 calculateBearings计算两个点之间转移所需转过的角度,即当前点到目标点的向量和当前方向向量之间的夹角,以及不同的点之间连续转换所需角度。(4)convexHull方法:若集中的点数量小于3,直接返回原来的集合。否则,利用礼品包装算法。首先找到极点,在该代码中为左下角的点,同时设置暂存集合与原集合一样,用于对其进行操作而不改变原来的点集;接着将该极点加入凸包集合,并从暂存集合中去除它;循环遍历所有的点,找出和极点偏转角度最小的,找到后将该点作为下一个极点,并继续找点;直到找到第一个极点,算法结束。(5)最后drawPersonalArt绘制一个图形,通过forward、turn及循环等操作,具体实现:进行500次循环,每隔100次循环更换一次颜色,依次为红橙黄绿青,每次循环转向116°并前进i/4长度,从而达成不断向外扩散、颜色渐变的效果。

      

2.3 Social Network

       实现Person和FriendshipGraph两个类,模拟社交网络,完成添加节点、节点之间添加单向边、通过宽度优先算法计算两节点间最短路等功能。

       主要需要完成,关于Person类的三个方法:addnewfriend增加对象的朋友,getmyname得到对象的名字,getfriends得到对象的朋友列表,以及FriendshipGraph类的三个方法:addVertex向图中添加新的节点;addEdge向图中添加新的边;getDistance通过BFS求两个点之间的最短距离。

       需注意的是:由于每个人的名字唯一,因此addVertex添加新节点前,需先判断这个人的名字之前是否出现过,若出现过,则打印警告并结束运行,若没有,则将其加入allpeoplet中,将名字写入allname中;以及person类的构造方法:判断名字是否在allpersons中已经存在(通过存储所有已存在的名字的全局名字表),若是则输出“名字已存在”并退出,否则初始化这个名字,并且将其加入allpersons中。

 

3 实验中遇到的困难与解决途径

1.运行MagicSquare时,提出异常,提示”数字之间并非使用\t分割“。

定位异常,找到了对应代码,发现是将error3打成了error2,改正后程序正常运行。

2.Git提交后刷新url未出现应上传的文件。

重新提交git,发现之前漏了一些命令步骤。

3.上传后从github打开java文件,出现乱码。

在eclipse中编码格式默认为GBK,修改设置为UTF-8即可。

 

4 经验感想

1.初次使用git,遇到一些障碍,需多搜索多尝试。

2.训练了我的基本 Java 编程技能,对java的一些语法有了一些掌握,但仍需继续练习。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十六涣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值