C语言程序设计基础OJ练习题(实验十结构体与共用体)

一、英文金曲大赛

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

我们在“渊子数”的题目中已经了解了渊子是个什么样的人了,他在大一的时候参加过工商学院的“英语聚乐部”。告诉你个秘密,这个俱乐部是个好地方,不但活动精彩而且有MM。
这不,英语俱乐部举办了一个叫做“英文金曲大赛”的节目。这个节目有好多人参加,这不,成绩出来了,渊子当是很勇敢,自告奋勇接下了算出大家的总得分的任务。
当时有7个评委,每个评委都要给选手打分,现在要求去掉一个最高分和去掉一个最低分,再算出平均分。结果精确到小数点后两位。

Input

测试数据包括多个实例。
每组数据包括7个实数,代表评委们对该选手的评分。紧接着是选手的名字,名字的长度不超过30个字符,且没有空格。
输入直到文件结束。

Output

算出每位选手名字和最终得分,结果保留两位小数。

Sample Input

10 10 10 10 10 10 9 xiaoyuanwang
0 0 0 0 0 0 0 beast

Sample Output

xiaoyuanwang 10.00
beast 0.00

Hint

#include<stdio.h>
struct str{
    char name[30];
    int a[10];
    double grade;
};
int main()
{
    struct str s;
    while(scanf("%d%d%d%d%d%d%d%s",&s.a[0],&s.a[1],&s.a[2],&s.a[3],&s.a[4],&s.a[5],&s.a[6],s.name)!=EOF)
    {
        int sum,max,min;
        sum = max = min = s.a[0];
        for(int i=1;i<=6;i++)
        {
            sum = sum+s.a[i];
            if(s.a[i]>max)
                max = s.a[i];
            else if(s.a[i]<min)
                min = s.a[i];
        }
        sum = sum - max- min;
        s.grade = sum/5.0;
        printf("%s %.2lf\n",s.name,s.grade);
    }
    return 0;
}

 

二、名单真相

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

马上就要考试了,小银变的非常的紧张(平时不好好的听课),昨天小银得到了一个成绩单,但是小银在打印的时候将名单上人的顺序倒置了,所以小银想知道真正的顺序。
成绩单的每一行包括:姓名 城市 成绩。姓名和城市保证全是小写字母(不超过15个字符),成绩不大于100.

Input

多组输入,每组的第一行输入一个n(1 <= n <= 1000).表示名单上人的数量,接下来n行每行包括人的姓名 城市 成绩。

Output

输出名单的真正的顺序。

Sample Input

3
xiaotong ningbo 100
xiaoyin zhejiang 100
xiaojin jiangxi 100

Sample Output

xiaojin jiangxi 100
xiaoyin zhejiang 100
xiaotong ningbo 100

Hint

Source

2015级《程序设计基础II》计科软件期末上机考试1 - by 绝尘

#include<stdio.h>
struct str{
    char name[16];
    char city[16];
    int grade;
};
int main()
{
    struct str s[1001];
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%s %s %d",s[i].name,s[i].city,&s[i].grade);
        }
        for(int i=n-1;i>=0;i--)
        {
            printf("%s %s %d\n",s[i].name,s[i].city,s[i].grade);
        }
    }
    return 0;
}

 

三、选票统计

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

某校学生会主席由全校学生投票选举产生,共有m名候选人报名参选,编号为1到m(0<m<1000),全校有n名学生(0<n<30000),每人都可以投票。但每人只能投一票,每票只能选1名候选人。请你设计一个程序能够统计出哪个候选人得票最高,得了多少票。不会出现得票数相同的情况。

Input

第一行输入候选人数m和学生数n,以空格分开;
下面依次输入每个学生所选的候选人的编号。

Output

第一行输出得票最多的候选人编号;
第二行输出该候选人所得的票数。

Sample Input

3 10
1 2 3 2 3 1 2 3 1 3

Sample Output

3
4

#include<stdio.h>
struct str
{
    int grade;
};
int main()
{
    struct str s[1001];
    int m,n,x,flag;
    scanf("%d%d",&m,&n);
    for(int i=1; i<=m; i++)
    {
        s[i].grade=0;
    }
    for(int i=0; i<n; i++)
    {
        scanf("%d",&x);
        s[x].grade++;
    }
    int max = 0;
    for(int i=1; i<=m; i++)
    {
        if(s[i].grade>max)
        {
            max = s[i].grade;
            flag = i;
        }
    }
    printf("%d\n%d\n",flag,max);
    return 0;
}

 

