创建属于你自己的整合类型——结构体的使用

news2024/10/3 8:17:45

创建属于你自己的整合类型——结构体的使用

  • 1.结构体简介
    • 1.1.结构体基础语法
    • 1.2.例题1——最厉害的学生(结构体排序)
      • 题目描述
      • 输入格式
      • 输出格式
      • 输入输出样例
        • 输入 #1
        • 输出 #1
      • 提示
  • 2.typedef结构体重命名
  • 3.(选读)成员函数和构造函数
    • 3.1.成员函数
    • 3.2.构造函数
    • 3.3.例题2——评等级
      • 题目描述
      • 输入格式
      • 输出格式
      • 输入输出样例
        • 输入 #1
        • 输出 #1
      • 提示
  • 4.(选读)结构体成员访问属性

1.结构体简介

1.1.结构体基础语法

    如果有多种不同类型的数据,想把他们集合成一个整体,可以使用struct关键字定义一个结构体。语法如下:

struct 结构体名
{
类型1 变量1,变量2;
类型2 变量1,变量2;

}变量一,变量二;//分号不要省略

    其中,最后一行定义的变量就是这个结构体类型的变量。可以省略。

    结构体中的变量也叫做结构体的属性

    定义结构体变量也可以在主函数内定义,比如:

struct 结构体名 变量名;//struct可以省略

    调用结构体成员的语法如下:

结构体变量名.成员变量名;

1.2.例题1——最厉害的学生(结构体排序)

最厉害的学生 - 洛谷

题目描述

现有 N N N 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过 8 8 8 个字符的仅有英文小写字母的字符串)、语文、数学、英语成绩(均为不超过 150 150 150 的自然数)。总分最高的学生就是最厉害的,请输出最厉害的学生各项信息(姓名、各科成绩)。如果有多个总分相同的学生,输出靠前的那位。

输入格式

第一行输入一个正整数 N N N,表示学生个数。

第二行开始,往下 N N N 行,对于每一行首先先输入一个字符串表示学生姓名,再输入三个自然数表示语文、数学、英语的成绩。均用空格相隔。

输出格式

输出最厉害的学生。

输入输出样例

输入 #1
3
senpai 114 51 4
lxl 114 10 23
fafa 51 42 60
输出 #1
senpai 114 51 4

提示

数据保证, 1 ≤ N ≤ 1000 1 \leq N \leq 1000 1N1000,姓名为长度不超过 8 8 8 的字符串,语文、数学、英语成绩均为不超过 150 150 150 的自然数。

题意分析
    定义一个结构体,储存每个学生的姓名,语文、数学和英语成绩。然后对结构体进行排序,总分高的靠前。最后输出第一名学生就行了。代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
struct student//定义一个结构体,储存每个学生的信息 
{
    string name;//储存这个学生的姓名 
    int chinese,maths,english,sum;//储存这个学生的语数英成绩和总分 
    int lev;//储存这个学生的输入顺序 
};
bool cmp(student a,student b)//自定义排序规则,对结构体进行排序 
{
	//注意if判断要写在前面,总分一样就输入顺序小的排在前面
    if(a.sum==b.sum)
        return a.lev<b.lev;
    return a.sum>b.sum;//否则返回总分大的排在前面 
}
int main()
{
    struct student a[1010];//在主函数内定义结构体,struct可以省略
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	//输入每个学生的信息 
        cin>>a[i].name>>a[i].chinese>>a[i].maths>>a[i].english;
        a[i].sum=a[i].chinese+a[i].maths+a[i].english;//计算总分 
        a[i].lev=i;//储存输入顺序 
    }
    sort(a+1,a+n+1,cmp);//对数组a的a[1]~a[n]排序 
    cout<<a[1].name<<" "<<a[1].chinese<<" "<<a[1].maths<<" "
	    <<a[1].english<<endl;//第一名即最厉害的学生 
    return 0;
}

2.typedef结构体重命名

    既然结构体也是一种复合类型,那我们可不可以对结构体进行类型重命名呢?当然可以。我们可以这样重命名:

typedef struct 结构体名
{
     结构体成员
}重命名名字;

也可以在主函数内重命名。

typedef 结构体名 重命名名字;

3.(选读)成员函数和构造函数

