- 理解了指針在代碼中的使用方法,學會使用指針進行參數操做
- 學會告終構體的定義方式與結構體的使用
- 通過持續一個週末的大做業重寫,增強了指針在函數中的應用,學會利用數組與指針的關係進行操做
指針:125
總分:125算法
給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。數組
輸入字符串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
Q1:數組範圍不夠大形成越界
A1:數組範圍加大至500001
Q2:發現最開始的思路出現了大量重複的無用判斷
A2:修正後運行時間大幅縮短函數
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=生成的運算符 返回指針位置
if level=1 且 操做符 爲 / if 運算數2 爲 0 return 1 if 計算式不能整除 return 1 end if return 0
在CreateExp函數中的使用方法
code
定義數組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] //返回正確答案
原版代碼:
blog
- 原版的生成運算符方式頭異常的鐵,使用嵌套二層switch把全部可能的狀況所有列舉出來,造成大量重複代碼
- 新版代碼採用指針移動的方法輸入字符,簡化了整個函數
- 原版直接輸出計算式的符號與數字
- 新版將計算式存入字符串後輸出,同時也將計算式保留,使函數ComputeExp可使用該計算式
emmm原版根本沒有這個函數字符串
原版代碼:(見4.2.1圖)it
- 原版代碼在生成運算符後當即對先後兩個運算符進行運算,思路過於直白,重複代碼過多
- 新代碼將輸出的字符串逆向轉換爲數字和運算符,並計算出正確答案
- 原版的大做業只用了183行代碼/三個函數完成了四則運算的操做,並且檢查輸入錯誤的方法異常詭異,徹底沒有半點改的空間
- 主要是由於某位老哥在他上次的做業完美重現了我詭異的代碼,
事實證實改了變量名代碼查重就沒用了,我想看一下那位老哥要厲害到什麼程度才能改我上次作的神奇玩意- 因此本次大做業除了輸入提示和上次長得同樣,其它全盤推翻重寫
- 學會細化函數的分工,使main函數儘量簡潔
- 用輸入字符串代替輸入字符,防止程序出錯
- 用指針代替了全局變量實現函數間參數改變
- 用查錯函數IsExp解決了小學生四則運算中出現的我也不會作的題,如:3/7
- 有多處使用了字符串轉數字/數字轉字符串的操做,一時半會無法整出一個統一的函數進行轉換,下次將再改進