可能由於這兩週進度的加快,感到比較吃力,知識點比較抽象,不那麼容易理解,也可能最近由於被準備考試,寫論文等事情追趕着,對C語言、PTA這方面有所懈怠(個人錯。。。T_T)。總之,在指針方面還存在不少不足,有的知識點沒有及時掌握,還要課後花時間看課本,對一些用法或者須要注意的地方還不夠熟悉,但願經過以後的時間能夠抓緊時間,掌握不熟練或者遺漏的知識點,多加練習,掌握這方面的知識。算法
125分數組
給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。函數
定義 i,統計count=0; 定義 字符數組s[500001],指針*p; gets(s); //輸入英語 i=strlen(s)-1;//取字符串長度 for i=strlen(s)-1 to 0 do if s[i]==' ' then if s[i+1]!=' '&&s[i+1]!='\0' //出現單詞 p=s+i+1; count++; if count>1 then printf(" ");//控制輸出最後一個單詞沒有空格 printf("%s",p); end if s[i]='\0'; end if else if i==0&&s[i]!=' ' then//單獨判斷最後一個 p=s; if count>=1 then printf(" "); end if printf("%s",p); end end for
-Q1:剛開始在輸出方面沒有什麼思路
-A1:後來去請教了同窗
-Q2:一開始沒有發現最後單詞沒有空格
-A2:經過count控制學習
函數CreateExp(char *exp,int level) 定義整型變量 題量number,答題次數times,統計count=0;item,temp; 定義整型變量 i,j,符號sign,數字個數k,位數m,運算符種類n,a; static char str[100],ch[5]; static char yourAnswer[10];//定義字符數組 字符str[100],運算符ch[5],yourAnswer[10]並初始化 static int num[5];//定義整型數組 數字num[5]並初始化 提示並輸入題量; for i=1 to number do memset(exp,0,100*sizeof(char));//每次輸出後將存放表達式的指針的內容清空 if level=1 then k=2;m=9;n=4;a=1;break; else if level=2 then k=3;m=90;n=2;a=10;break; else if level=2 then k=3;m=900;n=2;a=100;break;//根據級別,賦予對應的參數 num[0]=level;//將存放數字的數組的首位存放級別 for j=1 to k do num[j]=rand()%m+a;//生成隨機數字 for j=1 to k-1 do sign=rand()%n+1; switch(sign) case 1:ch[j]='+';break; case 2:ch[j]='-';break; case 3:ch[j]='*';break; case 4:ch[j]='/';break; //隨機生成運算符,並儲存在數組中; Select(num,ch);//判斷數字是否知足條件 for j=1 to (k*4) do if j==1 or j==5 or j==9 then itoa(num[temp],str,10);//將數字轉換爲字符 temp++; else if j==3 or (j==7 and level!=1) then *str=ch[j/3]; else if j==(k*4)-1 then *str='='; else *str=' '; strcat(exp,str); memset(str,0,100*sizeof(char));//清空 *str 輸出算式,並提醒用戶輸入答案; count=Check(num,yourAnswer,ch);//調用函數校對答案 詢問是否中途退出; Rate(count,times)*100);//調用函數計算正確率
我使用了memset函數來清空指針裏的內容
void memset(void s, int ch, size_t n);頭文件在<string.h>中,將s中當前位置後面的n個字節 (typedef unsigned int size_t )用 ch 替換並返回 s3d
函數Select(int *num,char *ch) 定義整型變量 change,result; if num[1]<num[2] and ch[1]=='-' 經過變量change將二者進行交換//使1位數運算結果爲正數 if ch[1]=='/' then while num[1]%num[2]!=0 從新生成兩個運算數//將除法定義爲整除運算 if num[0]!=1 then 計算前兩個數字運算結果 while result<num[3] if ch[2]=='+' then break; switch(num[0]) case 2: num[3]=rand()%90+10;break; case 3: num[3]=rand()%900+100;break;// 使2位數和3位數運算結果爲正數
關於這個函數,由於考慮到除數不能爲0,及一位數運算數據中出現0的無心義性,因此只隨機產生1~9;
考慮到小學運算不涉及有關負數運算及除法不整除的狀況,因此增長了些條件進行判斷;指針
函數Check(int *num,char *yourAnswer,char *ch,int count)//計算正確率 定義整型變量 答案answer; static char str[10];//定義字符串str並初始化 switch(ch[1]) 根據符號進行計算; switch(ch[2]) 根據符號進行計算; default: break;//若只有1步計算則break itoa(answer,str,10);//將正確答案轉爲字符; if strcmp(str,yourAnswer)==0 then 輸出答案正確 count++; else 提示答案錯誤並輸出正確答案 return count;
由於以前篩選環節比較特殊,因此定義存放數字和運算符的兩個數組,因此在判斷正誤函數,直接經過傳遞兩個數組的地址來計算正確答案code
由於改造後函數一、2的功能在改造前函數是封裝在3個函數中,因此就一塊兒比較blog
改造前的函數一、2
字符串
改造後的函數一、2
get
不一樣:
1.函數封裝的不一樣,改造前將級別一、級別2&3和符號生成的函數是依次分開,而改造後的是封裝成生成運算式和判斷運算式是否合理兩個函數;
2.在生成運算式這一塊,是定義多個變量,每一個變量對應一個值,而改造後是存放在數組中
優勢:
1.改造前將級別一、級別2&3是分開的,許多語句是重複的,不利於閱讀,改造後將一些重複的語句刪除;
2.經過指針,取消了全局變量
缺點:
改造後將以前的幾個函數功能封裝在一塊兒,語句可能過於複雜
改造前的函數3
改造後的函數3
不一樣:
1.改造後傳遞的輸入答案爲字符串;
2.改造後經過傳遞數組計算正確答案
優勢:
1.改造後傳遞的輸入答案爲字符串,完善了以前輸入字符串時程序會直接結束的bug
第二次進行改良的時候明顯就困難多了,不只要進一步完善程序,並且還要運用新的知識,修改的時候可能由於新知識掌握的不夠熟練,仍是練習的不夠,顯得有些慌亂。不只要修改以前隱藏的bug,還要解決修改過程當中出現的新的問題,並且還要面臨從新封裝函數或者從新構造函數的問題,因此我的認爲改代碼要比從頭開始寫代碼可貴多。但好在其餘同窗的幫助下,完成了此次修改,但我的認爲還須要多多練習,提升打代碼時的熟練度。