输入
先看一道比较简单的题目:
题目内容
已知正方形的边长,试编程求出其面积。
输入描述
输入不超过50个正整数的数据n (1<=n<=10000),每个正整数间以空格隔开。
输出描述
每次读入一个正整数,便输出其正方形的面积数,输出每个面积后再回车。
输入样例
1 3 5 7
输出样例
1
9
25
49
输入问题一:针对输入的个数不定情况,以EOF或-1作为输入的结束:
C语言:scanf 返回值描述输入的个数,如果没有输入则返回 -1 EOF其实也是-1.
#include <stdio.h>
int main(void)
{
int a;
while(scanf("%d",&a)==1)
printf("%d\n",a*a);
return 0;
}
两个输入则判断是否等于2,或者用:while (scanf("%d", &n) != EOF) 也可以(这个更加通用)
C++,通过cin的输入状态来判断:
#include <iostream>
using namespace std;
int main(void)
{
int a;
while(cin>>a)
cout<<a*a<<endl;
return 0;
}
两个输入则: while(cin>>a>>b) 之类的。
输入问题二:输入一开始就会说有N个,然后紧跟N个:
Your task is to Calculate a + b.
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.
For 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.
2
1 5
10 20
Sample output:
6
30
这类问题比较简单,先输入n,循环n次输入,每次输入计算直接输出
#include <stdio.h>
int main()
{
int n,i,a,b;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d",&a, &b);
printf("%d\n",a+b); //直接输出
}
return 0;
}
切记,不要误解为全部输入后再输出!
输入问题三:不指明输入多少个,但说明以什么结束输入:
题目类似1090略,不同是以 0 0 结束输入。杭电:Problem - 1091
解决方法,可以参考第一类输入问题,补上判断条件即可:
while(scanf("%d%d",&a, &b) &&(a!=0 || b!=0))
值得注意:逻辑为:(a!=0 || b!=0) a 和 b 不同时为0! 很容易写成 (a!=0 && b!=0)
输入问题四:输入一串文本:
C语言:
int main()
{
char buff[256];
scanf("%s",buff);
//分割字符串等等
return 0;
}
遇到空格问题用gets : gets(buff);
C++:
int main()
{
char buff[256];
cin>>buff;
//分割字符串等等
return 0;
}
遇到空格问题用: cin.getline(buff,256); 读取一行,第二个参数表明接收的字符最大长度。
如果使用string 则可以用以下代码完成输入(包括空格):
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin,s);
//分割字符串等等
return 0;
}
单个字符输入用getchar。
输出
相比输入问题,输出比较容易解决。
1、多个输入情况下,都是输入一个,输出一个结构,不要误解成输入完毕后再一次输出;
2、认真审题,有些题目需要多一个空行,比如:杭电HDOJ_1095
指明每次输出后,多一个空行。