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的无比热爱。

 

                
            
        
浙公网安备 33010602011771号