C語言——小學四年級題目解析(二)
- 2019 年 11 月 6 日
- 筆記
這是奔跑的鍵盤俠的第148篇文章
作者|我是奔跑的鍵盤俠
來源|奔跑的鍵盤俠(ID:runningkeyboardhero)
轉載請聯繫授權(微信ID:ctwott)
搬磚繼續……
年級只是代表題型,難度不做區分。規則:
一年級:選擇題;
二年級:填空題;
三年級:閱讀題;
四年級: 編程題。
第2題

乍一看,就是一道小學數學題,一個經典的解題思路:吹個口哨,所有的小動物抬起2隻腳,總共會抬起92*2=184隻腳,剩下358-184=174隻腳,雞兩隻腳都抬起來就起飛了,所以這174隻腳都是兔紙的,兔紙數量=174/2=87隻,雞的數量92-87=5隻

後來有了x,y和方程式。這就成了一道初中的方程求解題目。
x+y=92
2x+4y=358
easy!
再後來,學了C語言,又成了一道費解的編程題,內牛滿面

對電腦來講,他不會吹口哨讓小動物抬腳,直接擺2個方程求解更是不會。
你必須要告訴它演算法,而它才會按部就班的給你答案。
網上搜羅一下,真有人直接x=(358-2*92)/2列出來,我竟無言以對。
這道題目顯然是要考察循環結構的應用,如while,for等都可以。
最傻瓜式的演算法,可以2層for循環,x,y均從0開始循環至92,然後同時滿足上面的2個方程式,就是答案了。需要加個標誌,方程式成立時,2次break跳出循環。
稍微簡化一下,用一層循環,只循環x,從0開始循環至92,那y=92-x,只須滿足2x+4y=358即可,1次break直接結束。
程式碼如下:
#include <stdio.h> int main() { int x,y;/*x代表雞的數量,y代表兔的數量*/ for(x=0;x<=92;x++){ y=92-x; if(4*y + 2*x ==358){ printf("雞的數量是%d只,兔的數量是%d只。n",x,y); break; } } if(x==93){ printf("No answer!"); } return 0; } ==========編譯成功後開始運行==========
"C:Users2019_943_37.exe"
Process started (PID=3680) >>>
雞的數量是5隻,兔的數量是87隻。
<<< Process finished (PID=3680). (Exit code 0)
================ READY ================
末尾又加了一個x==93的判斷,也就是x循環到92依舊沒有答案、無解時,會提示No answer! 這道題顯然是有答案的,所以這道題目有沒這句話無影響。但是作為編程習慣的養成,建議要增加一些邊界的設計邏輯。
第3題

這道題讓初學C語言的我感覺到了一絲壓力,構造整形數組?按照卷面綜合難度來看,不應該有高難度的考察點。
C99往後的版本,支援定義的數組長度可以是變數,所以可以先讓用戶輸入數組長度,然後輸入數組元素。
另外根據題意,數組a和數組b不能有0,也就是說不能純粹的定義一個100長度的數組a,b,必須長度跟正負數個數相等才對。
如果是舊版本,就需要用malloc定義空間長度了,頭大

於是我就先寫了個簡單易懂版的程式碼,雖說簡單易懂,其實我也是思考了大半天才寫出來。細節考慮比較複雜,比如萬一沒有正數或者沒負數,按稍微規範一點的格式寫了56行……
#include <stdio.h> int main() { int num; printf("請輸入數組元素個數(須在1-100之間):n"); scanf("%d",&num); int str[num]; int i; int cnt1=0; int cnt2=0; printf("請輸入數組的%d個整數值n",num); for(i=0;i<num;i++){ scanf("%d",&str[i]); if(str[i]>0){ cnt1++; }else if(str[i]<0){ cnt2++; } } int a[cnt1]; int b[cnt2]; int j=0,k=0; int max=0,min=0; if(cnt1){ printf("數組a的元素有:n"); for(i=0;i<num;i++){ if(str[i]>0){ a[j]=str[i]; printf("%dt",a[j]); if(a[j]>max){ max=a[j]; } j++; } } printf("n數組a的最大值為%dn",max ); }else printf("輸入的數組元素中無正整數,數組a不存在。n"); if(cnt2){ printf("數組b的元素有:n"); for(i=0;i<num;i++){ if(str[i]<0){ b[k]=str[i]; printf("%dt",b[k]); if(b[k]<min){ min=b[k]; } k++; } } printf("n數組b的最小值為%dn",min ); }else printf("輸入的數組元素中無負整數,數組b不存在。n"); return 0; }
內容太多,過於詳實,可能也並不是什麼特別好的事情,畢竟這不是實戰。於是精簡了一下,37行程式碼,不考慮無正數負數的情形,能省去大括弧的就省去。
#include <stdio.h> int main() { int num; printf("請輸入數組元素個數(須在1-100之間):n"); scanf("%d",&num); int str[num]; int i; int cnt1=0,cnt2=0; printf("請輸入數組的%d個整數值n",num); for(i=0;i<num;i++){ scanf("%d",&str[i]); if(str[i]>0) cnt1++; else if(str[i]<0) cnt2++; } int a[cnt1],b[cnt2]; int j=0,k=0; int max=0,min=0; for(i=0;i<num;i++){ if(str[i]>0){ a[j]=str[i]; if(a[j]>max) max=a[j]; j++; }else if(str[i]<0){ b[k]=str[i]; if(b[k]<min) min=b[k]; k++; } } for(i=0;i<cnt1;i++) printf("a[%d]=%dn",i,a[i]); printf("數組a的最大值為%dn",max); for(i=0;i<cnt2;i++) printf("b[%d]=%dn",i,b[i]); printf("數組b的最小值為%dn",min); return 0; }稍微改了一下輸出形式,編譯運行結果如下:

另外,題目讓我們構造一個數組x,應該把str[num]改成x[num]才合乎題意,這裡偷懶一下就不改了。
最後的最後,這題用指針和malloc可能會有更犀利的程式碼,回頭如果有時間再說。
-END-
© Copyright
奔跑的鍵盤俠原創作品 | 盡情分享朋友圈 | 轉載請聯繫授權

