一次随堂测试参考程序

问题 A: 数组逆序

【题目描述】

顺序输入20个整数,逆序输出。

【输入】

20个整数

【输出】

逆序输出,每个整数中间用空格分隔,最后一个后面无空格。

【样例输入】

1 3 5 7 9 2 4 6 8 10 11 12 13 14 15 16 17 18 19 20

【样例输出】

20 19 18 17 16 15 14 13 12 11 10 8 6 4 2 9 7 5 3 1

【参考程序】

#include <stdio.h>
#include <string.h>

int main()
{
    int a[25],i;
    
    for(i=0;i<20;i++)//键盘输出
        scanf("%d",&a[i]);
    
    for(i=19;i>=0;i--)//逆序输出
    {
        if(i!=0)
            printf("%d ",a[i]);
        else
            printf("%d",a[i]);
    }

}

问题 B: 字符串的输入输出处理

【题目描述】

字符串的输入输出处理。

【输入】

第一行是一个正整数N,最大为100。之后是多行字符串(行数大于N), 每一行字符串可能含有空格,字符数不超过1000。

【输出】

先将输入中的前N行字符串(可能含有空格)原样输出,再将余下的字符串(不含有空格)以空格或回车分割依次按行输出。每行输出之间输出一个空行。

【样例输入】

2
www.njupt.edu.cn NUPT
A C M
N U P Ter

【样例输出】

www.njupt.edu.cn NUPT
A C M
N
U
P
Ter

【参考程序】

#include <stdio.h>

int main( ) {
    int n;
    scanf("%d",&n);
    getchar();
    
    char s[100];
    while (n--)
    {
        gets(s);
        puts(s);
        putchar('\n');
    }
    
    char c[100];
    while (scanf("%s",c)!=EOF)
    {
        printf("%s\n\n",c);
    }
    return 0;
}

问题C:二维数组最大值及位置

【题目描述】

有一个3×4的矩阵,要求编程求出其中值最大的那个元素,以及其所在的行号和列号。(如果最大数有多个,则显示第1个出现的数据的信息)

【输入】

从键盘输入12个数字组成一个3*4的矩阵。

【输出】

输出矩阵中最大值,以及其所在的行号和列号。如有多个最大值,则显示第1个出现的。

【样例输入】

1 2 9 3
5 3 4 2
0 6 9 1

【样例输出】

9 0 2

【参考程序】

#include <stdio.h>

