第五次作業------指針
1.本章學習總結
1.1 思維導圖

1.2 本章學習體會及代碼量學習體會
1.2.1 學習體會
換個說法吧,后面的博客,每次都說好難好難也不好。(不過也是事實)
指針,我稍微會用的就是和數組有關聯的那一部分。拿著自己寫的題目去問同學,他說我指針用的太過了,也的確是,不太會用,就拿做過的課堂派作業照著葫蘆畫瓢,尋一點點感覺。還是指針,我用了,自己都不知道他跑到哪里去了,看了半天都沒毛病,請教大佬后一語道破。目前對指針還是挺迷的,能不用指針我就盡量不用吧。(在你完全熟悉指針之前,盡量不要亂用。----這是大佬對我的寄語)。不過,有的題目用用指針還是蠻方便的。
此次大作業,說實話,真的看得一臉懵逼。本來就不怎么會用,然后有點不知道怎么下手。不過,也不能不做,做了總比沒做好,哪怕是看著別人的寫的,也比自己不寫好,好歹有個印象。后來和同學聊天談到,不怎么會用指針的話,至少會多少寫多少吧,先把一級的寫了。后來想想也對,這不就是把大問題分解成小問題嘛,解決起來就沒有那么困難。
此次作業,我還是要認真的,上次函數大作業沒寫好,以至于這次要基本全部重來一遍,非常費勁,如果這次還是那么含糊的話,那下次就是和文件關聯,與課設有關了。對中間要求嚴格一點,做的更好一點,也是為了后面能不學的那么累。
1.2.2 代碼累計

2.PTA總分
2.1截圖PTA中函數題目集的排名得分

2.2 我的總分:
指針pta總分110
3.PTA實驗作業
3.1 PTA題目1
7-3 字符串的冒泡排序 (20 分)
我們已經知道了將N個整數按從小到大排序的冒泡排序法。本題要求將此方法用于字符串序列,并對任意給定的K(<N),輸出掃描完第K遍后的中間結果序列。
輸入格式:
輸入在第1行中給出N和K(1≤K<N≤100),此后N行,每行包含一個長度不超過10的、僅由小寫英文字母組成的非空字符串。
輸出格式:
輸出冒泡排序法掃描完第K遍后的中間結果序列,每行包含一個字符串。
3.1.1 算法分析
定義二維字符數組ch[100][20]
for(i=0 to n)
do
scanf("%s",ch[i])//將字符串看做一個整體存放在數組中
end for
定義j
- for(i=0 to k)循環到k輪結束
do
- for(j=0 to n-1-i)//考慮到最大的那個數在最后的情況,要減1
do
- if(ch[j]>ch[j+1])
定義字符數組t[20]
//利用函數strcpy交換ch[j]與ch[j+1]的值
strcpy(t, ch[j]);
strcpy(ch[j], ch[j+1]);
strcpy(ch[j+1], t);
end if
end for
end for
- for(i=0 to n)
do
輸出ch[i]
end for
3.1.2 代碼截圖

3.1.4 PTA提交列表及說明

