算法竞赛中的输入输出框架

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

        这个题目关键在于:整数的个数是不确定的。下面直接给出程序:

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

       这个程序中scanf有返回值,返回的是成功输入的变量个数,当输入结束时,scanf函数无法再次读取x,将返回0. 在Windows下,输入完毕后先按Enter键,再按Ctrl+Z键,最后在按Enter键即可结束输入。在Linux下,输入完毕后按Ctrl+D键即可结束输入。

       上面这个程序是错误的,变量在未赋值之前的值是不确定的。特别的,它不一定是0.只需要在使用之前赋初值就可以解决这个问题。一种方法是定义一个很大的常数,如INF=1000000000,然后让max=-INF,而min=INF,另一种方法是先读取第一个整数x,然后令max=min=x.这样的好处是避免了人为的“假想无穷大”值,程序更加优美。

       上面的程序并不是很方便,每次都要手动输入很多数。一个好的方法是用文件--把输入数据保存在文件中,输出数据也保存在文件中。这样,只要事先把输入数据保存在文件中,就不必每次重新输入了;数据输出在文件中也避免了“输出太多,一卷屏前面的就看不见了”这样的尴尬,运行结束后,慢慢浏览输出文件即可。

        使用文件最简单的方法是使用输入输出重定向,只需在main函数的入口处加入以下两条语句:

freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);

      上述语句将使得scanf从文件input.txt读入,printf写入文件output.txt。不只是scanf和printf,所有读键盘输入、写屏幕输出的函数都将改用文件。尽管这样做很方便,但并不是所有算法竞赛都允许程序读写文件。甚至有的算法竞赛允许访问文件,但不允许用freopen这样的重定向方式读写文件。参赛之前仔细阅读文件读写的相关规定:是标准输入输出(也称标准I/O,即直接读键盘,写屏幕),还是文件输入输出?如果是文件输入输出,是否禁止用重定向方式访问文件?同时注意不要弄错大小写,不要弄错文件名,不要使用绝对路径或相对路径。

        有一种方法可以在本机测试时用文件重定向,但一旦提交比赛,就自动“删除”重定向语句。

#define LOCAL
#include<stdio.h>
#define INF 1000000000
int main(){#ifdef LOCALfreopen("data.in","r",stdin);freopen("data.out","w",stdout);#endifint x,n=0,min=INF,max=-INF,s=0;while(scanf("%d",&x)==1){s=s+x;if(x>max){max=x;}if(x<min){min=x;}/* printf("x = %d, min = %d. max = %d\n, x, min, max);*/n++;}printf("%d %d %.3f\n",min,max,(double)s/n);return 0;
} 

        这是一份典型的比赛代码,包含了几个特别之处:

       1.重定向的部分被写在了#ifdef和#endif中。其含义是:只有定义了符号LOCAL,才编译两条freopen语句。

       2.输出中间结果的printf语句写在了注释中,它在最后版本的程序中不应该出现,可以在发现了bug后,输出中间信息。 

       上面的代码在程序首部就定义了符号LOCAL,因此在本机测试时使用重定向方式读写文件。如果比赛要求读写标准输入输出,只需要在提交之前删除#define LOCAL即可。

        如果比赛要求用文件输入输出,但禁止用重定向的方式,使用的程序如下

#include<stdio.h>
#define INF 1000000000
int main(){FILE *fin,*fout;fin = fopen("data.in","rb");fout = fopen("data.out","wb");int x,n=0,min,max,s=0;min=INF;max=-INF;while(fscanf(fin,"%d",&x)==1){s+=x;if(x<min){min=x;}if(x>max){max=x;}n++;}fprintf(fout,"%d %d %.3f\n",min,max,(double)s/n);fclose(fin);fclose(fout);return 0;
}

       上面这个代码很直观,先声明变量fin和fout,把scanf改为fscanf,第一个参数为fin;把printf改为fprintf,第一个参数为fout,最后执行fclose,关闭两个文件。

       重定向和fopen两种方法各有优劣,重定向的方法写起来简单,但是不能同时读写文件和标准输入输出;fopen的写法稍显繁琐,但是灵活性比较大(例如,可以反复打开并读写文件)。如果想把fopen版的程序改成读写标准输入输出,只需赋值“fin=stdin;fout=stdout"即可,不要调用fopen和fclose。

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

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

