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

    五、参考资料

  • 相关阅读:
    mongodb
    winform最小化到托盘
    C# 多线程实例化 定时执行 实例化线程 刷新控件
    如何弹出一个模式窗口来显示进度条
    如何使自己的程序只运行一次
    Form窗体点击关闭按钮并未关闭进程的解决方法
    如何用C#写一个简单的Login窗口
    C#操作IIS添加MIME类型(win2003)
    天天学习WPF
    如何注册dll文件
  • 原文地址:https://www.cnblogs.com/N-idhogg/p/9745621.html
Copyright © 2020-2023  润新知