机试指南 | 数据输入的处理



数据输入的处理

C 语言版

简单的输入一组数据

【Example Subject】

Description
计算 a+b

Input
两个整数 a,b

Output
a+b的值

Sample Input
1 2

Sample Output
3

这种简单输入,接受一组输入,针对这种输入计算出值即可。

【Method】

#include <stdio.h>
int main()
{
    int a,b;
    scanf("%d %d",&a, &b);
    printf("%d\n",a+b);
    return 0;
}

一次运行输入多组数据直到读至 EOF

一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止

【Example Subject】

Description
计算 a + b

Input
多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,
每组输入单独占一行 

Output
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行

Sample Input
1 5
10 20
400 516

Sample Output
6
30
916

这种输入包含多对输入数据,需要构造一个循环读取。因为没有指出到底有多少对输入,要有办法判断输入何时结束。解决办法是:

【Method】

#include <stdio.h>
int main() 
{
	int a,b;
	while(scanf("%d %d",&a, &b) != EOF) 
	{// 输入结束时,scanf函数返回值为EOF(-1),即没有数据输入时会退出while循环
		printf("%d\n",a+b);
	}
	return 0; 
}

注 1:scanf 函数返回值就是读出的变量个数,如果一个都没有,则返回值是 -1。EOF是一个预定义的常量,等于 -1。

注 2:在调试程序时,键盘输入的数据,用 CTRL-Z(即按住 CTRL 键不放,再按下 Z)组合作为输入结束,此谓键盘输入设备的“文件末尾”。

一次运行输入多组数据由 N 决定

一次运行,要输入多组数据,组数由第一个输入数据决定(在开始的时候输入一个 N,接下来是 N 组数据)

【Example Subject】

Description
计算 a + b

Input
第一行是数据的组数N,从第二行是N组由两个整数(a和b)构成的输入,a和b之间用空格隔开,
每组输入单独占一行 

Output
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行

Sample Input
2
1 5
10 20

Sample Output
6
30

需要先读入第一行确定组数 N,而后写一次执行 N 次的循环进行处理即可。解决办法是:

【Method】

#include<stdio.h>
int main()
{
	int n,i;
	int a,b;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d%d",&a,&b);
		printf("%d\n",a+b);
	}
	return 0;
}

输入多组数据以特殊输入为结束标志

输入不说明有多少组数据,但以某个特殊输入为结束标志。平时做题中常见诸如“输入学生成绩,以 -1 结束”,没有学生得 -1 分的,这个结束数据可以要得。

【Example Subject】

Description
计算 a + b

Input
多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行。
当输入为 0 0 时,输入结束。

Output
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行。

Sample Input
1 5
10 20
0 0

Sample Output
6
30

构造循环对数据进行处理,将是否遇到了要求结束的输入,作为循环是否结束的依据。解决办法是:

【Method】

#include <stdio.h>
int main()
{
    int a,b;
    while(scanf("%d %d",&a, &b) &&(a||b))
	{
		printf("%d\n",a+b);
	}
	return 0;
}

利用文件重定向提高调试效率

编程得到正确结果前,往往需要多次运行程序,每次运行都需要花费不少的时间从键盘输入数据。每次输入的数据都是相同的时,会给人的心理带来不爽的感觉,并造成时间上的浪费。无论平时练习还是 ACM 竞赛实战,这些都是可以避免的。方法是,运用重定向。

用下面的形式调用函数 freopen() 会将标准输入 stdin 重定向到文件 input.txt(这个名字可以自己定义)。

//设置输入和输出文件
freopen("input.txt","r",stdin);    

重定向后,原先从键盘(标准输入的默认设备)接受的输入,将统统从文件读取 input.txt 读取,这就是重定向。程序可以写作:

#include<stdio.h>
int main()
{
    //只加这一句输入将被重定向到文件input.txt
	freopen("input.txt","r",stdin);  
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d\n",a+b);
	return 0;
}

于是,在运行程序前,将本该由键盘输入的数据,写到文件 input.txt 中。而在运行程序时,数据将不再需要人去输入。那个快,很享受。

需要注意的是,调试通过的程序,千万不要直接提交到 OJ 平台上去。如果竞赛中这样做了,罚你的 20 分钟不要算到我的头上。提交的程序要把输入重定向的一行删除,这样才算是符合要求的,可以获得 AC 的程序。

除了删除那一行,还有一种简单的做法是,提交前将这一行前加上注释符"//",效果是一样的。

#include<stdio.h>
int main()
{
	//freopen("input.txt","r",stdin);  //只加这一句输入将被重定向到文件input.txt
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d\n",a+b);
	return 0;
}

C++ 版

简单的输入一组数据

