关于ACM的输入输出(一)

一般来说ACM的现场赛会规定输入输出

或者是文件输入标准输出

也可能是文件输入文件输出

如果没有规定的话那么一般就是标准的输入输出了

那说一下输入输出的重定向

一般用下面两种方法

c++常用:

  1. #include <fstream.h>
  2.  
  3. ifstream filein("data.in"); // 定义一个文件输入流
  4.  
  5. ofstream fileout("data.out"); //cout<< --> fileout<<
  6.  
  7. filein.eof() //文件到末尾,返回非零值

data.in表示输入的数据文件

本地测试的话本来输入的数据就要在这个文件里面测试了

建一个本地的文本data.in,可以用记事本的方式打开

注意:文件输入的话,以后的cin>>都要改成filein>>, cout<<都要改成fileout<<

c语言常用:

  1. freopen("date.in","r",stdin); //重定向所有标准的输入为文件输入
  2.  
  3. freopen("date.out","w",stdout);//重定向所有标准的输出为文件输出
  4.  
  5. fclose(stdout);//输出结束
  6.  
  7. freopen("date.in","r",stdin); //重定向所有标准的输入为文件输入
  8.  
  9. freopen("date.out","w",stdout);//重定向所有标准的输出为文件输出
  10.  
  11. fclose(stdout);//输出结束

第一句的意思就是文件输入,以"读状态",去替换标准的输入

以上如果只是规定用文件输入输出 的某一种,那么就只用其中的一种

关于ACM的输入输出(二)

ACM题目特点: 由于ACM竞赛题目的输入数据和输出数据一般有多组(不定),并且格式多种多样,所以,如何处理题目的输入输出是对大家的一项最基本的要求。这也是困扰初学者的一大问题。 ACM的输入输出要求严格按照规定来,所以你不需要输出像"Please input the data"这类的提示语。否则将会被判Wrong Answer。
1、输入
初学者一般有个误区:如果题目包含多组测试数据,他们就会把输入的内容全部保存起来,然后再依次处理。
其实程序的输入\输出是相互独立的,因此,每当处理完一组测试数据,就应当按题目要求进行相应的输出操作。而不必将所有结果储存起来一起输出。
下面来介绍一下ACM中常见的一些输入情况。

只有一组测试数据
这类题目是最简单的,比如第1000题。参考代码:

  1. #include
  2. int main(void)
  3. {
  4. int a, b;
  5. scanf("%d %d", &a, &b);
  6. printf("%d\n", a + b);
  7. return ;
  8. }

没有明确指出输入什么时候结束 

如果是这种情况,我们默认是以“文件结束”(EOF)为结束标志。
这是ACM的默规,例如1076题。参考代码:

  1. #include
  2. int main(void)
  3. {
  4. int a, b;
  5. while (scanf("%d %d", &a, &b) != EOF)
  6. printf("%d\n", a + b);
  7. return ;
  8. }

指定数据量 

有时会在数据的第一行提供数据量大小,比如第一行是100,则表示有100组数据。比如第1077题。参考代码:

  1. #include
  2. int main(void)
  3. {
  4. int n, a, b;
  5. scanf("%d", &n);
  6. while (n--)
  7. {
  8. scanf("%d %d", &a, &b);
  9. printf("%d\n", a + b);
  10. }
  11. return ;
  12. }

以特定元素作结束符 

这种输入和第一种类似。常见的是规定以0作为结束符。
比如第1078题。参考代码:

  1. #include
  2. int main(void)
  3. {
  4. int a, b;
  5. while (scanf("%d %d", &a, &b), a || b)
  6. printf("%d\n", a + b);
  7. return ;
  8. }

输出

输出格式统一
这种比较简单,只要按要求来就没问题的。
比如每组输出占一行,或者每组输出后面加一个空行。比如1000题。

数据之间有空行
对于这种输出,有时候还会告诉你有几组输入,这样你就可以自己判断一下是不是最后一组。是就不输出空行,否则多输出一个空行。而有时候连共有几组数据都不会告诉你。其实不论知不知道有几组数据,我们都可以这样处理。

第一组数据后面不加空行。
第二组开始,每组前面加空行。 比如第1079题,参考代码:

  1. #include
  2. int main(void)
  3. {
  4. int a, b, i = ;
  5. while (scanf("%d %d", &a, &b), a || b)
  6. printf((i++? "\n%d\n": "%d\n"), a + b);
  7. return ;
  8. }

关于ACM的输入输出(三)

