“多组数组”题的注意事项,天杀的“鲁棒性”

【题目描述】

输入一些整数,求出它们的最小值、最大值和平均值(保留3位小数)。输入保证这些数都是不超过1000的整数。

输入包含多组数据,每组数据第一行是整数个数n,第二行是n个整数。n=0为输入结束标记,程序应当忽略这组数据。相邻两组数据之间应输出一个空行。

【样例输入】

8

2 8 3 5 1 7 3 6

4

-4 6 10 0

0

【样例输出】

Case 1: 1 8 4.375

Case 2: -4 10 3.000

【题目来源】

刘汝佳《算法竞赛入门经典  第2版》例题2-6 数据统计II

【解析】

本题涉及输入多组数据,直接上书中代码:

#include<stdio.h>
#define INF 1000000000
int main(){
    int x, n = 0, min = INF, max = -INF, s = 0, kase = 0;
    while(scanf("%d", &n) == 1 && n){
        int min = INF, max = -INF, s = 0;
        for(int i = 0; i < n; i++) {
            scanf("%d", &x);
            s += x;
            if(x < min) min = x;
            if(x > max) max = x;
        }
        if(kase) printf("\n");
        printf("Case %d: %d %d %.3f\n", ++kase, min, max, (double)s/n);
    }
    return 0;
}

这段代码有几个原书指出的要点:

(1)程序健壮性:虽然题目指明n=0为输入结束标记,但有时题目设计也会出错,真实数据可能忘记以n=0结尾。为了防止这种情况带来不必要的丢分,最好的方法就是在代码中增加一道保险,使其不输入0也能正常结束输入,这时就又会用到scanf("%d", &n) == 1来进行输入结束判断(原理详见《非常绕的“输入结束”信号》一文)。这种增加保险的代码在计算机中称之为“鲁棒性(robustness)”。

这里老金不得不吐槽两句,去**的“鲁棒性”!这是一个典型的把简单问题复杂化,莫名其妙装叉,看似高深莫测实则不伦不类的词。因为“鲁棒性”纯粹是个音译词。也不是说音译词就不好,在没有合适的中文表达情形下也无可厚诽。关键是,robustness明明有那么明确又通俗易懂的汉语意思“健壮性”,你却偏偏搞出这个生僻的音译飞机,这不是明显的装叉大以巴狼嘛!

更有甚者,有人还强行从汉字字义加以解释,老金搬来权当一乐。

逻辑是这样的:

总结起来就是:

不得不说,这个总结还真有创意,但咱们又不是在搞古文运动。况且,这种组合词本身意思也不明朗,我也可以解释成“鲁莽的人很棒”、“粗鲁的人很棒”、愚鲁的人很棒”,甚至可以解释成“鲁讯很棒”。所以,即便能像前面高人这样强行解释,对于大众来说,它也绝对不是一个好词。它就是不够简明,不够通俗易懂。任何一个人第一次面对它,都会莫名其妙。随便用“健壮性”、“容错性”、“可靠性”,哪怕是“抗造性”,最不济用“程序猛男”也比这个词更容易理解。

此外,老金真心觉得上面的字意引申过程不够平滑,特意查了字典,重新梳理下逻辑。

鲁:象形字,上鱼下口→鱼入口中→吃到了美味佳肴→美好。上面是字典中能查到的,

然后在前人的启发下进一步开启老金脑补模式:美好的东西自然要多多益善→东西一多总体积就会变“大”→大的东西就“粗”→粗大的东西就不灵活,就比较“愚钝”,于是有了“愚鲁”→“愚鲁”的人往往比较“粗俗”,于是有了“粗鲁”、“鲁莽”。

(2)输出格式:程序要求“相邻两组数据之间应输出一个空行”。要准确理解这句话的意思,即第一行前不能有空行,最后一行后不能有空行。if(kase) printf("\n");就是为了实现这个功能。这里尤其要说明的一点,虽然最后的printf语句中也有\n,但它只是换行,即把光标移到下一行,但不代表下一行就是空行。所以,最后一组数据输出后是不会输出空行的。

(3)变量重置:这是一个易错点。因为本题涉及“多组数据”输入。因此,为了避免上一组数据运算过后变量的值对下一组数据运算的结果产生影响,需要在进行每一组数据运算前都要对参与运算的变量进行重新初始化。题中对运算结果有影响的变量有4个:x、min、max、s。它们都应在while循环内每次运算前进行初始化。x是由用户输入的值进行初始化的,不会有问题。关键是min、max、s这3个变量,很容易放在while之外。要说明的是,像代码中那样里外都进行变量定义和初始化也是可以的,因为内层的变量会屏蔽外层的同名变量,只不过外层的那些都是多此一举。

