HIT 2019春软件构造Lab1
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 实验环境配置
2.1环境配置过程与方法
(1) 请阅读http://web.mit.edu/6.031/www/fa18/getting-started/,按该页面列出的指南,在本地机器安装相应的开发环境(JDK、Eclipse、Git)并熟练掌握它们的配置过程。
(2) 可以从http://web.mit.edu/6.031/www/sp17/getting-started/eclipse-faq/获取更多的Eclipse帮助。
(3) 阅读http://web.mit.edu/6.031/www/fa18/classes/02-basic-java/了解Java的基本编程特性。
(4) 关于Git的学习手册:https://git-scm.com/book/en/v2(英文版)、https://git-scm.com/book/zh/v2(中文版)。可使用https://www.shiyanlou.com/courses/4提供的在线实验环境进行Git练习。
(5) 阅读http://web.mit.edu/6.005/www/fa16/psets/ps0/#unit_testing,了解单元测试和JUnit工具。
(6) 阅读https://github.com/junit-team/junit4/wiki/Download-and-Install,并在自己的Eclipse IDE中安装配置JUnit。
(7) 阅读https://github.com/junit-team/junit4/wiki/Getting-started,了解如何使用JUnit为Java程序编写测试代码并执行测试。
2.2 GitHub Lab1仓库的URL地址
https://github.com/ComputerScienceHIT/Lab1-1170301028
2.3 配置过程遇到的困难及解决方案
(1)git配置时没有头绪,查询网站
https://blog.csdn.net/youzhouliu/article/details/78952453解决。
(2)git bash使用时遇到无法push等问题,通过百度搜索到需要绑定公钥,根据教程,找到问题所在并且解决。多次试验git的push功能。
(3)配置Junit时,查询网站
https://blog.csdn.net/andycpp/article/details/1327147解决。并同时调试了IDE的各种功能,例如自动补全等。
3 实验过程
请仔细对照实验手册,针对四个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但无需把你的源代码全部粘贴过来!)。
为了条理清晰,可根据需要在各节增加三级标题。
3.1 Magic Squares
任务理解:要求判断一个矩阵是否是magic square,其实是要对方阵的各种性质进行运用。看似是判断是否每行相加的值与每列相加的值以及主对角线与副对角线相加的值相等,但是其中有更加值得注意的点,比如矩阵是否是个方阵,矩阵中的元素是否都是合法,元素中的各个元素是否使用制表符隔开等问题。
3.1.1 isLegalMagicSquare()
思路/过程/结果。
(1) 文件读入及相关处理
这里是根据https://blog.csdn.net/nickwong_/article/details/51502969进行学习的,采用了面向对象的方法,读取文件的路径是相对路径。并初步对含有负数和小数的矩阵,和非法隔开做出判断
(2) 判断读入的矩阵是否是矩阵
首先根据实验手册提示,使用了string.split(“\t”)的用法,将字符串割裂。获得行的长度,在确认列长。
(3) 建立一个数组,将文件里符合条件的矩阵转化为整型。
(4) 判断矩阵是否是magic square
运用的方法是,建立一个大小为4n的数组sum,其中n为矩阵行宽(或列长)。每n项存分别存入行相加,列相加,正对角线相加,及副对角线相加的和。如图下:
然后比价这个数组sum是否每一项都相等,若相等就返回true,即是magic square,否则返回false。
(5) 结果:
3.1.2 generateMagicSquare()
思路/过程/结果。
(1) 根据要求输入的n为偶数和负数时会报错。
当n为负数时,会提示数据为负数。是因为数组大小不能为负数。
当n为偶数时,会提示数组越界。这个较难看出,先要对代码进行分析。
(2) 代码分析及注释:
解释n为偶数时:当nn%n0,这个时候row++。每次在进行行的跳跃时row都不能等于n-1。若n为偶数,会在最后一个插入时,不满足上述条件,rown时是违法的。故n为偶数时会越界。
(3) 对函数扩展:
写入文件,与读入数据相似,仍然选择相对路径。
n为偶数及负数时,打印提示语句,并return false。
(4) 流程图:
(5) 结果 选取n = 5.
3.2 Turtle Graphics
任务理解:turtle就相当于一个画笔,根据前进的长度和角度可以画出直线曲线,和各种颜色。已经搭好得到框架是为提供后序显现相关内容做的准备,其中包括一些类和方法,其中包括turn和forward,画笔颜色等。
每个任务之前都有清楚的函数功能解释,仔细阅读就能够完成。
3.2.1 Problem 1: Clone and import
(1) 从GitHub获取该任务的代码
可以打开提供的网址,然后选择download ZIP就可以把全部文件下载到本地,也可以在git bash中使用pull命令和clone命令下载到本地。
按照提供的项目目录将指定文件放入对应的位置,refresh之后简单修改一下包名和import即可使用。
(2) 在本地创建git仓库、使用git管理本地开发(以下参考网络)
1.git init初始化本地仓库
2.git add remote origin 添加远程库源
3.在远程仓库创建master分支
4.git pull origin master将远程仓库同步到本地
5. git add +文件名
git commit将本地文件加入本地仓库
git push将本地仓库同步到远程仓库。
3.2.2 Problem 3: Turtle graphics and drawSquare
任务要求画一个正方形,边长已给出,只要配合前进和改变方向就可以。
3.2.3 Problem 5: Drawing polygons
任务要求在函数drawRegularPolygon中实现画出等边多边形,这时候需要计算多边形的内角大小,运用for循环前进和改变方向。
(1) 函数calculateRegularPolygonAngle根据多边形内角性质得到公式计算,容易得到相应的角度。需要注意的是,返回值为double类型,返回时要注意类型的转化,如下:
(2) 引申出函数calculatePolygonSidesFromAngle根据多边形的内角计算出边的条数。这里需要将返回值向上舍入。如下:
最后实现部分:
3.2.4 Problem 6: Calculating Bearings
任务要求在函数calculateBearingToPoint计算出由初始方向从current点到target点逆时针所以要转动的角度。这里我对两点的位置关系做了等价类的分解。
(1) 两点横坐标相等
(2) 两点纵坐标相等
(3) target在current右上
(4) target在current左上
(5) target在current左下
(6) target在current右下
根据数学关系进行计算。
需要注意的是,角度的范围是0<=angle<360度,这里求出的角度若不在范围内可以对角度做一个转化,确保输出的结果合法,如图下:
由此引申一个函数calculateBearings给出n个坐标,计算相邻点之间需要转过的角度,加入到一个List中,返回这个List。
(1) 建立循环(次数为n-1)
(2) 计算两个转动的角度,调用calculateBearingToPoint
(3) 将角度加入List
(4) 加上初始角度(即为上一次的角度结果,第一次为0)
3.2.5 Problem 7: Convex Hulls
任务要求在给定n个点的基础上确定它们的凸包。凸包可以具体为包含所有点的一个圈。所以要找出“最外面的点”。
(1) 首先加入的点是最左且最下的点。第一个点我们较难确定是不是凸包上的点,但是我们知道最左且最下的一定是在凸包上,所以就选择它。
(2) 剩下的点中,我们一一遍历计算要到达所需要转的角度,找出转动最小的点,一定会是上一个点连接的最外的点。
(3) 把找到的角度加入,重复(2)
(4) 知道加入的点找到的下一个最小角的点就是第一次我们加入的点时,结束。
需要注意的问题是:
(1) 第一个加入的点一定要确定不仅是最左也要是最左边的最下的。因为有可能有超过1个点在最左边。若为3个在最左,只有选中最下的才可以确保这个点一定是凸包上的点。
(2) 若有两个点的最小角相同,此时,要把距离最远的点留下。若有三个,其中一个一定已经在上一次遍历时删除了一个,不必考虑了。
并且,double类型的数据不能用“==”来判断相等。
3.2.6 Problem 8: Personal art
任务要求自己设计一个图形。
首先我对颜色有一个渐变的排序。其次根据一定变换做出两个螺旋的形状,之后对角度做一些调整,以下是结果:
3.2.7 Submitting
在eclipse工作文件夹下打开Git Bash Here,输入以下命令行
(1) git add Lab1-1170301028
(2) git commit -m “备注” 将本地文件加入本地仓库
(3) git push将本地仓库同步到远程仓库
3.3 Social Network
任务理解:这里整体的运用是对有向图进行各项操作,加入点,加入边,计算点之间的单个功能。直接展现人物关系,其中还包括细节的处理,例如名字不能相同。没有给出实验框架,实验实现较于前两个问题有些难度,但是功能清晰,思路也不算难,主要是对代码从无到有有一个挑战。
3.3.1 设计/实现FriendshipGraph类
思路/过程/结果。
(1) 根据所给代码,知道我们需要建立的是人物的列表以及关系。关系采用了邻接矩阵的数据结构。我在这里选择了private型,所以我也加入了两个方法调用这两个变量。
(2) addVertex函数实现了加入点的操作。
这里只需要判断名字不重复就可以加入List。
(3) addEdge函数实现的加入边(关系)的操作
1.因为已经知道了list的长度,我们就可以确定关系矩阵的大小了。
2.判断一下传入的两点,是不是存在,不存在抛出异常。
3.建立矩阵:(建立好的矩阵自动初始化为全0,List类型数据有顺序)
(4) getDistance函数实现计算两点间的距离,若不存在关系则返回-1.
这里我选择使用广度优先搜索的算法进行修改。
1) 建立一个队列,先将起始点加入队头,建立一个标记数组(默认为false),建立length记为距离
2) 遍历队头以外其他所有点,将与这个点相连的点都加入队尾,把队头移出,加入的数标记为true,length++
3) 重复2)
4) 直到队列为空结束
5) 此时的length是多余了某点与之相连点的个数,做出一定处理减去。
如图:
(5) 结果:
3.3.2 设计/实现Person类
思路/过程/结果
(1) 首先想到的是人物的名字(string类型),以及名字的“集合”(List类型)。名字我使用了private型,所以我加入一个方法获取名字。
(2) 判断加入的名字是否重复,重复即抛出异常,不重复就加入。
3.3.3 设计/实现客户端代码main()
思路/过程/结果。
实验指导中已经给出了合适的main的测试用例,稍作修稿之后就可以被当做客户端代码使用,其他测试也已经在test中进行过了。
问题回答:14-17行代码应当都输出-1,因为实验手册中使用的是无向图,对它做出的修改就是,建立了有向图的邻接矩阵。
3.3.4 设计/实现测试用例
思路/过程/结果
(1) testAddVertex函数对函数AddVertex测试。
<1>加入点的测试,就是在加入前判断是否存在,在加入后判断是否加入。
异常时:
<2>针对异常的测试(加入一个已存在的人),加入异常的数据,此时期待值与返回值一定不相同。而此时抛出的异常是期待值与返回值相同,并清空List。
(2) testAddEdge函数对addEdge函数进行测试
<1>先定义几个人物并加入List,再加入几个关系。
<2>对关系矩阵进行判断
<3>根据实验手册进行有向图的判断
(3) testGetDistance函数是对getdistance函数的测试,这个测试较为简单,只要自己建立一个图,计算好相应的关系即可。
我建立的图为:
测试代码:
(4)结果:
3.4 Tweet Tweet
此问题与问题2类似,都是根据任务要求,在搭好的试验框架下完成任务。但是算法难度加大,debug也要花费更多的时间。
设计的问题跟推特的部分功能相似,这里主要是需要@其他作者的功能。功能较为实用。
3.4.1 Problem 1: Extracting data from tweets
(1) 问题1的第一个实现是getTimespan,是记录每篇推文的时间段。
时间函数的比较实用isBefore功能获得时间最大值和isAfter功能获得时间最小是。并且要调用实验框架中的getTimestamp功能。
(2) getMentionUser函数来获取一篇推特中@的人。
1) 需要辅助函数isLegalName。用来判断用户名是否合法。
2) 需要辅助函数nameTranslater。用来将用户名的大写都转化为小写。
3) 函数getMentionUser:
- 首先遍历文章,找到‘@’字符
- 若文章开始就是‘@’或者文章之后‘@’前一位为非法字符,就可以加入
- ‘@’之后直到‘:’、‘,’、‘ ’的字符中,只要合法都是用户名,加入集合。
3.4.2 Problem 2: Filtering lists of tweets
(1) writtenBy函数,用来确认推文的作者。
1>遍历文章,调用实验框架下的getAuthor方法获得作者名,与传入的用户名进行比较
2>注意点:比较的两个用户名都要转化大小 写之后再比较。
(2) inTimespan函数用来找出某个时间内所有发表的文章。
文章发表的时间应当在初始时间之后,结束时间之前,包括初始时间与结束时间。若是,就加入列表。
(3) containing函数,用来查找文章中是否含有词语words。遍历文章中的所有string,搜索word这个词,若在某个下标下有相同的字符串,所得的下标不应为-1,结束遍历。
3.4.3 Problem 3: Inferring a social network
(1) guessFollowGraph函数,用来找出作者所写的文章@的人。
1> 遍历每篇推文,获得文章的作者。
2> 调用writtenBy函数确定作者所写的文章列表。
3> 调用getMentionedUsers函数找出文章列表中被@的所有人。
4> 将作者与@的人加入Map类型变量。
(2) influencers函数,用来排序作者的影响力,其中要利用到guessFollowGraph中得到的Map类型变量。
1> 首先建立一个Set型变量,将Map中的key和Value提取出来。
2> 删除Set中的重复的变量,这才能获得所需要的用户名集合。
3> 遍历这个集合,获取每个人被@的次数。建立一个Map变量,分别存入用户名和被@的次数。
4> 建立一个List变量作为最终的返回变量,遍历这个Map型变量,找到value中的最大值,再根据这个最大值找出他的key。把key加入List,再将这个key移出这个Map。
5> 知道Map为空时,结束遍历。
3.4.4 Problem 4: Get smarter
guessFollowGraph_smarter函数,用来找出作者所写的文章@的人。
其中,若A@B,B@C,则A@C。
1> 遍历每篇推文,获得文章的作者。
2> 调用writtenBy函数确定作者所写的文章列表。
3> 调用getMentionedUsers函数找出文章列表中被@的所有人,记为集合Set。
4> 在集合Set中重复2>和3>。
5> 返回所需集合
4 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 时间段 任务 实际完成情况
2019-03-02 18:00-20:30 完成文件的读入并对数据进行处理和判断 按计划完成
2019-03-03 18:00-20:30 编写P1的isLegalMagicSquare函数并进行测试 按计划完成
2019-03-03 20:30-22:00 对P1的generateMagicSquare函数进行测试修改和分析 按计划完成
2019-03-05 19:30-22:30 完成P2中除了convexHull函数以外的所有方法 未完成,有bug
2019-03-07 19:30-22:30 对上述问题debug,完成convexHull函数。 完成
2019-03-08 19:00-22:00 修改新发现的bug,对细节作调整。完成Person类 完成
2019-03-10 19:30-22:30 完成FriendshipGraph类 未完成,有bug
2019-03-11 08:30-9:30 对FriendGraph类debug 未完成
2019-03-11 09:30-12:30 对FriendGraph类debug,并完成test 完成
2019-03-12 19:30-23:30 发现新P3中的bug,debug 完成
2019-03-12 15:45-18:00 完成P4中Extract类 完成
2019-03-13 20:30-22:30 完成P4中的Filter类 完成
2019-03-14 18:30-23:00 完成P4中的SocialNetWork的前两个问题 未完成,有bug
2019-03-15 14:00-22:00 完成P4包括test,修复SocialNetWork的发现的心bug 完成
2019-03-16 09:00-12:10 完成一半实验报告,修复四个新的bug 完成
2019-03-16 18:30-22:30 完成时剩余实验报告 完成
5 实验过程中遇到的困难与解决途径
遇到的难点 解决途径
文件读入时分割成字符串,再将字符串转化为整型的数组 查阅网站,询问了同学
凸包的概念较难理解,算法都较复杂 查阅百度百科,理解凸包概念,和同学讨论,最终选择了适合于本次实验的算法。
P3中使用较多的String、List及Set类型,转化较多 选择合适的变量表示,配置好编译器可以有方法提示,变量名较多,起名都按照功能性质来其名,添加了适当的备注。注意到Set类型是没有顺序的,遍历方法不能使用原来的方式,这里也查阅了一些网站。
Map类型的使用较容易混淆,在SocialNetWork类中的influencers函数中,需要更多的类型个变量,和很多的循环。 写代码时应该养成良好的编写习惯,注意备注,逻辑的分段。Map类型的性质查阅了网站,其中查阅了如何根据value值获得key的值(自己进行了修改)等。
6 实验过程中收获的经验、教训、感想
6.1 实验过程中收获的经验和教训
经验:
(1) 写函数之前要仔细理解要求,一般是根据返回值的类型的性质出发思考,解决问题是一步一步完成的,逻辑和思路要清晰,要注意书写规范,常常使用快捷键“Ctrl+Shift+F”来整理代码,可以清晰看出多重循环之间的关系。
(2) 有时候标志变量太多我们可以使用局部变量,防止出现混淆漏改的情况。
(3) 配置好编译器可以有方法提示,可以注意利用。
(4) 注意路径问题。如果不会不要轻易尝试,提问和上网查询是更好的方式,一般网上都会有处理一些问题的教程,自己随意尝试可能更加麻烦。
教训:
(1) 循环时,要注意条件。等价类分解的时候要注意把所有的问题都要考虑到,否则会陷入死循环。
(2) 变量名按照功能性质来取,不能随意,否则编译过程中会修改错变量。
(3) test中的测试用例较少,自己要进行更多的测试。
(4) 注意也要用main函数进行测试,有时候test测试用例通过也得不出正确解。利用打印,标记等方式多多测试。
6.2 针对以下方面的感受
(1) Java编程语言是否对你的口味?
比较对胃口,功能较多,内置库丰富方便好用。语法较为复杂,但熟练运用后会觉得很有意思。java编译中会遇到很多问题,是很多程序员遇到过的问题,形式多样,多多看看别人的经验有助于自己解决问题。
(2) 关于Eclipse IDE
UI界面上觉得很舒服,很精致。比较智能,可以及时检测语法错误、有方法提示等等,更新也比较及时。觉得很不错。
(3) 关于Git和GitHub
链接是全英文过程,较为复杂。有时候可能会错漏一些细节,还好不要紧。但是这个平台使用的用户体验是很不错的,都是前辈们智慧的结晶。虽然到现在的了解还不是很多,但是通过课上和课下自己查资料了解,觉得它的实用性已经远大过设计者最初的目标。
(4) 关于CMU和MIT的作业
解释说明都很清楚,不过都是全英文,有些词汇较为专业,还需要翻译。任务的细节了解还是有些困难的,其实实验中理解任务比完成任务花的时间多出不少。
但是不得不说,题目的设计比较实用,是现在人们常常接触的东西,让我们了解到现在流行的类似推特和微博的简单实现的原理。难度都是有层次的,不会很轻松,但是完成后十分有成就感。
(5) 关于本实验的工作量、难度、deadline
<1>工作量还是较大的,实验花了整两周的时间,工作量大也会导致出现一些bug,写的越多越发现问题,很多的时间都在修改之前的内容,进度较难前进。
<2>难度有简有难,整体难度中等偏上(虽然老师和一些同学不这么认为)。简单的实现可以一次完成一整个类,有些函数就比较难,debug更花时间。
<3>deadline我觉得合适,有足够调整自己的时间。
以上的几个体会让我看到了我和别人的差距,还需加油。
(6) 关于初接触“软件构造”课程
听课时觉得并不难,但每次课上时的小测让我发现自己不太能抓住重点,也容易错漏细节。软件构造在我内心的定位还是有点高的,也有所误会,应该适当转变心态。应该注意将实验和课程结合一起学习。
HIT 2019春软件构造Lab1相关推荐
- HIT2020春软件构造lab1
HIT 2020年春季学期 计算机学院<软件构造>课程 **Lab 1实验报告 目录 1 实验目标概述 2 实验环境配置 3 实验过程 3.1 Magic Squares 3.1.1 is ...
- 哈工大2021春软件构造实验总结
哈工大2021春软件构造实验总结 文章目录 一.实验一 1. 实验概述 1.1 Magic Squares 1.2 Turtle Graphics 1.3 Social Network 2. 实验感受 ...
- 哈工大2021春软件构造实验
2021春软件构造(Software Construction)课程共3个实验,其中lab1和lab2同往年一样,lab3是全新的实验. 3个实验的内容如下: Lab-1: Fundamental J ...
- 哈工大18年春软件构造课程讨论题
这是哈工大18年春软件构造课程(徐汉川老师)的讨论题目,少部分答案摘录自课件PPT和网上的资源(链接在文中给出).如有错误还望指出,谢谢. 一.在软件测试过程中,"测试用例的数目" ...
- 2022哈工大软件构造lab1小结(知识点)
哈工大软件构造lab1小结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 问题一 使用的库 异常处理机制 字符串内容检查 写入文件 问题二 problem 3:画一 ...
- 哈工大2021软件构造lab1总结
哈工大2021软件构造lab1总结 作为软件构造的第一次实验,感觉内容本身不是很难,里面功能的实现用上学期在数据结构和算法分析两门课里学到的知识就可以解决(尽管其实已经忘没了).这次实验主要目的还是准 ...
- 软件构造Lab1实验总结
软件构造Lab1实验总结 1 实验目标概述 本次实验通过求解四个问题,训练基本 Java 编程技能,能够利用 Java OO 开 发基本的功能模块,能够阅读理解已有代码框架并根据功能需求补全代码,能够 ...
- HIT 软件构造 Lab1
2022年春季学期 计算学部<软件构造>课程 Lab 1实验报告 姓名 艾浩林 学号 120L021917 班号 2003006 电子邮件 2017869860@qq.com 手机号码 1 ...
- HIT软件构造lab1
目录 1 实验目标概述 1 2 实验环境配置 1 3 实验过程 1 3.1 Magic Squares 1 3.1.1 isLegalMagicSquare() 1 3.1.2 generateMag ...
最新文章
- java.sql.SQLException: Lock wait timeout exceeded
- PHP之提取多维数组指定列的方法
- python 爬虫 使用requests设置代理
- bootstrap 点击加号 表格_bootstrap中的输入组按钮,点击加号加1,减1子
- GitHub 中文排行榜,高分优秀中文项目一网打尽!
- VR开发中性能问题—OculusWaitForGPU
- [译]如何在C#中调试LINQ查询
- JAVA并发包内容_java并发包
- 操作系统双语阅读 - Schedulers调度器2
- 网站导航(自定义站点地图)
- csdn下载频道资源整理
- 碰撞检测之 AABB 包围盒
- php 与 html 的混合编程
- 我的世界服务器怎么改无限力量,我的世界无限力量效果指令,我的世界怎么用命令方块做无限的效果...
- MathorCup 高校数学建模挑战赛第一届——大数据竞赛论文格式及提交规范
- 斯坦福自然语言处理(1)——三元组的使用
- 集装箱号码识别技术在港口的应用
- 【转】SSD、HDD、NVMe区别
- python(11)- 文件处理
- 计算机游戏13关gongl,密室逃脱4之恐怖电影院第13关怎么过 第13关通关攻略