(转自)ACM题目中输入数据的处理(C语言版)见:http://blog.csdn.net/sxhelijian/article/details/8978794

字符串的输入

while(gets(p))
  printf("%s",p);

  ACM竞赛题目的输入数据常要求有多组,并且格式多种多样,这是初次登OJ平台的同学的一个障碍。实际上,这些格式可以归为固定的几种类型,本文介绍各种类型的处理方法,以帮助同学们克服这些障碍。

  实际上,这些模式不仅是OJ平台上做题的需要。在平时的自由编程练习中,也可以自行使用这些模式,以提高调试程序的效率。对程序测试的意识也将在此过程中得到提升。
  本文1-4部分介绍了几种类型输入的处理,第5部分介绍通过输入重定向提高调试程序效率的方法。

1. 最简单的输入
例1:

  1. Description
  2. 计算 a+b
  3. Input
  4. 两个整数 a,b
  5. Output
  6. a+b的值
  7. Sample Input
  8. 1 2
  9. Sample Output
  10. 3

  这种最简单的输入,接受一组输入,针对这组输入计算出值即可。这与平时的程序设计并无差异。解决办法是:

  1. #include <iostream>
  2. using namespace std;
  3. int  main()
  4. {
  5. int a,b;
  6. cin >> a >> b;
  7. cout << a+b << endl;   //对其他题目,换成要求的复杂处理与输出
  8. return 0;
  9. }

2. 一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止
例2:

  1. Description
  2. 计算 a + b
  3. Input
  4. 多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行
  5. Output
  6. 每组的两个整数(a和b)求和并输出,每组的求和结果独占一行
  7. Sample Input
  8. 1 5
  9. 10 20
  10. 400 516
  11. Sample Output
  12. 6
  13. 30
  14. 916

  这种输入包含多对输入数据,需要构造一个循环读取。因为没有指出到底有多少对输入,要有办法判断输入何时结束。解决办法是:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a,b;
  6. while(cin >> a >> b)
  7. {
  8. cout << a+b << endl;
  9. }
  10. return 0;
  11. }

  说明1:当读到输入结束时,cin >> a >> b返回 0,循环也结束。

  说明2:在调试程序时,键盘输入的数据,用CTRL-Z(即按住CTRL键不放,再按下Z)组合作为输入结束,此谓键盘输入设备的“文件末尾”。

3. 一次运行,要输入多组数据,组数由第一个输入数据决定(在开始的时候输入一个N,接下来是N组数据)
例3:

  1. Description
  2. 计算 a + b
  3. Input
  4. 第一行是数据的组数N,从第二行是N组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行
  5. Output
  6. 每组的两个整数(a和b)求和并输出,每组的求和结果独占一行
  7. Sample Input
  8. 2
  9. 1 5
  10. 10 20
  11. Sample Output
  12. 6
  13. 30

  需要先读入第一行确定组数N,而后写一次执行N次的循环进行处理即可。解决办法是:

  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. int a, b, n;
  5. cin >> n;
  6. for(i=0;i<n;i++)
  7. {
  8. cin >> a >> b;
  9. cout << a + b << endl;
  10. }
  11. return 0;
  12. }

4.  输入不说明有多少组数据,但以某个特殊输入为结束标志。平时做题中常见诸如“输入学生成绩,以-1结束”,没有学生得-1分的,这个结束数据可以要得。
例4:

  1. Description
  2. 计算 a + b
  3. Input
  4. 多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行。当输入为 0 0 时,输入结束。
  5. Output
  6. 每组的两个整数(a和b)求和并输出,每组的求和结果独占一行。
  7. Sample Input
  8. 1 5
  9. 10 20
  10. 0 0
  11. Sample Output
  12. 6
  13. 30

  构造循环对数据进行处理,将是否遇到了要求结束的输入,作为循环是否结束的依据。解决办法是:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a ,b;
  6. while(cin>>a>>b&&(a||b))
  7. {
  8. cout<<a+b<<endl;
  9. }
  10. return 0;
  11. }

  有关字符和字符串数据的输入,在此不再多讲,只要将相关的函数用好即可,也可以找到相关资料参考。

5. 利用文件重定向提高调试效率
  编程得到正确结果前,往往需要多次运行程序,每次运行都需要花费不少的时间从键盘输入数据。每次输入的数据都是相同的时,会给人的心理带来不爽的感觉,并造成时间上的浪费。无论平时练习还是ACM竞赛实战,这些都是可以避免的。方法是,运用重定向。
  用下面的形式调用函数freopen()会将标准输入stdin重定向到文件input.txt(这个名字可以自己定义)。

  1. freopen("input.txt","r",stdin);    //设置输入和输出文件

  重定向后,原先从键盘(标准输入的默认设备)接受的输入,将统统从文件读取input.txt读取,这就是重定向。程序可以写作:

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int main()
  5. {
  6. freopen("input.txt","r",stdin);  //只加这一句输入将被重定向到文件input.txt
  7. int a,b;
  8. cin>>a>>b;
  9. cout<<a+b<<endl;
  10. return 0;
  11. }

  于是,在运行程序前,将本该由键盘输入的数据,写到文件input.txt中。而在运行程序时,数据将不再需要人去输入。那个快,很享受。
  需要注意的是,调试通过的程序,千万不要直接提交到OJ平台上去。如果竞赛中这样做了,罚你的20分钟不要算到我的头上。提交的程序要把输入重定向的一行删除,这样才算是符合要求的,可以获得AC的程序。

  除了删除那一行,还有一种简单的做法是,提交前将这一行前加上注释符"//",效果是一样的。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int main()
  5. {
  6. //freopen("input.txt","r",stdin);  //只加这一句输入将被重定向到文件input.txt
  7. int a,b;
  8. cin>>a>>b;
  9. cout<<a+b<<endl;
  10. return 0;
  11. }

  还有用条件编译处理的方法,暂不讲了。

