《程序设计基础(B)II》实验1--结构体共用体和枚举

Posted ypw1131115630

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《程序设计基础(B)II》实验1--结构体共用体和枚举相关的知识,希望对你有一定的参考价值。

A [2551] - 检查宿舍卫生

Problem Description

不知道是从哪个学校开始兴起的还是哪个领导的决定,学校里每周都要检查宿舍卫生!大家发现没有,检查宿舍卫生是件很奇葩的事情,它剥削了每件物品的意义:垃圾桶里不能有垃圾,挂钩上不能挂东西,桌子上不能放东西,床上不能躺人!!假设检查卫生分为五项成绩:垃圾桶得分、挂钩得分、桌子得分、床铺得分和窗台得分。每项满分20分,总分满分为100分。按照计算机学院奇葩的规定,宿舍成绩在85分以下就要算作不合格。某天,宿管阿姨给了你一个检查完宿舍的打分表,让你帮忙统计下有多少个宿舍没有达到85分(等于85分是可以的),并且统计成绩最高分。

Input

输入包含多组测试数据. 每组数据的第一行为一个整数 T (0 < T <= 100),代表你要统计的宿舍的总数,接下来 T 行每行为 5 个整数,代表宿舍五项成绩的得分。

Output

对于每组测试数据,输出只有一行,由一个空格分隔的两个整数:总分不合格的宿舍数和宿舍总分最高分,如果最高分仍小于85分,则输出为不合格的宿舍数和“No”(不包含引号)。

Sample Input

5
1 2 3 4 5
10 20 10 20 20
20 20 20 20 20
15 15 15 20 20
10 10 10 10 10

Sample 3 100

  看清题目即可。
技术图片
#include <stdio.h>
#define maxn 110
struct node
{
    int sum;
} a[maxn];
int main()
{
    int i,j,k,m,n;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));
        for (i=1; i<=n; i++)
        {
            j=5;
            while(j--)
            {
                scanf("%d",&k);
                a[i].sum+=k;
            }
        }
        k=0;
        m=0;
        for (i=1; i<=n; i++)
        {
            if (a[i].sum>m)
            {
                m=a[i].sum;
            }
            if (a[i].sum<85)
            {
                k++;
            }
        }
        if (m>=85)
            printf("%d %d
",k,m);
        else
            printf("%d No
",k);
    }
    return 0;
}
View Code

B [4202] - 小 I 的小姐姐

Problem Description

小 I 去天津玩啦,一路上,他跟他的同学发生了许多有趣的事。

当他们路过天津外国语学院时,他发现了许多小姐姐,他眼花缭乱,甚至不知道该去找哪个小姐姐聊天。

怎么办怎么办!

于是他想到了你,他拍了一张照片给你,你发现照片里一共有 n 个小姐姐(序号从 0 到 n - 1),每个小姐姐都有自己的风格,可以按特征划分出 3 个特征值  w1 , w2 , w3 ,你知道小 I 特别喜欢 w1 特征值高的小姐姐,不太看重 w3 ,于是你对于每个特征都赋予一个权重,分别对应为0.7 0.2 0.1,你能帮小 I 找出来他发来的这张照片里他最喜欢的小姐姐吗?

Input

多组输入,对于每组输入:

  • 第一行给出 n (n <= 5000) ,之后有 n 行数。
  • 每行数有三个数 w1, w2, w3,表示三个特征值。

所有整数及结果都在整型范围内,不存在权值和相等的情况。

Output

n 个小姐姐中权值和最高的序号。

Sample Input

3
1  5 10
5 1 10
10 5 1

Sample Output

2
这题感觉比上面的题目还简单,emmm,没啥思维量
技术图片
#include <stdio.h>
#define maxn 5010
struct node
{
    int sum;
} a[maxn];
int main()
{
    int i,j,k,m,n,w1,w2,w3;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));
        for (i=0; i<n; i++)
        {
                scanf("%d%d%d",&w1,&w2,&w3);
                a[i].sum=w1*0.7+w2*0.2+w3*0.1;
        }
        k=-1;
        m=-1;
        for (i=0; i<n; i++)
        {
            if (a[i].sum>m)
            {
                m=a[i].sum;
                k=i;
            }
        }
            printf("%d
",k);
    }
    return 0;
}
View Code

