1. 程式人生 > >C語言博客05--指針

C語言博客05--指針

r+ alt 截圖 null 語言 性能 else 質量 遞歸法

1.本章學習總結

1.1 思維導圖

技術分享圖片

1.2 本章學習體會及代碼量

1.2.1學習體會

              指針是C的靈魂,用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    //式子生成結束 
    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;
    }   
輸出tistr
  } 
  //結束函數
  • 代碼截圖
    技術分享圖片
    技術分享圖片
    技術分享圖片

4.2 與原有函數代碼比較

1.傳的參數少了;
2.處理除數更全面。

4.3 改進大作業總結

1.使用指針傳參數就不要return了,更何況有時候要返回幾個數。

C語言博客05--指針