2021-11-28 学习的打卡学习第六天(结构体的运用)

结构体可以系统性的将几个变量联系在一起,在一些实例中可以解决很多麻烦。

例题如下:

病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:

  1. 老年人(年龄 ≥60 岁)比非老年人优先看病。
  2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
  3. 非老年人按登记的先后顺序看病。

输入格式

第 1行,输入一个小于 100 的正整数,表示病人的个数;

后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于 10的字符串表示病人的 ID(每个病人的 ID 各不相同且只含数字和字母),一个整数表示病人的年龄(不超过 100 岁),中间用单个空格隔开。

输出格式

按排好的看病顺序输出病人的 ID,每行一个。

Sample Input

5
021075 40
004003 15
010158 67
021033 75
102012 30

Sample Output

021033
010158
021075
004003
102012

解决代码:

#include<stdio.h>
#include<string.h>
struct man
{
    char id[10];
    int age;
};
int main()
{
    struct man a[100];
    struct man young[100];
    struct man old[100];
    int n;
    char t[10];
    scanf("%d",&n);
    int i=0,r=0,y=0,e=0,f=0;
    for(i=0;i<n;i++)
       {
           scanf("%s %d",&a[i].id,&a[i].age);
           if(a[i].age>=60)
           {
               old[e]=a[i];
               e++;
           }
           else
           {
               young[f]=a[i];
               f++;
           }
       }
    for(i=0;i<e-1;i++)
    {
        for(r=0;r<e-1-i;r++)
        {
            if(old[r].age<old[r+1].age)
            {
               strcpy(t,old[r].id);
               y=old[r].age;
               strcpy(old[r].id,old[r+1].id);
               old[r].age=old[r+1].age;
               strcpy(old[r+1].id,t);
               old[r+1].age=y;
            }
        }
    }
    for(i=0;i<e;i++)
    printf("%s\n",old[i].id);
    for(i=0;i<f;i++)
    printf("%s\n",young[i].id);
    return 0;
}

这段代码可以优化一下:

for(i=0;i<e-1;i++)
    {
        for(r=0;r<e-1-i;r++)
        {
            if(old[r].age<old[r+1].age)
            {
               t=old[r];
               ald[r]=old[r+1];
               old[r+1]=t;
            }
        }
    }

原代码段:

for(i=0;i<e-1;i++)
    {
        for(r=0;r<e-1-i;r++)
        {
            if(old[r].age<old[r+1].age)
            {
               strcpy(t,old[r].id);
               y=old[r].age;
               strcpy(old[r].id,old[r+1].id);
               old[r].age=old[r+1].age;
               strcpy(old[r+1].id,t);
               old[r+1].age=y;
            }
        }
    }

是等价的。当时做的时候手比较生,一时忘了。

第2题雷同:

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 名学生发奖学金。期末,每个学生都有 3 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的 3 门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前 5 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

7   279

5   279

这两行数据的含义是:总分最高的两个同学的学号依次是 7 号、5 号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:

5    279

7    279

则按输出错误处理,不能得分。

输入格式

第 11 行为一个正整数 n,表示该校参加评选的学生人数。

第 22 到 n+1 行,每行有 3个用空格隔开的数字,每个数字都在 0 到 100之间 z 第 1 行的 3 个数 字依次表示学号为 j-1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 1∼n(恰好是输入数据的行号减 1)。

所给的数据都是正确的,不必检验。

输出格式

共有 5 行,每行是两个用空格隔开的正整数,依次表示前 5 名学生的学号和总分。

数据范围

50%的数据满足:各学生的总成绩各不相同。

100%的数据满足:6≤n≤300。

Sample Input

6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

Sample Output

6 265
4 264
3 258
2 244
1 237

Sample Input 2

8
80 89 89
88 98 78
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

Sample Output 2

8 265
2 264
6 264
1 258
5 258

代码:

#include<stdio.h>
struct man
{
    int yu;
    int shu;
    int ying;
    int id;
    int zong;
};
int main()
{
    struct man a[300];
    struct man t;
    int n;
    scanf("%d",&n);
    int i=0,r=0;
    for(i=0;i<n;i++)
    {
        scanf("%d %d %d",&a[i].yu,&a[i].shu,&a[i].ying);
        a[i].id=i+1;
        a[i].zong=a[i].yu+a[i].shu+a[i].ying;
    }
    for(i=0;i<n-1;i++)
    {
        for(r=0;r<n-1-i;r++)
        {
            if(a[r].zong<a[r+1].zong)
            {
                t=a[r];
                a[r]=a[r+1];
                a[r+1]=t;
            }
        }
    }
    for(i=0;i<4;i++)
    {
        for(r=0;r<4-i;r++)
        {
            if((a[r].zong==a[r+1].zong)&&(a[r+1].yu>a[r].yu))
            {
                t=a[r];
                a[r]=a[r+1];
                a[r+1]=t;
            }
        }
    }
    for(i=0;i<5;i++)
        printf("%d %d\n",a[i].id,a[i].zong);
    return 0;
}

后面又写了3道雷同题练手:

一.

小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根钢管。这听起来不算什么,但是这根钢管的要求可真是让他犯难了,要求如下:

  1. 这根钢管一定要是仓库中最长的;
  2. 这根钢管一定要是最长的钢管中最细的;
  3. 这根钢管一定要是符合前两条的钢管中编码最大的(每根钢管都有一个互不相同的编码,越大表示生产日期越近)。

相关的资料到是有,可是,手工从几百份钢管材料中选出符合要求的那根……要不,还是请你编写个程序来帮他解决这个问题吧。

输入格式

文件第一行为一个整数 n (1≤n≤1000),表示仓库中所有钢管的数量。

之后 nn 行,每行三个整数,分别表示一根钢管的长度(以毫米为单位,在 [1,10000] 范围内)、直径(以毫米为单位,在 [1,100] 范围内)和编码(一个 9 位整数)。

输出格式

只有一个 9 位整数,表示选出的那根钢管的编码。

Sample Input

4
3000 50 872198442
3000 45 752498124
2000 60 765128742
3000 45 652278122

Sample Output

752498124
#include<stdio.h>
struct iron
{
    int chang;
    int kuan;
    int id;
};
int main()
{
    struct iron a[1000];
    int n;
    int max_chang=0,min_kuan=1000,max_id=0;
    scanf("%d",&n);
    int i=0,r=0;
    for(i=0;i<n;i++)
        scanf("%d %d %d",&a[i].chang,&a[i].kuan,&a[i].id);
    for(i=0;i<n;i++)
    {
        if(a[i].chang>max_chang)
            max_chang=a[i].chang;
    }
    for(i=0;i<n;i++)
    {
        if(a[i].chang==max_chang)
        {
            if(a[i].kuan<min_kuan)
                min_kuan=a[i].kuan;
        }
    }
    for(i=0;i<n;i++)
    {
        if(a[i].chang==max_chang&&a[i].kuan==min_kuan)
        {
            if(a[i].id>max_id)
                max_id=a[i].id;
        }
    }
    printf("%d",max_id);
    return 0;
}

二.

世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的 150% 划定,即如果计划录取 m 名志愿者,则面试分数线为排名第 m×150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。

现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。

输入格式

第一行,两个整数 n,m(5≤n≤5000,3≤m≤n),中间用一个空格隔开,其中 n 表示报名参加笔试的选手总数,mm 表示计划录取的志愿者人数。输入数据保证m×150% 向下取整后小于等于 n。

第二行到第 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号 k(1000≤k≤9999) 和该选手的笔试成绩 s(1≤s≤100) 。数据保证选手的报名号各不相同。

输出格式

第一行,有 2 个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。

从第二行开始,每行包含 2 个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。

样例说明