C [1294] - 选票统计

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>
#define maxn 5010
struct node
{
    int sum[maxn];
} a;
int main()
{
    int i,j,k,m,n,w[maxn];
   scanf("%d%d",&n,&m);
        for (i=1; i<=m; i++)
        {
               scanf("%d",&k);
               a.sum[k]++;
        }
        k=-1;
        m=-1;
        for (i=1; i<=n; i++)
        {
            if (a.sum[i]>m)
            {
                m=a.sum[i];
                k=i;
            }
        }
            printf("%d
%d
",k,m);

    return 0;
}
View Code

D [4199] - 小 I 选宾馆

Problem Description

小 I 去天津玩啦,一路上,他跟他的同学发生了许多有趣的事。

到了晚上了,小 I 跟他的同学们要选一个宾馆住下了。但是形形色色的宾馆让小 I 不知所措。

对于一个宾馆来说,有许多特征,比如「价格」、「舒适度」。小I会对每个特征都有一个满意度。

小I会选择出满意度更高一些的宾馆。

其中,「价格」对于小 I 来说是最重要的,其次是「舒适度」。

如果有两个宾馆,如果对「价格」的满意度相同,那么根据「舒适度」进行选择;如果有多个宾馆条件相同,输出编号最小的宾馆。

小 I 现在处于水深火热之中,因为他们面对一堆宾馆不知所措,他想到了会编程的你,如果你不帮他选出来,他可能就会露宿街头了QAQ~

你能帮他按照他的意愿找到小I最满意的宾馆吗?

Input

多组输入,对于每组输入:

  • 给出 n (n <= 5000) 代表 n  个宾馆(编号从 1 - n),随后有 n 行数据。
  • 每行数据有两个整数,分别代表小I对「价格」、「舒适度」的满意程度,数值越大满意程度越高,满意度的范围从0 - 5000。

Output

输出按照描述的条件中小I最满意的宾馆编号,如果有多个宾馆条件相同,输出编号最小的宾馆。

Sample Input

4
0 1
1 0
1 1
1 0

Sample Output

3
设定第一个宾馆是最好的,不断地拿后面的宾馆和它比较,最后得出最好的宾馆。
技术图片
#include <stdio.h>
#define maxn 5010
struct node
{
    int b,c,i;
} a[maxn];
int main()
{
    int i,j,k,m,n,t,b,c;
    while(~scanf("%d",&n))
    {
        scanf("%d%d",&a[1].b,&a[1].c);
        b=a[1].b;
        c=a[1].c;
        t=1;
        for(i=2; i<=n; i++)
        {
            scanf("%d%d",&a[i].b,&a[i].c);
            if (b<a[i].b)
            {
                b=a[i].b;
                c=a[i].c;
                t=i;
            }
            else if(b==a[i].b&&a[i].c>c)
            {
                b=a[i].b;
                c=a[i].c;
                t=i;
            }
        }
        printf("%d
",t);
    }
    return 0;
}
View Code

E [2741] - 小鑫の日常系列故事(十)——排名次

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
给结构体排个序
技术图片
#include <stdio.h>
#define maxn 5010
struct node
{
    int score;
    char name[11];
} a[maxn];
int main()
{
    int i,j,k,m,n;
    struct node t;
    scanf("%d",&n);
    for (i=1;i<=n;i++)
    {
        scanf("%s %d",a[i].name,&a[i].score);
    }
    for (i=1;i<=n-1;i++)
    {
        for (j=1;j<=n-i;j++)
        {
            if (a[j].score<a[j+1].score)
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    for (i=1;i<=n;i++)
    {
        printf("%s %d
",a[i].name,a[i].score);
    }

    return 0;
}
View Code

 F [2446] - 最终排名

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>
#define maxn 5010
struct node
{
    int score;
    int name;
} a[maxn];
int main()
{
    int i,j,k,m,n;
    struct node t;
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d",&n);
        for (i=1; i<=n; i++)
        {
            scanf("%d%d",&a[i].name,&a[i].score);
        }
        for (i=1; i<=n-1; i++)
        {
            for (j=1; j<=n-i; j++)
            {
                if (a[j].score<a[j+1].score)
                {
                    t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
            }
        }
        for (i=1; i<=n; i++)
        {
            printf("%d %d
",a[i].name,a[i].score);
        }

    }
    return 0;
}
View Code

G [1569] - 选夫婿1

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
注意细节错误,先把符合的人选放到一个新的结构体里面,再将新的结构体按要求进行排序。
技术图片
#include <stdio.h>
#define maxn 1010
struct node
{
    int h,w;
    int name[21];
} a[maxn],b[maxn];
int main()
{
    int i,j,k,m,n,h1,h2,w1,w2;
    struct node t;
    scanf("%d",&m);
    for (i=1; i<=m; i++)
    {
        scanf("%s%d%d",a[i].name,&a[i].h,&a[i].w);
    }
    scanf("%d%d%d%d",&h1,&h2,&w1,&w2);
    k=0;
    for (i=1; i<=m; i++)
    {
        if (a[i].h>=h1&&a[i].h<=h2&&a[i].w>=w1&&a[i].w<=w2)
        {
            b[++k]=a[i];
        }
    }
    for(i=1; i<=k-1; i++)
    {
        for (j=1; j<=k-i; j++)
        {
            if (b[j].h>b[j+1].h)
            {
                t=b[j];
                b[j]=b[j+1];
                b[j+1]=t;
            }
        }
    }
    for (j=1; j<=k-1; j++)
    {
        if (b[j].h==b[j+1].h&&b[j].w>b[j+1].w)
        {
            t=b[j];
            b[j]=b[j+1];
            b[j+1]=t;
        }
    }
    if (k==0)
        printf("No
");
    else
    {
        for (i=1; i<=k; i++)
        {
            printf("%s %d %d
",b[i].name,b[i].h,b[i].w);
        }
    }
    return 0;
}
View Code

 H [2873] - 老--质价比

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
输入有点矩阵转置的感觉,第一行先输入结构体中的一个,第二行再输入另一个值,然后将其按要求排序
技术图片
#include <stdio.h>
#define maxn 10010
struct node
{
    int p,w;
} a[maxn];
int main()
{
    int i,j,k,m,n,h1,h2,w1,w2;
    struct node t;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));
        for (i=1; i<=n; i++)
        {
            scanf("%d",&a[i].w);
        }
        for (i=1; i<=n; i++)
        {
            scanf("%d",&a[i].p);
        }
        for (i=1; i<=n-1; i++)
        {
            for (j=1; j<=n-i; j++)
            {
                if (a[j].w>a[j+1].w)
                {
                    t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
            }
        }
        for (j=1; j<=n-1; j++)
        {
            if (a[j].w==a[j+1].w&&a[j].p<a[j+1].p)
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
        for (i=1; i<=n; i++)
        {
            printf("%d %d
",a[i].w,a[i].p);
        }
    }
    return 0;
}
View Code

I [1960] - 共用体练习

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>
#define maxn 100010
union
{
    int b;
    double c;
    char x[50];
}a[maxn];
char s[maxn][20];
int main()
{
    int n,t,i,j,m,h;
    double p;
    char x[50];
    scanf("%d%d",&n,&m);
    for (i=0;i<n;i++)
    {
        scanf("%s",s[i]);
        if (s[i][0]==I)
        {
            scanf("%d",&h);
            a[i].b=h;
        }
        else if (s[i][0]==D)
        {
            scanf("%lf",&p);
            a[i].c=p;
        }
         else if (s[i][0]==S)
        {
            scanf("%s",&x);
            strcpy(a[i].x,x);
        }
    }
    for (i=0;i<m;i++)
    {
        scanf("%d",&t);
        if(s[t][0]==I)
            printf("%d
",a[t].b);
        else if (s[t][0]==D)
            printf("%.2f
",a[t].c);
            else if(s[t][0]==S)
            printf("%s
",a[t].x);
    }
    return 0;
}
View Code

J [1959] - 简单枚举类型——植物与颜色

Problem Description

 请定义具有red, orange, yellow, green, blue, violet六种颜色的枚举类型color,根据输入的颜色名称,输出以下六种植物花朵的颜色:
Rose(red), Poppies(orange), Sunflower(yellow), Grass(green), Bluebells(blue), Violets(violet)。如果输入的颜色名称不在枚举类型color中,例如输入purple,请输出I don‘t know about the color purple.
 

Input

 输入数据有多行,每行有一个字符串代表颜色名称,颜色名称最多30个字符,直到文件结束为止。

Output

 输出对应颜色的植物名称,例如:Bluebells are blue. 如果输入的颜色名称不在枚举类型color中,例如purple, 请输出I don‘t know about the color purple.
 

Sample Input

blue
yellow
purple

Sample Output

Bluebells are blue.
Sunflower are yellow.
I don‘t know about the color purple.
本人感觉这个枚举在这题有点多此一举,没办法,为了熟悉一下这个东西的使用
技术图片
#include <stdio.h>
#define maxn 100010
enum color
{
    red,orange,yellow,green,blue,violet,no
} co;
char s[maxn];
int main()
{
    while(~scanf("%s",s))
    {
        if(strcmp(s,"red")==0)
            co = red;
        else if(strcmp(s,"orange")==0)
            co = orange;
        else if(strcmp(s,"yellow")==0)
            co = yellow;
        else if(strcmp(s,"green")==0)
            co = green;
        else if(strcmp(s,"blue")==0)
            co = blue;
        else if(strcmp(s,"violet")==0)
            co = violet;
        else
            co = no;

        switch(co)
        {
        case red:
            printf("Rose are red.
");
            break;
        case orange:
            printf("Poppies are orange.
");
            break;
        case yellow:
            printf("Sunflower are yellow.
");
            break;
        case green:
            printf("Grass are green.
");
            break;
        case blue:
            printf("Bluebells are blue.
");
            break;
        case violet:
            printf("Violets are violet.
");
            break;
        case no:
            printf("I don‘t know about the color %s.
",s);
            break;
        }

    }
    return 0;
}
View Code

 

以上是关于《程序设计基础(B)II》实验1--结构体共用体和枚举的主要内容,如果未能解决你的问题,请参考以下文章

结构体与共用体

实验报告(2019年6月26日)

构造数据类型实验

结构体变量实验报告

结构体和共用体

C语言中的结构体和共用体(联合体)