C語言博客做業05--指針

1.本章學習總結

1.1 思惟導圖



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

1.2.1 學習體會


  • 1. 老師說過指針的學習很重要,指針是C的靈魂,也給咱們演示了,的確c裏面不少都用到了指針,指針是C的靈魂說得很對啊。(⊙v⊙)。
  • 2.指針的學習感受難度很大了,由於抽象化了,不是再像數組或者函數與數學有些類似的那樣就能夠好理解些。指針跟咱們之前學習瞭解的數據類型不同,指針雖然也是一種數據類型,只不過是專門存放地址的數據類型。
  • 3. 指針的算術運算對於理解指針的理解也是頗有幫助的,由於也算是符合它「指」的特色,指針的加法運算便是指針當前所指的位置再移動n個單元,而且結果仍是個指針。兩個指針不能進行加法運算,這是非法操做,由於進行加法後,獲得的結果指向一個不知所向的地方,並且毫無心義。兩個指針能夠進行減法操做,但必須類型相同。
  • 4.指針的運用仍是很方便的,特別是在函數上面,原本在學習和使用函數的時候就有一些比較不方便的地方:函數只能返回一個值,並且還有想要經過形參改變實參也是比較麻煩的。學習了指針之後,能夠經過直接改變指針的所指對象的內容來解決函數只返回一個值的問題。並且一個函數若是使用了指針做爲形參,要保證行參和實參類型一致,不然須要強制轉換。︿( ̄︶ ̄)︿ ( ̄︶ ̄)︿( ̄︶ ̄)︿
  • 5.後來老師又教會咱們各類有關於動態分配內存有關的函數,動態存儲分配函數mallo(),動態存儲分配函數calloc(),動態存儲釋放函數free(),動態存儲分配函數須要本身慢慢理解,這些須要很好的思惟,由於抽象化仍是不少的,要本身去想象,並且要考慮到不少地方,最後還要釋放動態分配的空間

1.2.2 代碼累計

2.PTA總分

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



2.2 個人總分:

總分:110

3.PTA實驗做業

3.1 PTA題目1

7-2 說反話-增強版 :
給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。

輸入格式:
測試輸入包含一個測試用例,在一行內給出總長度不超過500 000的字符串。字符串由若干單詞和若干空格組成,其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用若干個空格分開。

3.1.1 算法分析

定義i,j,k爲循環變量,num1爲爲計算字符中空格的數目 ,num爲計算字符的長度
定義a數組爲要求輸入的數組 ,b爲倒序輸出
num=strlen(a);    //計算總共有多少字符
if num等於1 then
輸出這個字符
返回0
end if
for i=0 to a[i]  do
     if a[i]等於' ' num1++  // 計算空格數目
if  num1等於num then//全是空格的數組
    返回0 
end if
for i=num-1 to 0 do
    if a[i]不等於' ' then
       b[j++]=a[i]   //將a數組反着輸入到b中
    end if
    else
      if a[i-1]等於' ' then  //若是下一個仍是空格則繼續循環 
         continue
      end if
      if num1等於1 then   //解決一個單詞後面一個一個空格
         continue
      for k=j-1 to 0 do  //輸出
         倒序輸出b數組
      end for
     j=0
end for
if i==-1
   for k=j-1 to 0 do  
         倒序輸出b數組
      end for

3.1.2 代碼截圖

3.1.3 PTA提交列表及說明


Q1:一開始各類錯誤,有超時啊,有格式錯誤啊,有答案錯誤。。。
A1:才發現我把循環的位置弄錯了,把循環包括的範圍直接連最後的輸出也包括進去了
Q2:最後輸出的時候仍是錯了。。。全是格式錯誤,並且改了特別久都是格式錯誤。。。
A2:再定義了個變量num1,經過num1計算空格有多少就能夠來分別控制到底該怎麼輸出了,經過判斷num1與num的關係來看是否全是空格
Q2:最後一個測試點一直過不去:是不是一個單詞後面接一個空格這種狀況,調了好多種辦法,試過再新增一個變量還有其餘方法
A3:最後仍是用了num1的做用,若是num1等於1,證實只出現一個空格並且仍是在末尾部分

4.大做業

4.1.改造函數介紹

函數1構造字符數組存放算數表達式而且還包含了對於不合法或者超出該級別小學生學習範圍的表達式的處理;函數3計算出表達式的結果並將結果返回

1.函數1:構造字符數組存放算術表達式及整除狀況


算法分析:(對於計時函數等就不介紹了)
void CreateExp(char *exp,int level,int number)
定義字符數組Ch爲[-,+,*,/]
定義Flag爲判斷可否整除 
定義answer爲讀者輸入的答案,i爲循環變量初值爲1, flag爲是否繼續學習,result正確結果,count爲題目數量
for i=1 to number  do
     switch level do
                case 1 do exp[0]=rand()%10+'0'  exp[1]=Ch[rand()%4]  exp[2]=rand()%9+'1'
                                 if exp[1]等於'/' then  //當爲除法運算時候,要給小學生考慮下給它能夠整除的狀況
                                              Flag=(exp[0]-'0')%(exp[2]-'0') //判斷能不能整除的狀況 
                                              while(Flag不等於0)do  //不能整除的時候
                                                        exp[2]=rand()%9+'1'
                                Flag=(exp[0]-'0')%(exp[2]-'0')
                                              end while
                                 end if
                  break
                 case 2 do exp[0]=Rand(2)  exp[1]=Rand(1) exp[2]=Ch[rand()%4] ......exp[8]='\0' //參照等級一,把等級二的7位字符分別存進字符數組exp中 
                 break
         case 3    do       exp[0]=Rand(2) exp[1]=Rand(1) exp[2]=Rand(1) exp[3]=Ch[rand()%4] ......exp[11]='\0'  //參照等級一,把等級二的10位字符分別存進字符數組exp中 
         break
