1.學習了指針以爲指針相對來講比較抽象,並且在上指針課以前未進行預習,因此剛開始學會比較吃力,但經過老師的課堂派pta訓練 相對跟上一些進度,可是對指針掌握程度相對欠缺; 2.學完指針,指針的好處在函數上是一個體現,以前函數只能返回一個值;但有了指針,能夠經過傳遞多個地址,在本身定義的函數中 完成對這些地址中的值進行更改,則原函數中的變量的值也會相應更改,至關於一個函數能夠傳回多個值; 3.學習了字符串的賦值要藉助strcpy函數,不能依靠等號進行賦值,以及字符串的鏈接和長度比較都要調用函數來實現; 4.指針傳遞的是地址,能夠明顯提升大數據傳遞效率;
給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。
定義i,j 定義字符數組a; 輸入字符串a; 定義整型變量n用於存放a字符串的長度; 定義count計數一個單詞的長度; 定義flag,flag=1不輸出空格;flag=0時輸出空格; for i=n-1 to 0 do i-- if a[i]==' '&&count!=0 then //遇到空格且所記單詞數大於0時準備輸出單詞 if flag==1 then flag=0 //第一個單詞以前不用輸出空格 else 輸出空格 end if for j=i+1 to i+count do j++ 輸出a[j] count=0 /*當一個單詞輸出完後,count清零,從新計數*/ else if a[i]!=' ' then count++ /*在還沒遇到空格以前,計數加一*/ end if end for if count>0 then if flag==0 then 輸出空格 end if for i=0 to count do 輸出a[i] end for /*若是a[0]等於字母則在循環中沒法輸出最後一個單詞,這個if語句用於解決a[0]不等於空格的狀況*/
題目:實現小學四則運算。 題目要求: 題目有3個難度級別,分別爲: 第一級是1位數的一步加減乘除計算 第二級是2位數的2步加減運算 第三級是3位數的2步加減運算
說明:函數1構造字符數組存放算數表達式;函數3計算出表達式的結果並將結果返回;
思路:生成相應的隨機數和隨機運算符並依次賦給exp字符數組,最後輸出字符數組。 (注:其中穿插不合法狀況的判斷,使生成的表達式中不含不合法的表達式)
void CreateExp(char *exp,int level) 定義整型變量x,y用於生成隨機數 定義整型變量m判斷生成的是幾位數的數,n判斷運算符的類型的個數 定義字符數組str並賦初值零 定義i用於限制運算式子的步數 switch level do case 1 do m=10;n=4;i=3; break case 2 do m=100;n=2;i=5;break case 3 do m=1000;n=2;i=5;break end switch while i-- do if i%2==1 then y=rand()%n /*判斷運算符類型*/ switch y case 0:strcat(exp,"+");break; ...... /*這個switch用於判斷四種狀況,並將符合條件的運算符鏈接到exp上*/ end switch else then x=rand()%m; if level==1 and i==0 and y==3 and x==0 then //除數爲0的不合法狀況 i++ continue end if if level==1 and i==0 and y==3 end ((exp[0]-'0')%x!=0)//等級一中除法運算不能整除的不合法狀況 i++ continue end if 用itoa函數實現將一串整型數轉化爲字符串,並存在str數組中 將str鏈接在exp後 end if end while 輸出表達式的字符串exp
判斷不和法的狀況已經包含在函數1中並進行了相應的註釋。
思路:將字符數字轉化爲整型數字,並依次一步一步的計算並賦值給result,最後算出表達式結果,並將結果result返回。
int ComputeExp(char *exp,int level) 定義整型變量i,j用於循環 定義len,將exp數組長度的值賦給len 定義result用於存放表達式計算結果 定義flag,flag=0時說明是第一個運算符出現的狀況 定義字符變量ch暫時存放運算符 for i=0 to len do if exp[i]>='0'&&exp[i]<='9' then num=num*10+exp[i]-'0' else if flag==0 then /*第一個運算符出現的狀況*/ result=result+num num=0,flag=1; //進行完一次運算後num清零 ch=exp[i] //將運算符賦值給ch else switch ch do case '+':result+=num;break; ...... 判斷是相應的運算符後進行運算 end switch ch=exp[i] num=0 //進行完一次運算後num清零 end if 返回result的值
1.增長了一個規範不合法輸入函數:void correctScanf(int *x)(如圖1)
以前還沒學指針因此對返回輸入值操做相對困難,而後此次更改的時候就加了這個函數,
方便每次輸入時調用;以前每次輸入都得用到此代碼,如今調用就能夠實現,簡化了代碼。算法
2.函數1:void CreateExp(char *exp,int level) 和以前int gradeOne(int n) ; int gradeTwo(int n) ; int gradeThree(int n);三個函數的比較
(1)等於將三個函數整合到一個函數中去執行,如今這個函數的封裝能夠實現以前三個函數的輸出表達式的功能,簡化了代碼;
(2)可是以前的代碼的直觀性更強,更容易讀懂;其中對三個等級的判斷條件有所不一樣,分開討論,代碼相對比較有邏輯性;
(3)這個函數是將一個表達式存放在字符數組中並輸出,而以前函數的輸出表達式的方式相對簡單粗暴,直接將生成的兩個數和運算符用printf輸出;數組
3.函數3:int ComputeExp(char *exp,int level) 和以前int gradeOne(int n) ; int gradeTwo(int n) ; int gradeThree(int n);三個函數的比較
(1)以前的三個函數是對數直接的運算計算出表達式結果,而函數3則是將字符串中的數轉化爲整型在進行運算,相對較麻煩;
(2)可是函數3這樣的函數封裝,調用起來的靈活性比較強,而以前三個函數只能在相應等級中實現;函數
1.改用指針傳表達式的數組和計算表達式的結果,使各個函數的分工更加明確,代碼也更加有條理; 2.改進過程當中遇到的問題較多,也較上次複雜,如將表達式轉爲字符串形式,兩位數和三位數的整數的轉化相對複雜, 可是經過上網查找資料,發現調用itoa函數就能夠簡單實現; 3.大做業的代碼相對還有欠缺,如做答是在主函數中,其實還能夠用一個函數進行封裝實現; 4.代碼量一多,函數的封裝很是關鍵,函數封裝好只要在主函數中調用就能夠了,能夠簡化不少代碼,與改進前相比, 代碼行數減小了一百行左右,由三百多行減小到兩百多行;