C语言输入输出例题

C语言的在线编程中输入输出的练习题

A+B(1)

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

输入描述: 输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据包括多组。

输出描述: 输出a+b的结果

输入例子1:
1 5
10 20

输出例子1:
6
30

测试代码

#include

int main(){
    int a,b;
    //写法一:
    while(scanf("%d %d",&a,&b)==2)			 //scanf函数返回成功读入的数据项数
    //写法二:
    //while(scanf("%d %d\n",&a,&b)!=EOF)
    {    
        printf("%d\n",a+b);
    }
    return 0;
}

注:scanf函数返回成功读入的数据项数,即每次读入的个数


A+B(2)

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

输入描述: 输入第一行包括一个数据组数t(1 <= t <= 100)
接下来每行包括两个正整数a,b(1 <= a, b <= 10^9)

输出描述: 输出a+b的结果

输入例子1:
2
1 5
10 20

输出例子1:
6
30

测试代码

//方法一:利用t写for循环
#include
int main(){
    int t,a,b;
    scanf("%d",&t);
    for(int i=0;i<t;i++){
        scanf("%d %d",&a,&b);
        printf("%d\n",a+b);
    }
    
    return 0;
}

//方法二:直接接收后面的数并输出结果
#include
int main(){
    int t,a,b;
    scanf("%d",&t);
    //while(scanf("%d %d",&a,&b)==2)
    while(scanf("%d %d\n",&a,&b)!=EOF)
    {
        printf("%d\n",a+b);
    }
    
    return 0;
}
//方法三:利用t写while循环
# include 
int main()
{
    int t,a,b;
    scanf("%d",&t);
    while (t)
    {
        scanf("%d %d",&a,&b);
        printf("%d \n",a+b);
        t--;
    }
    return 0;
}
	//写法二:不用返回0
	#include
	 
	int main(void)
	{
	    int t, a, b;
	    scanf("%d", &t);
	    while(t)
	    {
	        scanf("%d %d", &a, &b);
	        printf("%d\n", a + b);
	        t--;
	    }
	}

A+B(3)

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

输入描述: 输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据有多组, 如果输入为0 0则结束输入

输出描述: 输出a+b的结果

输入例子1:
1 5
10 20
0 0

输出例子1:
6
30

测试代码

//方法一:在循环条件中加限定
#include
int main(void){
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF && a!=0 && b!=0)
    //while(scanf("%d %d",&a,&b)==2 && a!=0 && b!=0)
    {
        printf("%d\n",a+b);
    }
}
//方法二:在循环中判断退出
#include 
int main(){
    int a,b;
    while(scanf("%d%d\n",&a,&b)!=EOF)
    {
    if(a==0&&b==0) break;
    printf("%d\n",a+b);
    }
}


A+B(4)

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

输入描述: 输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。

输出描述: 每组数据输出求和的结果

输入例子1:
4 1 2 3 4
5 1 2 3 4 5
0

输出例子1:
10
15

测试代码

//方法一:自己写的,直接修改while循环的条件
#include
int main(){
    int n,res=0,sum=0;
    scanf("%d",&n);					//首先先取得一个n值
    //while(n!=0)
    while(n)
    {
        sum=0;
        for(int i=0;i<n;i++){
            scanf("%d",&res);
            sum+=res;
        }
        printf("%d\n",sum);
        scanf("%d",&n);				//循环完成后取下一个n值进行判断
    }
}

//方法二: 在循环中判断n==0进行退出
#include 
int main(){
    int n, num, sum=0;
    while(scanf("%d", &n)!=EOF){
        sum=0;
        if(n==0)
            break;
        for(int i=0;i<n;i++)
        {
            scanf("%d", &num);
            sum+=num;
        }
        printf("%d\n", sum);
    }
    return 0;
}
//方法三: 利用while(scanf("%d",&n),n)进行判断
#include
int main()
{
    int n,a,sum;
     
   while(scanf("%d",&n),n){
       if(n == 0)
       {
           break;
       }
          sum=0;
       for(int i=0;i<n;i++)
       {
           scanf("%d",&a);
           sum += a;
       }
       printf("%d\n",sum);
   }
     
    return 0;
}

注:while(scanf("%d",&n),n)其实相当于while(n),只是因为要输入所以写成了while(scanf("%d",&n),n)这样而已


A+B(5)

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M

输入描述: 输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
接下来t行, 每行一组数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。

输出描述: 每组数据输出求和的结果

输入例子1:
2
4 1 2 3 4
5 1 2 3 4 5

输出例子1:
10
15

测试代码