改進這段代碼是真的痛苦啊。。。改特別久絕望的啊,一直以爲語法沒錯,但是就是隨機數這裏一直錯誤,我一開始把隨機計算運算符號的也弄一個函數,後來好像就由於這樣,致使隨機數輸出的時候出錯了,還有各類死循環,狀況見下圖

函數1慘不忍睹的錯誤:

隨機數一點都不隨機。。。





萬惡的不知道怎麼的就死循環了。。。算法

2.函數2

在函數1中就包括有函數2的要求內容,因此在這裏就不介紹了


(PS:我將exp[2]的值直接不包含0這樣子就能夠不用擔憂除數爲0的狀況了)數組

3.函數3:表達式運算

算法分析:
定義字符ch爲存放計算符號
定義循環變量I,result爲計算結果,sum爲每位數,flag爲控制變量
for i=0 to exp[i] do
     if   exp[i]>='0'&&exp[i]<='9'   //將不是運算符號的字符一個個變成數字 then
           sum=sum*10+exp[i]-'0'   //將每個字符除了運算符號外轉化爲數字存在sum裏
           if   level==1&&i==2||level==2&&i==7||level==3&&i==10  //當將最後一個運算符號存給ch時候下一循環是不會在進入到計算循環裏面的 
                    switch(ch)  //判斷最後一個運算符號是什麼 ,而且計算出最後結果  
                     case '+': result+=sum break
                     case '-': result-=sum break
                     case '*': result*=sum break
                     case '/': result/=sum  break
                         end switch
            end if
    end if
    else
            if flag等於0  then   //當遇到第一個運算符號時候,再將計算符號存到ch中 
                result=result+sum
        flag++
        ch=exp[i]
        sum=0
        continue
           end if
           else
                 switch ch   //計算結果             
               case '+': result+=sum break
               case '-': result-=sum break
               case '*': result*=sum break
               case '/': result/=sum break
                   end switch
            ch=exp[i];
            sum=0;
            end else
end for
return result

4.3 與原有函數代碼比較

函數1與原有函數代碼比較

原有函數的截圖(特別長只截取了難度爲1級的代碼其他兩個等級也是差很少的)

函數

  • 1. 首先最直觀的一點就是代碼量少了不少,真的少了特別特別多,直接就是百行沒了,並且感受改進後的代碼看起來比較牛了,這樣子調用感受就是會比較高大上的感受吧,並且原本還設置了好多個變量,來放置各個隨機數的值,這樣子也使得代碼看起來很冗長繁瑣。
  • 2.沒改進前的代碼在一個函數中有不少種功能有創造計算式、還有判斷除數爲不爲0狀況、判斷答案正確與否,還有計算功能,不少功能,也使得這個函數看起來很雜亂,並且也有不少重複的功能感受應該能夠再放在一個函數中
  • 3.這一次還有個新的亮點就是隨機數時直接使用rand()%9+1,這樣就不會獲得除數爲0的狀況也就能夠不用再去判斷除數是否爲0的狀況,沒改進前爲了這個除數不能爲0狀況實在是寫得很長,還有這回考慮到了小學生除法最好是能夠整除的狀況。。。

函數3與原有函數代碼比較

原有函數的截圖

學習

  • 1. 改進前的代碼實在是很麻煩啊,每一個等級的難度,我都各自設了一個對應的函數來計算他們的結果,這樣子就很麻煩了,代碼也很長,並且功能實際上是重複了已經,可是那時候也想過改進,可無從下手,這回有老師的代碼能夠參考,這樣子就把這一部分的不少代碼量都給省掉了
  • 2.改造後的代碼也不用判斷是一級難度仍是二三級難度了,直接用一個計算函數就解決了,將這些具備相同功能的代碼給弄進了一個函數裏面,並且特別是這個新函數代碼的可讀性更好了,巧妙的將字符轉化爲數字再累計還有對運算符號的判斷,整個代碼看起來更牛逼了

4.4 改進大做業總結

1. 二級三級的難度乘除法中一開始改寫改着。。。隨機數全都不隨機了。。。三個數中必定有兩個數是相同,改了特別久,原本是將隨機數的出現放在一個函數中,運算符號也放在一個函數中,後來我參考了秋斌的代碼還有一隻調試,才發現是*exp[+(i++)]錯誤了,我就直接用數組方法和將計算符號的函數去掉不用函數了,這樣才解決了

 2.我一開始在書寫計算函數的時候也是參照老師所給的代碼寫的,寫着在和本身原本的代碼進行對比,而後。。。新代碼最後算出來的result是一個數的值,這就絕了啊,最後仍是給寫出來了。。。改了好久的代碼。。。真的好久

 3.經過指針改進代碼仍是用得少不習慣不熟悉,仍是許多不懂,有時候寫完一段一編譯各類編譯錯誤,函數的封裝仍是很重要的,各類銜接都很關鍵,若是用得好能夠減小不少工做量,代碼看起來也會很精簡

 4.不少功能若是同樣的話能夠再把它封裝一下,在以前也有這個想法,但是一直沒實現由於函數傳遞參數的緣由致使要改得面目全非。如今學了指針能夠直接經過改內容就能夠將各類功能封裝成一個函數

 5.大做業仍是有些bug沒能處理,就是要判斷整除的方法,我是經過Flag這個變量來判斷是否能夠整除,但是這樣耗時就有點久了,有時候devc直接卡住了

 6.做業不能再拖了…不能再拖下去拖到最後一天才寫了,根本沒時間去改大做業啊,好不容易改了也是不少bug…之後不能再將做業拖着了……
相關文章
相關標籤/搜索