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

奔跑的鍵盤俠原創作品 | 盡情分享朋友圈 | 轉載請聯繫授權

Tags: