C語言博客做業05--指針

1.本章學習總結

1.1 思惟導圖

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

1.2.1 學習體會

1.學習了指針以爲指針相對來講比較抽象,並且在上指針課以前未進行預習,因此剛開始學會比較吃力,但經過老師的課堂派pta訓練
相對跟上一些進度,可是對指針掌握程度相對欠缺;
2.學完指針,指針的好處在函數上是一個體現,以前函數只能返回一個值;但有了指針,能夠經過傳遞多個地址,在本身定義的函數中
完成對這些地址中的值進行更改,則原函數中的變量的值也會相應更改,至關於一個函數能夠傳回多個值;
3.學習了字符串的賦值要藉助strcpy函數,不能依靠等號進行賦值,以及字符串的鏈接和長度比較都要調用函數來實現;
4.指針傳遞的是地址,能夠明顯提升大數據傳遞效率;

1.2.2 代碼累計

2.PTA總分

2.1截圖PTA中函數題目集的排名得分

2.2 個人總分:

  • pta總分:110分

3.PTA實驗做業

3.1 PTA題目1

給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。

3.1.1 算法分析

定義i,j
定義字符數組a;
輸入字符串a;
定義整型變量n用於存放a字符串的長度;
定義count計數一個單詞的長度;
定義flag,flag=1不輸出空格;flag=0時輸出空格;
for i=n-1 to 0 do i--
    if a[i]==' '&&count!=0 then        //遇到空格且所記單詞數大於0時準備輸出單詞
        if flag==1 then 
            flag=0        //第一個單詞以前不用輸出空格
        else 輸出空格
        end if
        for j=i+1 to i+count do j++
            輸出a[j]
        count=0        /*當一個單詞輸出完後,count清零,從新計數*/
    else if a[i]!=' ' then
        count++        /*在還沒遇到空格以前,計數加一*/
    end if
end for
if count>0 then
    if flag==0 then
        輸出空格
    end if
    for i=0 to count do
        輸出a[i]
    end for     /*若是a[0]等於字母則在循環中沒法輸出最後一個單詞,這個if語句用於解決a[0]不等於空格的狀況*/

3.1.2 代碼截圖

方法一:(上面的算法分析爲此代碼的)

方法二:(因爲思路基本相同因此沒有寫算法分析;判斷的條件有所不一樣,題目顯示大小寫有區分因此用大小寫來判斷亦可實現)

3.1.3 PTA提交列表及說明

  • Q1:剛開始提交部分錯誤顯示「最小詞,前有空格」;
  • A1:經過改變空格輸出爲輸出來查錯(如圖一),發現一個單詞輸出後面帶;經過flag斷定條件解決;
  • Q2:最大句子出現運行時錯誤;
  • A2:將字符數組的範圍調大;
  • Q3:只有一個單詞的狀況,程序不輸出;
  • A3:在第一個for語句外單獨設置一個斷定條件,單獨判斷和輸出一個單詞的狀況;

4.大做業

題目:實現小學四則運算。
題目要求:
題目有3個難度級別,分別爲:
第一級是1位數的一步加減乘除計算
第二級是2位數的2步加減運算
第三級是3位數的2步加減運算

4.1.改造函數介紹

說明:函數1構造字符數組存放算數表達式;函數3計算出表達式的結果並將結果返回;

1.函數1

思路:生成相應的隨機數和隨機運算符並依次賦給exp字符數組,最後輸出字符數組。
(注:其中穿插不合法狀況的判斷,使生成的表達式中不含不合法的表達式)

函數僞代碼

