第十到第十六周—— BLOG_3

来源:https://www.cnblogs.com/zhiyixingnan/archive/2022/06/17/16385205.html
-Advertisement-
Play Games

面對對象程式設計 第十到十六周作業總結 引言:java的課程進入尾聲,但是編程的路才剛開始。 前言:這三周的大作業主要考察各個類之間的關係,數據的封裝,類的繼承,多態,介面,抽象類,集合框架等多個知識的綜合運用。 自學正則表達式的使用,有些題目對於格式的判斷非常的複雜,使用正則表達有效判斷了輸入的合 ...


  面對對象程式設計---第十到十六周作業總結

 引言:java的課程進入尾聲,但是編程的路才剛開始。

前言:這三周的大作業主要考察各個類之間的關係,數據的封裝,類的繼承,多態,介面,抽象類,集合框架等多個知識的綜合運用。

   自學正則表達式的使用,有些題目對於格式的判斷非常的複雜,使用正則表達有效判斷了輸入的合法性,並且減少了大量的格式判斷代碼。

        通過三次大作業寫完電信計費問題,這樣的方式相比之前的點線型友好了太多,這樣就又充分的時間去書寫代碼,完成代碼的內容。

   三次大作業彼此關聯難度又呈持平的狀態,給我們編碼時提供了莫大的信心。

 PTA大作業6

  各題目 設計與分析 踩坑心得 改進意見 核心代碼分析:

  (1)7-1 電信計費系列1-座機計費

設計與分析:

類圖如下:

  

 

 

 

 

 

 

 

 

 

  此題的難度在於不好下手,做此類圖較為複雜的題,需要仔細觀察類圖,明確類圖之間的聯繫

  在此題中 User類中的userRecord是這道題目的突破口,在這個userRecord中可以把用戶的通話記錄數據放入,便於Chargemode在中間的調用。

  然後再去理解類圖中的chargeMode類,這是這個程式的核心代碼,通過這一段計算出用戶的花費,完成程式。

  雖然類圖看起來非常的複雜,但只要將代碼分解,先從user入手,自然就寫到了userRecord,接著就補充到chargemode,再然後就去構思main函數,獲取輸入數據即可

踩坑心得:

 

 這應該是我最重要的一部分代碼,看起來非常的簡單,但得來是十分不容易的。

這道題目涉及到對arrayList排序的問題。我開始是先聲明一個User user[]的對象數組,先歷便arrayList,將數據賦值給user[],

再用compareTo方法對字元串進行冒泡排序,但是排序之後就出現了一個問題,我通過user數組賦值沒有辦法刪除重覆的元素,這就導致輸出重覆。

雖然最後解決了重覆的問題,但是這種方法效率比較低,我又找到了以上方法。

在把數據比較入arrayList時進行,如果arratList的user.numble值比後一個要大,那麼用j記錄下arrayList中的位置,再用指定位置插入,將新進來的數字插入進來,這樣插入完成後就已經是有序的了。

 

改進意見:

  1.由上圖可知,這個代碼的圈複雜度達到了19,這說明代碼的質量不高。因為我在寫題目的過程中,只註意需要完成題目要求的功能,而沒有對代碼進行優化,導致寫了過多的if/else語句,據查找資料,if/else 和迴圈的使用會使得圈複雜度提高,改進的方法是將if/else語句換成switch語句,可以有效減少圈複雜度。

  2.可以將判斷的邏輯顛倒過來,這樣代碼的思路就會更加的清晰,代碼的可讀性也會更高。

  3.可以將arrayList換成hashset,用集合簡化題目。

核心代碼分析:

① 數據判斷的正則表達式:

        final String regex = "^u-[0-9]{11,12} 0$";
        final String regex0 = "^t-[0]{1}[0-9]{9,11} [0]{1}[0-9]{9,11} [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$";
        final String regex00 = "^079[0-9]$";            

②arrayList的排序演算法:

