本週學習感覺:自從接觸了指針,感受打開了新世界的大門。原先在數組、字符串的學習中已經對於地址這個概念有了一個較爲深入的瞭解,經過本章對指針的學習,對於內存、地址有了更加全面的認識,而且掌握瞭如何使用指針去訪問內存單元。相較以前的數組、字符串來講,直接用指針去訪問內存單元會更加直觀。指針被稱爲c語言的靈魂是有依據的,由於它確實很方便,同時也是c語言的特點。但同時,指針也是一個難點。好比野指針的概念,我剛開始使用指針的時候就總是犯錯誤。並且對於指針的更深層次的研究,如二次指針,就有些複雜,須要仔細思考一番才能理解它的意思。總而言之,本週對於指針的學習較爲順利,我的認爲指針的引入十分的有意義,指針使得訪問內存單元更加直觀,確實很好用;可是要用得熟練,仍須要訓練。算法
給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。測試輸入包含一個測試用例,在一行內給出總長度不超過500 000的字符串。字符串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用若干個空格分開。數組
定義字符串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
其實這題我原本用的字符串作的......後來強行改爲了指針
安全
聲明:因爲個人第一次大做業代碼幾乎沒有使用全局變量,因此只是對原有的程序結構及功能進行完善函數
聲明:因爲在第一次大做業時個人代碼中這三個函數的功能都集中在一個大函數Calculate中,所以此次改進,我主要把該函數拆分並改善學習
傳入用於儲存計算式的地址,儲存到字符型指針變量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 輸出 請輸入「計算式」的答案
傳入計算式的地址,由字符型指針exp存放 整形sign=1 if 前一個數不能整除後一個數 then sign=0 end if if 當運算符爲-或/且前一個數小於後一個數時 then sign=0 end if 返回 sign
傳入算式字符串的地址給字符指針變量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
原先只有一個長得嚇人的大函數:
測試
3.兩者缺點:新函數的分塊實現雖然將功能分塊實現,可是功能有待完善,同時參數間的傳遞較爲複雜,不便閱讀。舊函數的缺點就很明顯,功能集中致使代碼冗長,可讀性差,拓展性也很弱。3d
第一次寫大做業時:第一次寫還算比較順利,由於不須要大量調用函數(由於構思時的函數模塊劃得不是特別好),主要困難是調試一些bug,以及在程序的交互性上花了比較大的功夫。由於是重頭開始寫,因此花的時間還算久。
第二次寫大做業時:第二次進行改良的時候明顯就困難多了,由於改代碼要比從頭開始寫代碼可貴多(我的觀點),雖然是本身的代碼,但畢竟也有一段時間了,因此改以前仍是瞅了很久hh。而後此次的修改主要有兩個方面:第一是對以前安全輸入bug的修復(我加了個安全輸入的函數),第二就是爲了程序的拓展性而把大函數拆分紅幾個函數,這也是重難點。在寫程序的時候,明顯感受到在進行參數傳遞的時候,不夠熟練(由於寫得仍是太少)。再就是此次得代碼中加入了被調函數中再調用函數的狀況,致使代碼寫得很慢,思路也比較亂。指針