在线判决系统是机器判题系统,也就是俗称的OJ(Online Judge),机器判决的一个特点就是必须100%的吻合才能判为正确,否则要么WA,PE。同时对于提交的程序还有一定的时间限制,如果超过时间则会判超时。OJ一般采用的是标准输入输出,所以提交的时候我们不必要使用文件读入输出(这与高中的信息学是不同的),机器判决只针对程序结果,不针对程序,所以很多时候直接提交数据也是可以的,俗称打表。

下面介绍常用的处理输入的方法

几种常用的处理输入方法(C语言)
感觉新人对于处理输入输出存在一些问题,这里写出几个常用到的处理方法:
1.知道输入数据组数n

  1. scanf("%d",&n);
  2. whlie(n--){
  3. 这里处理每一组输入.然后直接按格式输出,没必要开数组存储答案.
  4. }

2.没有数据总数,以EOF结束

可能用的几个函数:

  1. scanf():
  2. while(scanf("%s|%d")!=EOF){
  3. 处理每一组数据,并输出.
  4. }
  5. getchar():读入一个字符
  6. whlie((ch=getchar())!=EOF){
  7.  
  8. }
  9. gets():读入一行
  10. while(gets(buf)!=NULL) {
  11.  
  12. }

用getchar,gets注意读入读入换行符.

3.以0或-1结束的输入.
  while(scanf("%d",&n),n!=0) {
 
  }

关于C++的输入输出处理:

cin读字符串时遇到空白符(空格,换行等)结束

  1. char str[BUFFER];
  2. while (cin >> str) {
  3. }
  4. getline读字符串时遇到换行符结束,用于读一整行
  5. char str[BUFFER];
  6. while (cin.getline(str, BUFFER)) {
  7. }
  8. string str;
  9. while (getline(cin, str)) {
  10. }

cin/cout要比scanf/printf慢一些,尽可能使用scanf/printf以避免测试大量数据时因为输入输出慢而导致TLE. putchar/getchar要比scanf/printf更快

ACM技巧 使用文件输入输出方便测试的方法

把下面两块宏语句分别嵌在main函数的开始和结束,这样在本地调试的时候,cin/cout和scanf/printf直接对应到指定的文件流,但提交到OJ时,此两句不被编译,所以仍为标准I/O流,因此不用提交前改代码。

后面一块宏不用也可以,前面一块宏根据自己的输入文件改变"in.txt","out.txt",也可以只用其一。

  1. #include <iostream>
  2. #include <cstdio>
  3.  
  4. using namespace std;
  5.  
  6. #ifndef ONLINE_JUDGE
  7. freopen("in.txt","r",stdin);
  8. freopen("out.txt","w",stdout);
  9. #endif
  10.  
  11. #ifndef ONLINE_JUDGE
  12. fclose(stdin);
  13. fclose(stdout);
  14. #endif

用这种方法,cin/cout和scanf/printf都可以转化为文件流

C语言输入输出函数详解

C语言中基本的输入输出函数有:
putchar ():把变量中的一个字符常量输出到显示器屏幕上;
getchar ();从键盘上输入一个字符常量,此常量就是该函数的值;
printf  ();把键盘中的各类数据,加以格式控制输出到显示器屏幕上;
scanf   ();从键盘上输入各类数据,并存放到程序变量中;
puts    ():把数组变量中的一个字符串常量输出到显示器屏幕上;
gets    ():从键盘上输入一个字符串常量并放到程序的数组中.
sscanf(); 从一个字符串中提取各类数据。

putchar()
和 getchar() 顾名思议就是从输入流中获取一个字符和输出一个字符,比较简单,不再多讲。
例子如下:
char c = getchar();
putchar(c);

格式化输入输出scanf()和printf()是最有用的,所以重点讲一下。
printf():
一般形式:
printf("格式控制".输出列表);  
eg : printf("a=%d,b=%f,c=%c\n",a,b,c);
1;格式控制.
格式控制是用双引号括起来的字符串,也称"转换控制字符串",它包含以下两部分信息.
格式说明:由"%"和格式字符组成,如%d,%f,%c,他的作用是把输出数据转换为指定格式输出,格式的说明总是由"%"字符开始的.
普通字符:需要原样输出的字符,或者是一些有特殊含义的字符,如\n,\t。
2;输出列表
就是需要输出的一些数据,也可以是表达式,如果在函数中需要输出多个变量或表达式,则要用逗号隔开.

一些特殊字符的输出:
单引号,双引号,和反斜杠的输出在前面加转义字符”\”
如:”\’”  ,
 “\””   ,  “\\”
%的输出用两个连在一起的%%,即printf(“%%”);

