ACM题目中输入数据的处理(C语言版)

ACM题目中输入数据的处理(C++版),见:http://blog.csdn.net/sxhelijian/article/details/8978850

  ACM竞赛题目的输入数据常要求有多组,并且格式多种多样,这是初次登OJ平台的同学的一个障碍。实际上,这些格式可以归为固定的几种类型,本文介绍各种类型的处理方法,以帮助同学们克服这些障碍。

  实际上,这些模式不仅是OJ平台上做题的需要。在平时的自由编程练习中,也可以自行使用这些模式,以提高调试程序的效率。对程序测试的意识也将在此过程中得到提升。
  本文1-4部分介绍了几种类型输入的处理,第5部分介绍通过输入重定向提高调试程序效率的方法。

1. 最简单的输入
例1:

Description
计算 a+b

Input
两个整数 a,b

Output
a+b的值

Sample Input
1 2

Sample Output
3

  这种最简单的输入,接受一组输入,针对这组输入计算出值即可。这与平时的程序设计并无差异。解决办法是:

#include <stdio.h>
int main()
{
    int a,b;
    scanf("%d %d",&a, &b);
    printf("%d\n",a+b);  //对其他题目,换成要求的复杂处理与输出
    return 0;
}

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

Description
计算 a + b

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

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

Sample Input
1 5
10 20
400 516

Sample Output
6
30
916

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

#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)组合作为输入结束,此谓键盘输入设备的“文件末尾”。

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

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次的循环进行处理即可。解决办法是:

#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;
}

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

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

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

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

  有关字符和字符串数据的输入,在此不再多讲,只要将相关的函数用好即可,也可以找到相关资料参考。

5. 利用文件重定向提高调试效率
  编程得到正确结果前,往往需要多次运行程序,每次运行都需要花费不少的时间从键盘输入数据。每次输入的数据都是相同的时,会给人的心理带来不爽的感觉,并造成时间上的浪费。无论平时练习还是ACM竞赛实战,这些都是可以避免的。方法是,运用重定向。
  用下面的形式调用函数freopen()会将标准输入stdin重定向到文件input.txt(这个名字可以自己定义)。

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

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

#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;
}

  于是,在运行程序前,将本该由键盘输入的数据,写到文件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;
}

  还有用条件编译处理的方法,暂不讲了。

ACM题目中输入数据的处理(C++版),见:http://blog.csdn.net/sxhelijian/article/details/8978850

   

==================== 迂者 贺利坚 CSDN博客专栏=================

|==  IT学子成长指导专栏  专栏文章分类目录(不定期更新)    ==|

|== C++ 课堂在线专栏   贺利坚课程教学链接(分课程年级)   ==|

======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======

时间: 2024-12-01 21:55:34

ACM题目中输入数据的处理(C语言版)的相关文章

ACM题目中输入数据的处理(C++版)

ACM题目中输入数据的处理(C语言版)见:http://blog.csdn.net/sxhelijian/article/details/8978794 ACM竞赛题目的输入数据常要求有多组,并且格式多种多样,这是初次登OJ平台的同学的一个障碍.实际上,这些格式可以归为固定的几种类型,本文介绍各种类型的处理方法,以帮助同学们克服这些障碍. 实际上,这些模式不仅是OJ平台上做题的需要.在平时的自由编程练习中,也可以自行使用这些模式,以提高调试程序的效率.对程序测试的意识也将在此过程中得到提升. 本

c语言顺序表-菜鸟求救,这个程序,做ACM题目时两个pass,三个错了,提示是unknown error。。。

问题描述 菜鸟求救,这个程序,做ACM题目时两个pass,三个错了,提示是unknown error... #include #include #include #define MAXSIZE 1000 static int h[MAXSIZE]; int k = 0, x=0; typedef int datatype; typedef struct { datatype a[MAXSIZE]; int size; }seq_list; void init(seq_list *L) { L->

c语言-请问这道C语言题目中出现的错误是什么?

