ACM第一课正确处理输入输出.docx
- 文档编号:1349416
- 上传时间:2022-10-21
- 格式:DOCX
- 页数:19
- 大小:568.15KB
ACM第一课正确处理输入输出.docx
《ACM第一课正确处理输入输出.docx》由会员分享,可在线阅读,更多相关《ACM第一课正确处理输入输出.docx(19页珍藏版)》请在冰豆网上搜索。
ACM第一课正确处理输入输出
ACM第一课正确处理输入输出
一,输入输出原理
之所以我们平时编程输入输出都是在一个黑框框里面完成的,是因为你输入流和输入流都是在这个黑框框里面看到的。
所以导致好多同学看到“SampleInput”
12
34
56
78
想到的是先把所有输入存起来,然后再输出a+b的结果。
因为这样在黑框框里面看到的结果才和标准的一样。
如果你真的明白了什么是输入输出流,你就不会这么写了。
如上图,你给程序一个输入流,经过程序处理后,会给出一个输出流。
默认情况下,输入流由键盘敲入,就是俗称的黑框框。
输出流的显示也是在黑框框里面。
如果我们人工改变它,比如,输入流成了一个文本文档,输出流也成了一个文本文档。
将这两项分开。
你现在就应该明白为啥会这样写了吧?
其中用途是将输入流重定向为一个文档文件in.txt
同理是将输出流重定向为一个文档文件out.txt
打开当前cpp文件所在目录
新建一个名字为in的txt文档,在里面输入
13
45
67
保存,然后执行上一段代码,会自动生成一个out.txt
打开里面,你就看到输出结果
5
9
13
怎样?
是不是和题目给的samplein和sampleout格式看起来一样了?
所以你在考虑编程的时候要把输入输出流分开考虑。
不必先把所有输出流存下来然后输出,来一个输一个就OK了。
细心的人会发现我在循环里面写的是
EOF是endoffile明白了吧?
默认系统给他的值是-1用-1替换EOF也行,不过为了程序的可阅读性。
还是用EOF好。
为啥不用cin?
cin,cout的处理速度很慢,之所以你没有体会到,是因为给你的用力少,如果给你1000000000个用力,cin接收字符的速度慢就会被放大,有的题就会超时。
所以建议大家全用scanf和printf。
Scanf函数返回值就是读出的变量个数,如:
scanf(“%d%d”,&a,&b);
如果只有一个整数输入,返回值是1,如果有两个整数输入,返回值是2,如果一个都没有,则返回值是-1。
所以用来结束程序。
好多人用while
(1)晕,不超时才怪。
二,常见的输入
1),
Input
Theinputwillconsistofaseriesofpairsofintegersaandb,separatedbyaspace,onepairofintegersperline.
SampleInput
15
1020
这种输入是以EOF为文件结尾,所以只要检测EOF就OK了。
就是上面我写的那种方法。
2),
Input
InputcontainsanintegerNinthefirstline,andthenNlinesfollow.Eachlineconsistsofapairofintegersaandb,separatedbyaspace,onepairofintegersperline.
SampleInput
2
15
1020
先给出测试用力个数n,然后给出n行。
解决方法就是先接收字符n,然后控制循环循环n次,每次接收两个数。
代码不提供了,自己写。
3),
Input
Inputcontainsmultipletestcases.Eachtestcasecontainsapairofintegersaandb,onepairofintegersperline.Atestcasecontaining00terminatestheinputandthistestcaseisnottobeprocessed.
SampleInput
15
1020
00
结束条件不是EOF了!
!
是一个指定的00所以你一定别写成EOF了。
好多用例很阴的比如
23
45
00
66
46
如果用EOF结束,你应该知道发生了啥。
。
。
。
。
。
方法就是输入两个数,检测一下是不是00,简单吧?
4),
以上三种情况的组合。
给你举个比较复杂的例子:
Input
Inputcontainsmultipletestcases.EachtestcasecontainsaintegerN,andthenNintegersfollowinthesameline.Atestcasestartingwith0terminatestheinputandthistestcaseisnottobeprocessed.
SampleInput
41234
512345
0
每行先给一个数字N,然后后面跟着N个数,以0为结束。
所以你只要检测第一个数是否是0,如果不是,接收N个字符,是退出。
5),字符输入,比较恶心。
Input
Inputtothisproblemwillconsistofa(non-empty)seriesofupto100datasets.Eachdatasetwillbeformattedaccordingtothefollowingdescription,andtherewillbenoblanklinesseparatingdatasets.Allcharacterswillbeuppercase.
Asingledatasethas3components:
Startline-Asingleline,"START"
Ciphermessage-Asinglelinecontainingfromonetotwohundredcharacters,inclusive,comprisingasinglemessagefromCaesar
Endline-Asingleline,"END"
Followingthefinaldatasetwillbeasingleline,"ENDOFINPUT".
SampleInput
START
NSBFW,JAJSYXTKNRUTWYFSHJFWJYMJWJXZQYTKYWNANFQHFZXJX
END
START
NBTZQIWFYMJWGJKNWXYNSFQNYYQJNGJWNFSANQQFLJYMFSXJHTSINSWTRJ
END
START
IFSLJWPSTBXKZQQBJQQYMFYHFJXFWNXRTWJIFSLJWTZXYMFSMJ
END
ENDOFINPUT
其中有几个特殊字符startendendofinput读懂题意就明白啥意思了。
字符比较就能解决。
主要是怎么去接收这些字符串呢?
而且还有空格。
scanf(“%s”,str);可以么?
不行啊,,,有空格,比如第一个他收到NS就退出了。
gets(str);可以么?
显然他是可以的。
但在用gets时要注意题目的输入中是否有数值输入,gets()会吸收‘\n’所以如果是一个数值后面跟着一个字符串,就要先吸收掉一个‘\n’然后再接收字符串。
getline是一个函数,它可以接受用户的输入的字符,直到已达指定个数,或者用户输入了特定的字符。
它的函数声明形式(函数原型)如下:
istream&getline(charline[],intsize,charendchar='\n');
不用管它的返回类型,来关心它的三个参数:
charline[]:
就是一个字符数组,用户输入的内容将存入在该数组内。
intsize:
最多接受几个字符?
用户超过size的输入都将不被接受。
charendchar:
当用户输入endchar指定的字符时,自动结束。
默认是回车符。
结合后两个参数,getline可以方便地实现:
用户最多输入指定个数的字符,如果超过,则仅指定个数的前面字符有效,如果没有超过,则用户可以通过回车来结束输入。
charname[4];
cin.getline(name,4,'\n');
由于endchar默认已经是'\n',所以后面那行也可以写成:
cin.getline(name,4);
相关注意的事项请参考咱们本校资料里面的cin和scanf在使用时的注意事项
三,常见的输出
输出就比较容易了。
1),见的最多
1
3
4
这种输出只要在正常输出的数值后面加个换行符就ok
2),
Output
Foreachpairofinputintegersaandbyoushouldoutputthesumofaandb,andfollowedbyablankline.
每两个输出之间有空行。
好多人刚开始都是用的这种方法:
直接两个\n\n你提交,他会提示你格式出错因为结尾的地方你给了两个空行,显然是不行的。
解决方法是,用一个tag初值为0,当输出的时候检查它是不是0,如果是0,说明是第一次输出,则输出xxxxxxxxxxxx\n然后把tag值变成1。
当第N次(N>1)输出时,检查到tag为1按照\nxxxxxxxxx\n输出就OK了。
3),
形如
12345678
23456789
34567890
这种输出看似简单,其实很阴,如果你的输出是“%d空格”那么最后一个输出也有一个空格,如果你的结果正确,提交后肯定是格式出错。
所以怎么解决这个问题呢?
还是和2一样,检测,如果是第一次,输出一个数,没有空格,如果不是第一次,空格+数值,最后补个换行。
Ok!
!
在做题时的一点建议:
最好把给的用例粘贴到记事本里面看,然后全选。
看看输出是不是有啥特殊的地方。
比如刚才的3),如果正常输出的话如下图
如果你的输出最后也有空格
看到了吧?
ACM第二课评测机中各种状态
Verdictsofthejudgesystem
Verdict
Abbreviation
Indication
Accepted
AC
Thesolutionhasproducedoutputthatthejudgesystemoracheckerprogram(commonlyreferredtoasaspecialjudge)acceptsascorrect.
通过
PresentationError
PE
Thesolutionhasproducedoutputthatiscorrectincontentbutincorrectinformat.
答案正确,格式出错。
TimeLimitExceeded
TLE
Thesolutionhasrunforlongertimethanpermitted.Thismeanseitherthetimespentonalltestcasesexceedsthe
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACM 第一 正确处理 输入输出