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

奔跑的键盘侠原创作品 | 尽情分享朋友圈 | 转载请联系授权