相关文章

第九节HarmonyOS 常用基础组件5-LoadingProgress

一、LoadingProgress LoadingProgress组件用于显示加载动效的组件&#xff0c;比如应用的登录界面&#xff0c;当我们点击登录的时候&#xff0c;显示的“正在登录”的进度条状态。LoadingProgress的使用非常简单&#xff0c;只需要设置颜色和宽高就可以了。 Entry Component …

目标检测——Fast R-CNN算法解读

论文&#xff1a;Fast R-CNN 作者&#xff1a;Ross Girshick 链接&#xff1a;https://arxiv.org/abs/1504.08083 代码&#xff1a;https://github.com/rbgirshick/fast-rcnn 目录 1、算法概述2、Fast R-CNN细节2.1The RoI pooling layer2.2 Fine-tuning for detection2.3 Fast…

工业机器视觉megauging(向光有光)使用说明书(十三,资源发现bug,已经更新)

megauging&#xff08;向光有光&#xff09;旧资源有bug&#xff0c;已经更新&#xff0c;如下&#xff1a; 第一工具&#xff0c;combox默认0&#xff0c;选择后&#xff0c;鼠标点击“获取结果”&#xff0c;相机就取一帧图像处理后显示出来&#xff1a; 第一工具&#xff0…

YOLOv5算法进阶改进(7)— 将主干网络SPPF更换为SimSPPF / SPP-CSPC / SPPF-CSPC

前言:Hello大家好,我是小哥谈。SimSPPF是YOLOv6中提出的一种改进的空间金字塔池化方法,它是SPPF的升级版。SimSPPF通过在不同尺度上使用不同大小的池化核来提取特征,从而提高了检测器的性能。与SPPF相比,SimSPPF可以在不增加计算成本的情况下提高检测器的性能。本节课就教…

Flask使用线程异步执行耗时任务

1 问题说明 1.1 任务简述 在开发Flask应用中一定会遇到执行耗时任务&#xff0c;但是Flask是轻量级的同步框架&#xff0c;即在单个请求时服务会阻被塞&#xff0c;直到任务完成&#xff08;注意&#xff1a;当前请求被阻塞不会影响到其他请求&#xff09;。 解决异步问题有…

记录 | photoshop移动选区

期望达到的效果&#xff1a; 选择一块区域&#xff0c;并移动它 操作&#xff1a; (1) 选择矩形选框工具&#xff0c; (2) 对区域进行选取&#xff0c; (3) 选择移动工具&#xff0c; (4) 移动选区&#xff0c;效果如下&#xff0c;

学习TypeScrip2(任意类型any和unknown)

Any 类型 和 unknown 顶级类型 1.没有强制限定哪种类型&#xff0c;随时切换类型都可以 我们可以对 any 进行任何操作&#xff0c;不需要检查类型 let anys:any 123 anys 123 anys true 2.声明变量的时候没有指定任意类型默认为any let anys; anys 123 anys true 3.弊端…

已知数组A[1..n]中元素类型为非负整数,设计算法将其调整为左右两部分,左边所有为奇数,右边所有为偶数,并要求算法的时间复杂度为O(n)

//左边奇数右边偶数 void Swap(int* a, int* b) {int tmp *b;*b *a;*a tmp; } void LeftRight(int arr[],int n) {int i 0;int j n - 1;while(i<j){if (arr[i] % 2 0 && arr[j] % 2 1) {Swap(&arr[i], &arr[j]);i;j--;}else if (arr[i] % 2 1 &…

Next.js初步使用

文章目录 安装和运行页面静态文件 React初步&#xff0c;但不熟悉React也可以学习本文。 安装和运行 Next.js是一个基于React的服务端渲染框架&#xff0c;可以实现构建高性能、可扩展的React应用&#xff0c;提供了很多方便的工具和功能&#xff0c;包括自动代码分割、服务器…

Java研学-IO流(三)

六 字节流 – 字节输出流系列 OutPutStream体系 1 OutPutStream系列 – 字节输出流 // 表示字节输出流所有类的超类&#xff0c;输出流接受输出字节并将其发送到某个接收器 public abstract class OutputStreamFileOutputStream/BufferedOutputStream 2 FileOutputStream类设…

