可能由於以前數組那塊兒的做業拖得過久了,以致於我以爲指針學的好快,還沒反應過來就教完了,而後一開始作題的時候,就是一臉懵逼得狀態。而後前段時間也都在不數組的做業,指針也沒好好看看書,也就上課的時候聽聽老師講課,而後後面作題,一不會就去翻書,一來二去的雖然仍是不很明白指針到底怎麼回事,可是大概的題目也都會作了。而後如今我把指針跟結構體的題目集都刷完了,也該好好補補指針的知識點了。
PTA總分:110
反話-增強版 給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。
定義整型變量:i、j、k=0、count=0、length、temp 定義字符型指針:ch ch=(char *)malloc(500001*sizeof(ch));//經過malloc把較大的數組放到堆區,防止爆棧 輸入字符串ch 經過strlen函數獲得字符串ch的長度 temp=length-1 //解決末尾爲空格的狀況 while length-- do while ch[k]爲空格 do //解決前面有連續空格的狀況 k++ end while if length=0 且 ch[0]!=' ' then for j=0 to count do putchar(*(ch+j)) //輸出開頭不爲空格時的單詞 end for end if if ch[length] 不爲空格 then count++ else if ch[length]爲空格 且 ch[length+1]不爲空格 且 length不是字符串尾 then for i=1 to count do putchar(*(ch+length+i)) end for if length+1!=k then printf(" ") end if count=0 else if ch[length]爲空格 且 ch[length+1]爲空格 或者 ch[length]爲空格 then continue end if end while
在函數那章,咱們已經實現小學四則運算這份做業,如今要求你們把以前設計函數升級改造,原來的函數你們都是用全局變量實現不一樣函數參數傳遞,此次做業要求改地址傳遞,減小全局變量的使用。算法
題目有3個難度級別,分別爲:數組
**char CreateExp(char *exp,char level);**框架
定義整型變量num、op(獲取隨機數)、i,字符型數組str[10](用於整型轉字符型存放) srand(time(NULL)) //獲取隨機數種子 if level=='1' then i=3 //一級運算數及運算符的總和 while --i do if i爲偶數 then num=rand()%10; itoa(num,str,10)//將整型變量num轉化爲字符型變量存入數組str中 strcat(exp,str);//將str數組中的字符串接在exp數組後 else op=rand()%4; switch(op)//隨機獲取運算符,並接在數組exp後 case 0: strcat(exp,"+");;break; case 1: strcat(exp,"-");break case 2: strcat(exp,"*");break; case 3: strcat(exp,"/");break; end if end while else//當level爲2或3時 i=5 //二(三)級運算數及運算符的總和 while --i do if i爲偶數 then if level=='2' then num=rand()%100 else num=rand()%1000 end if itoa(num,str,10)//將整型變量num轉化爲字符型變量存入數組str中 strcat(exp,str);//將str數組中的字符串接在exp數組後 else op=rand()%4; switch(op)//隨機獲取運算符,並接在數組exp後 case 0: strcat(exp,"+");;break; case 1: strcat(exp,"-");break end if end while end if strcat(exp,"=")//將等號接在表達式後 if 表達式合法 then 輸出表達式 else 返回CreateExp(exp,level)函數,從新建立表達式 return *exp//返回指針*exp
char CreateExp(char *exp,char level)//構造字符數組存放算術表達式 { int num,i; int op; char str[10]; srand(time(NULL)); if(level=='1') { i=3;//運算數及運算符的總和 do { if(i%2) { num=rand()%10; itoa(num, str, 10); strcat(exp,str); } else { op=rand()%4; switch(op) { case 0: strcat(exp,"+");;break; case 1: strcat(exp,"-");break; case 2: strcat(exp,"*");break; case 3: strcat(exp,"/");break; } } }while(--i); } else { i=5;//運算數及運算符的總和 do { if(i%2) { if(level=='2') num=rand()%100; else num=rand()%1000; itoa(num, str, 10); strcat(exp,str); } else { op=rand()%2; switch(op) { case 0: strcat(exp,"+");break; case 1: strcat(exp,"-");break; } } }while(--i); } strcat(exp,"="); if(IsExp(exp,level))//判斷表達式是否合法 printf("\n\t\t\t\t%s",exp); else return CreateExp(exp,level);//表達式不合法時返回CreateExp(exp,level)函數,從新建立表達式 return *exp; }
**int IsExp(char *exp,char level);**函數
if 等級爲2、三級 then //二三等級不含除法,即不存在表達式不合法狀況 return 1; 定義整型變量m=0,sum=0,i=0、字符型變量c=exp[i],oldc='+' while c!='=' do c=exp[i] if c爲數字 then m=10*m+c-'0'//將字符型數字轉化爲整型數字 else if oldc=='+' then sum+=m else if oldc=='/' then if m==0 或者 sum%m!=0 then //不合法狀況,即除數爲零、不能整除 return 0 end if end if m=0//初始化 ,用於下一輪轉化整型變量 oldc=c end if i++ end while return 1
int IsExp(char *exp,char level)//表達式是否合法 { if(level=='2'||level=='3')//二三等級不含除法,即不存在表達式不合法狀況 return 1; int m=0, sum=0,i=0; char c, oldc='+'; do { c = exp[i]; if( c<='9'&&c>='0' ) m = 10*m + c - '0'; else { if( oldc == '+' ) sum += m; else if(oldc == '/') { if(m==0 || sum%m!=0)//不合法狀況,即除數爲零、不能整除 return 0; } m = 0; oldc = c; } i++; } while(c!='='); return 1; }
**int ComputeExp(char *exp);**學習
定義整型變量m=0,sum=0,i=0、字符型變量c=exp[i],oldc='+' while c!='=' do c=exp[i] if c爲數字 then m=10*m+c-'0'//將字符型數字轉化爲整型數字 else if oldc是+ then sum+=m else if oldc是- then sum-=m else if oldc是* then sum*=m else if oldc是/ then sum/=m end if m=0//初始化 oldc=c end if i++ end while return sum
int ComputeExp(char *exp)//表達式運算 { int m=0, sum=0,i=0; char c, oldc='+'; do { c = exp[i]; if( c<='9'&&c>='0' ) m = 10*m + c - '0';//將字符型數字轉化爲整型數字 else //計算表達式 { if( oldc == '+' ) sum += m; else if(oldc == '-') sum -= m; else if(oldc == '*') sum*=m; else if(oldc == '/') sum/=m; m = 0;//初始化 oldc = c; } i++; } while(c!='='); return sum; }
void NumberGet() { if(levelChoice=='1') { srand(time(NULL)); number1=rand()%10; number2=rand()%10; } else if(levelChoice=='2') { srand(time(NULL)); number1=rand()%100; number2=rand()%100; number3=rand()%100; } else { srand(time(NULL)); number1=rand()%1000; number2=rand()%1000; number3=rand()%1000; } } void OperatorGet() { if(levelChoice=='1') { srand(time(NULL)); operator_ch1=rand()%4; switch(operator_ch1) { case 0:ch1='+';break; case 1:ch1='-';break; case 2:ch1='*';break; case 3:ch1='/';break; } } else { srand(time(NULL)); operator_ch1=rand()%2; operator_ch2=rand()%2; switch(operator_ch1) { case 0:ch1='+';break; case 1:ch1='-';break; } switch(operator_ch2) { case 0:ch2='+';break; case 1:ch2='-';break; } } } //函數void GameBegin()中的一部分 if(levelChoice=='1') { NumberGet(); //獲取隨機數 OperatorGet(); //隨機獲取運算符 printf("%.0f %c %.0f = ",number1,ch1,number2); scanf("%lf",&yourAnswer); rightAnswer=Calculate(); if(yourAnswer==rightAnswer) { printf("\n\t\t\t\tGood job!^_^\n"); i++; } else { printf("\n\t\t\t\t回答錯誤!>_<\n"); printf("\n\t 正確答案是:%.0f %c %.0f = %.2lf\n",number1,ch1,number2,rightAnswer); j++; } } else { NumberGet(); //獲取隨機數 OperatorGet(); //隨機獲取運算符 printf("%.0f %c %.0f %c %.0f = ",number1,ch1,number2,ch2,number3); scanf("%lf",&yourAnswer); rightAnswer=Calculate(); if(yourAnswer==rightAnswer) { printf("\n\t\t\t\tGood job!\n"); i++; } else { printf("\n\t\t\t\t回答錯誤!>_<\n"); printf("\n\t\t\t\t正確答案是:%.0f %c %.0f %c %.0f = %.0lf\n",number1,ch1,number2,ch2,number3,rightAnswer); j++; } }
· 改造後的代碼(如上char CreateExp(char *exp,char level);函數)測試
1.原函數中,隨機數與隨機運算符的獲取分裝爲兩個函數,表達式的輸出也只是由一個簡單的printf()輸出 而改進後的代碼,將隨機數與隨機運算符的獲取再加上表達式的整合放在同一個函數中,使代碼更加簡潔 2.原代碼中,屢次調用隨機數和隨機運算符的獲取函數,在效率上拖慢了程序的運行,而改進後的代碼則不存在屢次重複調用的狀況出現
而後其他的函數基本都大同小異設計