//方法一:
#include
int main(void){
    int t,n,temp,sum;
    scanf("%d",&t);
    while(t){
        scanf("%d",&n);
        sum=0;
        for(int i=0;i<n;i++){
            scanf("%d",&temp);
            sum+=temp;
        }
        printf("%d\n",sum);
        t--;
    }
}
//方法二:结合n和t作为while的条件判断
#include
int main(void)
{
    int t, n, a,sum;
    scanf("%d", &t);
    while(scanf("%d", &n), n && t)
    {
        if(n == 0) break;
        sum = 0;
        for(int i= 0; i < n; i++)
        {
            scanf("%d", &a);
            sum += a;
        }
        printf("%d\n", sum);
        t--;
    }
    return 0;
}
//方法三:两个for循环
#include "stdio.h"
int main(){
    int n;
    scanf("%d", &n);
    int b;
    for(int i = 0; i < n; i++){
        scanf("%d", &b);
        int sum = 0;
        for(int j = 0; j < b; j++){
            int num = 0;
            scanf("%d", &num);
            sum += num;
        }
        printf("%d\n", sum);
    }
    return 0;
}


A+B(6)

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

输入描述: 输入数据有多组, 每行表示一组输入数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。

输出描述: 每组数据输出求和的结果

输入例子1:
4 1 2 3 4
5 1 2 3 4 5

输出例子1:
10
15

测试代码

//方法一:.
#include
int main(void){
    int n,temp,sum;
    while(scanf("%d",&n)!=EOF)
    //  while (EOF!=scanf("%d", &n))
    {
        sum=0;
        for(int i=0;i<n;i++){
            scanf("%d",&temp);
            sum+=temp;
        }
        printf("%d\n",sum);
    }
}


A+B(7)

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

输入描述: 输入数据有多组, 每行表示一组输入数据。
每行不定有n个整数,空格隔开。(1 <= n <= 100)。

输出描述: 每组数据输出求和的结果

输入例子1:
1 2 3
4 5
0 0 0 0 0

输出例子1:
6
9
0

测试代码

//写法一:
#include
int main(void){
    int temp,sum=0;
    while(scanf("%d",&temp)!=EOF){
        sum+=temp;
        if(getchar()=='\n'){ 		//到一行结尾处输出并重置sum
            printf("%d\n",sum);
            sum=0;
        }
    }
}

//代码二:
#include
int main(){
    int n,sum=0;
    char c;
    while(scanf("%d",&n)!=EOF){
        c=getchar();				//将getchar的值放入c中再后续进行判断
        sum+=n;
        if(c=='\n'){
            printf("%d\n",sum);
            sum=0;
        }
    }
    return 0 ;
}



字符串排序(1)

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

输入描述: 输入有两行,第一行n
第二行是n个空格隔开的字符串

输出描述: 输出一行排序后的字符串,空格隔开,无结尾空格

输入例子1:
5
c d a bb e

输出例子1:
a bb c d e

测试代码

//方法一:
#include
#include
#include

int main(void){
    int n;
    scanf("%d",&n);
    char str[n][100];
    for(int i=0;i<n;i++){
        scanf("%s",&str[i]);
    }
    qsort(str,n,sizeof(str[0]),strcmp);		//排序
    for(int i=0;i<n;i++){
        printf("%s ",str[i]);
    }
}

//方法二:自己编qsort的比较函数
#include 
 
#define LENGTH 1000
 
 
int compar(const void *p1, const void *p2){
    return strcmp((char *)p1, (char *)p2);
}
 
int main(int argc, char **argv){
    int len = 0;
    scanf("%d", &len);
    char arr[len][LENGTH];
    for(int i=0; i<len; i++)
    {
        scanf("%s", arr[i]);
    }
    qsort(arr, len, sizeof(arr[0]), compar);
    for(int i=0; i<len; i++)
    {
        printf("%s ", arr[i]);
    }
     
    return 0;
}

//写法三:
#include 
#include 
#include 
int Cmp(const void* a, const void* b) {
    char* newA = (char*)a;
    char* newB = (char*)b;
    return *newA - *newB;
}
int main()
{
    int n;
    scanf("%d", &n);
    char str[n][100];
    for (int i = 0; i < n; i++) {
        scanf("%s", str[i]);
    }
    qsort(str, n, sizeof(str[0]), Cmp);
    for (int i = 0; i < n; i++) {
        printf("%s ", str[i]);					//注意此处的空格
    }
    return 0;
}


字符串排序(2)

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

输入描述: 多个测试用例,每个测试用例一行。
每行通过空格隔开,有n个字符,n<100

输出描述: 对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开

输入例子1:
a c bb
f dddd
nowcoder

输出例子1:
a bb c
dddd f
nowcoder

测试代码

//写法一:
#include
#include
#include
int main(void){
    char str[100][100];
    int i=0;
    while(scanf("%s",str[i])!=EOF){		//此处数组可加可不加&符,因其本身就是地址
        i++;
        if(getchar()=='\n'){
            qsort(str,i,sizeof(str[0]),strcmp);
	        for(int x=0;x<i;x++){
	            printf("%s ",str[x]);		//注意此处的空格
	        }
        printf("\n");					//每行输出后还需要换行符
        i=0;
        }
    }
}

