20172301 《Java软件结构与数据结构》实验三报告

课程:《Java软件结构与数据结构》

班级: 1723

姓名: 郭恺

学号:20172301

实验教师:王志强老师

实验日期:2018年11月20日

必修/选修: 必修

一.实验内容

实验一

实验二

实验三

实验四

实验五

二.实验过程及结果

实验一:

实验一是比较简单的,代码是书上的代码。主要是Junit测试因为好久没有用过,总是会有一些错误,类似junit测试方法前没有添加test,或者junit测试的assert方法实现。

测试用例设计情况(正常,异常,边界,正序,逆序),关于测试用例,对于排序的异常,是ClassCastException,是转换发生了错误。具体是例如1、2、3、4、a、b是不可以比的,也就是不能排序。

排序应该是没有边界测试的。

对于查找的异常,是ArrayIndexOutOfBoundsException,是数组越界。即查找范围超过了数组范围。

查找应该是没有逆序测试的。

实验一测试结果截图:

查找测试:

排序测试:

实验二:

实验二首先要移到包里面,需要注意的是测试类的位置,需要放在项目的test文件夹中,并且变更目录为Test Sources Root。

实验二测试结果截图:

实验三:

七种查找算法分别是:线性查找、二分查找、插值查找、斐波那契查找、树表查找、分块查找、哈希查找。之前的学过的查找方式,这里就不再多说了。

需要注意的是,插值查找和斐波那契查找都是二分查找的优化,所以他们所查找的序列应该也是有序的。

我重点解释一下分块查找。

在之前的学习中,我们学习过分块排序。那么类比推理一下,分块查找的原理应该也是类似的。分块查找的最大特点就应该是块内无序,块间有序。 通过这个特点,我们可以首先可以确定目标元素在哪个块里面,然后通过顺序查找确定其位置。

可以说,是一种折半查找和顺序查找的优化改进的方法。

那么这里,我直接用了之前的分块方法。

private static > int partition(T[] data, int min, int max)

{

T partitionelement;

int left, right;

int middle = (min + max) / 2;

//使用中间数据值作为分区元素

partitionelement = data[middle];

// 暂时把它移开

swap(data, middle, min);

left = min;

right = max;

while (left < right)

{

// 搜索一个元素,它是>分区元素

while (left < right && data[left].compareTo(partitionelement) <= 0)

left++;

// 搜索一个元素,它是

while (data[right].compareTo(partitionelement) > 0)

right--;

// 交换元素

if (left < right)

swap(data, left, right);

}

// 将分区元素移动到适当的位置

swap(data, min, right);

return right;

}

然后,在分块查找里划分为几个部分。

int partition = partition(data,min,max);

int leftPartition = partition(data,min,partition-1);

int rightPartition = partition(data,partition+1,max);

判断具体位置后,进行线性查找。

实验三测试结果截图:

实验四:

这里的排序算法是希尔排序,堆排序,二叉树排序。

这里还是重点介绍一下希尔排序。因为有关第八周的测试,希尔排序学长提出了一点问题。

这里我先放出我当时的答案。

学长说这里应该是4插入到13的前面。

我们这里就应该注意希尔排序的基本思想:

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

希尔排序也是插入排序,对简单插入排序的改进方法。

所以,对于这道题来说,最后4应该直接插入到13的前面。

实验四测试结果截图:

异常:

实验五:

基于安卓实现查找和排序功能。是之前实验的一个整合。

实验五测试结果截图:

三. 实验过程中遇到的问题和解决过程

问题1:实验三中七种查找算法中的斐波那契查找,对于其中扩展数组的操作,C++实现:

int * temp;//将数组a扩展到F[k]-1的长度

temp=new int [F[k]-1];

memcpy(temp,a,n*sizeof(int));

int * temp是声明一个int类型的数组。

memcpy()方法应该是有关复制的操作,在java中应该如何实现。

问题1解决方案:

memcpy()函数

函数原型:void *memcpy (void*dest, const void *src, size_t n);

功能:由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。

由此,这个功能应该就是复制原数组到一个新数组中。

在java上有多种实现方式:

for循环代码可以说是很直观,灵活并且便于理解,但是效率有时候不高。 // 通过for循环

int[] array2 = new int[5];

for(int i = 0;i < array1.length;i++) {

array2[i] = array1[i];

}

for(int i = 0;i < array2.length;i++) {

System.out.print(array2[i]);

}

System.out.println();

System.arraycopy()方法通过源码可以观察到native,是原生态方法,效率自然更高。 public static native void arraycopy(Object src, int srcPos,

Object dest, int destPos,

int length);

Arrays.copyOf()方法在源码上是基于System.arraycopy(),所以效率自然低于System.arraycpoy()。 // 通过Arrays.copyOf()

int[] array4 = new int[5];

array4 = Arrays.copyOf(array1, 5);

for (int i = 0; i < array4.length; i++) {

System.out.print(array4[i]);

}

Object.clone()方法从源码来看也是native方法,但返回为Object类型,所以赋值时将发生强转,所以效率不如之前两种。 // 通过Object.clone()

int[] array5 = new int[5];