常用的格式说明如下:
格式字符
d  以十进制形式输出带符号整数(正数不输出符号)

o  以八进制形式输出无符号整数(不输出前缀O)

x  以十六进制形式输出无符号整数(不输出前缀OX)

u  以十进制形式输出无符号整数
f  以小数形式输出单精度实数
lf以小数形式输出双精度实数
e  以指数形式输出单、双精度实数
g  以%f%e中较短的输出宽度输出单、双精度实数
c  输出单个字符
s  输出字符串

这里强调一下:网上很多文章都说f 和lf是一样的,即不管单精度,双精度浮点数,都可以用f, 但我在POJ上做过测试,输出Double时用f确实也可以 ,但读入时,用f就报WA,所以大家如果对Double进行读写的话,都用lf吧。说到Double,再啰嗦一句,建议大家要用到浮点数时都用Double,不要用float,因为在很多情况下,float精度不够会导致WA。
特殊:
对64位整数的输入输出,在POJ上的C++环境下(即VC),64位整数是:
__int64    (注意int前面是两个下划线)
输入输出格式为”%I64d”.
在G++环境下(即Dev C++) 64位整数是
long long
输入输出格式为”%lld”.

输出宽度

  用十进制整数来表示输出的最少位数。 注意若实际位数多于定义的宽度,则按实际位数输出, 若实际位数少于定义的宽度则补以空格或0。
精度
  精度格式符以“.”开头,后跟十进制整数。意义是:如果输出数字,则表示小数的位数;如果输出的是字符, 则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
标志格式字符
-  结果左对齐,右边填空格
+  输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号
例如:
double c=24212345.24232;
printf(“%020.4”);
 表示输出精确到小数点后4位,输出占20位,若有空余的位补0.
scanf:
scanf的很多用法都是和printf对应的,故不再赘述。
说一下scanf一个特别好用的地方,就是可以滤去一些不想要的东西。
举例说明如下:
比如输入为日期 yyyy-mm-dd,就可以这样写:
int year,moth,day;
scanf(“%d-%d-%d”,&year,&moth,&day);
再比如:
scanf("%3d %*3d %2d",&m,&n);      输入113 118 69回车(系统将113赋予m,将69赋予n,因为*号表示跳过它相应的数据所以118不赋予任何变量)
puts()用的不多,且基本都能用printf()代替,故不再多说。
gets()是从输入流中获取一行字符串放入字符数组中:
char in[100];
gets(in);
大家可能最容易出错的地方就是字符串的输入,所以强调一下:
能进行字符,字符串输入的有:
getchar(), scanf(“%c”); scanf(“%s”), gets()
其中getchar() 和 scanf(“%c”)的功能是一样的。
需要注意的是,这两个函数读入的是输入流中当前位置的字符,
比如:
    scanf(“%d”,&n);
    c = getchar();
假设输入 67/ (假设“/”代表回车),则第一个scanf读入一个整数67后,当前输入流的位置是67之后,即指向回车符,所以第二个getchar()读入的就是一个回车符了,即 c = ‘\n’。
同样,gets()也是从当前位置读入一行字符串。
比如:
scanf(“%d”,&n);
gets(str);
此时读入字符数组中的字符串就是“\n” 了
所以通常在用scanf读入一个非字符串的类型之后,如果要读入字符,或字符数组,都用一个额外的getchar()把回车符读掉,若后面跟的不止一个回车符,可能还有多余的空格的话,就用gets()读掉。
    和以上不同的是,scanf(“%s”) 读入的时候是会忽略掉空格,回车和制表符的。并且以空格,回车和制表符作为字符串结束的标志。
    经常会有这样的题,输入第一行是一个整数,接下来每行的第一个是一个字符,用来表示某种操作,后面再跟一些数据,比如:
4
A 100 2
B 23
A 23 89
B 34
像这种输入就需要小心,读入字符时不要读成回车符。
为了防止意外,我一般是这样处理这类输入的:
char model[2];
Scanf(“%d”,&n);
for(…,…,…){
    scanf(“%s”,model);
    if(model[0] == ‘A’){
}
else{
}
}
    sscanf():
