C語言博客05--指針

1.本章學習總結(2分)

1.1 思惟導圖

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

1.2.1 學習體會

本週學習了指針,都說指針是C語言的靈魂,也是C語言區別於其餘語言所獨特的地方,學好指針的相關內容十分必要,但同時難度也更大,須要付出更多的時間去理解和熟練掌握。學習到指針部分以後明顯感受有點吃力,雖然也和前面的知識結合緊密,可是須要對指針的概念搞得很清楚,否則就會把地址和該地址所存的內容搞混。而後指針上完以後老師又教告終構體和文件相關的內容,真的要認真學習多花時間才能徹底理解掌握。目前的本身以爲仍是一直半解,蠻吃力的。
在數據傳遞時,若是數據塊較大,這時就可使用指針傳遞地址而不是實際數據,即提升傳輸速度,又節省大量內存。
指針爲動態數據結構(如二叉樹、鏈表)提供支持

1.2.2 代碼累計

2.PTA總分(2分)

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

3.PTA實驗做業(1分)

3.1 PTA題目1

給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。

33.1.1 算法分析

int main()
{
定義字符數組 str[500010];
輸入gets(str);
定義長度變量len;
len=strlen(str);
定義i,j,count=0;
定義flag=0;
for i=len-1 to i>=0 do
    if  str[i]!=' '  then
    count++;//計算字符數  
    end if
    else if str[i]==' '&&count!=0  then
        for  j=i+1 to str[j]!=' '&&str[j]!=0  do
        輸出字符
        end for
        for  j=i  to  j>=0  do
    if  str[j]!=' ' then
    break;
        end if
    if  j==0  then
    flag=1; 
    end if//遍歷後面是否還有字符 
    if  flag==0  then
    輸出空格
    count=0; 
    end if
        end  for
end  for
for i=0  to i<count&&str[i]!=' '  do
輸出字符//因爲最後一個單詞末尾可能沒有空格,因此單獨考慮
    
    return 0;
 }

3.1.2 代碼截圖

3.1.4 PTA提交列表及說明

  • Q1:開始有一個測試點最小值,前面有空格過不去
  • A1:後來發現若第一個單詞後面有空格,輸出也會帶空格,出現格式錯誤,因此定義一個flag,並判斷後面是否還有字符,如有字符則輸出一個空格,沒有字符即到了最後一個單詞的輸出,就不輸出空格
  • Q2:
  • A2:其實開始時的代碼寫的比較複雜,而後最後一個測試點一直過不去,也沒有找出解決辦法,多是輸出出了問題?

4.大做業(5分)

題目:實現小學四則運算。

在函數那章,咱們已經實現小學四則運算這份做業,如今要求你們把以前設計函數升級改造,原來的函數你們都是用全局變量實現不一樣函數參數傳遞,此次做業要求改地址傳遞,減小全局變量的使用。

4.1.改造函數介紹

1.函數1

僞代碼
int main()
{
    定義字符數組 exp[100]={0}; 
    定義整型變量 level,amount,right;
    定義浮點型變量 accuracy;
    定義整型變量 youranswer=0,myanswer=0;
    輸出menu---------------------------簡單四則運算訓練系統------------------------------\n                   歡迎進入訓練\n 
    等級1:1位數的一步加減乘除計算訓練\n等級2:2位數的2步加減運算\n等級3:3位數的2步加減運算\n請選擇等級:             
    輸入level
    while level!=1&&level!=2&&level!=3  
        fflush(stdin);//輸入非法字符時清除緩衝區數據從新輸入
            輸出 輸入錯誤,請從新輸入\n
        輸入level 
                end while   
    輸入  請輸入題目數量:   
               while  !scanf("%d",&amount)  //判斷是否輸入非法字符
    fflush(stdin);
        輸出 輸入錯誤,請從新輸入\n
                end while
               定義整型變量 n;
               定義 flag=0;
               for  n=0  to  n<amount&&flag==0  do
        CreateExp(exp,level);  //建造題目
        輸入 youranswer 
        myanswer=Answer(exp,level);
        Judge(youranswer,myanswer);
        輸出  輸入0繼續,若退出輸入1:
        輸入 flag 
        while  flag!=0&&flag!=1
        fflush(stdin);
        輸出  輸入錯誤,請從新輸入
        輸入 flag 
        end while
        if  flag==1 then  break;
    end for     
    right=Judge(youranswer,myanswer);
    accuracy=right*1.0/amount;
    輸出   正確率爲%.2lf",accuracy
    return 0;
}


