博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
acm中的循环输入(转)
阅读量:6758 次
发布时间:2019-06-26

本文共 2955 字,大约阅读时间需要 9 分钟。

(转自)ACM题目中输入数据的处理(C语言版)见:

 字符串的输入

while(gets(p))

  printf("%s",p);  

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

  实际上,这些模式不仅是OJ平台上做题的需要。在平时的自由编程练习中,也可以自行使用这些模式,以提高调试程序的效率。对程序测试的意识也将在此过程中得到提升。

  本文1-4部分介绍了几种类型输入的处理,第5部分介绍通过输入重定向提高调试程序效率的方法。
1. 最简单的输入
例1:

[plain]   
 
 
  1. Description  
  2. 计算 a+b  
  3.   
  4. Input  
  5. 两个整数 a,b  
  6.   
  7. Output  
  8. a+b的值  
  9.   
  10.   
  11. Sample Input  
  12. 1 2  
  13.   
  14. Sample Output  
  15. 3  

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

[cpp]   
 
 
  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:

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

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

[cpp]   
 
 
  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:

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

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

[cpp]   
 
 
  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:

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

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

[cpp]   
 
 
  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(这个名字可以自己定义)。

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

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

[cpp]   
 
 
  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的程序。

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

 

[cpp]   
 
 
  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. }  

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

 

 

转载于:https://www.cnblogs.com/eat-too-much/p/5675417.html

你可能感兴趣的文章
Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(10)...
查看>>
【Xamarin.Forms】在XAML中传递参数
查看>>
关于数据仓库 — 总体工具介绍
查看>>
最大的错误是不敢犯错
查看>>
跟我学交换机配置(七)
查看>>
makefile 中 $@ $^ % 2015-04-11 18:02:36
查看>>
C#强化系列文章三:实验分析C#中三种计时器使用异同点
查看>>
Linux 进程间通信(一)
查看>>
通用对象池ObjectPool的一种简易设计和实现方案
查看>>
HTTP压缩仍让加密连接处于风险之中
查看>>
乐视阿里达成百亿元销售框架
查看>>
戴尔通过提升大数据分析能力巩固“全数据”战略 帮助企业在现代数据经济中蓬勃发展...
查看>>
⑤Windows Server 8 RemoteFX体验
查看>>
《企业云桌面实施》-小技巧-03-vSAN6.5中SAS和SSD的使用建议
查看>>
cocos2d-x学习笔记番外篇02:获取系统毫秒时间
查看>>
perl学习笔记(1)
查看>>
连接第三方 腾讯QQ家校.师生群向智慧教学一路狂奔
查看>>
简单三步,搞定“量产”Windows 2008
查看>>
excel查找替换转义问号
查看>>
初始化游戏状态数据
查看>>