多组输入输出

首先说一下OJ平台的判题机制,OJ判题是黑盒测试,它并不关心程序的内容,只用程序的输出结果来判断是否正确。

OJ后台有两个文件,一个是输入文件,一个是输出文件。

你将代码提交上去后,OJ会运行你的代码,并将输入文件中的数据输入,如果你的代码的运行结果和输出文件完全一致,那么该代码通过,AC。

以 多组输入输出中 a + b 为例。

如果你的代码每组数据运行的结果和1.out完全一致,那么这道题就会判为AC。(注意只看输出内容

 

                                                                                                                                                                                            

 

下面说一下平常题目的输入输出格式:

常见的输入格式:

1.给定一个整数T, 然后接着输入T组数据

格式如下:

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

输入:

3
1 2
2 2
3 4

输出:

3
4
7

 

2.循环输入

(1):持续循环输入直到输入文件结尾(EOF)

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

输入:

1 2
2 2
3 4

输出:

3
4
7

(2)假设直到a,b都等于-1,结束循环.

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

输入:

1 2
2 2
3 4
-1 -1

输出:

3
4
7


(3)没有明确说明要输入多少个数据,需要在输入完数据后手动按 Ctrl + Z 强制结束输入  Ctrl + Z相当于是 EOF  所以退出循环

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

输入:

1 2 3 4 5 6 7
(按Ctrl + Z然后回车,强制结束循环)

输出:

28

(4) 如果题目要求输入多组数据,每组数据有多个数据,则先用一个循环控制输入多少组数据,然后在内部在用一个循环输入数据。 

例如:输入T组数据,每组数组包含一个整数n, 随后给数组存入n个值。

int T;
scanf("%d",&T);
int a[10];
while(T--){
    int n;
    scanf("%d",&n);
    int i;    
    for(i = 0; i < n; i++){
        scanf("%d",&a[i]);
    }
}

(5)特别的对于一些字符串相关的题,题目有时候会给出一行字符,这时候不能仅用'\n'来控制循环结束,一定要加上!=EOF

下面给出字符串常用的输入格式:

#include<stdio.h>
int main()
{
	char ch;
	while((ch=getchar())!=EOF)
	{
		if(ch=='\n') break;
		......
	}
	return 0;
}

总结: 多组输入中循环控制条件分两种。

1.没有明确什么时候结束输入。

则采用while(scanf(...)!=EOF) 

加!=EOF 是因为没有明确的循环结束条件时为了避免出现死循环,只能通过到达输入文件结尾的时候来结束循环,因为到达文件结尾后没有东西可供输入函数读取了,所以此时输入函数 如  scanf(), 就会返回 -1。  EOF在C语言的定义中就是-1 所当返回值等于EOF时,循环结束。

2.以特定元素作为结束标志,结束输入

如(2) 中  a和b都为-1时结束循环, 或者 遇到0时结束循环

则只需要加上给定的判断条件就行,视具体情况而定。

如  while(scanf("%d",&a,&b)&&(a!=-1||b!=-1))       

 

常见的输出格式:

1.有若干行,每行只包含一组正确答案

  上述代码都是这种情况,也就说输出一组答案后跟着输出换行;

如:

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

 

2.所有答案均为一行,每个答案之间只有一个空格,且行末没有空格

#include <stdio.h>
int main(){
    int T;
    int a[10];
    scanf("%d",&T);
    for(int i = 0; i < T; i++){
        scanf("%d",&a[i]);    
    }
    sort(a,a+T);
    for(int i = 0; i < T; i++)     
       i ? printf(" %d",c) : printf("%d",c); // 三目运算符 相当于 if(i!=0) printf(" %d",c);
                                            //                  else printf("%d",c);
    return 0;
}

输入:

3
1 2
2 2
3 4

 输出:

3 4 7

3. 每个输出前加上一些标记, 标志第几组数据,例如:

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

输入:

1 2
2 2
3 4

输出:

Case 1: 3
Case 2: 4
Case 3: 7

4.每输出n个数换行。

例如 输出 1 ~ 100的所有值,每输出10个数换行。伪码如下

for(i = 1; i <= 100; i++){
    printf("%d ",i);
    if(i%10==0) printf("\n");
}  

这些都是非常基础的知识,如果刚开始不懂,就多做几道题吧。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值