20202317向岩杰 2020-2021-2《数据结构与面向对象程序设计》课程总结
课程内容总结
基于命令行进行简单的Java程序编辑、编译、运行和调试。
练习Linux基本命令。
学习Java程序的JDB调试技能:https://www.cnblogs.com/rocedu/p/6371262.html。
编写简单的Java程序。
- 问题1:首先是在使用linux和vim编辑器的时候,由于是第一次使用这种方式操作系统,特别是对于我这种打字都有点费力的人来说,的确是一个比较大的难题。vim编辑器的使用显得手忙脚乱,刚开始估计都是这样的。
- 问题1解决方案:这个东西的解决方法,好像也没啥特别的解决方法,自己有在尝试做一些题目,像在csdn上找了一些基础的练习题,单纯是为了练熟代码格式还有就是练手速。
- 问题2:在安装jdk的时候出现了比较麻烦的事情,主要集中在安装Opera Jdk的时候,可能是由于先已经安装了openjdk的原因,在按照步骤装完opera jdk的时候,java -version仍然只显示openjdk。
- 问题2解决方案:后来从老师那里知道了其实openjdk对于我们的学习已经够用了。
还记得编写的第一个经典程序“hello World”。从那时起我已开始走进Java的世界。当时自己不是很理解为什么main方法一定要这样来定义public static void main(String[] args),能不能不-这样写?问了好多同学,他们告诉我的答案是一样的“java本身要求就是这样子的”,就像之前学C的时候,一定是#include开头后跟int main(),学习一门计算机语言的一般都是这样,先模仿,再钻研。特别是在vim编辑器的使用显得手忙脚乱,刚开始估计都是这样的。后来自己查资料,在csdn上找到了好多我能看得懂的参考资料。接下来的学习中还是要多练习,要跟上老师的教学进度。同时也不能只是简简单单的满足于Java的学习,要利用大二的时间多开拓视野,尽可能多学习新东西。
2.第二章
(1) 编写简单的计算器,完成加减乘除模运算。
(2) 要求从键盘输入两个数,使用判定语句选择一种操作,计算结果后输出,然后使用判定和循环语句选择继续计算还是退出。
(3) 编写测试代码,测试验证。(https://www.cnblogs.com/rocedu/p/4472842.html)
- 问题1:首先是对于构造方法过程稍微难以理解
- 问题1解决方案:将C语言的函数和构造方法类比就好理解多了
- 问题2:第一个计算器的输入体验不像一个计算器,所以想换一种写法
- 问题2解决方案:多加一个循环用来定位符号,由于是两个数所以比较容易分割整个字符串但是也有缺点,就是如果想增加更多的计算种类比如科学计算器就比较麻烦。
这次实验主要是强化了循环,对于构造方法的练习还不够。但是在想第二种方法的时候基本上Java的循环于c语言没啥区别,而且方法使得部分操作更加简单了,比如如果要将c语言中的一个字符串拆解可能十分麻烦,所以用c语言写计算器基本上就不会想到这种方法。但是第二种写的还是很麻烦,水平有限,暂时可能优化不了嘿嘿嘿。对于类与对象和构造方法的认识还不够,对于类、对象、方法之间的关系还差一些理解。之后会继续努力。
3.第三章
下载安装并使用IDEA,完成下面实验(https://www.cnblogs.com/rocedu/p/6371315.html)。
1. 初步掌握单元测试和TDD
2. 理解并掌握面向对象三要素:封装、继承、多态
3. 初步掌握UML建模
4. 完成蓝墨云上 (1)-(5)实验。
- 问题1:junit的配置,junit3配置后仍然无法使用
- 问题1解决方案:重新配置路径,尝试了包括junit-4.12等许多版本,最后一股脑全部放进去才搞定
- 问题2:在(2)中test charAt时,出现预期与实际情况一样但是仍报错
- 问题2解决方案:检查代码后发现单引号用成了双引号- 问题1:junit的配置,junit3配置后仍然无法使用
- 问题3:对于设计模式的格式和具体方法不清楚,包括Byte等的包装类不熟悉
- 问题3解决方案:查阅资料
这次实验对于TDD和设计模式这些新的东西有了更深的体会,特别是对于产品代码和测试代码的理解,产品代码相当于一个类,测试代码通过调用这个类中的方法来验证这个类是否发挥了作用。其次是设计模式中的工厂方法模式,老师提供的示例中主要是使用这个模式,还有包括抽象工厂模式(AbstractFactory)等许多模式,通过代码扩充,对于设计模式的可重用性、可扩充性、可维护性和灵活性好等特点有了更进一步地理解。
4.第四章
(一)Java Socket编程
1.学习蓝墨云上教材《Java和Android编程》“第16章 输入/输出 ”和“第22章 网络”,学习JavaSocket编程
2.结对编程。结对伙伴A编写客户端SocketClient.java,结对伙伴B编写服务器端。
3.截图加学号水印上传蓝墨云,代码push到码云,并撰写实验报告。
(二)Java和密码学
参考 http://www.cnblogs.com/rocedu/p/6683948.html
以结对的方式完成Java密码学相关内容的学习(帖子中所有代码和相关知识点需要学习)。提交学习成果码云链接和代表性成果截图,要有学号水印。
(三)编写有理数/复数计算器
结对编程,结对伙伴A编写有理数计算器。结对伙伴B编写复数计算器。截图加水印上传蓝墨云,代码push码云。
(四)远程有理数计算器
结对编程,结对伙伴A编程实现客户端,结果伙伴B实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴B(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端A,A收到结果后输出结果。截图加水印上 传蓝墨云,代码push码云。
(五)远程复数计算器
结对编程,结对伙伴B编程实现客户端,结果伙伴A实现服务器端。
客户端通过键盘输入一个有理数计算的公式(例如:1/4 + 1/6 = ),并把该公式以字符串的形式发送给伙伴A(服务器端),服务器端根据字符串计算出结果为5/12,并把结果返回给客户端B,B收到结果后输出结果。截图加水印上传蓝墨云,代码push码云。
注意实验四(4)和实验四(5),一个人不能仅实现客户端,必须实现一个客户端和服务器,否则两个实验均不得分!!!
- 问题1:关于有理数计算器的编写时,由于像个憨批忘记有nextToken这个方法无法从输入的算式中提取数字
- 问题1解决方案:用for 循环定位空格,记录空格的位置,用substring提取数字和运算符
- 问题2:对于IP地址稍做了研究因为在我尝试多次修改地址时发现并不会影响链接
- 问题2解决方案:后来了解到从127.255.255.255到127.0.0.1都是本机地址,称为环回地址
这次还是学到了很多的东西,特别是自己尝试去研究特定的方法,像一开始忘记了有nextToken这东西,然后研究出靠空格来定位,用数组来记录空格位置,再分割算式的方法提取数字和运算符,总的来说还是非常棒的(说不定就是nextToken的底层代码呢嘿嘿嘿),包括实现客户端和服务器的循环问答,下次继续加油。
5.第五章、第六章
1.链表练习,要求实现下列功能:
通过键盘输入一些整数,建立一个链表;
这些数是你学号中依次取出的两位数。 再加上今天的时间。
例如你的学号是 20172301
今天时间是 2018/10/1, 16:23:49秒
数字就是
20, 17,23,1, 20, 18,10,1,16,23,49
打印所有链表元素, 并输出元素的总数。
在你的程序中,请用一个特殊变量名来纪录元素的总数,变量名就是你的名字。 例如你叫 张三, 那么这个变量名就是
int nZhangSan = 0; //初始化为 0.
做完这一步,把你的程序签入源代码控制(git push)。
2.链表练习,要求实现下列功能:
实现节点插入、删除、输出操作;
继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;
从磁盘读取一个文件, 这个文件有两个数字。
从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。
从文件中读入数字2, 插入到链表第 0 位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
从链表中删除刚才的数字1. 并打印所有数字和元素的总数。
3.链表练习,要求实现下列功能:
使用冒泡排序法或者选择排序法根据数值大小对链表进行排序;
如果你学号是单数, 选择冒泡排序, 否则选择选择排序。
在排序的每一个轮次中, 打印元素的总数,和目前链表的所有元素。
在(2)得到的程序中继续扩展, 用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan (你的名字)来表示元素的总数。
- 问题1:一开始写的deleteElement方法有大问题,从头结点开始遍历链表的时候一直到tail都不能找到目标元素。
- 问题1解决方案:没有解决(9#%&#),但是学到了怎么使用debug和设置断点,而且也大概发现了问题,在进入deleteElement方法的时候,头指针并不为空,而且元素在比较时可能存在内容无法比较,可能需要重写equals(人类极限了属于)。
- 问题2:在冒泡的时候首先遇到的问题是element的比较。因为一开始的代码中链表的元素是Time类,就是上面截图中的Time类,但是两个类怎么比较。。。。直接蚌埠住了,再加上跟deleteElement死磕了好几个钟,所以放弃思考了
- 问题2解决方案:把Time类删了,删干净了,全部换成Integer,这样冒泡的排序也很好写。
(按顺序)总结所做过的作业
(按顺序)实验报告链接汇总
实验二 实验名称:简要内容
……
代码托管链接:
课程收获与不足