C博客做業05—指針

1.本章學習總結

1.1思惟導圖

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

1.2.1 學習體會

  • 理解了指針在代碼中的使用方法,學會使用指針進行參數操做
  • 學會告終構體的定義方式與結構體的使用
  • 通過持續一個週末的大做業重寫,增強了指針在函數中的應用,學會利用數組與指針的關係進行操做

1.2.2 代碼累計

2.PTA總分

2.1截圖PTA中的排名得分

2.2 個人總分

指針:125
總分:125算法

3. PTA實驗做業

3.1 PTA題目1

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

3.1.1 算法分析

輸入字符串a
mark=strlen(a)
for i=mark-1 to 0
    if a[i]!=空格 且 ( a[i-1]=空格 或 i = 0) //a[i]爲單詞首字母
        p=&a[i]
        flag++
        if flag!=1
            輸出空格
        end if
        do
        {
            輸出*p
            p++ //指針移到下一位
        }while *p!=空格 且 *p!=\0
    end if
end for

3.1.2 代碼截圖

3.1.3 測試數據

3.1.4 PTA提交列表及說明

說明:

Q1:數組範圍不夠大形成越界
A1:數組範圍加大至500001
Q2:發現最開始的思路出現了大量重複的無用判斷
A2:修正後運行時間大幅縮短函數

4.大做業

4.1 介紹改進函數

4.1.1 函數CreateExp

mk標記數組初始位置
if level=1
mark=1 //一個操做符
else
mark=2 //二個操做符
end if
指針移動至第一個操做符
do
{
    do
    {
        //調用CreateOp函數填入運算符,同時指針向前移動

        //調用CreateNum函數填入運算數,同時指針向前移動

        //指針移動到下一個操做符的位置
        mark--
    }while(mark)
    *exp='='
    *exp+1='\0' //結束字符串
    調用CreateNum函數填入最後一個運算數
    exp=mk //指針回到字符串起始位置
}while(調用IsExp函數查錯)
輸出字符串


下級函數CreateNum學習

根據level生成隨機數
do
{
    p-- //指針前移
    *p=a[i]%10+'0'
    a[i]=a[i]/10
}while(a[i]!=0)
返回指針位置

關於函數CreatNum中爲何不使用rand()%100和rand%1000測試

  • 使用rand()%100和rand%1000時發現了神奇的bug
  • 計算式出現了不可能存在的4位數字
  • 輸出三個運算數查錯
  • 發現運算數沒有問題
  • 觀察輸出的計算式 發現bug所在
  • 因爲使用如下式子移動指針
  • 致使指針移動時留下了 紅色標記的空位 並被隨機填充
  • 將這類狀況一一用IsExp函數剔除,感受不如直接在生成時直接避免

下級函數CreateOp指針

根據level生成除數num
flag=rand()%num
根據flag生成相應運算符
*q=生成的運算符
返回指針位置

4.1.2 函數IsExp

if level=1 且 操做符 爲 /
    if 運算數2 爲 0
    return 1
    if  計算式不能整除
    return 1
end if
return 0


在CreateExp函數中的使用方法
code

4.1.3 函數ComputeExp

定義數組a存放運算數和得數
定義字符數組op存放運算符
for (i=0 ,j=0;(exp+i)!='=';i++) //遍歷計算式
    if *(exp+i)爲數字
        a[j]=a[j]*10+*(exp+i)-'0' //將數字字符存入a[i]中
    else
        op[j]=*(exp+i) //運算符存入op
        j++
    end if
根據運算符進行計算
將結果存入a[3]
if a[2]存在
進行第二步運算
將結果存入a[3]
end if
return a[3] //返回正確答案

4.2 和原版的比較

4.2.1 函數CreateExp

原版代碼:

blog

  • 原版的生成運算符方式頭異常的鐵,使用嵌套二層switch把全部可能的狀況所有列舉出來,造成大量重複代碼
  • 新版代碼採用指針移動的方法輸入字符,簡化了整個函數
  • 原版直接輸出計算式的符號與數字
  • 新版將計算式存入字符串後輸出,同時也將計算式保留,使函數ComputeExp可使用該計算式

4.2.2 函數IsExp

emmm原版根本沒有這個函數字符串

4.2.3 函數ComputeExp

原版代碼:(見4.2.1圖)it

  • 原版代碼在生成運算符後當即對先後兩個運算符進行運算,思路過於直白,重複代碼過多
  • 新代碼將輸出的字符串逆向轉換爲數字和運算符,並計算出正確答案

4.3 改進大做業總結

  • 原版的大做業只用了183行代碼/三個函數完成了四則運算的操做,並且檢查輸入錯誤的方法異常詭異,徹底沒有半點改的空間
  • 主要是由於某位老哥在他上次的做業完美重現了我詭異的代碼,事實證實改了變量名代碼查重就沒用了,我想看一下那位老哥要厲害到什麼程度才能改我上次作的神奇玩意
  • 因此本次大做業除了輸入提示和上次長得同樣,其它全盤推翻重寫
  • 學會細化函數的分工,使main函數儘量簡潔
  • 用輸入字符串代替輸入字符,防止程序出錯
  • 用指針代替了全局變量實現函數間參數改變
  • 用查錯函數IsExp解決了小學生四則運算中出現的我也不會作的題,如:3/7
  • 有多處使用了字符串轉數字/數字轉字符串的操做,一時半會無法整出一個統一的函數進行轉換,下次將再改進
相關文章
相關標籤/搜索