非常绕的“输入结束”信号

【题目描述】

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

【样例输入】

2 8 3 5 1 7 3 6

【样例输出】

1 8 4.375

【题目来源】

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

【解析】

本题的难点在于,输入整数的个数是不确定的。因为不知道会输入多少个整数,程序只能通过循环不断要求用户输入,直到用户发出“输入结束”信号。

循环输入的代码很简单,但是用户的“输入结束”信号是什么呢?程序怎么接收这个信号呢?

按我们以前的经验,都是输入后按Enter键后开始输出,比如求两个整数的和。

#include<stdio.h>
int main(){int a,b;scanf("%d %d", &a, &b);printf("%d\n", a+b);return 0;
}

输入两个整数后按Enter,程序就会输出结果,看起来Enter键就是“输入结束”信号。但是假如我们在输入第一个数后就直接按Enter呢,你发现程序并没有输出任何结果,它依然在等着你输入,由此可见Enter并不是“输入结束”信号。

Enter发出的是“提交”信号。输入一个数,按Enter相当于对scanf说:老哥,给你交1个数!

但scanf要的是两个数,回答:老弟,你只交了1个,还差1个,继续!

所以,当你欠scanf老哥数字债时,不管按多少个Enter都无法结束输入。

如果输入9 5 2 7后按Enter,就是对scanf说:老哥,给你交4个数。

scanf老哥一看要求满足了,也不贪心,只取前两个,后面赠送的忽略不计。

那用什么发出“输入结束”信号,之前的文章“用恋爱脑搞懂scanf的返回值”已有介绍,在Windows下,输入完毕后按Enter键,然后按Ctrl+Z键,再按Enter键,即可结束输入。在Linux下,输入完毕后按Ctrl+D键即可结束输入。

显然,Windows下“Ctrl+Z”就是“输入结束”信号,为什么输入这个信号后还要加上一个Enter呢?别忘了,Enter的作用是“提交”,它得把这个“输入结束”信号“提交”给程序。

注意使用这个“输入结束”信号有两个条件:

①“输入结束”信号只是对当前的scanf老哥发出的,并不是对整个程序发出,因而它只能结束当前的scanf输入。

②“输入结束”信号要正常发挥作用,必须是在当前scanf语句未输入任何数据前按Ctrl+Z。

换句话说,上面的代码要想使用Ctrl+Z结束输入,只能在程序运行后,在未输入任何数据时就先按Ctrl+Z,然后程序就会在没有输入任何数据的情况下结束输入。

所以,准确地说,Ctrl+Z发出的“输入结束”信号是没有任何输入的“输入结束”信号。

这么看这个Ctrl+Z根本没个鸟用。

事实并非如此,因为当Ctrl+Z在发出“输入结束”信号的同时,scanf()函数会返回EOF(实际值为-1),咱们可以利用这个返回值再借助于循环实现有数据输入的“输入结束”。

代码如下:

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

当输入完数据后,按Enter键再按下Ctrl+Z,然后再按下Enter,就会向当前正在执行scanf函数发出“输入结束”信号,当前scanf函数在没有任何有效输入的情况下结束输入。此时scanf返回EOF,致使循环条件不成立,结束循环。

为什么输入数据后要先按下Enter键再按Ctrl+Z呢?因为这样才能满足上面说的第②个条件。

不过上述代码不先按Enter键也是能正常运行的,甚至在输入完数据后按任何一个字母都能输出正确结果。这是因为当输入的不是整数时,匹配失败,scanf函数会返回0,同样能结束循环。注意:此时Ctrl+Z只被当作字符串处理,而不会被scanf视为“输入结束”信号。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP和HTTPS谁传输数据更安全?

1.HTTP HTTP在传输数据时&#xff0c;通常都是明文传输&#xff0c;也就是传输的数据没有进行加密。在这种情况下&#xff0c;如果传输的是一些敏感数据&#xff0c;比如某银行卡密码&#xff0c;就很容易被别人截获到&#xff0c;这就对我们的个人利益产生了威胁。 HTTP传输数…

