ACM第一课正确处理输入输出文档格式.docx
《ACM第一课正确处理输入输出文档格式.docx》由会员分享,可在线阅读,更多相关《ACM第一课正确处理输入输出文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
其中用途是将输入流重定向为一个文档文件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),
InputcontainsanintegerNinthefirstline,andthenNlinesfollow.Eachlineconsistsofapairofintegersaandb,separatedbyaspace,onepairofintegersperline.
2
先给出测试用力个数n,然后给出n行。
解决方法就是先接收字符n,然后控制循环循环n次,每次接收两个数。
代码不提供了,自己写。
3),
Inputcontainsmultipletestcases.Eachtestcasecontainsapairofintegersaandb,onepairofintegersperline.Atestcasecontaining00terminatestheinputandthistestcaseisnottobeprocessed.
1020
00
结束条件不是EOF了!
!
是一个指定的00所以你一定别写成EOF了。
好多用例很阴的比如
23
66
46
如果用EOF结束,你应该知道发生了啥。
。
方法就是输入两个数,检测一下是不是00,简单吧?
4),
以上三种情况的组合。
给你举个比较复杂的例子:
Inputcontainsmultipletestcases.EachtestcasecontainsaintegerN,andthenNintegersfollowinthesameline.Atestcasestartingwith0terminatestheinputandthistestcaseisnottobeprocessed.
41234
512345
0
每行先给一个数字N,然后后面跟着N个数,以0为结束。
所以你只要检测第一个数是否是0,如果不是,接收N个字符,是退出。
5),字符输入,比较恶心。
Inputtothisproblemwillconsistofa(non-empty)seriesofupto100datasets.Eachdatasetwillbeformattedaccordingtothefollowingdescription,andtherewillbenoblanklinesseparatingdatasets.Allcharacterswillbeuppercase.
Asingledatasethas3components:
Startline-Asingleline,"
START"
Ciphermessage-Asinglelinecontainingfromonetotwohundredcharacters,inclusive,comprisingasinglemessagefromCaesar
Endline-Asingleline,"
END"
Followingthefinaldatasetwillbeasingleline,"
ENDOFINPUT"
.
START
NSBFW,JAJSYXTKNRUTWYFSHJFWJYMJWJXZQYTKYWNANFQHFZXJX
END
NBTZQIWFYMJWGJKNWXYNSFQNYYQJNGJWNFSANQQFLJYMFSXJHTSINSWTRJ
IFSLJWPSTBXKZQQBJQQYMFYHFJXFWNXRTWJIFSLJWTZXYMFSMJ
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,'
由于endchar默认已经是'
,所以后面那行也可以写成:
cin.getline(name,4);
相关注意的事项请参考咱们本校资料里面的cin和scanf在使用时的注意事项
三,常见的输出
输出就比较容易了。
1),见的最多
1
3
4
这种输出只要在正常输出的数值后面加个换行符就ok
Output
Foreachpairofinputintegersaandbyoushouldoutputthesumofaandb,andfollowedbyablankline.
每两个输出之间有空行。
好多人刚开始都是用的这种方法:
直接两个\n\n你提交,他会提示你格式出错因为结尾的地方你给了两个空行,显然是不行的。
解决方法是,用一个tag初值为0,当输出的时候检查它是不是0,如果是0,说明是第一次输出,则输出xxxxxxxxxxxx\n然后把tag值变成1。
当第N次(N>
1)输出时,检查到tag为1按照\nxxxxxxxxx\n输出就OK了。
形如
12345678
23456789
34567890
这种输出看似简单,其实很阴,如果你的输出是“%d空格”那么最后一个输出也有一个空格,如果你的结果正确,提交后肯定是格式出错。
所以怎么解决这个问题呢?
还是和2一样,检测,如果是第一次,输出一个数,没有空格,如果不是第一次,空格+数值,最后补个换行。
Ok!
在做题时的一点建议:
最好把给的用例粘贴到记事本里面看,然后全选。
看看输出是不是有啥特殊的地方。
比如刚才的3),如果正常输出的话如下图
如果你的输出最后也有空格
看到了吧?
ACM第二课评测机中各种状态
Verdictsofthejudgesystem
Verdict
Abbreviation
Indication
Accepted
AC
Thesolutionhasproducedoutputthatthejudgesystemoracheckerprogram(commonlyreferredtoasaspecialjudge)acceptsascorrect.
通过
PresentationError
PE
Thesolutionhasproducedoutputthatiscorrectincontentbutincorrectinformat.
答案正确,格式出错。
TimeLimitExceeded
TLE
Thesolutionhasrunforlongertimethanpermitted.Thismeanseitherthetimespentonalltestcasesexceedsthe