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.
  • 做完这一步,把你的程序签入源代码控制(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]交换。。。以此类推。

  • 通俗点说就是每次找到后面元素的最小值然后与之交换。如图:

  • 选择排序思路

    1. 外层循环:要走几趟,同样是length-1。
    2. 设置一个最小值。假设第一个就是最小值。
    3. 设置一个最小值下标
    4. 内层循环:那你当前的最小值去逐一比较。当有比当前最小值小的数时,记录最小值,记录下标。
    5. 退出内层循环后就交换位置。
  • 结果:

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

五、参考资料

posted @ 2018-10-05 19:32  N-idhogg  阅读(288)  评论(0编辑  收藏  举报