OJ编程题输入数据处理

来源:互联网 发布:java soap 编辑:程序博客网 时间:2024/06/02 19:43

现在越来越多的学校使用了OJ(online jude)平台,在上面发布比赛,通过编译运行选手们提交的代码来获取输出结果,与题目所给的正确输出结果对比,来判断参赛选手的代码正确性。那么我们在使用OJ平台刷题时,也需要根据题目意思注意一下最基本的输入数据处理。

首先,我们先来讨论一个细节问题。

C语言中的scanf函数想必大家再熟悉不过了,但肯定会有很多人,不知道这个函数也是有返回值的,我们先来看一下如下一段代码:

代码1

int n,m;printf("%d",scanf("%d%d",&n,&m));

执行此代码,我们可以发现,scanf(…)表达式的值为int,表示的是成功读入的变量的个数。下面提供了几组输入数据

输入:12 56<回车> 输出:2

输入:40 a<回车> 输出:1

分析这两组数据,我们可以发现如果用户输入的数据类型与指定的数据类型不同,是不能被记作成功读入变量。如果遇到了下面这种情况:

输入:a 40<回车> 输出:0

可见,只要第一个没有成功读入,该函数也不会继续执行下去了。 还有一点,scanf表达式的值为EOF,则说明输入数据已经结束。

下面这个例子,就是利用这个特征实现用户不断输入两个值来计算他们的和。

代码2

int n,m;while(scanf("%d%d",&n,&m)!=EOF)//EOF是直接能够拿来用的{  printf("%d",n+m);}

不停输入两个整数再敲回车,则不停输出他们的和,在windows系统下,如果CTRL+Z,然后回车,程序就能结束.

那我们在C++中的cin表达式同样也具有返回值,返回值为布尔类型,在成功读入所有变量时,返回值为true,否则为false。同样可以实现和代码1相同的功能:

代码3

int n,m;while(cin>>n>>m){  printf("%d",n+m);}

下面我们来看一个实例
例题:输入若干个正整数,输出其中最大值.

Sample Input:
2 3 5 6 8 25 88 77
Sample Output:
88

思路:我们只需通过前面所学,不断输入符合数据类型的值,输入一个判断一个,如果输入后面的值比前面大,则更新大的值。

实现代码:
代码4

#include<iostream>using namespace std;int main(){  int m,mx;  while(cin>>m)  {    if(m > mx)    mx = m;  }  cout<<mx;  return 0;}

由此可见一些必要的,却容易被我们忽视的细节问题,如果处理得当,亦可以使一些问题简洁很多,而这些恰恰需要我们去不断探索。

—Alisa 写于 江苏泰州 2017.02.24

0 1
原创粉丝点击