經過這一週的學習,讓我明白了指針的重要性,在不少時候運用,會使得代碼功能強大。 但我發現,能夠用指針的地方,能夠用數組,我比較喜歡用數組寫,多是剛剛學習指針,不怎麼熟悉的結果。之後的學習中要多運用指針打打代碼,這樣把這種新的方法經過鍛鍊,熟悉起來。指針裏面重點是處理字符,字符串的問題,我學會了好幾個處理的字符串的函數。好比複製strcpy,賦值strcat鏈接函數,strcmp比較函數,strlen長度函數。這幾個函數在處理不少字符串的問題上能夠起到很強的做用。從此的學習中要多用指針,多學習一點string文件裏面的函數。減小代碼的複雜度。
總分 :110算法
定義字符串長度longth;存放尾數poem數組; 輸入二維字符數組char - for i=0 to 4 scanf("%s",s[i]);//讀入 - end for - for i=0 to 4 //遍歷 - longth = strlen(s[i]);//計算每一行的字符串長度 - 如下2個字節按順序存放造成漢字 - poem[2*i]= s[i][longth-2];//最後一個漢字的第一個字節存放 - poem[2*i+1]= s[i][longth-1];//最後一個漢字的的第二個字節存放 - end for
Q:不知道怎麼處理漢字的存放,沒理解漢字是如何輸出的。
A:百度後知道了漢字分2個字節存放,連續的2個字節輸出就能夠打印出一個漢字,而後就用到這種辦法,把最後一個字拆分,一個字節一個字節,按順序存放在一個數組中,造成一個大的字符串,就是結果。數組
題目:實現小學四則運算。
題目要求:
題目有3個難度級別,分別爲:
第一級是1位數的一步加減乘除計算
第二級是2位數的2步加減運算
第三級是3位數的2步加減運算函數
1.構造字符數組存放算術表達式
學習
2.表達式運算測試
1.函數1 傳入實參 存放算術式的數組exp的地址,用戶等級rank, 用戶訓練題目量num; 定義 算式和值sum,答對題數yes=0;用戶輸入值yournum ,循環變量i , 判斷是否結束變量flag;存放運算符字符數組char - for i=1 to num - do switch rank; - case 1://生成一級運算式 - *(exp+0)=rand()%9+'1'; - *(exp+1)=ch[rand()%2];//隨機產生- + 運算符 生成隨機0,對應運算符「-」;隨機1,對應運算符「+」 - *(exp+2)=rand()%9+'1'; - *(exp+3)='\0'; break; //末尾存入\0.方便運算 - case 2://生成2級,原理和一級相同 - *(exp+0)=rand()%9+'1'; - ...... - *(exp+2)=ch[rand()%4];//隨機產生4種運算符 - *(exp+3)=rand()%9+'1'; - ...... - *(exp+5)=ch[rand()%4]; - *(exp+6)=rand()%9+'1'; - ...... - *(exp+8)='\0'; break; - case 3://生成3級,原理和一級相同 - *(exp+0)=rand()%9+'1'; - ...... - *(exp+11)='\0'; break; - end switch - strcat(exp,"=");//鏈接等號 - puts(exp);//輸出運算式 - sum=ComputerExp(exp);//調用計算函數計算結果 - 嵌入輸出的代碼,包括結果,正確率等 - end for 截圖函數代碼: 函數代碼參考上述構造字符數組存放算術表達式
傳入存放運算符的數組地址exp 定義 循環變量i;循環累加值m ; 總和值sum ;存放運算符oldc; - do while(*(exp+i))//遍歷運算式數組exp - if *(exp+i) <='9'&& *(exp+i)>='0' ) then m=10*m+*(exp+i)-'0';//當字符屬於數字時,字符運算把每個字符轉化爲數字 - else - do switch(oldc) //不然則爲運算符。調用switch語句分別進行運算 - case '+': sum=sum+m;break; - case '-': sum=sum-m;break; - case '*': sum=sum*m;break; - case '/': sum=sum/m;break; - end switch - m = 0;//運算完後m歸0,方便下一次運算 - oldc = *(exp+i);//存運算符,方面下一次計算 - i++; - end while - return sum;//返回結果 ,方便調用運算結果 截圖函數代碼: 函數代碼參考上述構造表達式運算
1.改造前的函數3個級別分別要用3個函數分別構造,可是改造後的函數一個函數就能夠解決3個級別的問題,
2.改造前的函數每一種級別都要進行復雜的代數運算,不少個case,一步一步的進行運算,改造後的函數,無論哪個級別,均可以統一用一個計算函數運算出來,結果返回就行。
3.改造前的函數,輸出提示一個級別運用一次,屢次使用了相同的東西,變量每一個函數都要定義。改造後的函數,全部的變量,都只要定義一次,另外的函數要用就直接傳遞實參給函數,直接使用。
4.改造前的函數沒有使用指針地址,改造後的函數使用了地址,在重複使用一個相同的數的狀況上,改造後的函數方便不少,能夠直接*取地址,直接使用,可是改造前的函數若是要使用,必須定義全局變量。
5.改造前的函數無論變量上。代碼量上都比改造後的函數複雜。改造後的函數簡單的2個函數就能夠完成全部功能。
6.改造前的函數輸出是這樣:
改造後函數,一個輸出函數,一個表達式直接puts(exp)!!!很是方便,簡潔!3d
1.改造前的函數運算是這樣的:
改造後的運算函數:
直接用 m=10m+(exp+i)-'0',這條語句,處理了全部的運算!
可見用字符數組存放後用字符運算的強大!它的優勢很明顯,無論一位數,二位數,一步,二步,均可以一會兒處理完,不須要分開!指針
回顧兩次做業編寫過程,總結碰到問題及後續程序編寫注意事項。
總結:第1次編寫大做業的時候,很疑惑函數的構造,因爲對函數的使用不是很熟悉,因此我第一次並未使用傳參數的函數,全部的變量都是在每個函數定義,雖然在編寫的時候簡單了不少,可是繁瑣不少了,不少變量都重複的在使用,其效果等同與全局變量的使用。在編寫的過程當中,會遇見取隨機值不知足位數的狀況,在之後的編寫中,要多運用函數傳參數的寫法,避免屢次定義相同變量,只須要在主函數中定義一次,而後能夠傳參數屢次使用。使用函數有個問題,就是屢次使用同一個數據,要重複調用,不怎麼方便。
第2次的做業:把全局變量改成地址,函數改成地址傳參數,解決了第一次編寫大做業的問題,只要有函數的地址,重複使用很方便,可是編寫的時候也碰見了傳參數出現錯誤的狀況,好比定義形參的類型,在使用存儲運算表達式的函數中,我想把和sum直接用在另一個函數,出現錯誤。緣由是這個sum變量是局部變量,不可以和別的函數共享,因此我想到了返回的方法,把sum做爲函數的返回值。這樣一更改,個人函數頭名void又忘記了更改爲對應的整形去定義函數,又出現錯誤,通過同窗的指點,才發現了這一點問題。從此的編寫中,要注意形參的傳遞要符合,有返回值函數不可以定義void。局部變量的值不可以給別的函數使用,若是要用,要用全局變量去定義,或者經過返回值使用!code