本週學習了指針,都說指針是C語言的靈魂,也是C語言區別於其餘語言所獨特的地方,學好指針的相關內容十分必要,但同時難度也更大,須要付出更多的時間去理解和熟練掌握。學習到指針部分以後明顯感受有點吃力,雖然也和前面的知識結合緊密,可是須要對指針的概念搞得很清楚,否則就會把地址和該地址所存的內容搞混。而後指針上完以後老師又教告終構體和文件相關的內容,真的要認真學習多花時間才能徹底理解掌握。目前的本身以爲仍是一直半解,蠻吃力的。 在數據傳遞時,若是數據塊較大,這時就可使用指針傳遞地址而不是實際數據,即提升傳輸速度,又節省大量內存。 指針爲動態數據結構(如二叉樹、鏈表)提供支持
給定一句英語,要求你編寫程序,將句中全部單詞的順序顛倒輸出。
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; }
在函數那章,咱們已經實現小學四則運算這份做業,如今要求你們把以前設計函數升級改造,原來的函數你們都是用全局變量實現不一樣函數參數傳遞,此次做業要求改地址傳遞,減小全局變量的使用。
僞代碼 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; }
僞代碼 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
僞代碼 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; }
原來的main函數實在是太太太長了,這裏就不放上來了,整體就是不簡練,沒有分割不一樣功能的函數,而一味的都寫在main函數中算法
原來只有四個簡單的加減乘除函數,沒有其餘多餘的函數分裝數組
此次大做業主要就是增強了本身對於函數分裝還有指針的運用,剛開始的方法雖然定義了指針可是感受並無徹底用上,後來老師指導和參考同窗的之後修改了,算是真正有用上指針了,此次的主要感覺就是要增強本身在指針運用方法的練習,以及對於你想寫怎麼的程序有一個大體的規劃,這對於後續的函數分裝和程序的拓展性怎樣很是重要,而後就是,繼續加油吧~