除以上要点之外,老金还有必要提出一点,就是代码运行后的输入和输出是交叉出现在画面中的,即像下面这样。

这貌似很混乱,与题目输入、输出要求相悖,实际上是没问题的,因为输入和输出天然就是是分开的,咱们只要保证分别从输入、输出两方面看与题目要求相符即可,不用因此担心丢分。

如果非要使输出结果中的输入、输出区分开来也是可以的,就要用到二维组,用来存储每次运算后的输出结果。

假设最多输入100组数据,代码如下:

#include<stdio.h>
#define INF 1000000000
int main(){
    int x, n = 0, min = INF, max = -INF, s = 0, kase = 0, a[100][2];
    double b[100][1];
    while(scanf("%d", &n) == 1 && n){
        int min = INF, max = -INF, s = 0;
        for(int i = 0; i < n; i++) {
            scanf("%d", &x);
            s += x;
            if(x < min) min = x;
            if(x > max) max = x;
        }
        a[kase][0] = min;
        a[kase][1] = max;
        b[kase][0] = (double)s/n;
        kase++;
    }

    for(int i=0; i<kase; i++){
        if(i) printf("\n");
        printf("Case %d: %d %d %.3f\n", i+1, a[i][0], a[i][1], b[i][0]);
    }
    return 0;
}

输出结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/513019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

日志服务 HarmonyOS NEXT 日志采集最佳实践

作者&#xff1a;高玉龙&#xff08;元泊&#xff09; 背景信息 随着数字化新时代的全面展开以及 5G 与物联网&#xff08;IoT&#xff09;技术的迅速普及&#xff0c;操作系统正面临前所未有的变革需求。在这个背景下&#xff0c;华为公司自主研发的鸿蒙操作系统&#xff08…

经典文献阅读之--LOG-LIO(高效局部几何信息估计的激光雷达惯性里程计)

0. 简介 局部几何信息即法线和点分布在基于激光雷达的同时定位与地图构建&#xff08;SLAM&#xff09;中是至关重要&#xff0c;因为它为数据关联提供了约束&#xff0c;进一步确定了优化方向&#xff0c;最终影响姿态的准确性。然而即使在使用KD树或体素图的辅助下&#xff…

echarts 毕节区县地图 包含百管委、高新区 (手扣)

百度网盘 链接&#xff1a;https://pan.baidu.com/s/14yiReP8HT_bNCGMOBajexg 提取码&#xff1a;isqi

【Qt 学习笔记】Qt 开发环境的搭建 | Qt 安装教程

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt 开发环境的搭建 | Qt 安装教程 文章编号&#xff1a;Qt 学习笔记 /…

坦克大战_java源码_swing界面_带毕业论文

一. 演示视频 坦克大战_java源码_swing界面_带毕业论文 二. 实现步骤 完整项目获取 https://githubs.xyz/y22.html 部分截图 启动类是 TankClinet.java&#xff0c;内置碰撞检测算法&#xff0c;线程&#xff0c;安全集合&#xff0c;一切皆对象思想等&#xff0c;是java进阶…

Annaconda的替代品miniforge!

用了多年的Annaconda竟然要收费了&#xff08;个人不收费&#xff0c;企业收费&#xff0c;但个人电脑在企业IP下&#xff0c;还是被警告了&#xff09;&#xff0c;只能用miniforge 全面替换了&#xff01; 一、卸载anaconda windows下卸载&#xff0c; 设置 -> 应用和功…

后台返回数据需要自己匹配图标,图标命名与后台返回的变量保持一致

