http://acm.njupt.edu.cn/acmhome/problemdetail.do?id=1083&method=showdetailios
比赛描述函数
字符串的输入输出处理。测试
输入spa
第一行是一个正整数N,最大为100。code
以后输入多行字符串(行数大于N), 每一行字符串可能含有空格,且字符数不超过1000。blog
输出ci
对于前N行字符串,按原样输出;字符串
对于其他的字符串以空格符为分割依次按行输出。get
注意:每行输出之间均要输出一个空行。io
样例输入
2
N U P Ter
样例输出
N
U
P
Ter
提示
对于输入输出仍有困惑的同窗请仔细阅读如下内容:
在ACM竞赛中,对于数据的读入,通常有如下四种状况:
1、四种基本输入形式:
1. 单组输入数据
示例:整数求和
http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1001
C语言:
1 #include <stdio.h> 2 int main() 3 { 4 int a,b; 5 scanf("%d %d",&a, &b); 6 printf("%d\n",a+b); 7 }
C++:
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. 多组输入数据,且不说明多少组,直到读至输入文件末尾为止
示例:A + B Problem (1)
http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1084
C语言:
1 #include<stdio.h> 2 int main() 3 { 4 int a,b; 5 while(scanf("%d %d",&a,&b) != EOF) 6 printf("%d\n",a+b); 7 return 0; 8 }
说明:scanf函数返回值就是读出的变量个数,如:scanf( “%d %d”, &a, &b );若是只有输入了一个整数,返回值是1,若是输入了两个,返回值是2,若是一个都没有,则返回值是EOF。EOF是一个预约义的常量,等于-1
C++:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a,b; 6 while(cin>>a>>b) 7 cout<<a+b<<endl; 8 return 0; 9 }
说明:表达式cin >> m >> n在读入发生错误返回0,不然返回cin的地址。
3. 多组输入数据,不说明多少组,以某特殊输入为结束标志。
示例:A + B Problem (2)
http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1085
C语言:
1 #include<stdio.h> 2 int main() 3 { 4 int a,b; 5 while(scanf("%d %d",&a,&b)!=EOF) 6 { 7 if(a==0&&b==0) 8 break; 9 printf("%d\n",a+b); 10 } 11 return 0; 12 }
C++:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a,b; 6 while(cin>>a>>b) 7 { 8 if(a==0&&b==0) 9 break; 10 cout<<a+b<<endl; 11 } 12 return 0; 13 }
说明:当读入的a与b同时为0时,程序终止;
4. 多组输入数据,开始输入一个T,接下来是T组数据
示例:A + B Problem (3)
http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1086
C语言:
1 #include<stdio.h> 2 int main() 3 { 4 int T; 5 int a,b; 6 scanf("%d",&T); 7 while(T--) 8 { 9 scanf("%d%d",&a,&b); 10 printf("%d\n",a+b); 11 } 12 return 0; 13 }
C++:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int T; 6 int a,b; 7 cin>>T; 8 while(T--) 9 { 10 cin>>a>>b; 11 cout<<a+b<<endl; 12 } 13 return 0; 14 }
说明:当T组数据处理完后,程序终止;
关于字符串的读入,这里再作专门讨论:
2、字符串输入
对字符串的输入分三种状况:
一、每一个字符串中不含空格、制表符及回车
这种状况,用scanf函数是再好不过的了;
例如:要读入字符串"abcdef"
那么只要:
char str[10];
scanf("%s",str);
说明:scanf函数读入字符串时,是以空格、制表符及回车做为不一样字符串之间的分隔符的;
二、字符串中含有空格、制表符,但不含回车
对于这种状况不能使用scanf,而应该使用gets函数;
例如:要读入字符串 "Hello world!"
那么只要:
char str[10];
gets(str);
说明:gets函数读入字符串时,只以回车做为不一样字符串之间的分隔符;另外,若是要用gets读入多个字符串,能够写成 while(gets(str)){......}
三、字符串中含回车
在这种状况下,若是没有题目的说明,程序没法知道哪里是字符串的分界。那么,用scanf("%c",&ch)来读,一边读,一边判断分界条件是否知足,若是知足,则把当前读到的东西存到一个字符串中。
3、输出处理
通常来说,输出处理通常只有两个问题:空行打印问题与浮点数的精度问题;
1. 关于空行(Blank line)
不少题目都要求在输出数据的恰当位置加空行。一个空行就是一个单独的"\n"。这里,有的题目说:“After each test case, you should output one blank line”,而有的题目说:“Between each test case, you should ouput one blank line”。要注意After和Between的区别,由于若是多了一或少了空行,将致使Presentation Error甚至Wrong Answer。
(1)After
这种状况最简单,只须要输出结果后,再加一个printf("\n"),:
示例:A + B Problem (4)
http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1087
C语言:
1 #include<stdio.h> 2 int main() 3 { 4 int n,sum,a; 5 while(scanf("%d",&n) && n) 6 { 7 sum=0; 8 while(n--) 9 { 10 scanf("%d",&a); 11 sum+=a; 12 } 13 printf("%d\n",sum); 14 printf("\n"); 15 } 16 return 0; 17 }
C++:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int n,sum,a; 6 while(cin>>n&&n) 7 { 8 sum=0; 9 while(n--) 10 { 11 cin>>a; 12 sum+=a; 13 } 14 cout<<sum<<endl; 15 cout<<endl; 16 } 17 return 0; 18 }
(2)Between
Between和After不一样的是,最后一组结果后面不该该再加单独的"\n",应该像这样:
1 int i; 2 for (i = 0; i < 10; i++) 3 { 4 printf("%d\n", a); 5 if (i != 9) 6 printf("\n"); 7 }
因为有时候咱们并不知道测试数据有几组(好比测试数据是以end of file 结束的),用上面的方法就不行了,因而,能够换一种写法:
1 int a; 2 bool first = true; 3 while(scanf("%d", &a) == 1) 4 { 5 if (!first) 6 printf("\n"); 7 else 8 first = false; 9 printf("%d\n", a); 10 }
这样,从第二组测试数据起,在输出每组测试数据的结果以前就会输出一个空行,和想要的效果是同样的。
2.关于精度
(1)结果保留x位小数
这种比较简单,只要 printf("%.xf\n",ans); 便可;
例如,要求保留6位小数: printf("%.6f\n",ans);
(2)没有说明要求保留几位,但要求与结果的偏差不大于1e-x;
解决 : printf("%.(x+3)f\n",ans);
例如:要求与结果的偏差不大于1e-9 : printf("%.12f\n",ans);
题目来源
NUPT