C語言博客05--指針

1.本章學習總結

1.1 思惟導圖

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

1.2.1 學習體會

經過學習了指針,在函數使用時,能夠只傳地址,而不用像之前同樣,傳這個組,這樣能夠節省內存,又提升了傳輸效率。指針還可實現動態內存分配,避免形成內存浪費。經過函數改變一個變量的值,就得用指針傳遞。若是用普通變量傳遞,則沒法實現。
但初學指針,對指針的使用仍是不熟練。p是一個內存地址值,*p是地址p指向的內容。對p和*p的使用還比較模糊。p++便可實現指針指向數組的下一個元素,指針的使用仍是比較方便的。

1.2.2 代碼累計

2.PTA總分

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

2.2 個人總分

總分:110

3.PTA實驗做業

3.1PTA題目1

求子串在母串中最後一次出現的地址
給定程序中函數fun的功能是:求出在字符串中最後一次出現的子字符串的地址,經過函數值返回,在主函數中輸出今後地址開始的字符串;若未找到,則函數值爲NULL。

3.1.1 算法分析

char *fun (char *s, char *t )
定義 i,j,count=0;
char *str1,*str2,*a;
a=NULL;
while(*s)
     str1=s;      //把母串賦給str1數組
     str2=t;       //把子串賦給str2數組
     while(*str2)
     if  *str1==*str2  then    //判斷t指針所指的字符串是否和s所指字符串裏面的子串相同 
           str1++;str2++;
     end if
     else
      break;
     end while
     if  *str2=='\0'  then   //t指針所指的字符串在s指針所指的字符串中最後一次出現的地址 
          a=s;
     end if
     s++;       //縮小s數組的範圍 
end while
返回a

3.1.2 代碼截圖


3.1.3 PTA提交列表及說明

  • Q1:求出在字符串中最後一次出現的子字符串的地址
  • A1:先找兩個數組把子串和母串存起來,經過比較兩個字符串是否有一個相同的元素,如有,接着往下比較,如有部分元素不一樣則跳出循環,字符串s自增,縮小比較範圍,直到字符串str2到末端,把剩餘的s字符串的內容賦給a數組,返回a數組,重複操做直到s數組結束,便可獲得字符串中最後一次出現的子字符串的地址

4.大做業

題目:實現小學四則運算

4.1.改造函數介紹

1.函數1算法

定義 level //題目難度 
定義 result,answer;//答案、用戶回答 
定義題目數量n,i
char exp[3];   //存放運算符的數組 
定義 right=0,wrong=0;
輸入答題數量
for  i=1 to n  do       //輸出n道題目 
     輸出菜單
     輸入題目難度
     if level==0 then     //提早結束答題 
       break;
     end if 
     CreateExp(exp,level,&result); //調用生成運輸式的函數
     Judge(result,answer,&right,&wrong);
end for
出用戶答題的正確率


2.函數2數組

void CreateExp(char *exp,int level,int *result)    //造成三種不一樣的運算式 
定義 c,d;
定義 i,j=pow(10,level);
定義存放運算數的數組 figure[4];
srand((time(NULL))); 
if level>=2 then    //兩步運算和三步運算相似,就用同一種方法 
   level=2;
end if 
for i=0 to level do  //產生隨機運算數
    figure[i]=rand()%j;
    while(i>=1&&figure[i]==0)   //除法計算時避免除數爲0 
         figure[i]=rand()%j;
    end while
end for
switch(level)
   case 1:   //一位數的一步運算 
      c=rand()%4+1; 
       switch(c)
           case 1:
                 strcpy(exp,"+");
                 *result=figure[0]+figure[1];
                 printf("%d%s%d=\n",figure[0],exp,figure[1]);
           break;
           case 2:
                 strcpy(exp,"-");
                 *result=figure[0]-figure[1];
                 printf("%d%s%d=\n",figure[0],exp,figure[1]);
           break;
           case 3:
                 strcpy(exp,"*");
                 *result=figure[0]*figure[1]; 
                 printf("%d%s%d=\n",figure[0],exp,figure[1]);
           break;
           case 4:
                 strcpy(exp,"/"); 
                 *result=figure[0]/figure[1];
                 printf("%d%s%d=\n",figure[0],exp,figure[1]);
           break;
   break;
   case 2:    //兩、三位數的兩步運算
       d=rand()%4+1;
        switch(d)
            case 1:
                 strcpy(exp,"+");
                 *result=figure[0]+figure[1]+figure[2];
                  printf("%d%s%d%s%d=\n",figure[0],exp,figure[1],exp,figure[2]);
            break;
            case 2:
                  strcpy(exp,"-");
                  *result=figure[0]-figure[1]-figure[2];
                  printf("%d%s%d%s%d=\n",figure[0],exp,figure[1],exp,figure[2]);
            break;
            case 3:
                  strcpy(exp,"*");
                  *result=figure[0]*figure[1]*figure[2];
                  printf("%d%s%d%s%d=\n",figure[0],exp,figure[1],exp,figure[2]);
            break;
            case 4:
                   strcpy(exp,"/");
                   *result=figure[0]/figure[1]/figure[2];
                   printf("%d%s%d%s%d=\n",figure[0],exp,figure[1],exp,figure[2]);
            break;
   break;


3.函數3函數

void Judge(int result,int answer,int *right,int *wrong)     //用戶輸入並判斷用戶回答是否正確,統計正確、錯誤個數
    定義 c;
    srand((time(NULL))); 
    輸入用戶答案
    If  answer==result then        //若用戶回答正確,祝賀用戶
        (*right)++;
        c=rand()%4+1;
        switch語句隨機生成讚美用戶的提示語
    end if
    else                     //若用戶回答錯誤,給出正確答案
        (*wrong)++;
        c=rand()%4+1;
        switch語句隨機生成鼓勵用戶的提示語


4.3 與原有函數代碼比較

學習

代碼行數比原來少了不少,代碼看起來更簡潔了,實現的功能也比之前多了,此次有設置隨機的用戶答題提示語,對輸入答題數目和題目難度的選擇有進行了非法字符的處理,基本的功能有實現,但生成運算式的方法比較呆板,並且二步運算的運算式都是同樣的,沒有實現兩個運算式是隨機的。

4.4 改進大做業總結3d

此次大做業中,使用了指針來作,對指針有了更深的瞭解,也體會到了指針真的是個好東西,它實現了普通數組、變量所不具有的功能,方便了某些功能的實現,且使用指針後的代碼比原來簡潔多了,可讀性也大大加強了。本次做業中,剛開始把CreateExp這個函數裏的result變量設爲普通變量,後面發現須要把result的結果傳到Judge函數中與用戶的回答比較,判斷用戶回答是否正確時,就發現毛病了。後來就把result設爲指針,經過改變指針內容來把改變後的result傳回主函數中,再傳到Judge函數中。對right、wrong變量也採起一樣的作法。相比第一次大做業,是講right、wrong設爲全局變量。還有造成運算式時,本來想把整個式子都存到字符數組中,但好像行不通,後來參考了同窗代碼,把運算數和運算符分開,把運算數存到一維數組中,運算符存到字符數組,再分別輸出。
相關文章
相關標籤/搜索