前三次大作業總結

yim-1發表於2024-04-21

目錄

前言
設計與分析
踩坑心得
改進建議
總結

前言

  • 難度
    前三次大作業,總的說,對於我C語言學的不咋地的難度還是蠻大的,分開說,第一次還是很照顧新人,後面兩次難度逐漸變大
  • 題量
    題量還是很友好的,沒感覺到什麼糟心的地方,前面幾題基本不需要花時間
  • 知識點
    java的基本語法,java物件導向的思想

設計與分析

  • 第一次大作業


  • 第二次大作業


  • 第三次大作業



    1.可以看到的是第一次大作業因為比較簡單,行數比較少,複雜度較低
    第二次大作業程式碼量到了390行,而且前期準備沒有先設計好思路,也沒有對類做到單一職責
    導致複雜度比較高
    第三次大作業對第二次大作業造成的錯誤進行了修改
    主要是將程式碼板塊化,搞清楚了每塊程式碼幹什麼
    減少了迴圈的濫用,也就降低了複雜度
    2.可以看到的是第一次大作業的類比較簡單明瞭
    而第二次並沒有較大的改進,這也是導致第二次大作業的程式碼比較不易看懂的一個主要原因
    還是沒有實現類的單一原則的問題
    第三次大作業雖然有改進,但在後續還是要將Main類裡面的許多功能提出來
    讓思路變得更加清晰明瞭
    3.在後續的程式碼編寫中我也會繼續將程式碼板塊化
    這一點可以降低複雜度,最重要的是可以幫助我將思路理順
    實現類的單一職責

踩坑心得

三次大作業下來也是被很多問題困擾

  • 第一次大作業
    第一次大作業最大的坑就是沒有處理好輸入裡面的一個迴圈
while(true)
        {
            
            dan=sc1.nextLine();
            if(dan.equals("end"))
            {
                break;
            }
            String regex="#A:";
            String []drr=dan.split(regex);
            brr[co2++].setstuawer(drr[m++].trim());
        }

這是剛開始時提交的程式碼

 while(true)
        {
            dan=sc1.next();
            if(dan.equals("end"))
            {
                break;
            }
            else
                l++;
            String regex="#A:";
            String []drr=dan.split(regex);
          
         
            brr[co2++].setstuawer(drr[1].trim());
            
        }

這是後面修改後的程式碼
看著好像沒什麼不同,但卻讓我難受了很久。
前者的輸入是nextLine(),後者的輸入是next()。
因為題目的輸入是#A:2 #A:4,中間有空格,所以我開始是想讀取一整行的。
然後又要求讀取到end就結束,所以我用了一個迴圈,這樣就導致我後面的正規表示式沒有正確的讀取輸入的資料。
所以就換了next(),一個一個讀取輸入,這樣也解決了end結束的問題
透過這個,我詳細的學習了一下next()和nextLine()和nextInt()的區別
為什麼把nextInt()放進來
因為nextInt()讀完資料後要想用next()或nextLine()讀取字串
一定要再加一個next()把回車讀取
而next()和nextLine()是自動讀取回車
這個問題雖然簡單,但卻是讓我停下來了很久
還有一個問題便是我在寫第四題時遇到了一個致命的問題

 private int chinese=sr.resultscore(chinese1,chinese2);
    private int math=sr.resultscore(math1,math2);
    private int phy=sr.resultscore(phy1,phy2);
    private int zscore=sr.sumscore(chinese,math,phy);
    private double zaver=sr.averscore(zscore);
    private int psscore=sr.sumscore(chinese1,math1,phy1);
    private double psaver=sr.averscore(psscore);
    private int qmscore=sr.sumscore(chinese2,math2,phy2);
    private double qmaver=sr.averscore(qmscore);

這是我類裡面的幾行程式碼
當這串程式碼提交上去時卻看到輸出全是0
我以為是邏輯問題,於是一直在修改前面的賦值邏輯
後來在苦苦掙扎了許久後突然想起來,類裡面只有方法和屬性
也就是說類不會和main函式一樣一行一行的跑
也就是說我的賦值根本就不會跑起來,所以根本沒有賦值進去
也就導致了輸出全是0
這次錯誤也是刻苦銘心
不過讓我進一步體會到物件導向的思想

  • 第二次大作業
    第二次大作業加了集合進來,這個不是很大的問題
    最大的問題是寫完第二次大作業後再看自己的程式碼的時候感覺非常的亂
    第一點就是我寫完就感覺看不懂了,所以本來沒有寫註釋習慣的我在後面寫程式碼時寫了許多的註釋
 int n=0;
        int qn=0;
        int qn1=0;
        int an=0;

這是我程式碼中的某一段,沒有註釋,後面再看的時候要想很久每個變數代表了什麼意思
第二點我在課上聽到了老師所強調的類的單一職責
以前沒有很在意類的單一職責,但這次寫完程式碼
第一感覺就是自己的思路不清晰,以及後續修改程式碼很麻煩,因為每個板塊涉及多個功能
這也讓我對類的單一職責功能重視了起來
除去這個問題,導致我思路不清晰的問題當時還有一個便是沒有提前設計好怎麼寫程式碼,而是直接上手了
後續也將這個問題給改過來了

  • 第三次大作業
    將第二次大作業的許多不正確的點給改進了
    基本實現了類的單一職責,以及提前設計好了整體的思路
    這次最大的問題便是對正規表示式的理解力不夠,也就是沒學好,導致後面出現了很多問題
    為此,我去網上學習了很久的正規表示式
    還有一個問題便是我的主函式太長了,在參觀了同學的程式碼下我發現
    自己應該設計一個輸入類來輸入資料,不要讓主函式太長,會導致思路變得不清晰

改進建議

第二,三次大作業可以設計一個資料類來儲存輸入進來的資料,其他的思路和老師提供的思路沒有什麼不同,
主要是要將java的基本語法掌握好

總結

  • 難點
    這三次大作業思路,邏輯都不難,主要難的地方是正規表示式,以及面對物件的思想對我來說
    基礎的語法和一些簡單的問題解決起來都不難
    難的地方在於程式碼量大起來後保持思路清晰
  • 我學到的
    1.在程式碼量大起來後,我學會了將程式碼放進idea中
    每寫一個板塊功能,便將這個板塊的功能進行除錯
    2.程式碼的板塊化,以前寫程式碼時總是將多個功能放進多一塊區域中,用同一個變數來關聯資料
    這樣就導致了寫程式碼時如果腦子不清晰很可能需要看很久的程式碼才能進行下一步
    以及在之後不好修改程式碼,因為涉及到的功能塊很多
    在對程式碼板塊化後修改程式碼不影響其他板塊的功能正常進行
    3.最最重要的是現在寫程式碼有了一顆良好的心態,認為幾百行程式碼已經是家常便飯
    遇到問題也能自己耐心解決,再去問同學
    而不是像之前一樣遇到問題便有點氣餒,將解決問題的希望寄託在同學身上

相關文章