四、小鑫の日常系列故事(十)——排名次

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

小鑫在来到SDUT之后,经过十分刻苦的学习和努力终于进入了ACM集训队。很快又一次ACM集训队的选拔就要开始了,集训队员们又忙碌了起来。他也十分幸运的被学长抓来当苦力。  o(∩_∩)o 

这次学长给他分配的任务是写一个自动排名的程序,我们知道当选拔赛结束的时候,每一个参与选拔的同学都会有一个自己的分数。而集训队需要根据大家的分数排名来决定谁能够进入集训队,这个任务就落在了小鑫身上。

你能帮小鑫来完成这个程序么?

Input

 输入的第一行为n  0<n<=50;

下面还有n行每行为一个人名和ta所得到的分数。保证没有相同的分数。

人名为英文单词,长度不超过10。

Output

 输出为n行,每行一个人名与他的得分。每一行最后没有多余的空格。

具体输出格式见样例。

Sample Input

3
Dan 10
John 50
Danny 30

Sample Output

John 50
Danny 30
Dan 10

Hint

#include<stdio.h>
struct str
{
    char name[20];
    int grade;
};
int main()
{
    struct str s[101];
    struct str flag;
    int n;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%s%d",s[i].name,&s[i].grade);
    }
    for(int i=0; i<n; i++)
    {
        for(int j = 0;j<n-i-1;j++)
        {
            if(s[j].grade<s[j+1].grade)
            {
                flag = s[j];
                s[j] = s[j+1];
                s[j+1] = flag;
            }
        }
    }
    for(int i=0; i<n; i++)
    {
        printf("%s %d\n",s[i].name,s[i].grade);
    }
    return 0;
}

 

五、最终排名

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

第四届山东理工大学ACM网络编程擂台赛比赛完后需要产生一个最终排名,排名按照题数多少来决定。但是有太多的队伍参与,手动计算排名已经不能满足比赛的需求。现在有一份名单记录各个队伍的ID和做出的题目数,需要你写一个程序,产生最终的排名。

为了简化题目,这里的排名规则为:做出题目数量多的队伍排在前面,如果题数相等,保持输入时的相对顺序不要改变。

Input

第一行包含一个正整数T( 1 ≤ T ≤ 15),表示有T组测试数据。每组数据第一行有一个正整数N(1 <  N ≤ 10000),表示队伍数量。接下来N 行包含两个整数,1 ≤ ID ≤ 10^7, 0 ≤ M ≤ 100。ID为队伍的编号,M为做出的题数。

 

Output

每组数据输出包含N行,第i行有两个整数,ID和M表示排在第i位的队伍的ID和做出的题数。

 

Sample Input

1
8
1 2
16 3
11 2
20 3
3 5
26 4
7 1
22 4

Sample Output

3 5
26 4
22 4
16 3
20 3
1 2
11 2
7 1

#include<stdio.h>
struct str
{
    int name;
    int grade;
};
int main()
{
    struct str s[1000001];
    struct str flag;
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=0; i<n; i++)
        {
            scanf("%d %d",&s[i].name,&s[i].grade);
        }
        for(int i=0; i<n; i++)
        {
            for(int j = 0; j<n-i-1; j++)
            {
                if(s[j].grade<s[j+1].grade)
                {
                    flag = s[j];
                    s[j] = s[j+1];
                    s[j+1] = flag;
                }
            }
        }
        for(int i=0; i<n; i++)
        {
            printf("%d %d\n",s[i].name,s[i].grade);
        }
    }
    return 0;
}

 

六、老--质价比

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

给出n件物品,每件物品有质量和价格两种属性。你要做的是按质量升序排序,若质量相同则按价格降序排序。

Input

多组输入。每组先输入一个正整数n(1<=n && n <= 100),代表有n件物品。接下来的一行有n个正整数Wi(1<= Wi && Wi <= 10000),代表每件物品的质量。再接下来的一行有n个正整数Pi(1 <= Pi && Pi <= 10000),代表每件物品的价格。

Output

对于每组数据输出n行,每行两个数Wi,Pi。顺序为题目描述所要求。

Sample Input

3
1 2 2
3 2 3

Sample Output

1 3
2 3
2 2

Hint

