C語言博客05--指針

1.本章學習總結

1.1 思惟導圖

1.2 本章學習體會及代碼量

1.2.1學習體會

指針是C的靈魂
1.沒學指針以前用數組比較多,調用函數時直接把整個數組傳過去,可是這樣對性能影響比較大,學了指針直接傳地址就能夠了。
2.指針還能夠實現子函數返回多個值;還能夠利用指針能夠實現動態內存分配。
3.指針直接對內存操做 ,效率高,指針還用於表示和實現各類複雜的結構,從而爲編寫出更加高質量的程序奠基基礎。
4.可是指針編寫的程序也更容易隱含各式各樣的錯誤,一不當心就有可能引發程序崩潰。

1.2.2 代碼累計

2.PTA總分

2.1截圖 PTA中的排名得分

2.2 個人總分:

PTA總分:110 分

3.PTA實驗做業

3.1 PTA題目1

給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。
輸入格式:
測試輸入包含一個測試用例,在一行內給出總長度不超過500 000的字符串。字符串由若干單詞和若干空格組成,
其中單詞是由英文字母(大小寫有區分)組成的字符串,單詞之間用若干個空格分開。
輸出格式:
每一個測試用例的輸出佔一行,輸出倒序後的句子,而且保證單詞間只有1個空格。
輸入樣例:
Hello World Here I Come
輸出樣例:
Come I Here World Hello算法

3.1.1算法分析(遞歸法)

void strput(char *str)   定義輸出函數 
  定義靜態變量flag=0        
  定義字符指針temp = strchr(str,' ') //尋找空格地址 
  if  temp 等於 NULL then 
         if strlen(str)不爲0  then   //str長度爲零不輸出 
            flag=1;                //若是字符串長度不爲零 flag=1 
            輸出str
     end if 
  else
      strput(temp + 1)     //遞歸 
      *temp = '\0'         //把空格改成\0 
      if strlen(str)不爲0而且flag等於1  then     //若是字符串爲0不輸出 並根據flag的值選輸出方式 
          輸出" str"
      else
          輸出str
      end if 
end if

主函數
  定義字符數組 str[500011]
  gets(str) //讀取字符數組 
  strput(str) //調用輸出函數

3.1.2 代碼截圖

3.1.3 PTA提交列表及說明

  • 開始用二維數組結果內存太大最後一個點過不了,後來改成遞歸
  • 剛開始沒有這個語句「if strlen(str)不爲0 then //str長度爲零不輸出 」致使

4.大做業

4.1函數算法分析(二合一)

聲明全局變量 n   //n與難度有關
   void CreateExp(int *result)  
   {
    srand(time(NULL))     //隨機種子 
    int ret //中轉變量 
    char tistr[40]={0}   //放式子 
    int num1,num2,num3   //放隨機數 
    char ch1,ch2        //放運算符 
    隨機數num1生成       //第一個數 
    itoa(num1, tistr, 10)//把num1接到tistr 
    運算符生成ret 
    switch(ret)     
    {
    case 0:ch1='+';break;      
    case 1:ch1='-';break;       
    case 2:ch1='*';
    if(n==1000)  ch1='+'; //爲了給小學生減小壓力,第三級沒有乘除 
    break;
    case 3:ch1='/';
    if(n==1000)  ch1='-'; //爲了給小學生減小壓力,第三級沒有乘除 
    break;
    }
    tistr[strlen(tistr)]=ch1;   //放運算符 
    do
    {
        num2=rand()%n;   //第二個數   
        if(num2!=0&&ch1=='/'&&num1!=0)    //對除法作處理 (至關於第二個函數)
        {
        if(((num1%num2)!=0||num1<num2))
        {
            num2=0;
        }
        }
    } while(num2==0);
    而後重複生成 
    *(tistr+strlen(tistr))='='
    *(tistr+strlen(tistr))=0    //式子生成結束 
       輸出tistr
  } 
  //結束函數
  • 代碼截圖


4.2函數算法分析

void ComputeExp(char *tistr,int *result)
{
    定義整型  num[3]={0}   j=0     i
    定義字符     ch1   ch2  
    for     i=0    直到  tistr[i] 等於 '='     i++     //把放運算式子的字符串解開
    {
        if    tistr[i]>='0'&&tistr[i]<='9'  then

            num[j]=tistr[i]-'0'+num[j]*10     //數字放到num數組

        else    then
    
        if(j==0) ch1=tistr[i];    //運算符放到  ch1  ,ch2
        if(j==1) ch2=tistr[i]; 
        j++;    
        end  if 
    }
        end for
 switch(ch1)       //對運算符進行判斷
    {
        case '+':*result=num1+num2;break;    //進行對應的計算
        case '-':*result=num1-num2;break;
        case '*':*result=num1*num2;break;
        case '/':*result=num1/num2;break;
    }
    switch(ch2)             //解決優先級問題 (枚舉) 
        {
        case '+':*result=*result+num3;break;    
        case '-':*result=*result-num3;break;
        case '*':
        if(ch1=='+') *result=num1+num2*num3;
        if(ch1=='-') *result=num1-num2*num3;
        if(ch1=='*') *result=*result*num3;
        if(ch1=='/') *result=*result*num3;break;    //若是第一步是加或減,第二步的乘或除要先算
        case '/':
        if(ch1=='+') *result=num1+num2/num3;
        if(ch1=='-') *result=num1-num2/num3;
        if(ch1=='*') *result=*result/num3;
        if(ch1=='/') *result=*result/num3;
        break;
        }
  • 代碼截圖

4.2 與原有函數代碼比較

1.傳的參數少了不用返回值;
2.處理除數更全面。
3.以前都是一個函數,封裝以後更加容易理解,整個結構更加靈活。

4.3 改進大做業總結

1.包裝後各個函數的干擾減小,代碼結構也更加清晰,移值性強。
2.經過找百度學會了用箭頭來選擇,佈局也更加協調。
3.以前我是不怎麼細分函數的,就是以爲比較方便,寫起來也快,而後聽取老師建議分裝,而後發現分裝好的函數沒有以前這麼繞,什麼函數什麼功能一目瞭然,對於寫代碼的人,找錯只需盯一小函數,而不是一片代碼,還要一條條理清楚,對於讀代碼的人,就是不用本身推理代碼的功能,一個函數一個功能,條理清晰。(很差的習慣儘可能糾正,畢竟一個大項目不可能一我的完成,團隊合做對代碼的分裝要求就比較高了)
* 最後上幾個截圖





相關文章
相關標籤/搜索