第五次做業------指針

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提交列表及說明
3d

  • Q1:開始一直想着用一位數組循環存放字符串,後面發現不行
  • A1:將字符串的存儲改成用二維數組
  • Q2:對字符串這個總體,不知道該怎麼處理,開始想着是,讀到空格就結束,前面的字符構成一個數組,就是一個字符串放在一個數組中的意思
    後面發現根本不知道該怎麼表示,無從下手
  • A2:換一種思考方式,將字符串做爲一個數組元素存放,將字符串看作一個總體處理
  • Q3:冒泡交換兩個數的值時,定義一個指針放值,發現不行
  • A3:用函數strcpy,進行復制處理,同時將指針改成一個數組去存放相應的字符串

4.大做業

題目:實現小學四則運算,有3個難度級別,分別爲:指針

第一級是1位數的一步加減乘除計算
第二級是2位數的2步加減運算
第三級是3位數的2步加減運算
改進內容:code

4.1.改造函數介紹

1.構造字符數組存放算術表達式
算法分析blog

定義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,後來就一直放着,此次就很費勁,我不想重蹈覆轍,因而又對代碼進行修改,儘可能少點錯誤。
  • 大做業是一次一次相關聯的,儘可能作到最好吧,否則若是這個又作很差的話,那我後面的文件和課設豈不是一團糟了。。。
相關文章
相關標籤/搜索