3.1.成员函数

     在结构体内,除了可以定义成员变量,还可以定义成员函数。成员函数,也叫做方法。具体定义方式和普通函数差不多,调用方式和结构体属性的调用也差不多。比如:

struct student
{
    string name;
    int score;
    void in_data()//输入姓名和分数
    {
        cin>>name>>score;
    }
    void print_data()//输出姓名和分数
    {
        cout<<name<<" "<<score<<endl;
    }
    void change_name(string _name)//改变这个人的名字
    {
        name=_name;
    }
    int get_score()//得到这个人的姓名
    {
        return score;
    }
};

    比如,上面的结构体,如果在下面由一个叫xiaoming的变量调用printf_data()方法,那就是输出小明的姓名和分数,以此类推。
xiaoming.print_data();
     注意:结构体内定义的成员函数可以直接访问定义的属性和方法。在结构体外定义的函数必须有一个明确的变量。比如:

struct student
{
    int chinese,maths,english;//储存这个学生每一门的分数
    void get_socre()//在结构内定义成员函数,可以直接访问
    {
        cin>>chinese>>maths>>english;
    }
};
int get_sum(student x)//计算总分
{
    return x.chinese+x.maths+x.english;
}

3.2.构造函数

     构造函数可以看做是特殊的成员函数。通常是用来初始化结构体属性的。构造函数基础语法如下:

struct 结构体名
{
     结构体名(参数类型1 参数1,参数类型2 参数2,…,参数类型n 参数 n)
     {
          函数体
     }
}

注意
1)构造函数没有类型,也没有返回值,只可以返回“”;
2)构造函数名必须和结构体名相同;
3)结构体内自带一个无参的构造函数。如果在结构体内重载了构造函数,需要再定义一个无参的构造函数。具体示例如下。

3.3.例题2——评等级

评等级 - 洛谷

题目描述

现有 N N N 名同学,每名同学需要设计一个结构体记录以下信息:学号、学业成绩和素质拓展成绩、综合分数(实数)。每行读入同学的学号、学业成绩和素质拓展成绩,并且计算综合分数(分别按照 70 % 70\% 70% 30 % 30\% 30% 权重累加),存入结构体中。还需要在结构体中定义一个成员函数,返回该结构体对象的学业成绩和素质拓展成绩的总分。

然后需要设计一个函数,其参数是一个学生结构体对象,判断该学生是否“优秀”。优秀的定义是学业和素质拓展成绩总分大于 140 140 140 分,且综合分数不小于 80 80 80 分。

当然通过本题很容易啦,本题只是为了帮助你训练结构体的使用方法。

本题存在精度误差问题,请将 a * 0.7 + b * 0.3 与 80 比较 转化为 a * 7 + b * 3 与 800 比较。

输入格式

第一行一个整数 N N N

接下来 N N N 行,每行 3 3 3 个整数,依次代表学号、学业成绩和素质拓展成绩。

输出格式

N N N 行,如果第 i i i 名学生是优秀的,输出 Excellent,否则输出 Not excellent

输入输出样例

输入 #1
4
1223 95 59
1224 50 7
1473 32 45
1556 86 99
输出 #1
Excellent
Not excellent
Not excellent
Excellent

提示

数据保证, 1 ≤ N ≤ 1000 1 \le N\le 1000 1N1000,学号为不超过 100000 100000 100000 的正整数,学业成绩和素质拓展成绩为 0 ∼ 100 0 \sim 100 0100 之间的正整数。

题意分析
按题意模拟就行。

代码

#include<iostream>
using namespace std;
int n,x,ans;
struct student
{
	int id,academic,quality;
	double overall;
	student(int _id,int _ac,int _qu)//初始化构造函数 
	{
		id=_id;//分别储存学号、学业成绩和素质拓展成绩
		academic=_ac;//给学业成绩赋值
		quality=_qu;//计算综合成绩
		overall=0.7*_ac+0.3*_qu;//这里的this->可以省略 
	}
	student(){}//没有传递参数的初始化构造函数
	int sum()//计算分数总和
	{
		return academic+quality;
	}
};
bool is_excellent(student s)
{//访问成员变量与调用成员函数 
	return s.overall>=80&&s.sum()>140;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	int tmp_id,tmp_ac,tmp_qu;
    	cin>>tmp_id>>tmp_ac>>tmp_qu;
    	student one_student(tmp_id,tmp_ac,tmp_qu);//结构体初始化 
    	if(is_excellent(one_student))//结构体变量作为参数传递 
    	    cout<<"Excellent"<<endl;
    	else
    	    cout<<"Not excellent"<<endl;
	}
	return 0;
}

