這周學習了指針相關的知識,一週的學習下來我以爲指針比前面任何一章的知識都要難理解,再加上上一週的數組題量比較大也比較難,因此關於指針的預習沒有作到位,上課時不少知識點講的比較快跟不上,下來作題發現不少都不懂; 指針的題目很少,最開始作指針的函數題以前我從新看了一遍課本,看完也還有一些沒法理解的地方,因此在作函數題時感受本身的思路和方法都和數組差很少,但到作編程題時就發現只有用指針的方法才能夠簡潔明瞭地完成題目,因此在編程題上花的時間比函數題要多,但經過編程題也對指針的內容更加了解了。
給定一句英語,編寫程序,將句中全部單詞的順序顛倒輸出。算法
定義字符數組a存放單詞串,定義空指針p,i=0 gest(a) 定義len計算數組a的長度 for i=len-1 to i=0 do if 某個字符不是空格且前面不是空格或者該字符爲字符串第一個 then for p指向該字符即單詞首字母 to *p指向空格或*p指向結束符'\0' do 輸出這個字符 end for if 該字符不是首字符且第一個單詞前無空格 輸出一個空格 end if end for
Q1:數據的第一個單詞不會在最後輸出;
A1:輸出字符的循環條件是前一個字符爲空格且字符自己不是空格,但循環到第一個單詞時它的首字母前面無空格,因此沒法輸出,加了一個i=0的條件後解決了。
Q2:若是輸入的數據爲一個單詞且前面有一個空格時個人代碼將會輸出那個單詞和空格,過不了測試點;
A2:在控制輸出空格的條件中加a[0]不等於空格,就是若是第一個單詞前有空格的話,倒序後輸出的單詞後面也不會有空格,解決這個問題改的地方很少但確實是試了不少方法。編程
void CreateExp(char *exp,int level) 定義字符數組存放運算符 level做爲switch語句的條件 if level=1 生成隨機數,運算符,隨機數儲存在數組中 end if且跳出循環 if level=2 生成對應隨機式儲存在數組中 end if且跳出循環 if level= 生成對應隨機式儲存在數組中 end if且跳出循環 then 輸出隨機式
定義m儲存隨機數,sum儲存計算結果,i爲循環變量 定義字符變量oldc儲存爲數組中的運算符 do if 字符爲1-9中的數字 then 將字符轉爲數值 並存到賦值給m i++ end if else if oldc爲運算符'+' 將m累加到sum中 數組中下一個字符賦值給oldc i++ end else 讀到字符數組結束符中end do 返回運算結果sum
改造前函數1和改造後的函數1:
改造前用於生成隨機運算式的函數我用了兩個個,一個生成隨機數,一個生成隨機運算符,而且每個隨機數和運算符都定義爲了全局變量,在主函數中也寫了很長一串,用指針改造後,本來的兩個函數的功能用一個函數就實現了,隨機數和運算符的生成都經過儲存到字符數組中來實現輸出,減小了不少全局變量的使用,並且代碼也簡潔了不少,函數的功能沒有重複。數組
改造前函數2和改造後的函數2:
改造前計算正確結果的函數傳入了6個參數,用if來判斷等級和switch語句來判斷運算符,不一樣的運算符進行不一樣的計算,改造後的函數經過判斷字符的類型來直接進行計算,省去了用switch語句中重複的部分,雖然改造後的函數沒有比改造前函數的代碼量少不少,但內容比原先的函數精簡不少,但原先的函數更容易理解一點。函數
此次的大做業雖然是在上次的做業基礎上作修改,但難度不比上次的做業小,首先是由於我對指針的使用還不太熟練,不少地方在修改的時候我都會看一下作過的pta和課堂派的指針題目去了解一些指針的用法,而後再修改本身的代碼,因此改造仍是花了挺多時間的,也仍然存在bug,但相較與第一次的大做業確實減小了將近十個的全局變量的使用,代碼量也減小了不少。 上一次做業存在的優先級的問題還暫時沒有徹底解決,接下來也會繼續思考完善要解決優先級問題的代碼,但願在下一次的改進中程序的功能有更好的拓展性。