【Example Subject】

Description
计算 a+b

Input
两个整数 a,b

Output
a+b的值

Sample Input
1 2

Sample Output
3

这种简单输入,接受一组输入,针对这种输入计算出值即可。

【Method】

#include <iostream>
using namespace std;
int  main()
{
    int a,b;
    //cin以空格或者回车作为输入输出分隔符
    cin >> a >> b;
    cout << a+b << endl;   
    return 0;
}

一次运行输入多组数据直到读至 EOF

一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止

【Example Subject】

Description
计算 a + b

Input
多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,
每组输入单独占一行 

Output
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行

Sample Input
1 5
10 20
400 516

Sample Output
6
30
916

这种输入包含多对输入数据,需要构造一个循环读取。因为没有指出到底有多少对输入,要有办法判断输入何时结束。解决办法是:

【Method】

#include <iostream> 
using namespace std;
int main()
{
	int a,b;
	while(cin >> a >> b)
	{
		cout << a+b << endl;
	}
	return 0;
} 

注 1:当读到输入结束时,cin >> a >> b 返回 0,循环也结束。

注 2:在调试程序时,键盘输入的数据,用 CTRL-Z(即按住 CTRL 键不放,再按下 Z)组合作为输入结束,此谓键盘输入设备的“文件末尾”。

一次运行输入多组数据由 N 决定

一次运行,要输入多组数据,组数由第一个输入数据决定(在开始的时候输入一个 N,接下来是 N 组数据)

【Example Subject】

Description
计算 a + b

Input
第一行是数据的组数N,从第二行是N组由两个整数(a和b)构成的输入,a和b之间用空格隔开,
每组输入单独占一行 

Output
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行

Sample Input
2
1 5
10 20

Sample Output
6
30

需要先读入第一行确定组数 N,而后写一次执行 N 次的循环进行处理即可。解决办法是:

【Method】

#include <iostream>
using namespace std;
int main() {
    int a, b, n;
    cin >> n;
	for(i=0;i<n;i++)
	{
		cin >> a >> b;
		cout << a + b << endl;
	}
    return 0;
}

输入多组数据以特殊输入为结束标志

输入不说明有多少组数据,但以某个特殊输入为结束标志。平时做题中常见诸如“输入学生成绩,以 -1 结束”,没有学生得 -1 分的,这个结束数据可以要得。

【Example Subject】

Description
计算 a + b

Input
多组由两个整数(a和b)构成的输入,a和b之间用空格隔开,每组输入单独占一行。
当输入为 0 0 时,输入结束。

Output
每组的两个整数(a和b)求和并输出,每组的求和结果独占一行。

Sample Input
1 5
10 20
0 0

Sample Output
6
30

构造循环对数据进行处理,将是否遇到了要求结束的输入,作为循环是否结束的依据。解决办法是:

【Method】

#include<iostream>
using namespace std;
int main()
{
    int a ,b;
    while(cin>>a>>b&&(a||b))
    {
		cout<<a+b<<endl;
	}
    return 0;
}

利用文件重定向提高调试效率

编程得到正确结果前,往往需要多次运行程序,每次运行都需要花费不少的时间从键盘输入数据。每次输入的数据都是相同的时,会给人的心理带来不爽的感觉,并造成时间上的浪费。无论平时练习还是 ACM 竞赛实战,这些都是可以避免的。方法是,运用重定向。

用下面的形式调用函数 freopen() 会将标准输入 stdin 重定向到文件 input.txt(这个名字可以自己定义)。

//设置输入和输出文件
freopen("input.txt","r",stdin);    

重定向后,原先从键盘(标准输入的默认设备)接受的输入,将统统从文件读取 input.txt 读取,这就是重定向。程序可以写作:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    freopen("input.txt","r",stdin);  //只加这一句输入将被重定向到文件input.txt
    int a,b;
    cin>>a>>b;
    cout<<a+b<<endl;
    return 0;
}

于是,在运行程序前,将本该由键盘输入的数据,写到文件 input.txt 中。而在运行程序时,数据将不再需要人去输入。那个快,很享受。

需要注意的是,调试通过的程序,千万不要直接提交到 OJ 平台上去。如果竞赛中这样做了,罚你的 20 分钟不要算到我的头上。提交的程序要把输入重定向的一行删除,这样才算是符合要求的,可以获得 AC 的程序。

除了删除那一行,还有一种简单的做法是,提交前将这一行前加上注释符"//",效果是一样的。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    //freopen("input.txt","r",stdin);  //只加这一句输入将被重定向到文件input.txt
    int a,b;
    cin>>a>>b;
    cout<<a+b<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WuGenQiang

谢谢你的喜欢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值