博客做業 - 指針

1.本章學習總結

1.1 思惟導圖

1.2本章學習體會,代碼量學習體會

1.2.1學習體會

經過這一週的學習,讓我明白了指針的重要性,在不少時候運用,會使得代碼功能強大。  但我發現,能夠用指針的地方,能夠用數組,我比較喜歡用數組寫,多是剛剛學習指針,不怎麼熟悉的結果。之後的學習中要多運用指針打打代碼,這樣把這種新的方法經過鍛鍊,熟悉起來。指針裏面重點是處理字符,字符串的問題,我學會了好幾個處理的字符串的函數。好比複製strcpy,賦值strcat鏈接函數,strcmp比較函數,strlen長度函數。這幾個函數在處理不少字符串的問題上能夠起到很強的做用。從此的學習中要多用指針,多學習一點string文件裏面的函數。減小代碼的複雜度。

1.2.2代碼累計

2.PTA總分

2.1

2.2個人總分:

總分 :110算法

3.PTA實驗做業

3.1題目介紹

3.1.1算法分析

定義字符串長度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

3.1.2代碼截圖

3.1.3測試數據

3.1.4PTA提交列表和說明

Q:不知道怎麼處理漢字的存放,沒理解漢字是如何輸出的。
A:百度後知道了漢字分2個字節存放,連續的2個字節輸出就能夠打印出一個漢字,而後就用到這種辦法,把最後一個字拆分,一個字節一個字節,按順序存放在一個數組中,造成一個大的字符串,就是結果。數組

4.大做業(5分)

題目:實現小學四則運算。
題目要求:
題目有3個難度級別,分別爲:
第一級是1位數的一步加減乘除計算
第二級是2位數的2步加減運算
第三級是3位數的2步加減運算函數

4.1改進內容:

1.構造字符數組存放算術表達式
學習

2.表達式運算測試

4.2改造函數介紹

主要上述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


截圖函數代碼:
函數代碼參考上述構造字符數組存放算術表達式

2.函數2

傳入存放運算符的數組地址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;//返回結果 ,方便調用運算結果


截圖函數代碼:
函數代碼參考上述構造表達式運算

4.3 與原有函數代碼比較

改造前函數1和改造後的函數1

1.改造前的函數3個級別分別要用3個函數分別構造,可是改造後的函數一個函數就能夠解決3個級別的問題,
2.改造前的函數每一種級別都要進行復雜的代數運算,不少個case,一步一步的進行運算,改造後的函數,無論哪個級別,均可以統一用一個計算函數運算出來,結果返回就行。
3.改造前的函數,輸出提示一個級別運用一次,屢次使用了相同的東西,變量每一個函數都要定義。改造後的函數,全部的變量,都只要定義一次,另外的函數要用就直接傳遞實參給函數,直接使用。
4.改造前的函數沒有使用指針地址,改造後的函數使用了地址,在重複使用一個相同的數的狀況上,改造後的函數方便不少,能夠直接*取地址,直接使用,可是改造前的函數若是要使用,必須定義全局變量。
5.改造前的函數無論變量上。代碼量上都比改造後的函數複雜。改造後的函數簡單的2個函數就能夠完成全部功能。
6.改造前的函數輸出是這樣:



改造後函數,一個輸出函數,一個表達式直接puts(exp)!!!很是方便,簡潔!3d

改造前函數2和改造後的函數2

1.改造前的函數運算是這樣的:



改造後的運算函數:
直接用 m=10m+(exp+i)-'0',這條語句,處理了全部的運算!
可見用字符數組存放後用字符運算的強大!它的優勢很明顯,無論一位數,二位數,一步,二步,均可以一會兒處理完,不須要分開!指針

4.4 改進大做業總結

回顧兩次做業編寫過程,總結碰到問題及後續程序編寫注意事項。
總結:第1次編寫大做業的時候,很疑惑函數的構造,因爲對函數的使用不是很熟悉,因此我第一次並未使用傳參數的函數,全部的變量都是在每個函數定義,雖然在編寫的時候簡單了不少,可是繁瑣不少了,不少變量都重複的在使用,其效果等同與全局變量的使用。在編寫的過程當中,會遇見取隨機值不知足位數的狀況,在之後的編寫中,要多運用函數傳參數的寫法,避免屢次定義相同變量,只須要在主函數中定義一次,而後能夠傳參數屢次使用。使用函數有個問題,就是屢次使用同一個數據,要重複調用,不怎麼方便。
第2次的做業:把全局變量改成地址,函數改成地址傳參數,解決了第一次編寫大做業的問題,只要有函數的地址,重複使用很方便,可是編寫的時候也碰見了傳參數出現錯誤的狀況,好比定義形參的類型,在使用存儲運算表達式的函數中,我想把和sum直接用在另一個函數,出現錯誤。緣由是這個sum變量是局部變量,不可以和別的函數共享,因此我想到了返回的方法,把sum做爲函數的返回值。這樣一更改,個人函數頭名void又忘記了更改爲對應的整形去定義函數,又出現錯誤,通過同窗的指點,才發現了這一點問題。從此的編寫中,要注意形參的傳遞要符合,有返回值函數不可以定義void。局部變量的值不可以給別的函數使用,若是要用,要用全局變量去定義,或者經過返回值使用!code

相關文章
相關標籤/搜索