4.(选读)结构体成员访问属性

     在结构体中,我们可以定义公开的属性和方法,也可以定义私有的属性和方法。可以使用public privateprotected关键字实现这个功能。结构体内的属性默认是公开的(public)。这里只需要大概了解一下就行了,感兴趣可以自己上网查阅资料。

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于STM32的温湿度监控系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码主循环代码应用场景 家居环境监控工业环境监控常见问题及解决方案 常见问题解决方案结论 1. 引言 在智能家居和工业自动化中&#xff0c;温湿度监控系统是一个非常重要的组成部分…

Linux 进程优先级、程序地址空间、进程控制

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a; Linux 目录 一、进程优先级 1、什么是进程优先级&#xff1f; 2、为什么要有优先级&#xff1f; 3、Linux的优先级特点、查看方式 4、命令行参数和环境变量 1.命令行参数 2.环境变量 获取环境变量的…

Unity强化工程 之 SpriteEditer Multiple

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 1. SpriteEditer Multiple Automatic slicing - Unity 手册 这是用于裁剪图集的模式 应用之后精灵编辑器会看到Slice亮…

云计算第二阶段:----监控与服务安全SECURITY

本模块内容&#xff0c;主要讲述 服务器的安全防护与配置软件相关知识。分为网络防护软件介绍、配置与使用用&#xff0c;网络安全相关知识浅度解析。 涉及软件有prometheus ,graphna,zabbix。 网络安全方面涉及基于debian linux系统的kali版本liunx的介绍与简单使用。 SECUR…

c++----内存管理

okk&#xff0c;大家好。我们大家学习了鄙人的前面前面几篇博客&#xff0c;并且还稍微使用了一些c的基础知识。并且我们前面都说过&#xff0c;我们前面学习的知识都说过。我们前面的几篇博客都是我们以后使用c基础。但是我们大家都知道现在代码都关注什么时间啊&#xff0c;内…

强光照射对半导体材料在紫外线下稳定性的影响

引言 半导体材料在光电器件中的应用日益广泛&#xff0c;其稳定性直接影响到器件的性能和寿命。特别是对于那些需要在户外或强光环境下工作的半导体器件&#xff0c;紫外线的照射会对材料的稳定性带来严峻挑战。因此&#xff0c;对半导体材料在紫外线照射下的稳定性进行深入研究…

模型实战(25)之 基于LoFTR深度学习匹配算法实现图像拼接

模型实战(25)之 基于LoFTR深度学习匹配算法实现图像拼接 图像拼接在全景图、大图或者多目场景下经常会被使用,常用的方法有传统图像处理算法和深度学习直接获取对应点的算法传统图像处理算法过程繁琐,阈值少且整体算法结果对调参比较敏感,其主要通过形状、特征点等描述子对…

【解决error】安装torch 1.1.0

第一步 当云服务器上没有指定版本的torch可以选择 先确定指定torch符合的python版本号 例如这里&#xff0c;我需要安装torch1.1.0&#xff0c;所以需要python>3.6 且 python<3.7 根据python版本&#xff0c;确定服务器安装torch的版本配置 第二步 新建conda虚拟环境…

搞DDR必懂的关键技术笔记:Initialization, Training , Calibration

初始化、训练和校准 引言 当一个带有DRAM子系统的设备上电时,DRAM达到可操作状态之前会发生一系列事件。以下是根据JEDEC规范中的状态机所显示的DRAM从上电到可操作状态所经历的各种状态。 这可不是我们平时就一句Training阶段就能概述。 本质上,初始化过程包括四个不同的阶…

【Redis】全局命令/内部编码/浅谈单线程模型

目录 前言 两个核心命令 GET和SET 全局命令 KEYS EXISTS DEL EXPIRE TTL TYPE 数据结构的内部编码 Redis的5中数据类型 Redis数据结构和内部编码 单线程架构 前言 Redis 提供了 5 种数据结构&#xff0c;理解每种数据结构的特点对于 Redis 开发运维⾮常重要&a…