int main() {
    int i,j;
    int a[10][10];
    
    for (i=0; i<3; i++)
    {
        for (j=0; j<4; j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    
    int max=0,x,y;
    
    for (i=0; i<3; i++)
    {
        for (j=0; j<4; j++)
        {
            if (a[i][j]>max)
            {
                max=a[i][j];
                y=i;
                x=j;
            }
        }
    }
    
    printf("%d %d %d",max,y,x);
    return 0;
}

问题 D: 简单密码破解(该题目为华为上机测试题)

【题目描述】

密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。 假设渊子原来一个BBS上的密码为zvbo941987,为了方便记忆,他通过一种算法把这个密码变换成YUANzi1987,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。 他是这么变换的,大家都知道手机上的字母: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0,就这么简单,渊子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,声明:密码中没有空格,而密码中出现的大写字母则边成小写之后往后移一位,如:X,先边成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。

【输入】

输入包括多个测试数据。输入是一个明文,密码长度不超过100个字符,输入直到文件结尾。

【输出】

输出渊子真正的密文。

【样例输入】

YUANzi1987

【样例输出】

zvbo941987

【参考程序】(张文溢)

#include <stdio.h>

int main()
{
    char a[110];
    while(~scanf("%s",a))
    {
        for(int i=0;a[i]!='\0';++i)
        {
            if(a[i]>='A' && a[i]<'Z')
                a[i]+=33;
            else if(a[i]=='Z')
                a[i]+=7;
            else if(a[i]>='a' && a[i]<='z')
            {
                if(a[i]>='a' && a[i]<='c')
                    a[i]='2';
                else if(a[i]>='d' && a[i]<='f')
                    a[i]='3';
                else if(a[i]>='g' && a[i]<='i')
                    a[i]='4';
                else if(a[i]>='j' && a[i]<='l')
                    a[i]='5';
                else if(a[i]>='m' && a[i]<='o')
                    a[i]='6';
                else if(a[i]>='p' && a[i]<='s')
                    a[i]='7';
                else if(a[i]>='t' && a[i]<='v')
                    a[i]='8';
                else if(a[i]>='w' && a[i]<='z')
                    a[i]='9';
                else if(a[i]==0)
                    a[i]='0';
            }
        }
        printf("%s\n",a);
    }
}

问题 E: 平均分及不及格人数

【题目描述】

输入一个正整数n(n≤30),再输入n个学生的成绩,计算平均分,并统计不及格同学的个数。

【输入】

输入一个正整数n(n≤30)表示学生的个数,再输入n个学生的成绩。

【输出】

输出分三行。

第一行输出平均分(保留1位小数)。第二行输出不及格同学的个数。不及格人数为0时也要输出。

第三行输出不及格同学的分数,中间用空格分隔,最后一个后面没有空格。如果不及格人数为0,则什么都不输出。

【样例输入】

3
90 90 50

【样例输出】

76.7
1
50

【参考程序】


#include <stdio.h>

int main() {
    int n,c=0;
    double sum;
    int a[50],b[50];
    
    scanf("%d",&n);
    for (int i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
    
    for (int i=0; i<n; i++)
    {
        sum+=a[i];
    }
    
    sum/=n;
    printf("%.1f\n",sum);
    
    for (int i=0; i<n; i++)
    {
        if (a[i]<sum)
        {
            b=a[i];
            c++;
        }
    }
    
    printf("%d\n",c);
    for (int i=0; i<c; i++)
    {
        if (i!=c-1)
            printf("%d ",b[i]);
        else
            printf("%d\n",b[i]);
    }
    
    return 0;
}

问题F:字符逆序

【题目描述】

将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。

【输入】

输入包括一行。 第一行输入的字符串。

【输出】

输出转换好的逆序字符串。

【样例输入】

I am a student

【样例输出】

tneduts a ma I

【参考程序】

#include <stdio.h>
#include <string.h>

int main() {
    char s[100];
    gets(s);
    
    for (int i=strlen(s)-1; i>=0; i--)
    {
        printf("%c",s[i]);
    }
    return 0;
}

问题G:谁坐主宾

【题目描述】

哎哟喂,我的天哪,你见过吃饭最麻烦的规矩吗?见过?你一定没来过山东。山东的规矩愁死人了,首先要确定主宾坐哪里。通常情况下朋友聚会,谁年龄最大谁坐主宾。今儿个巧了,所有人同年同月同日生(请忽略概率),怎么办?我们都是程序猿,按名字大小吧,名字最大的坐主宾。题目要求求出主宾的名字
名字一律以拼音表示,含空格;名字不会重复。

【输入】

若干行,表示客人每个人的名字,名字长度不超过30;客人总数不超过10。

【输出】

主宾的名字,末尾换行

【样例输入】

Zhang tang ke
Li xin
Guo lei

【样例输出】

Zhang tang ke

【参考程序】

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int cmp( const void *a , const void *b)
{
    return ((*(char *)a )–(*(char *)b);
}


int main()
{
    int n=0;
    char s[10][50],a[50];
    
    while (gets(s[n]))
        n++;

    qsort(s,n,sizeof(s[0]),cmp);
    puts(s[n-1]);

}

【补充说明】

这是唯一一个难住我的题目,因为没有系统的学过算法,我对该题目选择使用冒泡排序,而OJ的评判结果始终是Wrong Answer,清源说使用qsort函数最后才写出这段程序通过,有兴趣的评论区留言,我给你冒泡法的代码我们一起debug。

分享