前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言——小学四年级题目解析(二)

C语言——小学四年级题目解析(二)

作者头像
Ed_Frey
发布2019-11-06 19:50:13
6380
发布2019-11-06 19:50:13
举报
文章被收录于专栏:奔跑的键盘侠奔跑的键盘侠

这是奔跑的键盘侠的第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直接结束。

代码如下:

代码语言:javascript
复制
#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:\Users\2019_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行……

代码语言:javascript
复制
#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("%d\t",a[j]);
                if(a[j]>max){
                    max=a[j];
                }
                j++;
            }
        }
        printf("\n数组a的最大值为%d\n",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("%d\t",b[k]);
                if(b[k]<min){
                    min=b[k];
                }
                k++;
            }
        }
        printf("\n数组b的最小值为%d\n",min );
    }else printf("输入的数组元素中无负整数,数组b不存在。\n");

  return 0;
}

内容太多,过于详实,可能也并不是什么特别好的事情,毕竟这不是实战。于是精简了一下,37行代码,不考虑无正数负数的情形,能省去大括号的就省去。

代码语言:javascript
复制
#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]=%d\n",i,a[i]);
    printf("数组a的最大值为%d\n",max);
    for(i=0;i<cnt2;i++) printf("b[%d]=%d\n",i,b[i]);
    printf("数组b的最小值为%d\n",min);
  return 0;
}

稍微改了一下输出形式,编译运行结果如下:

另外,题目让我们构造一个数组x,应该把str[num]改成x[num]才合乎题意,这里偷懒一下就不改了。

最后的最后,这题用指针和malloc可能会有更犀利的代码,回头如果有时间再说。

-END-

© Copyright

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 奔跑的键盘侠 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档