时区信息TimeZoneInfo

1.时区TimeZoneInfo 对于一个开放于全球的网站或服务&#xff0c;在时间上的显示是一个问题&#xff0c;因为各个国家都会有所谓的时差&#xff0c;好在 .Net Framework 提供 TimeZoneInfo 类来解决这个问题。 TimeZoneInfo 类的成员支持以下操作&#xff1a; 检索操作系统已定…

Mysql数据库故障排查与优化

目录 前言 一、Mysql数据库的单实例故障 1.故障一——拒绝连接数据库 1.1故障内容 1.2问题分析 1.3解决方法 2.故障二——密码错误 2.1故障内容 2.2问题分析 2.3解决方法 3.故障三——数据库处理较慢 3.1故障内容 3.2问题分析 3.3解决方法 4.故障四——数据库表…

k8s 基础入门

1.namespace k8s中的namespace和docker中namespace是两码事&#xff0c;可以理解为k8s中的namespace是为了多租户&#xff0c;dockers中的namespace是为了网络、资源等隔离 2.deployment kubectl create #新建 kubectl aply #新建 更新 升级&#xff1a; 滚动升级&#x…

真实sql注入以及小xss--BurpSuite联动sqlmap篇

前几天漏洞检测的时候无意发现一个sql注入 首先我先去网站的robots.txt去看了看无意间发现很多资产 而我意外发现admin就是后台 之后我通过基础的万能账号密码测试or ‘1‘’1也根本没有效果 而当我注入列的时候情况出现了 出现了报错&#xff0c;有报错必有注入点 因此我…

Flink Checkpoint 机制深度解析:原理、注意事项与最佳实践

Flink Checkpoint 机制详解 Apache Flink 的 Checkpoint 机制是一种强大的容错机制&#xff0c;其设计目标是在分布式流处理环境中保证数据处理的一致性和可靠性。Checkpoint 主要通过周期性地创建应用流图状态的全局快照来实现&#xff0c;当系统发生故障时&#xff0c;可以从…

33-2 XXE漏洞 - XXE外部实体注入原理

一、外部实体注入漏洞定义 外部实体注入漏洞(XML External Entity Injection,XXE)是针对应用程序解析 XML 输入类型的一种攻击。 攻击者利用未经严格安全控制的服务端 XML 解析过程,向其注入恶意 XML 数据。通过加载恶意外部实体,攻击者可以导致服务器执行恶意配置,从而造…

企业能耗数据分析有哪些优势?怎样进行分析?

随着互联网技术的发展&#xff0c;企业在运营中会出现大量的用能数据&#xff0c;但却做不了精准的用能数据分析&#xff0c;导致数据没有得到有效利用&#xff0c;以及产生能源浪费现象。 为什么企业用能分析总是难&#xff1f; 一、用能分析过程复杂 由于用能分析过于复杂…

采用C#.net6.0+Vue,Ant-Design技术开发的一套大型医院手术麻醉信息系统源码,系统成熟,运行稳定

手术麻醉信息系统源码&#xff0c;C#手麻系统源码&#xff0c;自主版权应用案例&#xff08;适合上项目&#xff09; 手术麻醉信息系统可以实现手术室监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集&#xff0c;采集的数据能据如实准确地反映患者生命体征参数的变化&…

穿山甲广告平台SDK接入效果怎么样?

广告收入是大多数开发者的应用变现收入来源&#xff0c;如何进行流流量变现是从应用设计之初就需要开发者思考的问题。 穿山甲广告平台作为国内第三方广告变现平台&#xff0c;是不少开发者选择的对接平台。 穿山甲广告平台的广告类型较多&#xff0c;有信息流&#xff0c;ba…

Linux 安装apache