m×150%=3×150%=4.5 向下取整后为 4。保证 4 个人进入面试的分数线为 88,但因为 88 有重分,所以所有成绩大于等于 88 的选手都可以进入面试,故最终有 5 个人进入面试。

Sample Input

6 3
1000 90
3239 88
2390 95
7231 84
1005 95
1001 88

Sample Output

88 5
1005 95
2390 95
1000 90
1001 88
3239 88
#include<stdio.h>
struct man
{
    int id;
    int grade;
};
int main()
{
    struct man a[5000];
    struct man t;
    int n,m;
    scanf("%d %d",&n,&m);
    int i=0,r=0;
    for(i=0;i<n;i++)
        scanf("%d %d",&a[i].id,&a[i].grade);
    for(i=0;i<n-1;i++)
    {
        for(r=0;r<n-1-i;r++)
        {
            if(a[r].grade<a[r+1].grade)
            {
                t=a[r];
                a[r]=a[r+1];
                a[r+1]=t;
            }
        }
    }
    m=m*1.5;
    while(1)
    {
        if(a[m-1].grade==a[m].grade)
            m++;
        else
            break;
    }
    for(i=0;i<m-1;i++)
    {
        for(r=0;r<m-1-i;r++)
        {
            if(a[r].grade==a[r+1].grade&&a[r].id>a[r+1].id)
            {
                t=a[r];
                a[r]=a[r+1];
                a[r+1]=t;
            }
        }
    }
    printf("%d %d\n",a[m-1].grade,m);
    for(i=0;i<m;i++)
        printf("%d %d\n",a[i].id,a[i].grade);
    return 0;
}

三.

蒜头君和朋友们去爬香山,为美丽的景色所陶醉,想合影留念。如果他们站成一排,男生全部在左(从拍照者的角度),并按照从矮到高的顺序从左到右排,女生全部在右,并按照从高到矮的顺序从左到右排,请问他们合影的效果是什么样的(所有人的身高都不同)?

输入格式

第一行是人数 n(2≤n≤40,且至少有 1 个男生和 1个女生)。

后面紧跟 n 行,每行输入一个人的性别(男male或女female)和身高(范围在 [0,2] 内的浮点数,单位米),两个数据之间以空格分隔。

输出格式

n 个浮点数,模拟站好队后,拍照者眼中从左到右每个人的身高。每个浮点数需保留到小数点后 

2 位,相邻两个数之间用单个空格隔开。

Sample Input

6
male 1.72
male 1.78
female 1.61
male 1.65
female 1.70
female 1.56

Sample Output

1.65 1.72 1.78 1.70 1.61 1.56
#include<stdio.h>
#include<string.h>
struct man
{
    char sex[10];
    float hign;
};
int main()
{
    struct man a[50];
    float b[50],c[50];
    int n,e=0,f=0;
    scanf("%d",&n);
    float t=0;
    int i=0,r=0;
    for(i=0;i<n;i++)
    {
        scanf("%s %f",&a[i].sex,&a[i].hign);
        if(a[i].sex[0]=='m')
        {
                b[e]=a[i].hign;
                e++;
        }
        else
            {
                c[f]=a[i].hign;
                f++;
            }
    }
    for(i=0;i<e-1;i++)
    {
        for(r=0;r<e-1-i;r++)
        {
            if(b[r]>b[r+1])
            {
                t=b[r];
                b[r]=b[r+1];
                b[r+1]=t;
            }
        }
    }
    for(i=0;i<e;i++)
    printf("%.2f ",b[i]);
    for(i=0;i<f-1;i++)
    {
        for(r=0;r<f-1-i;r++)
        {
            if(c[r]<c[r+1])
            {
                t=c[r];
                c[r]=c[r+1];
                c[r+1]=t;
            }
        }
    }
    for(i=0;i<f;i++)
    printf("%.2f ",c[i]);
    return 0;
}

结构体大概是掌握了,明天仔细重新再看一遍指针。再学学链表,继续加油!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值