问题描述 请问这道C语言题目中出现的错误是什么? #include int main(){ int a; while((a=getchar())!=EOF){ if(a=='t') {putchar('t');} else if(a=='b') {putchar('b');} else if(a=='') {putchar('\');} else if(a!='t'&&a!='b'&&a!='') {putchar(a);} } } 解决方案 第三个else if 没必要用

问一道开关电灯的acm题目

问题描述 问一道开关电灯的acm题目 开关电灯查看 提交 统计 提问总时间限制: 1000ms 内存限制: 65536kB描述N盏灯排成一排,从1到N依次编号.有N个人也同样编号.第一个人将灯全部熄灭:第2个人将对应2和2的倍数的灯打开:第3个人将对应着3和3的倍数的灯做反向操作(如果原来是开,则关掉它,否则就打开它):以后的人和3做同样的操作,即第i个人将对应着i和i的倍数的灯做反向操作.输入灯的总数N 1<=N<=1000输出在第N个人操作后,顺序输出还亮着灯的编号.样例输入8样例输出2

acm icpc-一个大整数乘法的acm题目问下,可以得话给个代码,谢谢了,想了挺久,没做出来

问题描述 一个大整数乘法的acm题目问下,可以得话给个代码,谢谢了,想了挺久,没做出来 T4:两两相乘的积为12!的个数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65535kB 描述 找出输入数据中所有两两相乘的积为12!的个数. 输入 输入数据中含有一些整数n(1≤n< 2^32 ). 输出 输出所有两两相乘的积为12!的个数. 样例输入 1 10000 159667200 9696 38373635 1000000 479001600 3 1 479001600 样例

写给一心刷ACM题目的学生

[来信] 老师你好,我大2013级大二的学生.大一时自学了数据结构,大二的时候参加了ACM. 现在寒假在家里刷题.可是我还想学习些东西,比如深入C 的学习,或者java.但是感觉除了刷题之外,就很迷茫,不知道以后出去工作是C 好还是java好.其实我更喜欢C ,但是如何去深入学习C 呢,我对C 的深入学习也是很迷茫的,因为对于C/C 除了用来刷题,我都不知道他们能够干什么? [回复] 你没有说你的专业,我猜想应该是计算机类的专业.下面就基于这个前提,谈谈我的想法. 很高兴你能找到一个提高编程能力

c语言-acm关于图的问题,C语言,谢谢!

问题描述 acm关于图的问题,C语言,谢谢! [题目描述] 最近pdf又突发奇想,想再出去旅游一次.出去旅游之前当然要好好计划一番.Pdf给自己想去的地方并给它们编好了号(起点为1).为了不跟自己过不去,pdf提前找出哪些地点存在交通方便的路径,而且只会走这些路径. 为了旅途乐趣的最大化,pdf希望每个地点都到访过的同时,又保证来去都不会走重复的路,而且最终还要回到起点.问想要达到上述要求,pdf应该怎么样安排地点的访问顺序. [输入] 第一行一个整数t,表示数据组数. 每组数据的第一行两个整数

c语言-数据结构C语言版10道实习题目求解答!!

问题描述 数据结构C语言版10道实习题目求解答!! 除有特别说明外,每个题目请以自然语言.形式化表述(伪码.流程图等).程序代码三种方式描述. 顺序结构线性表LA与LB的节点关键字为整数.LA与LB的元素按非递减有序,线性表空间足够大.试给出一种高效算法,将LB中的元素合并到LA中,使新的LA元素仍保持非递减有序.高效是指最大限度的避免移动元素. 请写一个算法将线性表(a1,a2,-,an)逆置为(an,an-1,-,a1). 在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,

Acm题目,求大神给代码

问题描述 Acm题目,求大神给代码 大神帮做一下..Description 在古堡中有N个房间(N<50000),M条道路,每条道路上均有一个守卫,它可以被一个特定编号的武器消灭,每个房间中也存在一种武器,第i个房间中的武器编号为i,道路在守卫消灭之后方可通行,GX一开始在J房间,他想知道哪些房间经过获得武器并打败守卫的过程,是最终可以去的. Input 第一行是N,J,M 接下来M行,每行三个数A,B,C,分别代表A房间和B房间之间有一条路,且此处守卫可以被编号为C的武器消灭.Output 输