acm中的循环输入(转)的更多相关文章

  1. [ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式

    ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入. C/C++代码中 ...

  2. 在oj中Python的循环输入问题解决

    在oj中Python的循环输入问题解决 在makefile中定义逗号字符串和空格字符串 在linux服务器上面部署javaweb项目jar包 数据结构与算法之栈(Java与Python实现) 在oj中 ...

  3. ACM中使用 JAVA v2. 1

    ACM中使用JAVA v2.1 严明超 (Blog:mingchaoyan.blogbus.com Email:mingchaoyan@gmail.com) 0.前 言 文前声明:本文只谈java用于 ...

  4. Java在ACM中的应用

    Java在ACM中的应用 —. 在java中的基本头文件(java中叫包) import java.io.*; import java.util.*; //输入Scanner import java. ...

  5. IO/ACM中来自浮点数的陷阱(收集向)

    OI/ACM中经常要用到小数来解决问题(概率.计算几何等),但是小数在计算机中的存储方式是浮点数而不是我们在作数学运算中的数,有精度的限制. 以下以GUN C++为准,其他语言(或编译器)也差不了多少 ...

  6. ACM中的浮点数精度处理

    在ACM中,精度问题非常常见.其中计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模板一般就不成问题了.精度问题则不好说,有时候一个精度问题就可能成为一道题的瓶颈,让你debu ...

  7. ACM中Java的应用

    先说一下Java对于ACM的一些优点吧: (1) 对于熟悉C/C++的程序员来说Java 并不难学,两周时间基本可以搞定一般的编程,再用些时间了解一下Java库就行了.Java的语法和C++非常类似, ...

  8. [原创]浅谈JAVA在ACM中的应用

    由于java里面有一些东西比c/c++方便(尤其是大数据高精度问题,备受广大ACMer欢迎),所以就可以灵活运用这三种来实现编程,下面是我自己在各种大牛那里总结了一些,同时加上自己平时遇到的一些jav ...

  9. Java编程中获取键盘输入实现方法及注意事项

    Java编程中获取键盘输入实现方法及注意事项 1. 键盘输入一个数组 package com.wen201807.sort; import java.util.Scanner; public clas ...

  10. centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课

    centos  shell脚本编程2 if 判断  case判断   shell脚本中的循环  for   while   shell中的函数  break  continue  test 命令   ...

随机推荐

  1. get time等时间指令的用法

    如图,活动时间是选择的方式选取,虽然可以通过定位年月日时来实现选择,这务必带来很多脚本内容.这里用另外的方法实现 1.使用"get time"指令获得当前系统时间 ${1} = 2 ...

  2. jmeter之请求体类型

    一.当post方法的提交数据类型(content-type)为multipart/form-data,请求体为文件文件上传. fiddler抓包请求体的name对应jmerter文件上传的参数名称,f ...

  3. 一文带你看透什么是ResNet

    目录 什么是ResNet 提出背景 梯度爆炸/梯度消失: 退化现象: 原理解析 网络结构 参考资料 什么是ResNet 首先我们来看什么是ResNet,其全称为Residual Network(残差网 ...

  4. phpoffice php操作excel表格的导入和导出

    https://packagist.org/packages/phpoffice/phpexcel 使用: composer require phpoffice/phpexcel 控制器引入 //引入 ...

  5. 二、C语言基础知识

    声明 本文内容大多取自<高级语言程序设计一书>,为本人学习笔记记录,切勿用于商业用途. 第一节 C 语言发展和特点 C 语言是当今最流行的计算机语言之一,是一种结构化的高级语言. 一.C ...

  6. 打造企业级AI文案助手:GPT-J+Flask全栈开发实战

    一.智能文案革命的序幕:为什么需要AI文案助手? 在数字化营销时代,内容生产效率成为企业核心竞争力.据统计,营销人员平均每天需要撰写3.2篇文案,而传统人工创作存在三大痛点: 效率瓶颈:创意构思到成文 ...

  7. 在postman中为每个测试用例添加相同的请求头

    最近在学习的时候看到可以在postman中可以为每个测试用例添加相同的请求头,这个就不用单独去设置了,可以说是非常好用,遂记录一下. 具体设置如下: https://postman.org.cn/

  8. 后缀数组(SA)

    后缀数组 P3809 [模板]后缀排序 定义: 对给定字符串的所有后缀排序后得到的sa.rk数组 sa[i]->排名为i的后缀的位置 rk[i]->位置为i的后缀的排名 容易发现,sa与r ...

  9. 实现高质量视频通话的javascript技巧与方法

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  10. Unity+MediaPipe虚拟试衣间技术实现全攻略

    引言:数字时尚革命的序章 在元宇宙概念席卷全球的今天,虚拟试衣技术正成为连接物理世界与数字孪生的关键桥梁.本文将深入解析基于Unity引擎结合MediaPipe姿态估计框架的虚拟试衣系统实现,涵盖从环 ...