安装apache过程 配置yum源安装apache启动apache检查apache的状态访问apache如果访问不了可能是火墙和selinux 配置yum源 一 .挂载光盘 mkdir /kk mount /dev/cdrom /kk检查挂载点 ls /kk第二步&#xff1a;修改yum的配置文件&#xff0c;指向我们创建的yum源&#xff1a;/te…

苍穹外卖05(Redis入门,下载于安装,服务启动和停止,Redis数据类型面试题,常用命令,Java中操作Redis,店铺营业状态设置)

目录 一、Redis入门 1. Redis简介 1 NoSQL介绍 2 Redis简介 2. Redis下载与安装 1 Redis下载 2 Redis安装 3. Redis服务启动与停止 1 服务启动命令 2 客户端连接命令 3 修改Redis配置文件 3 修改Redis配置文件 4 Redis客户端图形工具 二、Redis数据类型【面试题】…

如何让光猫4个网口都有网络

一般情况光猫只有LAN1口有网络&#xff0c;LAN2、LAN3和LAN4口都是预留给电视用的&#xff0c;那么如何让这3个网口也有网络呢&#xff1f; 使用场景&#xff1a; 光猫在弱电箱内&#xff0c;弱电箱中有三根网线&#xff08;网线1、网线2和网线3&#xff09;分别接入到了三个房…

基于Arduino IDE 野火ESP8266模块 文件系统LittleFS 的开发

一、文件系统LittleFS的介绍 LittleFS是一个为微控制器设计的轻量级、可靠且高性能的文件系统。它专为嵌入式设备打造&#xff0c;拥有占用空间小、对硬件要求低的特点&#xff0c;同时保证在断电情况下数据的完整性和稳定性。 1.设计与特点 LittleFS的设计旨在提供嵌入式系统所…

依赖倒转原则

1.1 MM请求电脑 MM电脑坏了&#xff0c;需要修电脑&#xff0c;是因为每次打开QQ,一玩游戏&#xff0c;机器就死了。出来蓝底白字的一堆莫名奇妙的英文。蓝屏死机了&#xff0c;估计内存有问题。 1.2 电话遥控修电脑 遥控修理电脑&#xff0c;打开内存条&#xff0c;两根内存…

Vivado使用(6)——增量综合( Incremental Synthesis)

目录 一、概述 1.1 增量综合的工作原理 1.2 增量综合的优点 1.3 注意事项 二、设置增量综合 2.1 Write Incremental Synthesis 复选框 2.2 Incremental Synthesis 选择框 2.2.1 自动使用上一次运行的检查点&#xff08;Automatically use the checkpoint from the…

Vue(十二):脚手架配置代理,github案例,插槽

一、脚手架配置代理 老师讲的主要有两种方法&#xff1a; 但是我的没有proxy&#xff0c;只有proxyTable,之前一直不成功&#xff0c;现在我是这样配置的&#xff1a; config文件夹下的index.js: App.vue: 然后就成功了&#xff1a;&#xff08;我真服了&#xff0c;之前在这…

jdbc连SQL server,显示1433端口连接失败解决方法

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“connect timed out。请验证连接属性。确保 SQL Server 的实例正在主机上运行&#xff0c;且在此端口接受 TCP/IP 连接…

零基础入门实战深度学习Pytorch课程下载

本课程旨在帮助零基础学员掌握PyTorch深度学习框架。通过实战项目&#xff0c;学员将学习神经网络基础、模型训练和调优技巧。逐步掌握深度学习核心概念&#xff0c;为未来在人工智能领域打下坚实基础。 课程大小:2.6G 课程下载&#xff1a;https://download.csdn.net/downlo…

【战略前沿】与中国达成生产协议后,飞行汽车即将起飞

【原文】Flying cars edge towards takeoff after Chinese production deal 【作者】Thomas Macaulay 斯洛伐克公司KleinVision签署了一项协议&#xff0c;将大规模生产AirCar。 一辆获得航空认证的飞行汽车向商业化又迈出了一大步。 空中汽车的创造者KleinVision今天宣布出售…