- Q1:開始一直想著用一位數組循環存放字符串,后面發現不行
- A1:將字符串的存儲改為用二維數組
- Q2:對字符串這個整體,不知道該怎么處理,開始想著是,讀到空格就結束,前面的字符構成一個數組,就是一個字符串放在一個數組中的意思
后面發現根本不知道該怎么表示,無從下手 - A2:換一種思考方式,將字符串作為一個數組元素存放,將字符串看做一個整體處理
- Q3:冒泡交換兩個數的值時,定義一個指針放值,發現不行
- A3:用函數strcpy,進行復制處理,同時將指針改為一個數組去存放相應的字符串
4.大作業
題目:實現小學四則運算,有3個難度級別,分別為:
第一級是1位數的一步加減乘除計算
第二級是2位數的2步加減運算
第三級是3位數的2步加減運算
改進內容:
4.1.改造函數介紹
1.構造字符數組存放算術表達式
算法分析
定義lence//表示數組長度
- if(level == 1)
lence = 4;//一級運算式子共有4個字符
- else if(level == 2)
lence = 9;//一級運算式子共有9個字符
- else
lence = 12; //一級運算式子共有12個字符
end if
- for( i = 0 to lence-1)
- for(j = 0 to level)//一級是一位數,二級兩位數,三級三位數
- if(level>1)//大于兩位數的隨機數,第一位數字不能為0
- if(j==0)
exp[i++] = rand() % 9+'1';//第一位數字不能為0
- else
exp[i++] = rand() % 10 + '0';
end if
else
exp[i++] = rand() % 10 + '0';
end if
end for
- if(level == 1)//等級一生成四個運算符
t = rand() % 4;
if (t == 0) exp[i] = '+';
else if (t == 1) exp[i] = '-';
else if (t == 2) exp[i] = '*';
else exp[i] = '/';
- else //等級二三生成兩個運算符
t = rand() % 2;
if (t == 0) exp[i] = '+';
else exp[i] = '-';
end if
end for
exp[lence-1] = '=';//讓最后一個為等號
exp[lence] = '\0';
截圖函數代碼

2.計算結果的函數
算法分析
定義計算結果sum并初始化為0
定義oldc為原來字符并復制為 +
do
- if(exp[i]<='9'&&exp[i]>='0' ) //讀到的字符是數字,累計起來
m=10*m+exp[i]-'0';
- else
- if(oldc=='+' )//加法
sum += m;
- else if(oldc=='-')//減法
sum -= m;
- else if(oldc=='*')//乘法
sum *= m;
- else if(oldc=='/')//除法
sum /= m;
end if
m = 0;//重新歸零,不影響下次運算
oldc =exp[i];//賦新制
end if
i++;//i自增讀下一個字符
}while(exp[i-1]!='=');
end do while
返回最終結果sum;
代碼截圖

4.2 與原有函數代碼比較
改造前函數1和改造后的函數1
- 在生成式子計算的時候,我改造之后的是每次調用函數生成式子,而原來的是在每個等級中循環生成式子并計算結果,改造之后大大增強了代碼的可讀性
- 現有代碼,巧妙運用exp存放,比原來的代碼量有所減少
改造前函數2和改造后的函數2
- 原來計算結果是用switch語句判斷符號,然后再用result去做相應的加減乘除運算,分的情況會很多,很麻煩
- 現在改造的函數是讀取存放進數組的字符,來計算結果,非常巧妙,代碼量大大減少
4.3 改進大作業總結
- 在運用exp的時候,我參考同學代碼用來sprintf將式子放入數組中,但我發現根本出不來等式,后面才知道原來還要printf將式子表示出來。然后當時運用的是指針,要申請內存,不然就會出錯,總之,改來改去我就干脆把他改成數組算了,省事。但是。。。。。。后來我又改了,因為我發現自己并不熟悉sprintf的用法,后來想想,我的哪里用了指針,就是硬湊上去的嘛。于是,我就在同學建議下對三個級別分情況討論,依次將字符存入數組中,更加簡便易懂
- 困擾我最久的就是,我分明返回了result的值,但它最后就是顯示為0,經過問學長學姐,才知道原來我要把我返回的result的值賦給一個x,這樣才能把正確結果存起來
- 在計算結果的那個函數中,參考了老師提供的代碼,對數字進行累計和對運算符進行不斷更新,使計算看起來更方便一些,同時也和生成式子的那個指針關聯起來了。
- 指針,其實現在還是比較怕用的,因為我不太清楚他到底要怎么指。而且,此次作業對于我來說可以說是一次大改動了,上次函數大作業還有許多bug,后來就一直放著,這次就很費勁,我不想重蹈覆轍,于是又對代碼進行修改,盡量少點錯誤。
- 大作業是一次一次相關聯的,盡量做到最好吧,不然如果這個又做不好的話,那我后面的文件和課設豈不是一團糟了。。。
浙公網安備 33010602011771號