c语言初学者经典练习解读——结构体

首先我们总结一下结构体的注意事项:

01结构体  是 一种构造类型

02 定义完之后加分号

03 数据类型

04 内存是最长的单个变量的内存*个数

我们先看第一个例题

假设检查宿舍卫生分为五项成绩:垃圾桶得分、挂钩得分、桌子得分、床铺得分和窗台得分。每项满分20分,总分满分为100分。按照检查规定,宿舍成绩在85分以下就要算作不合格。某天,宿管阿姨给了你一个检查完宿舍的打分表,让你帮忙统计下有多少个宿舍没有达到85分(等于85分是可以的),并且统计成绩最高分。

输入格式:

第一行为一个整数 n (0 < n <= 100),代表你要统计的宿舍的总数,接下来 n 行每行为 5 个整数,代表宿舍五项成绩的得分。

输出格式:

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

输入样例:

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

输出样例:

3 100

首先分析题目 我们可以知道这个类型也就是宿舍或者类型可以看作是一个结构体,因为对于这一类的变量都有这个模板,对于结构体内部我们可以有排名和成绩两个成员属性

对于输入,如何处理输入呢,输入五项内容,不如直接定义五个变量,然后后加到一起作为属性——分数  其次输入的n,所以我们不能只定义一个结构体,也不能一个一个定义,所以我们上来就先定义足够多的结构体数组,u需要几个我们取几个就可以了

对于输出

一个是不合格数,一个是最高分,其中“如果最高分仍小于85分”,说明我们还需要一个if来判断最后

注意点:

对于不合格宿舍数的统计,我们可以在输入的过程直接加到成员属性里面,然后紧接着判断即可

然后就是统计最大的 注意求最大的不是用冒泡排序,这里求最大值一个循环就够了

最后直接判断最大的即可

#include<stdio.h>
struct dormitory{
    int score;
    int rank;
}room[10];
int main(){
int a,b,c,d,e,i,n,p=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
        room[i].score=a+b+c+d+e;
        if(room[i].score<85)p++;
    }
    int max=room[0].score;
    for(i=1;i<n;i++){
        if(max<room[i].score){
            max=room[i].score;
        }
    }
    if(max<85)printf("%d No",p);
    else{
        printf("%d %d",p,max);
    }
    return 0;
}

例题2

2023年的烧烤让全国的人民了解到了淄博,来自天津的小杨同学也被淄博的温暖所吸引考入了山东理工大学。小杨同学具备天津人的幽默和乐观,于是顺利地进入到学校学生会的宣传部工作,并且协助招聘1名宣传委员。

报名的人很多,每人首先交1张照片,小杨同学需要从n个照片里根据特征值选择1人(序号从 0 到 n - 1),每个参加招聘的同学都有自己的风格,可以按特征划分出 3 个特征值 w1 , w2 , w3 ,宣传部需要 w1 特征值高的同学,不太看重 w3 ,于是小杨同学对于每个特征都赋予一个权重,分别对应为0.7 0.2 0.1,你能帮小杨同学选出宣传部需要的人吗?

输入格式:

第一行给出一个整数 n (n <= 1000) ,之后有 n 行数。

每行数有三个整数 w1, w2, w3,表示三个特征值。

不存在权值和相等的情况。

输出格式:

输出n 个应聘同学中权值和最高的序号。

输入样例:

3
1 5 10
5 1 10
10 5 1

输出:

2

 

解读:

首先很明显的是“三个特征值”,也就说明了成员的属性要包含三个,注意不是所有的值都是int就可以!这个题目后面是有*0.7,所以肯定是需要浮点数参与进去的,不然是整形的话后面小数部分不会计算在内,导致错误

然后

输入: 跟上个题目一样,我们不挨个定义结构体变量,而是定义足够多的结构体数组元素,用几个调用几个

输出:

循环找出最大的值即可,同时记录好下标哟

#include<stdio.h>
struct student{
double w1,w2,w3,sum;
}stu[100];
int main(){

int n;
scanf("%d",&n);
int i,j,p;
for(i=0;i<n;i++){

scanf("%lf%lf%lf",&stu[i].w1,&stu[i].w2,&stu[i].w3);
stu[i].sum=stu[i].w1*0.7+stu[i].w2*0.2+stu[i].w3*0.1;
}
double max;
max=stu[0].sum;
for(i=1;i<n;i++){
if(max<stu[i].sum){
max=stu[i].sum;
p=i;
}
}
printf("%d",p);
return 0;
}
#include<stdio.h>
struct person{
    double w1,w2,w3;
   double sum;
    int rank;
};
int main(){
int n;
    scanf("%d",&n);
    struct person per[n];
    int i,j;
    for(i=0;i<n;i++)
    {
        per[i].rank=i;
        per[i].sum=0;
  scanf("%lf%lf%lf",&per[i].w1,&per[i].w2,&per[i].w3);
       per[i].sum=per[i].w1*0.7+per[i].w2*0.2+per[i].w3*0.1;
}
  double max=0;
    int p=0;
    for(i=0;i<n;i++){
        if(max<per[i].sum){
            max=per[i].sum;
        p=i;
      }
        }
    printf("%d\n",p);
    return 0;
}

而在这两段代码的比较中

第一段代码是错误的

不知道大家有没有看出来

解密——————> 数组长度不够!

这里会显示段错误

例题3

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

输入格式:

第一行输入候选人数m和学生数n,以空格分开;

下面依次输入每个学生所选的候选人的编号。

输出格式:

第一行输出得票最多的候选人编号;

第二行输出该候选人所得的票数。

输入样例:

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

输出样例:

3
4
#include<stdio.h>
struct candidate{
    int get;
    int rank;
};
struct vote{
    int ticket;
};
int main(){
    int n,m;
    scanf("%d %d",&m,&n);
    struct candidate per[m];
    struct vote stu[n];
    int i,j;
    for(i=0;i<m;i++){
        per[i].get=0;
        per[i].rank=i+1;//
    }
    for(i=0;i<n;i++)
    {
        scanf("%d",&stu[i].ticket);
        for(j=0;j<m;j++){
            if(stu[i].ticket==per[j].rank){
                per[j].get++;
            }
        }
    }
  int max=0,p=90;
    for(j=0;j<m;j++){
        if(max<per[j].get){
            max=per[j].get;
            p=per[j].rank;
        }
    }
    printf("%d\n%d",p,max);
    return 0;
}

 例题4

疫情期间到淄博隔离的山大学子们受到了淄博当地家人般的照顾,于是山大的学子们疫情后仍然会坐火车到淄博转一转,体会这座城市的温暖。这不,山大的小南同学在一个周末和同学又来到了八大局买扇子,听说都是有收藏价值呢。

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

对于一个宾馆来说,有许多特征,比如「价格」、「舒适度」。小南会对每个特征都有一个满意度。小南会选择出满意度更高一些的宾馆。其中,「价格」对于小南来说是最重要的,其次是「舒适度」。

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

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

输入格式:

给出 n (n <= 5000) 代表 n 个宾馆(编号从 1 - n),随后有 n 行数据。

每行数据有两个整数,分别代表小南对「价格」、「舒适度」的满意程度,数值越大满意程度越高,满意度的范围从0 - 5000。

输出格式:

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

输入样例:

4
0 1
1 0
1 1
1 0

输出样例:

3

这个题目,对于结构体成员应该有什么,我们不过多强调了

但是这个题目注意点是:

一个是  数组长度足够大,满足题目中的要求

另一个是待比较的是有先后的,我们如何实现这个先后呢

我们要输出的是最佳的下标,所以我们要有一个变量不断变换,来记录最大的,更改下标

与其我们全部输入完,再循环,再比较,不如我们在输入的同时就进行比较,输入一个比较一次,这就在输入完了我们也比较完了,直接就可以输出最佳的下标

注意比较两次也说明,我们需要两个变量来充当最大值

         


#include<stdio.h>
struct hotel{
    int price,comfort;
}ho;
int main(){
int n,p,p_max=0,c_max=0,i;
    scanf("%d",&n);
    for(i=0;i<n;i++){
    scanf("%d %d",&ho.price,&ho.comfort);
    if(p_max<ho.price){
        p_max=ho.price;
        p=i;
        c_max=ho.comfort;
    }
        else if(p_max==ho.price){
            if(c_max<ho.comfort){
                p=i;
                c_max=ho.comfort;
            }
        }
    }
    printf("%d",p+1);
    return 0;
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值