sscanf()经常用来分解字符串,功能非常强大,但很多功能都需要正则表达式的知识,所以就介绍一下最简单的几种用法,大家如果想了解更多的话,自己去网上找吧。
1、
char str[100],str1[100],str2[100];
gets(str);
sscanf(str,”%s%s”,str1,str2);
将读入的一整行字符串按空格,制表符或回车符分割成两个字符串。
2、
取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
  sscanf("123456
", "%4s", str);
    对于C++的输入输出就不再详细的讲了,因为cin,cout的速度实在太慢,不推荐使用,我一般都是到万不得已时才用。比如当你要读入字符串到string 对象中时,就只能用cin了,这时候还有一个常见的问题,就是如何将一整行字符串读入一个string 中,这就要用到getline函数了。
用法为:
getline(cin, str);
第一个参数就是标准输入流cin ,第二个参数是接收读入数据的string对象,本来还有第三个参数,是结束符的标志,但通常用它默认的就可以了,所以不用管。
注意区分这个getline和cin.getline的区别:
cin.getline的用法如下:
char str[20];
cin.getline(str,20); 表示从读入的一行字符串中,取最多20各字符放入字符数组str中,注意此处的str是字符数组,而上面的str是string对象。
    另外需要注意的是,千万不要把cout和printf混用,因为cout是带缓冲的而printf不带,所以会使得输出的数据顺序混乱。

ACM的输入输出总结的更多相关文章

  1. Python3 acm基础输入输出

    案例一:输入字符串分割并转化成多个int数值 a, b= map(int, input().split()) try: while True: a, b= map(int, input().split ...

  2. 新手入门 acm 输入输出练习

    A + B Problem(1000) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  3. woj1002-Genesis woj1003-birthofnoah woj1004-noah's ark

    title: woj1002-Genesis date: 2020-03-05 categories: acm tags: [acm,woj] 输入输出考虑一下.easy #include <i ...

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

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

  5. 在竞赛ACM Java处理输入输出

    一.Java之ACM注意点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错误,所以在我看来好多OJ系统做的是非 ...

  6. ACM竞赛之输入输出

    http://acm.njupt.edu.cn/acmhome/problemdetail.do?id=1083&method=showdetail 比赛描述 字符串的输入输出处理. 输入 第 ...

  7. ACM录 之 输入输出。

    —— 简单介绍一下ACM里面的输入输出... —— 主要说C++的输入输出(其实其他的我不会...). —— C++里面有输入输出流,也就是cin和cout,用起来也算是比较方便吧... —— 但是, ...

  8. ACM竞赛之输入输出(以C与C++为例)

    本文转自互联网,内容.排版有修正. 欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju G ...

  9. ACM之Java输入输出

    本文转自:ACM之Java输入输出 一.Java之ACM注意点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错 ...

随机推荐

  1. websocket集群情况下Nginx 代理出现的坑

    那么问题的背景: A想给B发送socket 消息 ! A这消息 这时候被Nginx 轮询发到了C 服务器上! 擦!   这时候就蛋疼了!   要接收消息那个人在B服务器上!     B就这样苦逼的收不 ...

  2. 《UNIX网络编程》 -- 第六章

    6.3 select 函数 给出描述符1.4.5而 maxfdp1 设置为6的原因: maxfdp1 是值-结果参数,这里传递的是描述符的范围,类似之前的 size_of(length).又因为描述符 ...

  3. CodedUI Test 测试WPF程序,无法获取控件属性值的解决方法

    注意注意!ItemStatus 在VS2010的CUIT里面是没有的!需要2013以上的版本才可使用. 公司新程序使用WPF制作,但使用CodedUI Test进行自动化测试的时候,很多控件抓取不到其 ...

  4. 扩展类 HOW TO EXTEND CLASSES TO MAKE NEW CLASSES IN PYTHON

    How to Extend Classes to Make New Classes in Python - dummies https://www.dummies.com/programming/py ...

  5. Java基础知识大全

    本文引用于: http://uule.iteye.com/blog/762949 /; DecimalFormat df = new DecimalFormat("0.00");/ ...

  6. Testlink安装访问提示“应用程序DEFAULT WEB SITE”中的服务器错误

    错误摘要:HTTP错误403.14 - ForbiddenWeb服务器被配置为不列出此目录的内容.

  7. Spring IOC/DI和AOP原理(转发:https://www.cnblogs.com/techroad4ca/p/5770073.html)

    一 IOC/DI 1. 概念及原理 IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序.对象及其依赖对 ...

  8. 1.7 使用电脑测试MC20的发送带中文的短信功能

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  9. 爬虫五 Beautifulsoup模块详细

    一.基本使用 from bs4 import BeautifulSoup htmlCharset = "GB2312" soup=BeautifulSoup(html_doc,'l ...

  10. Git处理 行结束符

    Dealing with line endings (Windows) 如果你正在使用Git在GitHub上和别人协作的话,确保Git处理行结束符的配置已经正确配置了. 每次在键盘上按下return键 ...