testItemId为后台返回匹配图标的变量名 sportsTargetsData:{suggestSportTargetId: "2",unlocks: [{ testItemId: vo2max_high_knee, sportTargetName: 心肺能力, indexName: 心肺能力, sportTargetId: 1 },{ testItemId: grip_strength, sportTargetName: 基础力量…

基于YOLOV5+Pyqt5农作物叶片病害检测系统

1、引言 农作物病害的精准检测与识别是推动农业生产智能化与现代化发展的重要举措。随着计算机视觉技术的发展&#xff0c;深度学习方法已得到快速应用&#xff0c;利用卷积神经网络进行农作物病害检测与识别成为近年来研究的热点。基于传统农作物病害识别方法&#xff0c;分析…

瑞吉外卖实战学习--13、完善删除中的逻辑

完善删除中的逻辑 前言效果图逻辑介绍表结构根据mybatisPlus接口规范创建实体类和service和mapper文件1、实体类Dish和Setmeal2、Mapper接口DishMapper和SetealMapper3、Service接口DishService和setmealService4、Service实现类DishServiceImpl和setmealServicelmpl 编写删除函…

双榜有名!美创入围第一新声x天眼查「年度中国高科技高成长企业」系列榜单

为了更好地了解中国高科技高成长企业的现状和发展趋势&#xff0c;2023年底&#xff0c;【第一新声】特联合【天眼查】启动“数字未来”系列之2023年度中国高科技高成长企业系列榜单评选征集工作&#xff0c;发现和挖掘被资本市场关注&#xff0c;同时受客户认可的高科技、高成…

五、postman基础使用案例

postman基础使用 相关案例【传递查询参数】【提交表单数据】【提交JSON数据】 注&#xff1a;postman⼀款⽀持调试和测试的⼯具&#xff0c;开发、测试⼯程师都可以使⽤。方法一般统一为&#xff1a;方法→请求头→请求体→断言 相关案例 【传递查询参数】 访问TPshop搜索商品的…

高德定位 SDK 到底提供了什么服务?

最近我被高德的销售烦到不行&#xff0c;说是我用了他们的 SDK&#xff0c;现在 SDK 要收费。 表达是很绕的&#xff0c;什么授权啦&#xff0c;什么企业认证风险啦&#xff0c;讲了一堆&#xff0c;还跟我开始搬出协议了。感觉高德的销售真够垃圾的&#xff0c;编个话术都不会…

动态规划详细讲解c++|经典例题讲解认识动态规划|0-1背包问题详解

引言 uu们&#xff0c;你们好&#xff01;这次的分享是动态规划&#xff0c;其中介绍了动态规划的相关概念和做题模板&#xff08;三要素&#xff09;&#xff0c;同时为了uu们对动态规划方法有更加形象的认识&#xff0c;特地找了两个经典问题&#xff0c;和大家一起分析。并…

音频转换工具 Bigasoft FLAC Converter for Mac

Bigasoft FLAC Converter for Mac是一款专为Mac用户设计的音频转换工具&#xff0c;它能够将FLAC音频文件高效、高质量地转换为其他常见的音频格式&#xff0c;如MP3、AAC等。这款软件具有直观易用的界面&#xff0c;使用户能够轻松上手&#xff0c;无需复杂的操作步骤即可完成…

SpringBoot整合Lombok以及各种使用技巧

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉🍎个人主页:Leo的博客💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容: SpringBoot整合Lombok以及各种使用技巧 📚个人知识库: Leo知识库,欢迎大家访…

C语言内存函数,让内存管理更高效!

1. memcpy使⽤和模拟实现 2. memmove使⽤和模拟实现 3. memset函数的使⽤ 4. memcmp函数的使⽤ 正文开始&#xff1a; 1. memcpy 使⽤和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); • 函数memcpy从source的位置开始向后复…

【C++】前缀和

目录 一维前缀和二维前缀和 一维前缀和 #include <iostream> using namespace std; #include <vector> int main() {int n,q;cin >> n >> q;vector<long long> arr(n1);for(int i 1;i<n;i){cin >> arr[i];}//创造前缀和数组vector<l…

安卓Activity上滑关闭效果实现

最近在做一个屏保功能&#xff0c;需要支持如图的上滑关闭功能。 因为屏保是可以左右滑动切换的&#xff0c;内部是一个viewpager 做这个效果的时候&#xff0c;关键就是要注意外层拦截触摸事件时&#xff0c;需要有条件的拦截&#xff0c;不能影响到内部viewpager的滑动处理…

linux设置Nacos自启动

前提&#xff1a;已经安装好nacos应用 可参考&#xff1a;Nacos单机版安装-CSDN博客 1. 创建nacos.service 1.1 在 /lib/systemd/system 目录底下&#xff0c;新建nacos.service文件 [Unit] Descriptionnacos Afternetwork.target[Service]Typeforking# 单机启动方式&#…

OpenLayers6实战,OpenLayers实现鼠标拖拽方式绘制梯形

专栏目录: OpenLayers实战进阶专栏目录 前言 本章讲解如何使用OpenLayers实现鼠标拖拽方式绘制梯形。点击鼠标拖拽梯形,松开鼠标后绘制完成。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6.15.1使用Yarn安装依赖yarn add olvue中…