array5 = array4.clone();

for (int i = 0; i < array5.length; i++) {

System.out.print(array5[i]);

}

其他(感悟、思考等)

这周做完实验没有及时总结,因为时间比较久远,导致有一些错误和解决方法都有所遗忘。部分参考资料还是在浏览器的历史记录中淘到的。以后要对错误及时总结,养成良好的学习习惯。

参考资料

java程序的结构与类型实验报告_20172301 《Java软件结构与数据结构》实验三报告...相关推荐

  1. Java 程序基本结构

    我们先剖析一个完整的Java程序,它的基本结构是什么: /*** 可以用来自动创建文档的注释*/ public class Hello {public static void main(String[ ...

  2. Java程序基本的设计类型

    基本的Java程序设计 一.一个简单的Java程序 1.1 最简单的程序 1.2 注释 二.数据类型 三.变量 3.1 变量声明 3.2 变量初始化 四.常量 一.一个简单的Java程序 1.1 最简 ...

  3. java程序的装载与检查_浅谈Java类型装载、连接与初始化

    类型装载.连接与初始化 Java虚拟机通过装载.连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用.其中装载就是把二进制形式的Java class文件读入Java虚拟机中去;连接 ...

  4. 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)...

                 The reasonable man adapts himself to the world; The unreasonable one persists in trying ...

  5. 转载----编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)...

    阅读目录 建议1:不要在常量和变量中出现易混淆的字母 建议2:莫让常量蜕变成变量 建议3:三元操作符的类型务必一致 建议4:避免带有变长参数的方法重载 建议5:别让null值和空值威胁到变长方法    ...

  6. JAVA中两个char类型相加_1、JAVA中的几种基本类型,各占用多少字节?

    1.Java是一种强类型语言.这就意味着必须为每一个变量声明一种类型.在Java中,-共有8种基本类型,其中有4种整型.2种浮点类型.1种用于表示Unicode编码的字符单元的字符类型char和1种用 ...

  7. 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议6~10)...

    建议6:覆写变长方法也循规蹈矩 在JAVA中,子类覆写父类的中的方法很常见,这样做既可以修正bug,也可以提供扩展的业务功能支持,同时还符合开闭原则(Open-Closed Principle). 符 ...

  8. 运行java程序需要的工具软件的目录,运行Java程序需要的工具软件所在的目录是A.JDK的bin目录B.JDK的demo目录C.JDK的lib目录D.JDKR的j...

    运行Java程序需要的工具软件所在的目录是A.JDK的bin目录B.JDK的demo目录C.JDK的lib目录D.JDKR的j 更多相关问题 [多选] 下列收汇需入待核查账户的是(). [判断题] 教 ...

  9. java代码优化的方法和准则_编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议16~20)...

    建议16:易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP,Ruby,Groovy.Javascript等,这些入侵者都有一个共同特征:全是同一类语言-----脚本语言,它 ...

  10. Java程序为什么需要调优(《大话Java性能优化》第一章第一节)

    2011年1月,新加坡飞往杭州的航班.飞行时间很长,大约6个小时,坐在四周的人很快熟悉了,互相攀谈起来.有一位小姑娘,16.7岁的摸样,长得很漂亮,默默地坐在座位上,当有热心的阿姨问起她的情况,她带着 ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task12. 合并K个排序链表
  2. 第1章 Java语言概述
  3. 入门|机器学习中常用的损失函数你知多少?
  4. HTML基础重要知识点图文,HTML5基础知识点总结
  5. SPOJ 1811. POJ 2774 . 最大公共子串
  6. 计算机学业水平考试及格,信息技术学业水平考试表格部分试题(带答案)
  7. P1220-关路灯【区间dp】
  8. 使用jquery获取ul中当前正在点击的li的索引
  9. java 停止定时器_实例助解java定时器设置及停止的方法
  10. jQuery-获取验证码
  11. STAF rc = 6
  12. mysql函数 优化_Mysql函数求优化解决思路
  13. 基于SpringBoot的校园快递代取管理系统
  14. 好用的短链接生成器,活码生成器
  15. 最新IP地理数据库(dat文件) --别花钱了
  16. 51单片机mysql_51单片机之蓝牙遥控小车_效果展示+单片机知识+完整蓝牙电车代码...
  17. 自然数分解(罗列出一个自然数的加数的所有组合)(回溯)
  18. c语言累乘法,C语言基本算法
  19. PowerMILL宏自动化编程教程
  20. 霍兰德职业测试皮肤软件,霍兰德职业兴趣测试

热门文章

  1. TCC(新加坡太一国际数字交易所):升值万倍的数字资产 成就多少亿万豪
  2. C语言程序设计实验报告——实验七
  3. 设备零线地线短路维修
  4. 一款提升程序员生产力的黑科技神器
  5. URAL 1741 Communication Fiend
  6. 计算机自带拼图程序,电脑上比较好用的拼图软件?
  7. unbalanced calls to begin/end appearance transitions for uiviewcontroller的解决方法
  8. style是什么意思
  9. 射频通信PCC和SCC定义
  10. html5分镜头脚本范例,分镜头脚本范本.pdf