20172321 2018-2019-1 《程序設計與數據結構》實驗一報告

20172321 2018-2019-1 《程序設計與數據結構》實驗一報告

  • 課程:《程序設計與數據結構》
  • 班級: 1723
  • 姓名: 吳恆佚
  • 學號:20172321
  • 實驗教師:王志強
  • 實驗日期:2018年10月5日
  • 必修/選修: 必修

1、實驗內容

實驗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)。html

    實驗2要求

  • 鏈表練習,要求實現下列功能:
  • (2)實現節點插入、刪除、輸出操做;
    • 繼續你上一個程序, 擴展它的功能,每作完一個新功能,或者寫了超過10行新代碼,就簽入代碼,提交到源代碼服務器;
    • 從磁盤讀取一個文件, 這個文件有兩個數字。
      從文件中讀入數字1, 插入到鏈表第 5 位,並打印全部數字,和元素的總數。 保留這個鏈表,繼續下面的操做。
    • 從文件中讀入數字2, 插入到鏈表第 0 位,並打印全部數字,和元素的總數。 保留這個鏈表,並繼續下面的操做。
    • 從鏈表中刪除剛纔的數字1. 並打印全部數字和元素的總數。
  • 簽入全部代碼。java

    實驗3要求

  • 鏈表練習,要求實現下列功能:
  • (3)使用冒泡排序法或者選擇排序法根據數值大小對鏈表進行排序(2分);
    • 若是你學號是單數, 選擇冒泡排序, 不然選擇選擇排序。
    • 在排序的每個輪次中,打印元素的總數,和目前鏈表的全部元素。
  • 在(2)獲得的程序中繼續擴展,用同一個程序文件,寫不一樣的函數來實現這個功能。 仍然用 nZhangSan(你的名字)來表示元素的總數。node

    實驗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. 並打印全部數字和元素的總數。
  • 簽入全部代碼。git

    實驗5要求

  • 數組練習,要求實現下列功能:
  • (3)使用冒泡排序法或者選擇排序法根據數值大小對數組進行排序(2分);
    • 若是你學號是單數, 選擇選擇排序, 不然選擇冒泡排序。
    • 在排序的每個輪次中, 打印元素的總數,和目前數組的全部元素。
  • 在(2)獲得的程序中繼續擴展, 用同一個程序文件,寫不一樣的函數來實現這個功能。 仍然用 nZhangSan (你的名字)來表示元素的總數。
  • 2、實驗過程及結果

    實驗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);

    }
}

3、實驗過程當中遇到的問題和解決過程

  • 問題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類型的,因此致使元素的錯亂。.net

4、感想

  • 這回的實驗感受難點主要仍是在鏈表上,也就是實驗一、二、3,應該是之前就對鏈表的掌握不是特別熟練吧,而後就是排序,單純的排序方法很好解決,可是在其餘的亂七八糟的操做裏要實現它老是發生了不少問題。此次實驗讓我翻了之前的好多代碼,我以爲複習做用很大。
  • 在十月一號就在912花了7個多小時來解決實驗,這是自辛亥革命以來我第一次在國慶節第一天作做業,這就能夠看出我對Java的無比熱愛。

5、參考資料

相關文章
相關標籤/搜索