C语言博客作业05--指针
1.本章學習總結(2分)
1.1 思維導圖
1.2 本章學習體會及代碼量學習體會
1.2.1 學習體會
- 這幾周初步學習了幾種數組:一維數組、二維數組和字符數組。
- 指針可以存儲變量地址,可以對復雜數據進行處理,對計算機的內存分配進行控制。
- 相對之前的學習來說,指針的學習更需要深入理解題目,才能找到思路。
- 指針很重要,是C語言的靈魂,關系到后面數構文件和鏈表等一系列的學習,因此基礎更要打好。
1.2.2 代碼累計
2.PTA總分(2分)
2.1截圖PTA中函數題目集的排名得分
2.2 我的總分:
125
3.PTA實驗作業(1分)
3.1 PTA題目1
給定一句英語,要求你編寫程序,將句中所有單詞的順序顛倒輸出。
3.1.1 算法分析
輸入一段字符并將它們存入數組str中;
len=str的長度(包括空格);
for i=len-1 to 0 do
if str[i]==' '&&i<len-1
{sp=&str[i+1];
輸出該空格后的字符sp;
去掉str數組尾部的所有空格;
str[i]=‘\0’;}
if i==0 sp=&str[i] 輸出sp之后的所有字符;
3.1.2 代碼截圖
3.1.4 PTA提交列表及說明
開始時理解錯了題意,將題目錯解成將這一字符串倒敘輸出,所以編譯多次都未通過,后來經過再次仔細審題發現是單詞倒序輸出,于是想到了利用指針的移動和‘\0’符號的使用達到了倒序輸出的目的。
4.大作業(5分)
題目:實現小學四則運算。
在函數那章,我們已經實現小學四則運算這份作業,現在要求大家把之前設計函數升級改造,原來的函數大家都是用全局變量實現不同函數參數傳遞,這次作業要求改地址傳遞,減少全局變量的使用。
題目要求:
題目有3個難度級別,分別為:
第一級是1位數的一步加減乘除計算
第二級是2位數的2步加減運算
第三級是3位數的2步加減運算
改進內容:
1.構造字符數組存放算術表達式
不管哪個級別的算式,請都生成一個字符數組存放。不管用戶選擇哪個級別題目,都能在表達式生成函數中生成一個算術式子。具體函數接口
void CreateExp(char *exp,int level)
{
switch(level)
{
case 1:生成一位數一步加減式子,寫入字符數組exp;
case 2:生成2位數2步加減式子,寫入字符數組exp;
case 3:生成3位數2步加減式子,寫入字符數組exp;
}
// 注意三位數隨機數,應該也包含生成一位數,即用rand()%1000就可以。
}
2.表達式是否合法(選做)
對于不合法或者超出該級別小學生學習范圍的表達式,視為不合法,需重造一個。不合法表達式體現有除數為0的表達式、1,2級別中出現不能整除的除法表達式或其他不合法情況
int IsExp(char *exp,int level)
{
}
3.表達式運算
根據字符表達式,能計算其結果。有能力同學深入研究表達式優先級。
int ComputeExp(char *exp)
{
}
這塊代碼可以參考這題做法:
include <stdio.h>
int main()
{
int m=0, sum=0;
char c, oldc='+';
do {
c = getchar();
if( c<='9'&&c>='0' )
m = 10*m + c - '0';//1
else
{
if( oldc == '+' )
sum += m;
else
sum -= m;
m = 0;//2
oldc = c;
}
} while(c!='=');
printf("sum=%d", sum);
return;
}
4.1.改造函數介紹
主要上述三個函數的改造說明
1.函數1
隨機數種子
定義字符型數組str[4]={'+','-','*','/'};
switch(level)
{case 1:將隨機一位數和符號存儲于數組中(隨機字符利用str[]數組產生);break;
case 2:將隨機兩位數和符號存儲于數組中(兩位數字分別為兩個數組元素);break;
case 3:將隨機三位數和符號存儲于數組中(三位數字分別為三個數組元素);break;}
2.函數2
switch(level)
{case 1:while 除數為0或被除數不能被整除 do 被除數=1-9隨機數;break;
case 2:while 被除數不能被整除 do 被除數=10-99隨機數;break;
case 3:while 被除數不能被整除 do 被除數=100-999隨機數;break;}
3.函數3
兩個函數執行一個功能:
第一個函數:
接收參數num1,num2和p;
switch(p)
{case '+':sum=num1+num2;break;
case '-':sum=num1-num2;break;
case '':sum=num1num2;break;
case '/':sum=num1/num2;break;}
返回sum;
第二個函數:
接收參數*p;
num1=atoi(p);
if num1/10==0 利用函數1一步求出sum
else if num1/100==0 利用函數1求出第一步運算的結果,再利用一次函數1求出sum;
else 利用函數1求出第一步運算的結果,再利用一次函數1求出sum;
返回sum;
4.3 與原有函數代碼比較
改造前函數1和改造后的函數1
改造前:直接在主函數中設num1,num2,num3,ch1,ch2等變量。優點:變量調用很明確方便;缺點:變量非常的多,雜亂。
改造后:采用字符數組在函數地址中寫入隨機生成的式子。優點:在函數中使主函數變得簡單,用數組存儲省去了設置一堆變量的麻煩;缺點計算的時候還要轉化有點麻煩。
改造前函數2和改造后的函數2
改造前:直接在主函數中判斷,每個式子生成之后都要用循環判斷一次。優點:目的明確;缺點:代碼冗長,而且功能單一,完全可以分裝入函數。
改造后:專設一個函數來判斷,分情況討論。優點:采用傳入地址的方法,直接修改主函數中變量的值,不需要返回值;缺點:書寫較繁瑣我覺得還可以化簡。
改造前函數3和改造后的函數3
改造前:每種情況都設一個函數,三個函數分別計算值。優點:目的明確,引用方便;缺點:繁瑣,浪費。
改造后:設一個函數包含三種情況,另一個函數負責計算,利用函數之間的相互調用來完成計算。優點:代碼量少,可讀性好;缺點:需要耐心思考每一步的指針到底指向的是哪里,然后才能調用,易寫難想。
4.4 改進大作業總結
第一次時寫的不太順利,總是會不是漏了這個就是忘了那個,當時剛剛學到字符,也不大會用,很多字符方面的東西一知半解的,老是運行出錯,所以大作業也盡量去避免用字符之類的,這是不對的。而學完了指針再看大作業,就顯得當初的代碼很low了,這一點從代碼量也能看出來,當時寫了足足有300多行,而現在只有當初的一半多一點??梢娭羔樖值厥】臻g。再者第一次寫的時候十分隨意,函數的封裝也沒怎么注意,主函數非常的長而且拖沓,而且函數和變量的取名也十分隨意,想怎么來就怎么來,全局變量設了一堆,幸好沒有對大體產生什么干擾,不然按照當時我的水平,肯定手足無措。這一次我注意到了很多細節問題,我相信會比上一次更好更完善,這一次的函數封裝是按照老師的步驟來的,給了我一些新的思路,當然,我也相信我的代碼還有改進的空間。
轉載于:https://www.cnblogs.com/lkjhgfdsa/p/10133712.html
總結
以上是生活随笔為你收集整理的C语言博客作业05--指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多边形填充算法-有序边表法(扫描线算法)
- 下一篇: 在Core WebApi中使用Swagg