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
奔跑的键盘侠原创作品 | 尽情分享朋友圈 | 转载请联系授权