#include<stdio.h>
struct str
{
    int wi;
    int pi;
};
int main()
{
    struct str s[10001];
    struct str flag;
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d",&s[i].wi);
        }
        for(int i=0; i<n; i++)
        {
            scanf("%d",&s[i].pi);
        }
        for(int i=0; i<n; i++)
        {
            for(int j = 0; j<n-i-1; j++)
            {
                if(s[j].wi>s[j+1].wi)
                {
                    flag = s[j];
                    s[j] = s[j+1];
                    s[j+1] = flag;
                }
                else if(s[j].wi==s[j+1].wi)
                {
                    if(s[j].pi<s[j+1].pi)
                    {
                        flag = s[j];
                        s[j] = s[j+1];
                        s[j+1] = flag;
                    }
                }
            }
        }
        for(int i=0; i<n; i++)
        {
            printf("%d %d\n",s[i].wi,s[i].pi);
        }
    }
    return 0;
}

 

七、共用体练习

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

 给定n和m,接下来有n个描述,每个描述包含一个类型标志和一组相应的数据。类型标志共3种:INT DOUBLE STRING,然后对应一组相应的数据。紧接着有m个询问,每个询问仅包含一个整数x,要求输出第x个描述对应的数据(STRING类型保证不含空格,每组对应STRING数据不会超过19个字符)。

 

Input

输入的第一行为两个整数,n和m (n<=100000, m<=100000),分别代表描述的个数和询问的个数。接下来为 n 行描述,最后为m行询问,具体格式见样例输入输出。

Output

对于每个询问,输出对应的结果,注意:浮点数保留两位小数。

Sample Input

5 4
INT 456
DOUBLE 123.56
DOUBLE 0.476
STRING welcomeToC
STRING LemonTree
0
1
2
4

Sample Output

456
123.56
0.48
LemonTree

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
union data
{
    char str[20];
    double number;
    int number2;
};
struct                                                                        
{
    char type[20];
    union data num;                                                      //共用体嵌入在结构体里
}s[100001];
int main()
{
    int n,m,x,i;
    scanf("%d %d",&n,&m);
    for(i = 0 ; i<n ; i++)
    {
        scanf("%s",s[i].type);
        if(strcmp(s[i].type,"STRING")==0)
            scanf("%s",s[i].num.str);
        else if(strcmp(s[i].type,"INT")==0)
            scanf("%d",&s[i].num.number2);
        else if(strcmp(s[i].type,"DOUBLE")==0)
            scanf("%lf",&s[i].num.number);
    }
    for(i = 0; i <m ; i++)
    {
        scanf("%d",&x);
        if(strcmp(s[x].type,"STRING")==0)
            printf("%s\n",s[x].num.str);
        else if(strcmp(s[x].type,"INT")==0)
            printf("%d\n",s[x].num.number2);
        else if(strcmp(s[x].type,"DOUBLE")==0)
            printf("%.2lf\n",s[x].num.number);
    }
    return 0;
}

 

、选夫婿2

Time Limit: 1000 ms Memory Limit: 32768 KiB

Submit Statistic

Problem Description

       倾国倾城的大家闺秀潘小姐要选夫婿啦!武林中各门各派,武林外各大户人家,闻讯纷纷前来,强势围观。前来参与竞选的男生藏龙卧虎,高手云集,才子遍布,帅哥纷纭,更不乏富二代,官二代,可谓声势空前。

 

       每个人参与竞选的帅哥除了进行一段激情洋溢的求婚演讲以外,还要报上自己姓名、身高,以及个人简历。最后再进行文武选拔,最后夺魁者方能得到潘小姐的芳心。

       潘小姐不爱名利,只看人,第一关就是身高要合格,即必须在其要求的范围内,否则直接排除在外,不允许参加下一轮的选拔。

       作为一个程序员,你没有钱也没有权,擅长的也就是编程了。潘小姐也发现了这一点,所以把首轮根据身高进行选拔的任务交给了你,如果完成的好,你可以直接进入下一轮选拔,你笑了。

 

Input

       潘小姐给你了所有报名男生的信息。输入数据的第一行是一个正整数N(0 < N < 100)。然后N行数据,每行包含两部分,用空格隔开。第一部分是报名者的姓名name(长度小于20的字符串),然后是整数身高h(0 < h < 300)。最后一行是两个整数a,b.表示身高的合格范围是[a,b]。

Output

       你需要把合格的男生信息按照身高从低到高输出,格式跟输入一样,也是每行两个信息,共N行,若没有合格人选则输出No,具体格式见样例。