while(!s.equals("end")) {
            if(Pattern.matches(regex, s)) 
            {
                String s0 = s.substring(2);
            String str[] = s0.split("[ ]");
                int flag=0;
            User user = new User();
            user.setNumber(str[0]);
            for(User i:list){
                if(i.getNumber().equals(user.getNumber()))
                    flag=1;
            }
            int j=0;
            for(User m:list) {
                if(m.getNumber().compareTo(user.getNumber())>0)
                    break;
                j++;
            }
                if(flag==0){
            
                        list.add(j,user);
                
                }

            
            }        

 

 7—2電信計費系列2-手機+座機計費

 各題目 設計與分析 踩坑心得 改進意見 核心代碼分析:

  (1)7-2 串口字元解析 

設計與分析:

類圖如下(其他與上一題基本相同)

 

 

 

 

 此題的難點在於對於手機來說:撥打電話和接聽電話都需要計費,不但需要判斷是撥打還是接聽,還需要判斷所在的位置。

對於接聽來說,所在的位置如果發生變化,相應的計費金額也會有所改變。

核心就來到了判斷輸入是否合法,輸入的時間是否合法等問題,其意思是說如過無法判斷輸入數據的準確與否,就無法寫出這道題目。

我同樣採取了正則表達式判斷時間,對於本題給出的格式yyyy-MM-dd HH:mm:ss。我寫了一個簡易的時間正則表達式。

在獲得輸入的數據後需要瞭解計費規則的相關類,

這些類的核心方法是: calCost(ArrayList<CallRecord> callRecords)。 該方法針根據輸入參數callRecords中的所有記錄計算某用戶的某一項費用;

如市話費。 輸入參數callRecords的約束條件:必須是某一個用戶的符合計費規則要求的所有記錄。 SendMessageRule是發送簡訊的計費規則類,用於計算發送簡訊的費用。

 

踩坑心得:

 

 

 這一部分的代碼就是五個部分的判斷,對於題目給出的五個地區不同的區號判斷。

只需要從地區範圍由小到大判斷,就不會遺漏數據了。

改進意見:

1、由上圖分析,這道題的圈複雜度為70,超過了15,這表明代碼的質量還可以提高,這道題是由於寫了很多個迴圈的結果導致。其實有些迴圈可以把他合併起來,這樣既減少了代碼的行數,又提高了代碼的質量。

2、這道題存在有些代碼重覆率過高的問題,可以通過靜態方法的調用,解決這些代碼的重覆問題。

核心代碼分析:

①時間的正則表達式:

final String landtel = "t-[0]{1}[0-9]{9,11} 1[0-9]{10} [0-9]{3,4} [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$";
        // 座機--電話
final String teltel = "t-1[0-9]{10} [0-9]{3,4} 1[0-9]{10} [0-9]{3,4} [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$";
final String telland = "t-1[0-9]{10} [0-9]{3,4} 0[0-9]{9,11} [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$";
    

②arrayList的使用:

if (Pattern.matches(regextel, s)) {
                    String s0 = s.substring(2);
                    String str[] = s0.split("[ ]");
                    int flag = 0;
                    User user = new User();
                    user.setNumber(str[0]);
                    for (User i : listtel) {
                        if (i.getNumber().equals(user.getNumber()))
                            flag = 1;
                    }
                    int j = 0;
                    for (User m : listtel) {
                        if (m.getNumber().compareTo(user.getNumber()) > 0)
                            break;
                        j++;
                    }
                    if (flag == 0) {
                        listtel.add(j, user);
                    }
                }

            } else if (Pattern.matches(regex0, s) || Pattern.matches(landtel, s)) {// 座機通話記錄 座機打座機 // 增加座機打手機
                if (Pattern.matches(regex0, s)) {
                    UserRecords ue = new UserRecords();
                    CallRecord callRecord = new CallRecord();
                    String str[] = s.split("[ ]");
                    String d1 = str[2] + " " + str[3];
                    String d2 = str[4] + " " + str[5];
                    Date da1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(d1);
                    Date da2 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(d2);
                    callRecord.setCallingNumber(str[0].substring(2));
                    callRecord.setCallingAddressAreaCode(str[0].substring(2, 6));
                    callRecord.setAnswerNumber(str[1]);
                    callRecord.setAnswerAddressAreaCode(str[1].substring(0, 4));
                    callRecord.setStartTime(da1);
                    callRecord.setEndTime(da2);
                    for (User j : list) {
                        if (j.getNumber().equals(callRecord.getCallingNumber())) {
                            ue = j.getUserRecords();
                        } else
                            continue;
                        if (callRecord.getAnswerAddressAreaCode().equals(callRecord.getCallingAddressAreaCode())) { // 判斷地區
                            ue.addCallingInCityRecords(callRecord);
                        } else if (callRecord.getAnswerAddressAreaCode().equals("0701")
                                || Pattern.matches(regex00, callRecord.getAnswerAddressAreaCode())) {
                            ue.addCallingInProvinceRecords(callRecord);
                        } else
                            ue.addCallingInLandRecords(callRecord);
                        j.setUserRecords(ue);
                        break;
                    }
                }
                if (Pattern.matches(landtel, s)) {
                    UserRecords ue = new UserRecords();
                    UserRecords ue0 = new UserRecords();
                    CallRecord callRecord = new CallRecord();
                    s = s.substring(2);
                    String str[] = s.split("[ ]");
                    String d1 = str[3] + " " + str[4];
                    String d2 = str[5] + " " + str[6];
                    Date da1 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(d1);
                    Date da2 = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").parse(d2);
                    callRecord.setCallingNumber(str[0]);
                    callRecord.setCallingAddressAreaCode(str[0].substring(0,4));
                    callRecord.setAnswerNumber(str[1]);
                    callRecord.setAnswerAddressAreaCode(str[2]);
                    callRecord.setStartTime(da1);
                    callRecord.setEndTime(da2);
                    // 分區域放進去
                    for (User j : list) {
                        if (j.getNumber().equals(callRecord.getCallingNumber())) {
                            ue = j.getUserRecords();
                        } else continue;
                            
                        if (callRecord.getAnswerAddressAreaCode().equals(callRecord.getCallingAddressAreaCode())) { // 判斷地區
                            ue.addCallingInCityRecords(callRecord);
                        } else if (callRecord.getAnswerAddressAreaCode().equals("0701")
                                || Pattern.matches(regex00, callRecord.getAnswerAddressAreaCode())) {
                            ue.addCallingInProvinceRecords(callRecord);
                        } else
                            ue.addCallingInLandRecords(callRecord);
                        j.setUserRecords(ue);
                        break;
                    }

 

7-1 電信計費系列3-簡訊計費

各題目 設計與分析 踩坑心得 改進意見 核心代碼分析:

(1)7—1 計算兩點間的距離

設計與分析:

 

 

 

這題只需要用一個String的字元串去接收題目中的輸入,再使用String中的方法spilt將字元串進行拆分

本題的難度在於判斷輸入的簡訊字元段,同意採用正則表達的,在計算字元串的長度就可以了。

 踩坑心得:

 

 實現這道題目主要就是截取到簡訊,在使用之前類似的方法就可以

改進建議:

1、由圖可知,該題的圈複雜度為17。這裡有點可惜,如果小於10代碼質量就會很好。改進可以減少迴圈的使用。

2、這題可以將獲取字元串變成一個字元數組。、此題可以將split方法改進,提高程式的執行效率

核心代碼分析:

①正則表達式:

final String regex = "^u-[0-9]{11,12} 0$";// 座機開戶u-[] 0;正則
        final String regex0 = "^t-[0]{1}[0-9]{9,11} [0]{1}[0-9]{9,11} [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$";
        // 座機撥打電話格式正則
        final String landtel = "t-[0]{1}[0-9]{9,11} 1[0-9]{10} [0-9]{3,4} [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$";
        // 座機--電話
        final String teltel = "t-1[0-9]{10} [0-9]{3,4} 1[0-9]{10} [0-9]{3,4} [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$";
        final String telland = "t-1[0-9]{10} [0-9]{3,4} 0[0-9]{9,11} [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|(3[0-1])) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9]) [0-9]{4}[.](([1-9]{1})|([1]{1}[0-2]{1}))[.]([1-9]|([1-2]{1}[0-9]{1})|3[0-1]) (([0-1][0-9])|(2[0-3]))[:]([0-5][0-9])[:]([0-5][0-9])$";
        final String regex00 = "^079[0-9]$";// 座機區號正則
        final String regextel = "u-1[0-9]{10} 1$";// 手機開戶正則
        final String regexmessage= "u-1[0-9]{10} 3$";
        final String regexmess = "m-1[0-9]{10} 1[0-9]{10} ([\\w]|[ ]|[.]|[,])+$";

②簡訊計費:

class SendMessageRule extends MessageChargeRule{

    double calCost(ArrayList<MessageRecord> messageRecords) {
        int  n=0;
        for(int i=0;i<messageRecords.size();i++) {
            if(messageRecords.get(i).getMessage().length()<=10) {
                n++;
            }
            else {
                if(messageRecords.get(i).getMessage().length()%10==0)
                    n += messageRecords.get(i).getMessage().length()/10;
                else
                    n += messageRecords.get(i).getMessage().length()/10+1;
            }
                
        }
        if(n<=3)
            return n*0.1;
        else if(n<=5)
            return 0.3+(n-3)*0.2;
        else
            return 0.7+(n-5)*0.3;
    }
    
}

實驗四

設計與分析:

 

 

 

 

 

 

實驗4(1)主要是理解看懂給出的類圖,根據類圖寫出代碼。理解各種抽象類之間的聯繫,最難的應該是GaneDate類型的理解。這個類把這幾個物品之間聯繫起來,實現游戲的功能,這幾個類圖之間的代碼實現

實驗4(2)在原有的基礎上把boat類繼承到abstractObjectial即可。把abstractransport變成介面,再用boat實現這個介面,這道題就算寫完。

在代碼實現過程中遇見的最大問題就是看懂題給出的類圖,寫出類圖這道題目就相當於完成了一大半,在這個基礎上把各個類串在一起,理解每個類之間的關係,就可以完成這道題。為了避免修改農夫過河前幾次代碼中代碼的主幹,我在游戲類中保留了這些代碼,這樣的代碼修改難度就降低了不少,最後運行完成後debug找出了一個邏輯上的錯誤,就提交了這次實驗。

 

 這是case31錯誤時的截圖,這道題這個點我也是測試了非常久才給出了正確的答案。

原因在於一個函數

 

 

實驗4(1)主要是理解看懂給出的類圖,根據類圖寫出代碼。理解各種抽象類之間的聯繫,最難的應該是GaneDate類型的理解。這個類把這幾個物品之間聯繫起來,實現游戲的功能,這幾個類圖之間的代碼實現

實驗4(2)在原有的基礎上把boat類繼承到abstractObjectial即可。把abstractransport變成介面,再用boat實現這個介面,這道題就算寫完。

在代碼實現過程中遇見的最大問題就是看懂題給出的類圖,寫出類圖這道題目就相當於完成了一大半,在這個基礎上把各個類串在一起,理解每個類之間的關係,就可以完成這道題。為了避免修改農夫過河前幾次代碼中代碼的主幹,我在游戲類中保留了這些代碼,這樣的代碼修改難度就降低了不少,最後運行完成後debug找出了一個邏輯上的錯誤,就提交了這次實驗。

改進意見:

1、如複雜度分析圖所示,本題的圈複雜度為33,超過了代碼的一般範圍,這就意味這該代碼的可讀性非常的差,而對與前文提到的方法都可有效減少圈複雜度。

2、本題的代碼有兩百多行,代碼的簡化就顯得尤為重要,應該適當的合適代碼的邏輯,讓代碼模塊化。

3、如果能夠將代碼的邏輯顛倒一下,程式將更加的合理。

核心代碼如下:

public abstract class AbstracTransport {
private String place ="a";public String departure ="a";
private int capacity;
private ArrayList<MaterialObject>goodses = new ArrayList<MaterialObject>();
abstract public void moveTo( String destination);
public int getCapacity() {
    return capacity;
}
public void setCapacity(int capacity) {
    this.capacity = capacity;
}
public String getPlace() {
    return place;
}
public void setPlace(String place) {
    this.place = place;
}
public ArrayList<MaterialObject> getGoodses() {
    return goodses;
}
public void setGoodses(ArrayList<MaterialObject> goodses) {
    this.goodses = goodses;
}
}
class Boat extends AbstracTransport{

    public void moveTo(String  destination) {
        if(this.getPlace() == destination)
                setPlace(departure);
        else
            setPlace(destination);
    }
    public void crossRiver(Person person) {
        if(person.isPlace())
            person.setPlace(departure);
        else
            person.setPlace("b");
    }
    public void crossRiver(Person person, MaterialObject m) {
        this.crossRiver(person);
        if(m.isPlace())
            m.setPlace(departure);
        else
            m.setPlace("b");
    }
    public void broad(MaterialObject m) {
        getGoodses().add(m);
    }
    
    public void disembark(MaterialObject m){
        getGoodses().remove(m);
        }
    }
public abstract class AbstractGame {
    private AbstractRule gameOverRule = new GameOverRule();
        
    private AbstractRule gameSuccessRule = new GameSuccessRule();
        
    private GameData gameDate = new GameData();
    
    public abstract void play() ;
        
    
}
public abstract class AbstractRule {
    public abstract boolean judge(GameData gameData);
}
class CrossRiverRule extends AbstractRule{
        public boolean judge(GameData gameData) {
        if(hasCross(gameData.cabbage)&&hasCross(gameData.sheep)&&hasCross(gameData.wolf)&&hasCross(gameData.farmer))
            return true;
        return false;
    }
    public boolean hasCross(MaterialObject m) {
        if( m.getPlace().equals(m.destination))
            return true;
        return false;
    }
}
class ObjectExistRule extends AbstractRule{
    public boolean judge(GameData gameData){
        if(gameData.sheep.isExist()&&gameData.wolf.isExist()&&gameData.cabbage.isExist())
            return true;
        return false;
    }
}
class GameOverRule extends AbstractRule{
    ObjectExistRule oe= new ObjectExistRule();
    CrossRiverRule cr = new CrossRiverRule();
    public boolean judge(GameData gameData) {
        if(!oe.judge(gameData))
            return true;
        if(cr.judge(gameData))
            return true;
        return false;
    }
}

學習心得:

1、通過三次作業的練習,強化了我對java語言的使用和理解,學習了很多編程時使用的技巧和方法,深化了我書寫代碼時的邏輯理解和對演算法的實現能力,拔高了我對程式設計的眼界和深度,領悟自上而下逐步細化的編程思想更加的透徹

2、知道了寫程式時細節決定成敗,必須一絲不苟,讓我對自己的水平有了一定的認知,提醒我今後的學習還有很多改進的地方,深刻瞭解了關於Java程式結構和代碼書寫的規範,以及要遵守的代碼書寫規範

3、積累了一些debug的經驗,深刻認識到了調試的重要性,學會了調試的基本技巧,如何設置斷點,單步進入,跟蹤參數,以及更改代碼的邏輯順序,排除邏輯錯誤,對提高代碼的質量大有改善。

4、學會了正則表達式的運用,合理的運用正則表達式能有效減少判斷格式代碼的行數,還可以準確的判斷出輸入的正確性。

5、面對複雜的類圖時不要盲目的下手,要尋找到一個突破口,從一點上去逐步書寫整個代碼,這樣寫出來的代碼就會條理比較清晰,效果也更好。

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 分類方式 按參數分: 有參構造(預設構造) & 無參構造 按類型分: 普通構造 & 拷貝構造 調用方式 括弧法 顯示法 隱式轉換法 PS:下方所有文本均以此代碼為基礎 1 class Person { 2 public: 3 //無參構造函數 4 Person() { 5 std::cout << ...
  • 引言:今天工作遇到了一個需要按行讀取txt文件數據的需求,查詢了一下getline()函數,發現這竟然是一個C++的標準庫函數,而且設計的很好,特地做一下記錄。getline本質是一個定界流輸入截取函數,預設是換行符‘/n’ 個人技術博客(文章整理+源碼): https://zobolblog.gi ...
  • 大佬的理解->《IO流和File》 1、File類 File類是IO包中唯一代表磁碟文件本身的對象,File類定義了一些與平臺無關的方法來操作文件。通過調用File類提供的各種方法,能夠完成創建、刪除文件、重命名文件、判斷文件的讀寫許可權許可權是否存在、設置和查詢文件的最近修改時間等操作。 ​ File ...
  • 前言 大部分情況下,地理繪圖可使用 Arcgis 等工具實現。但正版的 Arcgis 並非所有人可以承受。本文基於 Python 的 cartopy 和 matplotlib 等庫,為地理空間繪圖的代碼實現提供參考。 所有所需庫如下: gma、cartopy、matplotlib、numpy 更多內 ...
  • 1 問題的提出 對於給定的數據集 \(D = \{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}\),線性回歸 (linear regression) 試圖學得一個線性模型以儘可能準確地預測是指輸出標記. 2 原理 設給定的數據集 \(D = \{(x_i,y_i)\} ...
  • 基礎數據準備 基礎數據是通過爬蟲獲取到。 以下是從第一期03年雙色球開獎號到今天的所有數據整理,截止目前一共2549期,balls.txt 文件內容如下 Python 代碼實現 分析數據特征和數據處理方式選擇 python學習交流Q群:906715085### #導入Counter from col ...
  • 前幾天看了一篇文章,自己動手試了下,發現有些不一樣結論,作博客記錄下,本文主要研究兩個問題: 包裝流的close方法是否會自動關閉被包裝的流? 關閉流方法是否有順序? 包裝流的close方法是否會自動關閉被包裝的流? 平時我們使用輸入流和輸出流一般都會使用buffer包裝一下,直接看下麵代碼(這個代 ...
  • 能夠基於Java Agent編寫出普通類的代理 理解Byte Buddy的作用 能夠基於Byte Buddy編寫動態代理 1 Byte Buddy Byte Buddy 是一個代碼生成和操作庫,用於在 Java 應用程式運行時創建和修改 Java 類,而無需編譯器的幫助。除了 Java 類庫附帶的代 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...