經過學習了指針,在函數使用時,能夠只傳地址,而不用像之前同樣,傳這個組,這樣能夠節省內存,又提升了傳輸效率。指針還可實現動態內存分配,避免形成內存浪費。經過函數改變一個變量的值,就得用指針傳遞。若是用普通變量傳遞,則沒法實現。 但初學指針,對指針的使用仍是不熟練。p是一個內存地址值,*p是地址p指向的內容。對p和*p的使用還比較模糊。p++便可實現指針指向數組的下一個元素,指針的使用仍是比較方便的。
總分:110
求子串在母串中最後一次出現的地址 給定程序中函數fun的功能是:求出在字符串中最後一次出現的子字符串的地址,經過函數值返回,在主函數中輸出今後地址開始的字符串;若未找到,則函數值爲NULL。
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
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設爲全局變量。還有造成運算式時,本來想把整個式子都存到字符數組中,但好像行不通,後來參考了同窗代碼,把運算數和運算符分開,把運算數存到一維數組中,運算符存到字符數組,再分別輸出。