软件构造Lab 1
2019年春季学期
计算机学院《软件构造》课程
Lab 1实验报告
姓名 肖宇
学号 1170300508
班号 11703005
电子邮件 [email protected]
手机号码 18531878026
目录
1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 Magic Squares 1
3.1.1 isLegalMagicSquare() 1
3.1.2 generateMagicSquare() 1
3.2 Turtle Graphics 1
3.2.1 Problem 1: Clone and import 2
3.2.2 Problem 3: Turtle graphics and drawSquare 2
3.2.3 Problem 5: Drawing polygons 2
3.2.4 Problem 6: Calculating Bearings 2
3.2.5 Problem 7: Convex Hulls 2
3.2.6 Problem 8: Personal art 2
3.2.7 Submitting 2
3.3 Social Network 2
3.3.1 设计/实现FriendshipGraph类 2
3.3.2 设计/实现Person类 2
3.3.3 设计/实现客户端代码main() 2
3.3.4 设计/实现测试用例 3
3.4 Tweet Tweet 3
3.4.1 Problem 1: Extracting data from tweets 3
3.4.2 Problem 2: Filtering lists of tweets 3
3.4.3 Problem 3: Inferring a social network 3
3.4.4 Problem 4: Get smarter 3
4 实验进度记录 3
5 实验过程中遇到的困难与解决途径 3
6 实验过程中收获的经验、教训、感想 4
6.1 实验过程中收获的经验和教训 4
6.2 针对以下方面的感受 4
1 实验目标概述
本次实验通过求解四个问题(其中一个可选),训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
基本的Java OO编程
基于Eclipse IDE进行Java编程
基于JUnit的测试
基于Git的代码配置管理
2 实验环境配置
系统:xindows10
IDE:Eclipse
CPU:i7-6700
RAM:8GB
ROM:128GB
3 实验过程
3.1 Magic Squares
给定一组数据,判断是否满足格式要求。
满足的话判断是否行累加和== 对角线累加和
不满足的话输出提示信息
3.1.1 isLegalMagicSquare()
思路:将该问题分成几个小部分:
- 文件读入及读入格式判断
- 格式要求判断
- 累加和相等的判断
写代码时将这几个方面分离成函数,进行相关部分的代码
结果:输出了判断结果 + (错误提示信息)
3.1.2 generateMagicSquare()
3.2 Turtle Graphics
利用工具进行作图,利用数学只是计算作图所需的角度,最后凸包算法
3.2.1 Problem 1: Clone and import
进入到下载页面点击下载…
3.2.2 Problem 3: Turtle graphics and drawSquare
值turtle.forward是会出一个边,turtle.turn是进行一次转角,于是我们就可以进行一次循环,完成4次便会质疑四次的90度角转弯
3.2.3 Problem 5: Drawing polygons
绘画正多边形首先需要计算出该多边形的外角,然后利用3.2.2的原理进行绘制
3.2.4 Problem 6: Calculating Bearings
在草纸上导出一个公式即可—数学问题
3.2.5 Problem 7: Convex Hulls
卷包裹问题,这里我们使用外机的方法来查询找出最外围的点
首先进行一次按照极角的排序
然后利用外积的正负性来判断是否是在凸包上
如果是在凸包上,那么就加入到一个临时list中
最后判断这个临时的list中是否有三点共线的情况
如果有,那么我们就删去位于中间的点
3.2.6 Problem 8: Personal art
3.2.7 Submitting
git pull
git add .(如果添加全部文件为一个’.’ ,可替换为对应文件)
git commit -m “” (引号里面是自己的注释)
3.3 Social Network
社交网络的实现,这里我们需要完成人物的存储与读取
还要实现的是社交网络的村如何读取。
privateArrayList<ArrayList>ship_graph=newArrayList<ArrayList>(); //容器list二维可变数组:第一位下标对应一个人的编码,改为对应的一个数组内存上其朋友们的编码
private HashMap<Person, Integer> person_map=newHashMap<Person,Integer>();//一一对应的存入人物名字和编码
private int number = 0;//用number对每个人按递增正整数的顺序进行编码
这里我们使用的这样一种数据结构实现的。
3.3.1 设计/实现FriendshipGraph类
我们存储人物关系的数据结构是list的数组,即二维list
每一个list数组保存一个人的朋友的编号
这些list组成了另一个list
3.3.2 设计/实现Person类
Person是FriendshipGraph中的一个节点,数据类型包括name,和储存该节点的朋友的Set,方法包括返回名字,返回朋友和添加朋友。
3.3.3 设计/实现客户端代码main()
先调用FriendshipGraph中的方法想图中添加一些测试点和测试边,再调用getDistanse函数测试,检查是否与预期值相同。
3.3.4 设计/实现测试用例
Person类的实现,需要存入入伍,我们测试的时候可以针对,存入人物的是否为空进行设计
FriendshipGraph基于Person类,测试也是针对关系是否存在
3.4 Tweet Tweet
3.4.1 Problem 1: Extracting data from tweets
getTimespan()
取到tweet中的Timespan成员变量
找出其中最大的end和最小的start,并用其构成一个Timespan对象进行返回
getMentionedUsers()
先找到@存在的位置–遍历算法
下一步检查前后字符是否符合格式:即是否@前面有字母以及后面的字符是否是用户名规则中要求的字符或是空白字符或是标点符号。
若满足要求:是合法字符,继续编立下一个字符;是结束空白字符或是标点符号,结束当前循环,保存当前字符串;
若不满足要求:要么是@钱不满足,要么是中途遇到了非法字符,也立即结束当前循环。
外围大循环一直执行到字符串结束。
3.4.2 Problem 2: Filtering lists of tweets
inTimespan()
1.遍历所有的tweet,如果其时间Timestamp在Timespan之中,则将其加入结果List中
2.返回结果
containing()
1.遍历所有word
a)检查word是否符合要求,如果word中含有空白字符则报错
b)遍历所有tweet
i.将word和tweet中的字符都化为小写
ii.判断tweet的Text中是否包含word,包含则将tweet加入返回列表Tweets中
2.返回Tweets
3.4.3 Problem 3: Inferring a social network
guessFollowsGraph()
1.遍历每一个tweet
a)利用Extract.getMentionedUsers获取tweet中@的所有人,并且存入集合followed中
b)将集合followed加入tweet的Author在Map中的集合中
2.返回Map的内容
注:这其中对于用户名的检查也需要判断其是否满足格式,虽然数据很弱,但应该严谨!检查方式3.4.1中的类似。
Influencers():
这里我们是写了一个pair类,里面存放键值对,first element存放的是被跟随者的编码,second element存放的是跟随着人数。
然后我们写一个比较器,按照pair的second元素大小进行排序,将原set转换成一个list,然后调用其sort函数进行排序。
注:这里有个小要求,那就是影响力相同的情况下,我们是要保证任务顺序为原来的set中单呢顺序,这种请款单各市县我们是使用的比较器内的排序算法实现的,器second element进行比较时,对于==情况我们返回序号靠前的人影响力较大。
3.4.4 Problem 4: Get smarter
依据的规则是:if A follows B and B follows C, then we can consider that A follows C.这里我们假设的拥护者是传递的。在实际的某些情况中,比如说是“站队”问题上,也的确是这么回事!
4 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 时间段 任务 实际完成情况
2019-03-05 15:00-16:30 编写问题1main函数 按计划完成
2019-03-06 14.30-19:00 编写问题1的isMagicSquare()函数
generateMagicSquare()函数 遇到困难,总算完成
2019-03-07
至03-09 编写问题2 完成
2019-03-10
至03-11 编写P3 遇到困难,卡了接近一天
03-12至03-15 P4 完成
5实验过程中遇到的困难与解决途径
遇到的难点 解决途径
P1:欲用动态二维数组保存文件中的数据,一直出现异常(错误)
定义成ArrayList的ArrayList数组。
-
每次向arr加入一个ArrayList
-
获取数据方式改用arr.get().get()可行
P1:文件读入是声明错误于网上查到文本文件读入方式
6实验过程中收获的经验、教训、感想
6.1实验过程中收获的经验和教训
本次实验通过求解四个问题(其中一个可选),训练基本Java编程技能,能够利用Java OO开发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够为所开发的代码编写基本的测试程序并完成测试,初步保证所开发代码的正确性。另一方面,利用Git作为代码配置管理的工具,学会Git的基本使用方法。
基本的Java OO编程
基于Eclipse IDE进行Java编程
基于JUnit的测试
基于Git的代码配置管理
6.2针对以下方面的感受
(1) Java编程语言是否对你的口味?
符合
(2) 关于Eclipse IDE
很容易就从c++过渡到java的idle
(3) 关于Git和GitHub
值得学习开发
(4) 关于CMU和MIT的作业
英文题目描述,难度对本人来说较大,作业量对于新手来说较大
(5)关于本实验的工作量、难度、deadline
工作量大,难度还好,时间足够。
(6)关于初接触“软件构造”课程
比较困难。
推荐阅读
-
Java语言实现简单FTP软件 FTP协议分析(1)
-
Java语言实现简单FTP软件 FTP协议分析(1)
-
Windows编程基础--第1节 第一个win32软件
-
详解Java基础篇--面向对象1(构造方法,static、this关键字)
-
软件构造实验1的工具类小tips
-
TCDatabase介绍(1) 博客分类: 软件开发 TokyoCabinetRuby数据结构LuaMySQL
-
TCDatabase介绍(1) 博客分类: 软件开发 TokyoCabinetRuby数据结构LuaMySQL
-
[原创] 如何在Android Market赚钱 part 1 - paid app 付费app 博客分类: Android AndroidGoogle中国移动咨询软件测试
-
软件构造——从SOLID五大原则的角度看OOP
-
ucore lab1_report