20172321 2018-2019-1 《程序设计与数据结构》实验一报告
20172321 2018-2019-1 《程序设计与数据结构》实验一报告
- 课程:《程序设计与数据结构》
- 班级: 1723
- 姓名: 吴恒佚
- 学号:20172321
- 实验教师:王志强
- 实验日期:2018年10月5日
- 必修/选修: 必修
一、实验内容
实验1要求
- 链表练习,要求实现下列功能:
- (1)通过键盘输入一些整数,建立一个链表;这些数是你学号中依次取出的两位数。 再加上今天的时间。
- 例如你的学号是 20172301
今天时间是 2018/10/1, 16:23:49秒;数字就是
20, 17,23,1, 20, 18,10,1,16,23,49 - 打印所有链表元素,并输出元素的总数。
- 在你的程序中,请用一个特殊变量名来纪录元素的总数,变量名就是你的名字。例如你叫张三, 那么这个变量名就是 int nZhangSan = 0;//初始化为 0.
- 例如你的学号是 20172301
- 做完这一步,把你的程序签入源代码控制(git push)。
实验2要求
- 链表练习,要求实现下列功能:
- (2)实现节点插入、删除、输出操作;
- 继续你上一个程序, 扩展它的功能,每做完一个新功能,或者写了超过10行新代码,就签入代码,提交到源代码服务器;
- 从磁盘读取一个文件, 这个文件有两个数字。
从文件中读入数字1, 插入到链表第 5 位,并打印所有数字,和元素的总数。 保留这个链表,继续下面的操作。 - 从文件中读入数字2, 插入到链表第 0 位,并打印所有数字,和元素的总数。 保留这个链表,并继续下面的操作。
- 从链表中删除刚才的数字1. 并打印所有数字和元素的总数。
- 签入所有代码。
实验3要求
- 链表练习,要求实现下列功能:
- (3)使用冒泡排序法或者选择排序法根据数值大小对链表进行排序(2分);
- 如果你学号是单数, 选择冒泡排序, 否则选择选择排序。
- 在排序的每一个轮次中,打印元素的总数,和目前链表的所有元素。
- 在(2)得到的程序中继续扩展,用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan(你的名字)来表示元素的总数。
实验4要求
- 数组练习,要求实现下列功能:
- (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. 并打印所有数字和元素的总数。
- 签入所有代码。
实验5要求
- 数组练习,要求实现下列功能:
- (3)使用冒泡排序法或者选择排序法根据数值大小对数组进行排序(2分);
- 如果你学号是单数, 选择选择排序, 否则选择冒泡排序。
- 在排序的每一个轮次中, 打印元素的总数,和目前数组的所有元素。
- 在(2)得到的程序中继续扩展, 用同一个程序文件,写不同的函数来实现这个功能。 仍然用 nZhangSan (你的名字)来表示元素的总数。
二、实验过程及结果
实验1
- 过程:我的思路是在原先写过的一个链表例题上进行修改的,主要就是把原来的add()方法加进一个循环里来实现键盘输入链表
System.out.println("请键入所需要的数字: (需要用空格隔开)");
Scanner scanner = new Scanner(System.in);//把20 18 23 21形式的数字串加入栈
String shuru = scanner.nextLine();
StringTokenizer str = new StringTokenizer(shuru);
for (int a = 0; a < shuru.length(); a++) {
while (str.hasMoreTokens()) {
String fanxu = str.nextToken();
Number num = new Number(Integer.parseInt(fanxu));
shiyanyi1.add(num);
}
}
System.out.println("栈中所有元素:" + shiyanyi1.toString());
System.out.println("栈中元素数量:" + shiyanyi1.size());`
- 结果:
实验2
- 过程:要实现的插入、删除、输出方法因为以前学过,都很容易,但是因为有一个数字是插在0位,而我之前的插入方法是插在指定位置的后面,所以又重写了一个头插法
public void addFirstNumList(Number data) {
NumList node = new NumList(data);
node.next = list;
list = node;
nWuhengyi++;
}
- 结果:
实验3
-
过程:主要就是考察我们对排序的理解,我用的是选择排序法:第一次从R[0]R[n-1]中选取最小值,与R[0]交换。第二次从R[1]R[n-1]中选取最小值与R[1]交换。。。以此类推。
-
通俗点说就是每次找到后面元素的最小值然后与之交换。如图:
-
选择排序思路
- 外层循环:要走几趟,同样是length-1。
- 设置一个最小值。假设第一个就是最小值。
- 设置一个最小值下标
- 内层循环:那你当前的最小值去逐一比较。当有比当前最小值小的数时,记录最小值,记录下标。
- 退出内层循环后就交换位置。
-
结果:
实验4
- 过程:实验4其实和之前的大同小异,只不过是用数组实现而已,我们用这样两段代码定义数组就可以得到链表,
protected String[] Array;
public shiyanyi2(String string) {
Array = string.split(" ");
nwuhengyi = 0;
}
Scanner scanner = new Scanner(System.in);
System.out.println("输入空格隔开的整数");
String string = scanner.nextLine();
shiyanyi2 array = new shiyanyi2(string);
然后数组的插入、删除就很容易了。
- 结果:
实验5
- 过程:还是用的选择排序法,代码是以前就学过的
//--------------选择排序法
class Select{
public void sort(int arr[]){
//中间值
int temp = 0;
//外循环:我认为最小的数,从0~长度-1
for(int j = 0; j<arr.length-1;j++){
//最小值:假设第一个数就是最小的
int min = arr[j];
//记录最小数的下标的
int minIndex=j;
//内循环:拿我认为的最小的数和后面的数一个个进行比较
for(int k=j+1;k<arr.length;k++){
//找到最小值
if (min>arr[k]) {
//修改最小
min=arr[k];
minIndex=k;
}
}
//当退出内层循环就找到这次的最小值
//交换位置
temp = arr[j];
arr[j]=arr[minIndex];
arr[minIndex]=temp;
System.out.print("第" + (j+1)+"次排序后的结果是:");
for (int h = 0 ; h<arr.length;h++)
{
System.out.print(arr[h] + " ");
}
System.out.println(" ");
}
//输出结果
System.out.print("最后排序结果:");
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
- 结果:
从文件中读取
- 这也是以前的一个练习,我特意编写了一个新的类来测试是否可以成功得到数字1和2
import java.io.*;
public class aaa {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\Administrator", "aaa.txt");
//
//使用try-catch处理异常
//
try {
if (!file.exists()) {
file.createNewFile();
}
} catch (IOException Exception) {
System.out.println("错误,指定路径不存在");
}
InputStream inputStream1 = new FileInputStream(file);
while (inputStream1.available() > 0) {
System.out.print((char) inputStream1.read() + " ");
}
inputStream1.close();
System.out.println(" ");
byte[] buffer = new byte[1024];
String content = "";
int flag = 0;
InputStream inputStream2 = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream2);
while ((flag = bufferedInputStream.read(buffer)) != -1) {
content += new String(buffer, 0, flag);
}
System.out.println(content);
bufferedInputStream.close();
String [] a =new String[10];
a = content.split(" ");
String B = a[0];
String C = a[1];
int i = Integer.valueOf(B).intValue();
int ii = Integer.valueOf(C).intValue();
System.out.println(i);
System.out.println(ii);
}
}
三、实验过程中遇到的问题和解决过程
- 问题1:因为我的从文件中提取数字是从原来的一个类里得到的,之前没有的全,只用了
File file = new File("C:\\Users\\Administrator", "aaa.txt");
//
//使用try-catch处理异常
//
try {
if (!file.exists()) {
file.createNewFile();
}
} catch (IOException Exception) {
System.out.println("错误,指定路径不存在");
}
InputStream inputStream1 = new FileInputStream(file);
while (inputStream1.available() > 0) {
System.out.print((char) inputStream1.read() + " ");
}
inputStream1.close();
这部分,然后直接提取,得到的数字一直是32和49,百思不得其解。
- 解决:后来发现有提取的代码没有用完整,所以得不到文件里的数字,加上这一段就好了
byte[] buffer = new byte[1024];
String content = "";
int flag = 0;
InputStream inputStream2 = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream2);
while ((flag = bufferedInputStream.read(buffer)) != -1) {
content += new String(buffer, 0, flag);
}
System.out.println(content);
bufferedInputStream.close();
String [] a =new String[10];
a = content.split(" ");
String B = a[0];
String C = a[1];
int i = Integer.valueOf(B).intValue();
int ii = Integer.valueOf(C).intValue();
System.out.println(i);
System.out.println(ii);
-
问题2:在排序输出每一轮次的元素时,会出现这样的情况
-
解决:是选择排序法用的int类型的数组,但是之前得到的是string类型的,所以导致元素的错乱。
四、感想
- 这回的实验感觉难点主要还是在链表上,也就是实验1、2、3,应该是以前就对链表的掌握不是特别熟练吧,然后就是排序,单纯的排序方法很好解决,但是在其他的乱七八糟的操作里要实现它总是发生了很多问题。这次实验让我翻了以前的好多代码,我觉得复习作用很大。
- 在十月一号就在912花了7个多小时来解决实验,这是自辛亥革命以来我第一次在国庆节第一天做作业,这就可以看出我对Java的无比热爱。