void CreateExp(char *exp,int level)
    定義整型變量x,y用於生成隨機數
    定義整型變量m判斷生成的是幾位數的數,n判斷運算符的類型的個數
    定義字符數組str並賦初值零
    定義i用於限制運算式子的步數
    switch level do
        case 1 do m=10;n=4;i=3; break
        case 2 do m=100;n=2;i=5;break
        case 3 do m=1000;n=2;i=5;break
    end switch
    while i-- do
        if i%2==1 then
            y=rand()%n /*判斷運算符類型*/
            switch y
                case 0:strcat(exp,"+");break;
                ......
                 /*這個switch用於判斷四種狀況,並將符合條件的運算符鏈接到exp上*/
            end switch
        else then
            x=rand()%m;
            if level==1 and i==0 and y==3 and x==0 then  //除數爲0的不合法狀況
                i++ continue
            end if
            if level==1 and i==0 and y==3 end ((exp[0]-'0')%x!=0)//等級一中除法運算不能整除的不合法狀況
                i++ continue
            end if
            用itoa函數實現將一串整型數轉化爲字符串,並存在str數組中
            將str鏈接在exp後
        end if
    end while
    輸出表達式的字符串exp

函數代碼


2.函數2

判斷不和法的狀況已經包含在函數1中並進行了相應的註釋。

3.函數3

思路:將字符數字轉化爲整型數字,並依次一步一步的計算並賦值給result,最後算出表達式結果,並將結果result返回。

函數僞代碼

int ComputeExp(char *exp,int level)
    定義整型變量i,j用於循環
    定義len,將exp數組長度的值賦給len
    定義result用於存放表達式計算結果
    定義flag,flag=0時說明是第一個運算符出現的狀況
    定義字符變量ch暫時存放運算符
    for i=0 to len do
        if exp[i]>='0'&&exp[i]<='9' then
            num=num*10+exp[i]-'0'
        else
            if flag==0 then /*第一個運算符出現的狀況*/
                result=result+num
                num=0,flag=1;    //進行完一次運算後num清零    
                ch=exp[i]  //將運算符賦值給ch
            else
                switch ch do
                    case '+':result+=num;break;
                    ......
                    判斷是相應的運算符後進行運算
                end switch
                ch=exp[i] 
                num=0  //進行完一次運算後num清零  
        end if
    返回result的值

函數代碼


4.2 與原有函數代碼比較

  • 1.增長了一個規範不合法輸入函數:void correctScanf(int *x)(如圖1)
    以前還沒學指針因此對返回輸入值操做相對困難,而後此次更改的時候就加了這個函數,
    方便每次輸入時調用;以前每次輸入都得用到此代碼,如今調用就能夠實現,簡化了代碼。算法

    圖1

  • 2.函數1:void CreateExp(char *exp,int level) 和以前int gradeOne(int n) ; int gradeTwo(int n) ; int gradeThree(int n);三個函數的比較
    (1)等於將三個函數整合到一個函數中去執行,如今這個函數的封裝能夠實現以前三個函數的輸出表達式的功能,簡化了代碼;
    (2)可是以前的代碼的直觀性更強,更容易讀懂;其中對三個等級的判斷條件有所不一樣,分開討論,代碼相對比較有邏輯性;
    (3)這個函數是將一個表達式存放在字符數組中並輸出,而以前函數的輸出表達式的方式相對簡單粗暴,直接將生成的兩個數和運算符用printf輸出;數組

  • 3.函數3:int ComputeExp(char *exp,int level) 和以前int gradeOne(int n) ; int gradeTwo(int n) ; int gradeThree(int n);三個函數的比較
    (1)以前的三個函數是對數直接的運算計算出表達式結果,而函數3則是將字符串中的數轉化爲整型在進行運算,相對較麻煩;
    (2)可是函數3這樣的函數封裝,調用起來的靈活性比較強,而以前三個函數只能在相應等級中實現;函數

4.3 改進大做業總結

1.改用指針傳表達式的數組和計算表達式的結果,使各個函數的分工更加明確,代碼也更加有條理;
2.改進過程當中遇到的問題較多,也較上次複雜,如將表達式轉爲字符串形式,兩位數和三位數的整數的轉化相對複雜,
可是經過上網查找資料,發現調用itoa函數就能夠簡單實現;
3.大做業的代碼相對還有欠缺,如做答是在主函數中,其實還能夠用一個函數進行封裝實現;
4.代碼量一多,函數的封裝很是關鍵,函數封裝好只要在主函數中調用就能夠了,能夠簡化不少代碼,與改進前相比,
代碼行數減小了一百行左右,由三百多行減小到兩百多行;

大做業運行結果展現



相關文章
相關標籤/搜索