




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022-3-241ACM程序设计输入输出格式输入输出格式2022-3-242ACM题目特点由于ACM竞赛题目的输入数据和输出数据一般有多组(不定),并且格式多种多样,所以,如何处理题目的输入输出是对大家的一项最基本的要求。这也是困扰初学者的一大问题。下面,分类介绍:2022-3-243一个超级简单的题目(ex-1):lProblem Description Your task is to calculate a + b. lInput The input will consist of a series of pairs of integers a and b, separated by a
2、 space, one pair of integers per line. lOutputFor each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.lSample input1 510 20lSample output6302022-3-244初学者很常见的一种写法:l#includelvoid main()ll int a,b;l scanf(“%d %d”,&
3、a,&b);l Printf(“%d”,a+b);l2022-3-245有什么问题呢?这就是下面需要解决的问题这就是下面需要解决的问题基本输入输出基本输入输出2022-3-246输入第一类:l输入不说明有多少个Input Block,以EOF为结束标志。 参见:ex-1.2022-3-247ex-1源代码:#include int main() int a,b; while(scanf(%d %d,&a, &b) != EOF) printf(%dn,a+b); 2022-3-248本类输入解决方案:lC语法:while(scanf(%d %d,&a, &
4、;b) != EOF) . lC+语法:while( cin a b ) . 2022-3-249说明:lScanf函数返回值就是读出的变量个数,如:scanf( “%d %d”, &a, &b ); 如果a和b都被成功读入整数,那么scanf的返回值就是2;如果只有a被成功读入整数,返回值为1;如果a和b都未被成功读入整数,返回值为0;如果遇到错误或遇到end of file,返回值为EOF lEOF是一个预定义的常量,等于-1。2022-3-2410输入第二类:l输入一开始就会说有N个Input Block,下面接着是N个Input Block。 ex-2lProblem
5、Description Your task is to calculate a + b. lInput Input contains an integer N in the first line, and then N lines follow. Each line consists of a pair of integers a and b, separated by a space, one pair of integers per line. lOutputFor each pair of input integers a and b you should output the sum
6、of a and b in one line, and with one line of output for each line in input. lSample input21 510 20lSample output6302022-3-2411ex-2源代码:#include int main() int n,i,a,b; scanf(%d,&n);for(i=0;in;i+) scanf(%d %d,&a, &b); printf(%dn,a+b); 2022-3-2412本类输入解决方案:lC语法:scanf(%d,&n) ; for( i=0 ;
7、i n; for( i=0 ; in ; i+ ) . 2022-3-2413输入第三类:l输入不说明有多少个Input Block,但以某个特殊输入为结束标志。ex-3lProblem Description Your task is to calculate a + b. lInput Input contains multiple test cases. Each test case contains a pair of integers a and b, one pair of integers per line. A test case containing 0 0 terminat
8、es the input and this test case is not to be processed. lOutputFor each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input. lSample input1 510 200 0lSample output6302022-3-2414ex-3源代码:#include int main() int a,b;while(s
9、canf(%d %d,&a, &b) &(a!=0 & b!=0) printf(%dn,a+b); 上面的程序有什么问题?上面的程序有什么问题?杜绝低级错误!2022-3-2415本类输入解决方案:如果最后一行是以一个0结尾则:lC语法:while(scanf(%d,&n) & n!=0 ) . lC+语法:while( cin n & n != 0 ) . 2022-3-2416输入第四类:l输入是一整行的字符串的参见:POJ_1298 http:/ lSample InputSTART NS BFW, JAJSYX TK NRUTW
10、YFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX END START N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ END START IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ END ENDOFINPUT 2022-3-2417本类输入解决方案:lC语法: char buf20; gets(buf); lC+语法:如果用string buf;来保存: getline( cin , buf
11、); 如果用char buf 255 ; 来保存: cin.getline( buf, 255 );2022-3-2418说明:lscanf(“ %s%s”,str1,str2),在多个字符串之间用一个或多个空格分隔;l若使用gets函数,应为gets(str1); gets(str2); 字符串之间用回车符作分隔。l通常情况下,接受短字符用scanf函数,接受长字符用gets函数。l而getchar函数每次只接受一个字符,经常c=getchar()这样来使用。2022-3-2419说明:cin.getline的用法lgetline 是一个函数,它可以接受用户的输入的字符,直到已达指定个数,或
12、者用户输入了特定的字符。它的函数声明形式(函数原型)如下:istream& getline(char line, int size, char endchar = n);l不用管它的返回类型,来关心它的三个参数:lchar line: 就是一个字符数组,用户输入的内容将存入在该数组内。lint size : 最多接受几个字符?用户超过size的输入都将不被接受。lchar endchar :当用户输入endchar指定的字符时,自动结束。默认是回车符。2022-3-2420说明续l结合后两个参数,getline可以方便地实现: 用户最多输入指定个数的字符,如果超过,则仅指定个数的前面字
13、符有效,如果没有超过,则用户可以通过回车来结束输入。lchar name4;lcin.getline(name,4,n);l由于 endchar 默认已经是 n,所以后面那行也可以写成:lcin.getline(name,4);2022-3-2421练习:l以下题目属于哪一类输入?以下题目属于哪一类输入?lPOJ_1423http:/ lPOJ_1519http:/ l更多类型http:/ Block对应一个Output Block,Output Block之间空行。 ex-4lProblem Description Your task is to calculate the sum of s
14、ome integers. lInput Input contains an integer N in the first line, and then N lines follow. Each line starts with a integer M, and then M integers follow in the same line. lOutputFor each group of input integers you should output their sum in one line, and you must note that there is a blank line b
15、etween outputs. lSample input3 4 1 2 3 4 5 1 2 3 4 5 3 1 2 3 lSample output10156 2022-3-2423以下方法什么问题?lC语法: . printf(%dnn,ans); lC+语法: . cout ans endl endl; 2022-3-2424Ex-4正确源代码l#include l int main()l l int icase,n,i,j,a,sum;l scanf(%d,&icase);l for(i=0;iicase;i+)l lsum=0;l scanf(%d,&n);lfor(
16、j=0;jn;j+)ll scanf(%d,&a);l sum+=a;llif(iicase-1)l printf(%dnn,sum);l elsel printf(%dn,sum);l l 2022-3-2425解决办法:lC语法:for (k=0;kcount;k+) while () printf( %dn,result); if (k!=count-1) printf(n); lC+语法:类似,输出语句换一下即可。2022-3-2426思考:l思考以下题目的输入格式思考以下题目的输入格式lhttp:/ long代替l使用了汉语的标点符号litoa不是ANSI函数 能将整数转换为
17、字符串而且与ANSI标准兼容的方法是使用sprintf()函数 int num = 100; char str25; sprintf(str, %d , num);l另外,拷贝程序容易产生错误2022-3-2429不常规的编程方式lPrintfPrintf和和coutcout混用的问题混用的问题l以下的程序输出什么?l#includel#includelint main()llint j=0;lfor(j=0;j5;j+)llcoutj=;lprintf(%dn,j);llreturn 0;l2022-3-2430什么问题?l一个带缓冲输出(一个带缓冲输出(coutcout)l一个不带缓冲输出
18、一个不带缓冲输出(printf)(printf)lGooleGoole你的问题,充分利用网络资源你的问题,充分利用网络资源2022-3-2431相互学习进步相互学习进步l总结一些非算法方面的错误;l将心得相互交流;l避免初级错误是准备竞赛的第一步;l不要轻视初级错误。2022-3-2432菜鸟之伤菜鸟之伤ACMACM菜鸟的菜鸟的2121个经典错误个经典错误2022-3-2433以HDU1089 AB为例lSample Inputl1 5l10 20lSample Outputl6l302022-3-2434菜鸟之伤(1)l#includelvoid main()llint a,b;lscanf
19、(“%d%d”,&a,&b);lprintf(“%dn”,a+b);l2022-3-2435菜鸟之伤(1)l总结:程序不能处理多组数据的问题是最常见的入门问题,只要掌握几种常见的类型,就可以轻松掌握了,具体处理方法曾在第一次课件有详细描述,这里省略了2022-3-2436菜鸟之伤(2)l#includelvoid main()llint a,b;lwhile(scanf(“%d%d”,&a,&b)!=0)lprintf(“%dn”,a+b);l2022-3-2437菜鸟之伤(2)l总结:文件结束符EOF的值是-1而不是0,所以while(scanf()!=0)常
20、常会因为死循环而造成TLE,这个必须牢记。l说明:不仅仅菜鸟,很多老鸟也常常因为不注意这点而犯错误,而且还常常因为想不到会犯这种低级错误而想不到原因。2022-3-2438菜鸟之伤(3)l#includelvoid main()llint a,b;lwhile(scanf(“%d%d”,&a,&b)!=EOF);lprintf(“%dn”,a+b);l2022-3-2439菜鸟之伤(3)l总结:while 或者 for循环的条件外面误加了分号,编译不影响,但是结果循环体没有真正得到多次执行;l说明:菜鸟常犯的错误,往往因为编译能通过而不能迅速察觉,尤其比赛中l提醒:提醒:当你将
21、scanf();语句加上while循环以处理多组数据问题的时候尤其注意因为之前有分号,很容易忘记去掉!2022-3-2440菜鸟之伤(4)l#includelvoid main()llint a,b;lwhile(scanf(“%d%d”,&a,&b) =2)lprintf(“%dn”,a+b);l2022-3-2441菜鸟之伤(4)l总结:C语言中,赋值符号和判断是否相等的逻辑符号具有完全不同的含义,往往因为我们的习惯问题,在编程中误将判断是否相等的逻辑符号写成赋值符号。同样的,这种失误也会因为不影响编译而影响查错的时间。l说明:菜鸟常犯的错误,但是有过几次教训就会牢记了,呵
22、呵2022-3-2442以HDU1001 Sum Problem为例lSample Inputl1l100lSample Outputl1l50502022-3-2443菜鸟之伤(5)#includevoid main() int i,n,s; while(scanf(“%d”,&n) =1) for(i=1;i=n;i+) s+=i; printf(“%dnn”,s); 2022-3-2444菜鸟之伤(5)l总结:忘记变量的初始化是典型的菜鸟问题,不必紧张,多经历几次就牢记了l说明:普通变量的初始化还比较容易查找,而用来保存计算结果的数组的初始化更是容易忘记!2022-3-2445菜
23、鸟之伤(6)#includevoid main() int i,n,s=0; while(scanf(“%d”,&n) =1) for(i=1;i=n;i+) s+=i; printf(“%dnn”,s); 2022-3-2446菜鸟之伤(6)l总结:变量初始化放在循环外,是一个典型的ACM初级错误,因为ACM赛题的多组测试特性,如果不能在循环内初始化,将只能确保第一组数据没问题,而很多入门者习惯只测试一组数据,很容易忽略这个问题。ll说明:菜鸟常犯的错误,关键是要理解为什么这样会有问题,真正理解后,修改也就不难了。2022-3-2447菜鸟之伤(7)l#includelvoid ma
24、in()lint i,n,s;lwhile(scanf(“%d”,&n) =1)lls=n*(n+1)/2;lprintf(“%dnn”,s);ll2022-3-2448菜鸟之伤(7)l总结:数组越界还能在提交后收到Runtime Error的信息反馈,而运算中的数据溢出则往往只能收到Wrong Answer的错误提示,所以这种错误往往容易被误导成算法问题;l说明:不仅菜鸟,就是大牛甚至大神,也常常犯这种错误,只是情况复杂些而已2022-3-2449菜鸟之伤(8)l#includelvoid main()lint i,n,s;lwhile(scanf(“%d”,&n) =1)l
25、ls=n/2*(n+1);lprintf(“%dnn”,s);ll2022-3-2450菜鸟之伤(8)l总结:当两个整数进行运算的时候,运算结果一定还是整数,所以不要因为常规数学惯性思维的影响而认为结果可能为浮点数;而不同数据类型一同运算的时候,运算结果的数据类型和相对复杂的类型一致(比如 整数+实数,结果类型是实数)2022-3-2451菜鸟之伤(9)l#includelvoid main()lint i,n,s;l while(scanf(“%d”,&n) =1)l if(n%2=0)l s=n/2*(n+1);l elsel s=(n+1)/2*n;l printf(“%dnn”
26、,s);l2022-3-2452菜鸟之伤(9)l总结:写for或者while等任何循环语句的时候,不管循环体内有几个语句,务必养成都加上一对大括号的好习惯。l常常碰到的情况是这样的本来循环体内只有一条语句,确实不用大括号,但是在修改程序的过程中,循环体内增加了其他语句,而这时却忘记了添加大括号!l所以说好习惯很重要!2022-3-2453菜鸟之伤(10)l#includelvoid main()lint i,n,s;l while(scanf(“%d”,&n) =1)l if(n%2=0)l s=n/2*(n+1);l elsel s=(n+1)/2*n; l printf(“%dnn
27、”,s);l2022-3-2454菜鸟之伤(10)l总结:这也是一个经典错误,虽然为循环体加了大括号,但是并没有包含全部的信息,造成的后果是只有一次输出尽管对于每组数据都处理了,但是只输出最后一组结果。l由于很多同学习惯每次只测试一组数据,就更容易忽略这个错误了.l再次证明再次证明好习惯很重要!好习惯很重要!2022-3-2455菜鸟之伤(11)l假设不会中间溢出,下面的程序是否有问题?l#includelvoid main()lint i,n,s;l while(scanf(“%d”,&n) =1)l l s=n(n+1)/2;l printf(“%dnn”,s);l l2022-3
28、-2456菜鸟之伤(11)l总结:这也是受数学习惯影响而可能出现的一个错误,当然,这个错误很好检查,因为编译不能通过的l总结出这个只是因为确实会出现这个情况,而对于极度没有编程经验的同学来说,有时候也会带来困扰2022-3-2457还是以AB为例l题目描述:计算AB的值,输入数据每行包含2个正整数,如果输入数据是两个负数,则结束输入。lSample Inputl1 5l-1 -1lSample Outputl62022-3-2458菜鸟之伤(12)l#includelvoid main()llint a,b;lwhile(scanf(“%d%d”,&a,&b)=2)l if(a
29、=-1 & b=-1) return;l printf(“%dn”,a+b);l2022-3-2459菜鸟之伤(12)l总结:正如判断相等要用“=”一样,C语言中进行逻辑与的运算也是需要两个字符“&”,类似的逻辑或运算也是两个字符“|”,如果是单个的字符,含义就完全不同了2022-3-2460菜鸟之伤(13)l上一个程序的改进版:上一个程序的改进版:l#includelvoid main()llint a,b;lwhile(scanf(“%d%d”,&a,&b)=2)l if(a=-1 & b=-1) return;l printf(“%dn”,a+b)
30、;l2022-3-2461菜鸟之伤(13)l总结:题目描述是负数结束输入,Sample Input最后给出的是-1,如果读题不仔细,很容易陷入思维定势,而会不加思索在程序中用-1判断,这样就真的会发生不幸的事件尽管我也认为这个陷阱有点阴,而且未必有很大意义,但是题目并没错,而你确实读题不仔细l说明:算是经典的小陷阱,现在很少出现了2022-3-2462继续以AB为例l题目描述:给定2个整数A和B,如果A+B0,请输出”OK!”,否则请输出”No”lSample Inputl1 5l1 -5lSample OutputlOK!lNo2022-3-2463菜鸟之伤(14)l#includelvoi
31、d main()llint a,b;lwhile(scanf(“%d%d”,&a,&b)=2)l if(a+b0) printf(“OK!n”);l else printf(“NOn”); l2022-3-2464菜鸟之伤(14)l总结:字符串输出的大小写问题对于菜鸟需要特别注意,其实,不管是全大写、全小写,还是首字母大写,你尽管复制即可(没有电子版,另当别论),当然还要注意是否有标点符号等情况。l说明:菜鸟常犯错误,稍有经验即可避免2022-3-2465以1170Balloon Comes!为例lSample Inputl4l+ 1 2l- 1 2l* 1 2l/ 1 2lS
32、ample Outputl3l-1l2l0.502022-3-2466菜鸟之伤(15)lint n,a,b,i;lchar p;lscanf(%d,&n);lfor (i=0;in;i+)ll scanf(%c%d%d,&p,&a,&b);l if( ) l2022-3-2467菜鸟之伤(15)l刚才程序的改进版:lint n,a,b,i;lchar p;lscanf(%d,&n);lgetchar();lfor (i=0;in;i+)ll scanf(%c%d%d,&p,&a,&b);l if( .) ll是否还有问题?如何修改
33、?2022-3-2468菜鸟之伤(15)l总结:字符和数字的混合输入带来的问题,也是一个常常困扰使用C语言编程的同学的经典问题,关键就是程序未能及时接收回车符,而误将回车当作下一组数据的首字母,你可以通过添加一句getchar(); 轻松解决该问题。l说明:菜鸟的经典错误,如果之前没有遇到过,很难一下子反应过来,当然,遇到一次以后就不成为问题了2022-3-24692007 平方和与立方和l给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和。lSample Inputl1 3l2 5lSample Outputl4 28l20 1522022-3-2470菜鸟之伤(16)#in
34、cludevoid main() int m,n; while(scanf(“%d%d” ,&m,&n) =2) int i,x=0,y=0; for(i=m;i=n;i+) if(i%2=0) y=y+i*i; else x=x+i*i*i; printf(“%d %dn”,y,x); 2022-3-2471菜鸟之伤(16)l总结:题目并没有保证数据是递增的,但人往往有思维定势,而很多题目的设计就是针对这一点!不要埋怨,这种训练能很好的培养我们审慎的思维习惯。l说明:这种错误经历过以后还是比较容易牢记的,所以说有时候经验很重要。2022-3-2472菜鸟之伤(17)l以下的程
35、序输出什么?l#includel#includelint main()llint j=0;lfor(j=0;j5;j+)llcoutj=;lprintf(%dn,j);llreturn 0;l2022-3-2473菜鸟之伤(17)l 期望输出:lj=0lj=1lj=2lj=3lj=4l 实际输出:l?2022-3-2474菜鸟之伤(17)l总结:在一个程序中同时使用C和C+的输出语句,很容易带来问题,原因就是输出机制不完全一样(一个不带缓冲,一个带缓冲),所以尽量避免C和C+输出语句混用。l说明:这是传说中的经典错误,据说曾困扰某牛人于现场赛 :-)2022-3-2475以2004 成绩转换
36、为例l题目描述:题目描述:输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下: 90100为A; 8089为B; 7079为C; 6069为D; 059为E;l输出描述:输出描述:对于每组输入数据,输出一行。如果输入数据不在0100范围内,请输出一行:“Score is error!”。2022-3-2476菜鸟之伤(18)l#includelint main()l int t,a;l while(scanf(%d,&t)!=EOF)l if(t100|t0) printf(Score is error!n);l elsel a=(t-50)/10;l switch(a)l
37、 case 5:l case 4:printf(An); case 3:printf(Bn);l case 2:printf(Cn); case 1:printf(Dn);l default:printf(En); l l return 0;l 2022-3-2477菜鸟之伤(18)l总结:C语言中的case语句要求在每个case的处理后面都要跟break;(特殊需求除外),而如果因为不了解或者不小心而缺少部分break;则执行的效果也许会不符合你最初的设计。l说明:C语言的基本功很重要2022-3-2478以2046 骨牌铺方格 为例l题目描述:题目描述:在2n的一个长方形方格中,用一个1 2的骨牌铺满方格,输入n ,输出铺放方案的总数.l输入描述:输入描述:输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2n (0n=50)。2022-3-2479菜鸟之伤(19)l#includelint main()ll int i;l _int64 a50=0,1,2;l for(i=3;i=50;i+)l ai=ai-1+ai-2;l while(scanf(%d,&i)!=EOF)l printf(%I64dn,ai); l l2022-3-2480菜鸟之伤(19)l总结:数组下标越界是最常见的Runt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园语言安全培训课件
- 研学活动赶海活动方案
- 端午节红色系列活动方案
- 文字注释说课稿-2025-2026学年中职专业课-数控技术应用-装备制造大类
- ⑥个性化网页设计说课稿-2025-2026学年初中美术岭美版九年级下册-岭美版
- 童趣活动策划方案
- 第八课 国家利益至上说课稿-2025-2026学年初中道德与法治八年级上册统编版(五四学制)
- 福州小吃活动策划方案
- Unit3 Amazing animals (教学设计)-2024-2025学年人教PEP版(2024)英语三年级上册
- 石家庄爱心活动方案
- 人体十二经络系统解析
- 2025年巷道掘砌工(技师)职业技能鉴定理论考试题库(含答案)
- 2025年交通安全宣传周知识竞赛考试题库及答案(含各题型)
- 2025年美的ai面试题目及答案
- 律师从事公司自行清算业务操作建议流程
- 2025年深圳中级电工试题及答案
- 工会专用账户管理办法
- 中科大现代环境生物技术课件第4章 细胞工程
- 财政分局合同管理制度
- 阿尔茨海默病健康教育讲课件
- 乐团指导教师管理制度
评论
0/150
提交评论