Sample Input

8
武大郎 70
西门庆 182
李逵 160
燕青 175
鲁智深 195
武松 180
小泉纯一狼 30
孙二娘 169
165 190

Sample Output

孙二娘 169
燕青 175
武松 180
西门庆 182

#include<stdio.h>
struct str
{
    char name[21];
    int h;
};
int main()
{
    struct str s[10001];
    struct str st;
    int n,x,y,flag;
    flag = 0;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%s%d",s[i].name,&s[i].h);
    }
    for(int i=0; i<n; i++)
    {
        for(int j = 0; j<n-i-1; j++)
        {
            if(s[j].h>s[j+1].h)
            {
                st = s[j];
                s[j] = s[j+1];
                s[j+1] = st;
            }
        }
    }
    scanf("%d%d",&x,&y);
    for(int i=0; i<n; i++)
    {
        if(s[i].h>=x&&s[i].h<=y)
        {
            printf("%s %d\n",s[i].name,s[i].h);
            flag = 1;
        }
    }
    if(flag==0)
        printf("No\n");
    return 0;
}

 

九、选夫婿1

Time Limit: 1000 ms Memory Limit: 32768 KiB

Submit Statistic

Problem Description

    倾国倾城的大家闺秀潘小姐要选夫婿啦!武林中各门各派,武林外各大户人家,闻讯纷纷前来,强势围观。前来参与竞选的男生藏龙卧虎,高手云集,才子遍布,帅哥纷纭,更不乏富二代,官二代,可谓声势空前。

    每个人参与竞选的帅哥除了进行一段激情洋溢的求婚演讲以外,还要报上自己姓名、身高和体重,以及个人简历。最后再进行文武选拔,最后夺魁者方能得到潘小姐的芳心。

       潘小姐不爱名利,只看人,第一关就是身高和体重要合格,即必须在其要求的范围内,否则直接排除在外,不允许参加下一轮的选拔。

       作为一个程序员,你没有钱也没有权,擅长的也就是编程了。潘小姐也发现了这一点,所以把首轮根据身高体重进行选拔的任务交给了你,如果完成的好,你可以直接进入下一轮选拔,你笑了。

Input

        潘小姐给你了所有报名男生的信息。输入数据的第一行是一个正整数N(0 < N < 1000)。然后N行数据,每行包含三部分,用空格隔开。第一部分是报名者的姓名name(长度小于20的字符串),然后是整数身高h(0 < h < 300),第三部分是整数体重w (0 < w < 200)。

最后一行是四个整数a,b,c,d.表示身高的合格范围是[a,b],体重的合格范围是[c,d](0 < a < b < 200, 0 < c < d < 300)。

 

Output

        你需要把合格的男生信息按照身高从低到高输出,格式跟输入一样,也是每行三个信息,共N行,如果身高相同则按体重从轻到重输出,若没有合格人选则输出No,具体格式见样例。

 

Sample Input

8
武大郎 70 40
西门庆 180 70
李逵 160 150
燕青 175 69
鲁智深 180 100
武松 180 75
小泉纯一狼 30 20
孙二娘 169 60
165 190 60 90

Sample Output

孙二娘 169 60
燕青 175 69
西门庆 180 70
武松 180 75

Hint

#include<stdio.h>
struct str
{
    char name[21];
    int h;
    int w;
};
int main()
{
    struct str s[10001];
    struct str st;
    int n,x,y,p,q,flag;
    flag = 0;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%s%d%d",s[i].name,&s[i].h,&s[i].w);
    }
    for(int i=0; i<n; i++)
    {
        for(int j = 0; j<n-i-1; j++)
        {
            if(s[j].h>s[j+1].h)
            {
                st = s[j];
                s[j] = s[j+1];
                s[j+1] = st;
            }
            else if(s[j].h==s[j+1].h)
            {
                if(s[j].w>s[j+1].w)
                {
                    st = s[j];
                    s[j] = s[j+1];
                    s[j+1] = st;
                }
            }
        }
    }
    scanf("%d%d%d%d",&x,&y,&p,&q);
    for(int i=0; i<n; i++)
    {
        if(s[i].h>=x&&s[i].h<=y&&s[i].w>=p&&s[i].w<=q)
        {
            printf("%s %d %d\n",s[i].name,s[i].h,s[i].w);
            flag = 1;
        }
    }
    if(flag==0)
        printf("No\n");
    return 0;
}

 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值