//写法二: 自己编cmp函数
#include
#include
#include
 
int compare(const void* a, const void* b){
    return strcmp((char*)a, (char*)b);
    //return *(char*)a- *(char*)b;
}

//int compare(const void *a,const void *b){
//    char * _a=(char*)a;
//    char * _b=(char*)b;
//    return strcmp(_a,_b);
//}

int main(){
    int n = 0, i;
    char str[100][100];
    while (scanf("%s", &str[n]) != EOF){
        n++;
        if (getchar() == '\n'){
            qsort(str, n, sizeof(str[0]), compare);
            for (i = 0; i < n - 1; i++){
                printf("%s ", str[i]);
            }
            printf("%s\n", str[n - 1]);
            n = 0;
        }
    }
    return 0;
}

字符串排序(3)

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

输入描述: 多个测试用例,每个测试用例一行。
每行通过,隔开,有n个字符,n<100

输出描述: 对于每组用例输出一行排序后的字符串,用’,'隔开,无结尾空格

输入例子1:
a,c,bb
f,dddd
nowcoder

输出例子1:
a,bb,c
dddd,f
nowcoder

测试代码

//方法一:
#include
#include
#include
int main(void){
    char str[100][100];
    int i=0;int x;
    while(scanf("%[^,\n]",str[i++])!=EOF){
        if(getchar()=='\n'){
            qsort(str,i,sizeof(str[0]),strcmp);
            for(x=0;x<i-1;x++){
                printf("%s,",str[x]);			//注意此处的,号
            }
        printf("%s\n",str[x]);
        i=0;
        }
    }
}
//方法二:输出不同的写法
#include
#include
#include

int main(){
    int n, j;
    char str[100][100];
    n = 0;
    while (scanf("%[^,\n]", str[n]) != EOF){
        n++;
        if (getchar() == '\n'){
            qsort(str, n, sizeof(str[0]), strcmp);
            for (j = 0; j < n - 1; j++){
                printf ("%s,", str[j]);
            }
            printf ("%s\n", str[n - 1]);
            n = 0;
        }
    }
    return 0;
}

//方法三:

注:^表示"非",[ ^\n ]表示读入换行字符就结束读入。这个是scanf的正则用法,我们都知道scanf不能接收空格符,一接受到空格就结束读入,所以不能像gets()等函数一样接受一行字符串,但是使用%[ ^\n ]就可以读取一行,直到碰到’\n’才结束读入。


自测本地通过提交为0

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

每年前几场在线笔试编程题的时候,总有同学询问为什么我本地测试通过,自测也通过,提交代码系统却返回通过率0。

这不是系统的错,可能是因为
1.你对题目理解错了,你的代码只过了样例或你自己的数据
2.你的代码逻辑有问题,你的代码只过了样例或你自己的数据 总之就是你的代码只是过了样例和自测数据,后台的测试数据你根本不可见,要多自己思考。

输入描述: 输入有多组测试用例,每组空格隔开两个整数

输出描述: 对于每组数据输出一行两个整数的和

输入例子1:
1 1

输出例子1:
2

测试代码

#include
int main(void){
    long long int a,b;
    while(scanf("%lld %lld ",&a,&b)!=EOF){
        printf("%lld\n",a+b);
    }
}

注:这个坑真是有被秀到,当以为和前面的题一样,或者以为只要把空格搞好就完事的时候,才发现没有完全通过,结果发现!——居然是因为数据类型的问题。


一些解释

1、EOF 在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file),在while循环中以EOF作为文件结束标志。所以 while(scanf("%d",&n)!=EOF)可以用来输入多组数据
2、有些题目又有要求, 当输入n为0时则不进行处理, 可以这样写while(scanf("%d",&n)&&n!=0),也可以直接写while(scanf("%d",&n)&&n),进而变成while(scanf("%d",&n),n)
3、while(scanf("%d",&n),n)在while括号里是一个逗号表达式

  • 逗号表达式,它将两式联接起来,如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14。
  • 所以while(scanf("%d",&n),n)语句就是先输入一个整数赋值给n(表达式1),然后while括号里的值是n(表达式2),若n为真则进行while循环n为0时则不做处理

总结

1、while(scanf("%d",&n)&&n!=0)等价于while(scanf("%d",&n)&&n)等价于while(scanf("%d",&n),n)
2、while(scanf("%d",&n),n)语句就是先输入一个整数赋值给n(表达式1),然后while括号里的值是n(表达式2),若n为真则进行while循环n为0时则不做处理
3、scanf("%[ ^,\n ]"是遇到逗号和\n结束。
4、scanf函数返回的是成功读入的数据项数,即每次读入的个数。


参考文献

OJ在线编程常见输入输出练习

你可能感兴趣的:(C语言,c语言,算法)