C語言博客05--指針

1.本章學習總結(2分)

1.1 思惟導圖

1.2 本章學習體會及代碼量學習體會

1.2.1 學習體會

本週學習感覺:自從接觸了指針,感受打開了新世界的大門。原先在數組、字符串的學習中已經對於地址這個概念有了一個較爲深入的瞭解,經過本章對指針的學習,對於內存、地址有了更加全面的認識,而且掌握瞭如何使用指針去訪問內存單元。相較以前的數組、字符串來講,直接用指針去訪問內存單元會更加直觀。指針被稱爲c語言的靈魂是有依據的,由於它確實很方便,同時也是c語言的特點。但同時,指針也是一個難點。好比野指針的概念,我剛開始使用指針的時候就總是犯錯誤。並且對於指針的更深層次的研究,如二次指針,就有些複雜,須要仔細思考一番才能理解它的意思。總而言之,本週對於指針的學習較爲順利,我的認爲指針的引入十分的有意義,指針使得訪問內存單元更加直觀,確實很好用;可是要用得熟練,仍須要訓練算法

1.2.2 代碼累計

2.PTA總分(2分)

2.1

2.2 個人總分:110

3.PTA實驗做業(1分)

3.1 PTA題目1

給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。測試輸入包含一個測試用例,在一行內給出總長度不超過500 000的字符串。字符串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用若干個空格分開。數組

3.1.1 算法分析

定義字符串a存放單詞串,字符型指針p存放a的首地址
輸入字符串a
定義整數len存放a的長度,i、j爲循環變量,變量flag控制是否輸出空格
for i=len-1 to 0 do
    if 此時p指向的字符爲單詞首字母 then 
        if flag==1 then
            輸出空格
        end if
        for j=i to p+j指向的字符爲空格或爲字符串末字符 do
            輸出該字符
        end for
        if flag==0 then
            flag=1
        end if
    end if
end for

3.1.2 代碼截圖

其實這題我原本用的字符串作的......後來強行改爲了指針
安全

3.1.4 PTA提交列表及說明

  • Q1:最先嚐試用指針來作,發現處處都是bug(指針基礎不紮實)糾結了很久......其中陷入了野指針的誤區致錯。
  • A1:乾脆先用字符串作一遍,理清楚思路再嘗試用指針作
  • Q2:在運用指針的過程當中,沒有去記錄指針所記錄的初始地址就開始利用指針所存地址自增來遍歷字符串,因而致使輸出時輸出了奇怪的東西。
  • A2:後來改用i自增來用地址加i來遍歷字符串,避免了這個問題。固然,事先記錄地址也能夠解決這個問題。

4.大做業(5分)

聲明:因爲個人第一次大做業代碼幾乎沒有使用全局變量,因此只是對原有的程序結構及功能進行完善函數

4.1.改造函數介紹

聲明:因爲在第一次大做業時個人代碼中這三個函數的功能都集中在一個大函數Calculate中,所以此次改進,我主要把該函數拆分並改善學習

1.函數1:CreateExp

傳入用於儲存計算式的地址,儲存到字符型指針變量exp中,傳入等級level
整型變量i,j爲循環變量
字符數組「+-*/」
if level=1 then
    生成一步一位數加減乘除計算式,並儲存
    while *(exp+2)==0 do    //保證分母不會出現0
        *(exp+2)=rand()%10+'0'
    end while
else if level==2 orlevel==3 then
    生成兩步2/3位加減計算式,並儲存
end if
輸出 請輸入「計算式」的答案

2.函數2:IsExp

傳入計算式的地址,由字符型指針exp存放
整形sign=1
if 前一個數不能整除後一個數 then
    sign=0
end if
if 當運算符爲-或/且前一個數小於後一個數時 then
    sign=0
end if
返回 sign

3.函數3:ComputeExp

傳入算式字符串的地址給字符指針變量exp,傳入答案地址給整型指針變量answer
*answer初始化爲0,oldop記錄舊的計算符,初始化爲'+'
定義i爲循環變量m爲中間變量,記錄每一個數字的值
while *(exp+i-1)!=0 do
    if *(exp+i)是數字字符 then
        m=m*10+*(exp+i)-'0'    //計算m的值
    else
        if oldop爲'+' then
            *answer+=m;
        else if oldop爲'-' then
            *answer-=m;
        else if oldop爲'*' then
            *answer*=m;
        else if oldop爲'/' then
            *answer/=m;
        end if
        oldop=*(exp+i);   //新的字符取代舊的字符
        m=0 //從新初始化爲0
    i++
end while

4.3 與原有函數代碼比較

原先只有一個長得嚇人的大函數:
測試

  • 1.兩者不一樣:原先的大函數一個函數囊括了全部的功能,新的多個函數來實現原函數的功能,還有所提高。
  • 2.兩者優勢:新函數分塊實現功能顯然比舊函數有更好的可讀性以及拓展性,之後要修改程序的功能也會更加方便。舊函數雖然很長,可是能實現的功能比新函數要強,也會更加穩定,bug少。
  • 3.兩者缺點:新函數的分塊實現雖然將功能分塊實現,可是功能有待完善,同時參數間的傳遞較爲複雜,不便閱讀。舊函數的缺點就很明顯,功能集中致使代碼冗長,可讀性差,拓展性也很弱。3d

    4.4 改進大做業總結

    第一次寫大做業時:第一次寫還算比較順利,由於不須要大量調用函數(由於構思時的函數模塊劃得不是特別好),主要困難是調試一些bug,以及在程序的交互性上花了比較大的功夫。由於是重頭開始寫,因此花的時間還算久。
    第二次寫大做業時:第二次進行改良的時候明顯就困難多了,由於改代碼要比從頭開始寫代碼可貴多(我的觀點),雖然是本身的代碼,但畢竟也有一段時間了,因此改以前仍是瞅了很久hh。而後此次的修改主要有兩個方面:第一是對以前安全輸入bug的修復(我加了個安全輸入的函數),第二就是爲了程序的拓展性而把大函數拆分紅幾個函數,這也是重難點。在寫程序的時候,明顯感受到在進行參數傳遞的時候,不夠熟練(由於寫得仍是太少)。再就是此次得代碼中加入了被調函數中再調用函數的狀況,致使代碼寫得很慢,思路也比較亂。指針

相關文章
相關標籤/搜索