2.函數2

僞代碼
void CreateExp(char *exp,int level)                                                                  
{ 
    srand(time(NULL)); 
    定義整型變量 x,y,z;
    定義整型變量 ch1,ch2;
    if  level==1 then
    ch1=rand()%4;
    else
    ch1=rand()%2;
    ch2=rand()%2;
    end if//生成運算符 
    switch(level)
    {
        case 1:
            x=rand()%10;y=rand()%10;
    itoa(x,exp,10); 將變量x的數據類型轉爲字符型
    switch(ch1)
        case 0:strcat(exp,"+");break;
        case 1:strcat(exp,"-");break;
        case 2:strcat(exp,"*");break;
        case 3:strcat(exp,"/");break;
                end switch
     strcat(exp,itoa(y,exp+3,10));
    break;//一級
       case 2:
    x=rand()%100;y=rand()%100;z=rand()%100;
    itoa(x,exp,10);
    switch(ch1)
        case 0:strcat(exp,"+");break;
        case 1:strcat(exp,"-");break;
                 end switch
     strcat(exp,itoa(y,exp+4,10));
     switch(ch2)
        case 0:strcat(exp,"+");break;
        case 1:strcat(exp,"-");break;
                end switch
    strcat(exp,itoa(z,exp+7,10));
     break;//二級 
       case 3:
    x=rand()%1000;y=rand()%1000;z=rand()%1000;
    itoa(x,exp,10);
    switch(ch1)
        case 0:strcat(exp,"+");break;
        case 1:strcat(exp,"-");break;
                 end switch
     strcat(exp,itoa(y,exp+5,10));
     switch(ch2)
        case 0:strcat(exp,"+");break;
        case 1:strcat(exp,"-");break;
                end switch
    strcat(exp,itoa(z,exp+9,10));   
    break;  //三級      
end  switch
    strcat(exp,"=");
    puts(exp); 
//生成exp


構建表達式函數經老師指點後修改

  • 這樣明顯簡便不少,以前的方法一直調用函數strcat和itoa函數,代碼質量不高,效率很低

3.函數3

僞代碼
int Answer(char *exp,int level)
{
    定義整型變量 answer;
    answer=*exp-'0';//將字符型轉爲整型
    定義i;
    for i=0  to  *(exp+i)!=0
        if  *(exp+i)=='+'||*(exp+i)=='-'||*(exp+i)=='*'||*(exp+i)=='/'  then
            switch(*(exp+i))
                case '+':answer=add(answer,*(exp+i+1)-'0');break;
                case '-':answer=sub(answer,*(exp+i+1-'0'));break;
                case '*':answer=mul(answer,*(exp+i+1)-'0');break;
                case '/':answer=divide(answer,*(exp+i+1)-'0');break;
            end switch  
        end if
                end for 
    return answer;
int Judge(int youranswer,int myanswer)
{
    定義整型變量 right=0;
    if  youranswer==myanswer  then
        printf("答案正確!\n");
        right++;
    else
                   printf("答案錯誤,正確答案爲%d\n",myanswer);
    end if
    return right;
}

4.3 與原有函數代碼比較

函數1

原函數

原來的main函數實在是太太太長了,這裏就不放上來了,整體就是不簡練,沒有分割不一樣功能的函數,而一味的都寫在main函數中算法

函數2


原來只有四個簡單的加減乘除函數,沒有其餘多餘的函數分裝數組

  • 不一樣: 原來的main函數中內容太多了,看起來有點亂,須要花費更多時間去分割每部分語句的功能,改造後main函數中只保留了主菜單部分,而且寫了構建表達式,計算答案,判斷正誤三個函數。
  • 優勢:main函數中沒有太多的語句,只有主要功能的語句,這樣程序看起來思路清晰不少。使用多個函數將功能分開,大大增強了程序的拓展性,對於之後對程序的進一步修改和增長功能很是有幫助。
  • 缺點:功能還有待完善,對於非法字符的處理可能也還有其餘更好的方法。

4.4 改進大做業總結:

此次大做業主要就是增強了本身對於函數分裝還有指針的運用,剛開始的方法雖然定義了指針可是感受並無徹底用上,後來老師指導和參考同窗的之後修改了,算是真正有用上指針了,此次的主要感覺就是要增強本身在指針運用方法的練習,以及對於你想寫怎麼的程序有一個大體的規劃,這對於後續的函數分裝和程序的拓展性怎樣很是重要,而後就是,繼續加油吧~
相關文章
相關標籤/搜索