pyqt5使用pyqtgraph实现动态热力图

pyqt5使用pyqtgraph实现动态热力图 一、效果图 二、流程 1、打开Designer创建一个UI界面 2、把UI转成py 3、创建一个main.py文件 4、在main文件中渲染画布、创建初始数据、画热力图、创建更新数据线程、绑定按钮触发事件三、UI界面 其中h_map.py代码如下: # -*- coding: ut…

1688API接口系列,1688开放平台接口使用方案(商品详情数据+搜索商品列表+商家订单类)

1688商品详情接口是指1688平台提供的API接口&#xff0c;用于获取商品详情信息。通过该接口&#xff0c;您可以获取到商品的详细信息&#xff0c;包括商品标题、价格、库存、描述、图片等。 要使用1688商品详情接口&#xff0c;您需要先申请1688的API权限&#xff0c;并获取ac…

变量和引用

变量和引用 2.1.深入认识变量 2.1.1.什么是变量 变量是在程序中保存用户数据的一段内存存储空间&#xff0c;变量名是内存空间的首地址 变量三要素&#xff1a;名称、类型、值 2.1.2.变量的名称 组成: 字母、数字、下划线组成&#xff0c;不能以数字开头 变量名称的长…

蓝桥杯每日一题2023.12.2

题目描述 蓝桥杯大赛历届真题 - C 语言 B 组 - 蓝桥云课 (lanqiao.cn) 题目分析 答案&#xff1a;3598180 由题目分析可以知道&#xff0c;给小明发的牌一共有13种类型&#xff0c;每种类型的牌一共有四张。对于每种牌&#xff0c;我们都有5种选择&#xff0c;不拿、拿一张、…

LeetCode - 965. 单值二叉树(C语言,二叉树,配图)

二叉树每个节点都具有相同的值&#xff0c;我们就可以比较每个树的根节点与左右两个孩子节点的值是否相同&#xff0c;如果不同返回false&#xff0c;否则&#xff0c;返回true。 如果是叶子节点&#xff0c;不存在还孩子节点&#xff0c;则这个叶子节点为根的树是单值二叉树。…

FFmpeg命令行使用小结

文章目录 前言一、视频1.1 修改格式转码1.2 截取片段1.3 合并多个视频1.4 裁剪区域1.5 修改分辨率1.6 翻转视频1.7 调整速度1.8 多个视频拼接1.9 添加字幕1.10 修改文件封面1.11 添加文字水印1.12 制作画中画1.13 音视频混合/分离1.14 视频直播推流1.15 m3u8切片 二、音频2.1 视…

Spring Boot 最核心的 25 个注解

1、SpringBootApplication 这是 Spring Boot 最最最核心的注解&#xff0c;用在 Spring Boot 主类上&#xff0c;标识这是一个 Spring Boot 应用&#xff0c;用来开启 Spring Boot 的各项能力。 其实这个注解就是 SpringBootConfiguration、EnableAutoConfiguration、Componen…

分析实现HarmonyOS中的Linux内核架构模式

在当今的科技领域&#xff0c;操作系统是各种智能设备运行的关键所在。而在这方面&#xff0c;华为的鸿蒙系统备受瞩目。那么&#xff0c;鸿蒙系统技术架构是怎样的呢&#xff1f;本文将为您揭开这一神秘面纱。 首先&#xff0c;我们需要了解鸿蒙系统的基本架构。鸿蒙系统采用…

mysql中除了InnoDB以外的其它存储引擎

参考资料&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html MyISAM存储引擎 https://dev.mysql.com/doc/refman/8.0/en/myisam-storage-engine.html MyISAM 存储引擎是基于比较老的ISAM存储引擎&#xff08;ISAM已经不再可用&#xff09;&#xff…

shell编程系列(11)-使用grep查找文本

文章目录 前言grep的使用根据关键字查找反向查找 结语 前言 grep命令也是我们在日常使用linux&#xff0c;编写shell脚本中会用到的一个高频命令&#xff0c;grep主要是帮助我们查找我们想要的内容&#xff0c;类似于我们在office word里面的 Ctrl f 查找功能&#xff0c;但是…