easyrecovery和diskgenius哪个好 easyrecovery好用吗 diskgenius值得买吗

随着数据存储重要性的不断增加&#xff0c;数据丢失问题变得让人越来越担忧。当文件因为操作不慎、存储文件的介质损坏或其他原因导致数据丢失时&#xff0c;人们迫切需要一种强大的数据恢复工具来帮助他们找回丢失的文件。在这篇文章中&#xff0c;我们将比较两款知名的数据恢…

[Bugku] web-CTF靶场系列系列详解④!!!

平台为“山东安信安全技术有限公司”自研CTF/AWD一体化平台&#xff0c;部分赛题采用动态FLAG形式&#xff0c;避免直接抄袭答案。 平台有题库、赛事预告、工具库、Writeup库等模块。 --------------------------------- eval 开启环境&#xff1a; 进入页面发现是一道php题&…

axios请求响应拦截器

目录 axios-拦截器 拦截器的作用 请求拦截器-基本写法: axios请求拦截器-统一设置token 需求: 核心步骤: 关键代码: 响应拦截器-基本写法: axios响应拦截器-统一处理token失效 需求: 核心步骤: 关键代码: axios响应拦截器-数据剥离 需求: 核心步骤: 关键代码: ax…

试用AWS全新神器:Amazon Bedrock的「Open Artifacts」版Claude.ai Artifacts

Claude.ai的Artifacts真是太方便了。 GitHub上的AWS Samples仓库中有一个仿制Artifacts的应用程序。 Open Artifacts for Amazon Bedrock https://github.com/aws-samples/open_artifacts_for_bedrockhttps://github.com/aws-samples/open_artifacts_for_bedrock本文将介绍「…

【Java算法专场】前缀和(下)

目录 和为 K 的子数组 算法分析 算法步骤 算法代码 算法示例 和可被 K 整除的子数组 算法分析 同余定理 负数取余 算法步骤 算法代码 算法示例 连续数组 算法分析 算法步骤 算法代码 算法示例 矩阵区域和 算法分析 算法步骤 算法代码 算法示例 算法分析 …

1008 Elevator(Java)

题目 解释 输入数字N&#xff0c;数字N后面跟着N个数字代表着目的楼层&#xff0c;起始点是0层&#xff0c;每上升一层花费6秒&#xff0c;每下降一层花费4秒&#xff0c;每达到一个目的楼层&#xff0c;电梯会停5秒。问你一共花费多少秒&#xff1f; 解题思路 这道题不难&a…

【论文笔记】Matching Anything by Segmenting Anything

【引用格式】&#xff1a;Li S, Ke L, Danelljan M, et al. Matching Anything by Segmenting Anything[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2024: 18963-18973. 【网址】&#xff1a;https://openaccess.thecvf.com/co…

【Python】把list转换成json文件(list中为字典,元素按行写入)

0.前言 数据需要处理成与大模型输入相同类型的数据&#xff0c;从csv文件读出后&#xff0c;想要转换成json文件&#xff0c;看了好多资料都是把整个list写入了json&#xff0c;并不是我想要的格式&#xff0c;这里记录一下最后的按行写入的格式。 1.list转json import json …

Camtasia怎么自动加字幕 Camtasia怎么设置字幕

为了防止观众听不清楚视频中的解说声音&#xff0c;在进行视频编辑时&#xff0c;往往需要添加字幕。但是&#xff0c;你是否觉得一个一个添加字幕有些麻烦&#xff1f;使用Camtasia时&#xff0c;有没有什么能够快速、方便添加字幕的方法呢&#xff1f;添加字幕后&#xff0c;…

Docker 环境下使用 Traefik 3 的最佳实践:快速上手

Traefik 最近终于发布了大版本升级后的第一个修正版本&#xff0c;或许是时候正式迁移程序到新版本了。 写在前面 最近 Traefik 发布了 3.1 版本。作为从 Traefik 1.x 开始使用的用户&#xff0c;Traefik 每个大版本升级都会出现一些配置不兼容的情况&#xff0c;这次 3.x 的正…