当前位置: 首页 > news >正文

结构体(c++语言)

在实际问题中,一组数据往往具有不同的数据类型。例如,人口大普查时,我们需要记录每一位公民的姓名,年龄,性别,住址,身份证号码。这些信息分别要用整型,字符型,字符串型来记录。为了解决问题,C++语言给出了另一种构造数据类型——“结构体”,它在数据存储方面相当于其他高级语言中的记录,但它有着面向对象的优势。

一、结构体定义和操作

   1. 定义结构体及结构体变量

   结构体变量的定义有两种方式:

   

   定义结构体的同时定义结构体变量

   struct 结构体名 {  //其中 struct 是关键字

    成员表   //可以有多个成员

    成员函数  //可以有多个成员函数,也可以没有

   }  结构体变量表; //可以同时定义多个结构体变量

   

   结构体变量名列表的各个变量用“,”隔开。

    例如:

   struct DATA{

    int a[2];                        //成员为一个数组

    int c;      

    }data_a,data_b;   

 当然,我们也可以先定义结构体再定义结构体变量

   struct 结构体名{

    成员表

    成员函数

   };

   结构体名  结构体变量表;//同样可以同时定义多个结构体变量

    例如:

   struct DATA{

    int a[2];                      

    int c;      

    };

   DATA data_a,data_b;//这种定义方式与上一种方式的效果是相同的

  在定义结构体变量时注意,结构体变量名和结构体名不能相同。在定义结构体时,系统对之不分配实际内存。只有定义结构体变量时,系统才为其分配内存。

 2.成员调用

   结构体变量与各个成员之间引用的一般形式为:

   结构体变量名. 成员名

    对于上面定义的结构体变量,我们可以这样操作:

    cin>>data_a.a[0]>>data_a.a[1];  //一般情况下不能写 cin>>data_a;

    int a=data_a.a[0]+data_a.a[1];    //就像用整形变量一样用a[0]、a[1]

     data_b=data_a;       //结构体之间的相互赋值是合法的

    data_a.c=0;       //就如同给整形变量赋值

    实际上结构体成员的操作与该成员类型所具有的操作是一致的。

成员运算符“.”在存取成员数值时使用,其优先级最高,并具有左结合性。在处理包含结构体的结构体时,可记作:

   strua. strub. membb

   这说名结构体变量 strua 有结构体成员 strub;结构体变量 strub 有成员 membb。   

   3.成员函数调用

   结构体成员函数调用的一般形式为:

   结构体变量名. 成员函数  

   结构体成员函数默认将结构体变量作为引用参数。

二、结构体操作实例

   现在,我们先定义一个简单的结构体,这个结构体将用来记录一个学生的大致情况,所以它的成员应该有学号、姓名、性别、年龄、成绩、家庭住址等。

   #include<iostream>

   using namespace std;

   struct student{

    int num;   //学号

    char name[21];  //姓名

    char sex;   //性别

    int age;   //年龄

    float score;   //成绩

    char address[51];  //家庭住址

   };  //此处不可忽略分号

   struct student a,b;

   int main()

   {

    cin>>a.num>>a.name>>a.sex>>a.age>>a.score>>a.address;

    cin>>b.num>>b.name>>b.sex>>b.age>>b.score>>b.address;

    cout<<a.num<<' '<<a.name<<' '<<a.sex<<' '<<a.age<<' '<<a.score<<' '<<a.address<<endl;

    cout<<b.num<<' '<<b.name<<' '<<b.sex<<' '<<b.age<<' '<<b.score<<' '<<b.address<<endl;

    return 0;

   }

学生信息 查看测评数据信息

输入一个学生的信息,包括姓名、性别、年龄、体重,再输出这些信息。(要求使用结构体)

输入格式

一行,依次是学生的姓名、性别、年龄、体重。

输出格式

一行,依次是学生的姓名、性别、年龄、体重(体重保留一位小数)。

输入/输出例子1

输入:

wangshuting  f  12  70.69

输出:

wangshuting  f  12  70.7

#include<bits/stdc++.h>
using namespace std;
struct stu{string name;char x;int a;double b;
}n;
int main(){cin>>n.name>>n.x>>n.a>>n.b;cout<<n.name<<" "<<n.x<<" "<<n.a<<" ";printf("%.1lf",n.b);return 0;
}

成绩排名次 查看测评数据信息

输入N个学生的姓名和语文成绩,按语文成绩高低排出名次,并且从大到小输出每个学生的姓名。

输入格式

输入第一行:N,表示N个学生。( 0 < n < 60 )

第二到第N+1行:两个变量:A姓名,B学生成绩(保证成绩没有相同)。学生的姓名不超过20个字符。

输出格式

输出N行,按学生成绩由高到低输出。

每行输出学生名次、姓名和成绩,中间用空格隔开。

输入/输出例子1

输入:

3

xiaofang 89

xiaotian 100

chenhao 60

输出:

1 xiaotian 100

2 xiaofang 89

3 chenhao 60

#include<bits/stdc++.h>
using namespace std;
struct stu{string name;int a;
}m[1005];
int n; 
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>m[i].name>>m[i].a;}for(int i=1;i<n;i++){for(int j=i+1;j<=n;j++){if(m[i].a<m[j].a)swap(m[i].name,m[j].name),swap(m[i].a,m[j].a);}}for(int i=1;i<=n;i++){cout<<i<<" "<<m[i].name<<" "<<m[i].a<<endl;}return 0;
}

身高问题 查看测评数据信息

输入 n 个学生的信息,每个学生信息包括姓名、身高、学号。编程输出身高最高的学生的信息。

输入格式

第 1 行一个正整数 n,表示学生个数,n≤100。

以下 n 行,每一行依次输入学生的姓名、身高、学号。

输出格式

输出最高的学生信息,如存在身高一样的请输出学号小的那个同学。

输入/输出例子1

输入:

5

John 172 20160302

David 173 20160306

Jason 168 20160309

Jack 152 20160311

Kitty 147 20160319

输出:

David 173 20160306

#include<bits/stdc++.h>
using namespace std;
struct a{string name;int sg;int xh;
}x[105];
int n;
bool cmp(a x,a y){if(x.sg!=y.sg)return x.sg>y.sg;else return x.xh<y.xh;
}
int main(){int n;cin>>n;for(int i=1;i<=n;i++)cin>>x[i].name>>x[i].sg>>x[i].xh;sort(x+1,x+n+1,cmp);cout<<x[1].name<<" "<<x[1].sg<<" "<<x[1].xh;return 0;
}

乐乐的礼物(xx10nhoi) 查看测评数据信息

        圣诞节到了,乐乐所在的班准备搞一个圣诞晚会,晚会的其中一个环节是全班同学互送礼物。已知每个同学都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人。有些人准备了较多的钱,有些人准备了较少的钱。现在乐乐想知道晚会结束后哪些同学收到的礼物的总价值最大(包含无法送出的钱)。

输入格式

第1行一个整数n,表示乐乐所在的班的人数(2≤n≤100);

第2至n+1行(n行),按班里的学号顺序给出每个同学的姓名。(姓名只包含大写或小写字母,姓名的长度不超过10个字母);

第n+2至2*n+2行(n行),按学号顺序给出每个同学送礼物的信息:第一个是整数m(0≤m≤5000),表示该同学准备用来送礼的钱;第二个是整数k(0≤k≤20),表示该同学准备把钱平均分给k个好朋友(给每个朋友的钱都是整数,并尽量全部用完,剩下无办法再分的钱自己保留);接着是k个姓名,每个姓名之间用一个空格分开,表示要分给哪k个朋友。

输出格式

输出文件有n行,按最后的钱数从大到小的顺序输出每个同学的姓名和钱数。如果钱数相同的按学号顺序从小到大输出。

输入/输出例子1

输入:

5

Dave

laura

owen

vick

amr

200 3 laura owen vick

500 1 Dave

150 2 vick laura

600 1 amr

0 0

输出:

amr 600

Dave 502

laura 141

vick 141

owen 66

样例解释

Dave的200元分给了3人,每人66元,剩下2元,还收到了2号给他的500元,因此他最后有502元。

laura的500元给了同学,收到1号给他的66元和3号给他的75元,他最后有141元。

owen的150元给了2人,每人75元,收到1号给他的66元,他最后有66元。

vick的600元给了同学,收到1号给他的66元和3号给他的75元,他最后有141元。

amr没钱给人,收到5号给他的600元,他最后有600元。

#include<bits/stdc++.h>
using namespace std;
struct pp{string name;int mon,id;
}a[105];
int n;
bool cmp(pp x,pp y){if(x.mon!=y.mon)return x.mon>y.mon;else return x.id<y.id;
}
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i].name;a[i].id=i;}int m,k;for(int i=1;i<=n;i++){cin>>m>>k;if(k==0){a[i].mon=a[i].mon+m;continue;}int pj=m/k;a[i].mon=a[i].mon+m%k;string s;for(int j=1;j<=k;j++){cin>>s;for(int h=1;h<=n;h++){if(a[h].name==s){a[h].mon+=pj;}}}}sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++){cout<<a[i].name<<" "<<a[i].mon<<endl;}return 0;
}

考试成绩 查看测评数据信息

在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第k名学生的学号和成绩。

输入格式

第一行有两个整数,分别是学生的人数n(1≤n≤100),和求第k名学生的 k(1≤k≤n)。  

其后有n行数据,每行包括一个学号(整数)和一个成绩(浮点数),中间用一个空格分隔。

输出格式

输出第k名学生的学号和成绩,中间用空格分隔。(注:请用%g输出成绩)

输入/输出例子1

输入:

5 3 

90788001 67.8 

90788002 90.3

90788003 61

90788004 68.4

90788005 73.9

输出:

90788004 68.4

#include<bits/stdc++.h>
using namespace std;
struct a{int xh;double cj;
}x[1005];
int n,k;
bool cmp(a x,a y){if(x.xh!=y.xh)return x.cj>y.cj;else return x.xh<y.xh;
}
int main(){cin>>n>>k;for(int i=1;i<=n;i++){cin>>x[i].xh>>x[i].cj;}sort(x+1,x+n+1,cmp);printf("%d %g",x[k].xh,x[k].cj);return 0;
}

谁获得了最高奖学金 查看测评数据信息

某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:
  1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;
  2) 五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;
  3) 成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;
  4) 西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;
  5) 班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;
  只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。
  现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。

输入格式

第一行输入数据N,表示学生的总数( 0 < N < 100 ),。接下来的n行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。  

输出格式

输出包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这n个学生获得的奖学金的总数。

输入/输出例子1

输入:

4

YaoLin 87 82 Y N 0

ChenRuiyi 88 78 N Y 1

LiXin 92 88 N N 0

ZhangQin 83 87 Y N 1

输出:

ChenRuiyi

9000

28700

#include<bits/stdc++.h>
using namespace std;
struct node{string xm;int qm,bj;char bgb,xb;int lw,ans,sum;
}a[101];
int n,tot=0;
bool cmp(node x,node y){if(x.ans==y.ans)return x.sum<y.sum;else return x.ans>y.ans;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){cin>>a[i].xm>>a[i].qm>>a[i].bj>>a[i].bgb>>a[i].xb>>a[i].lw;if(a[i].qm>80&&a[i].lw>=1)a[i].ans+=8000;if(a[i].qm>85&&a[i].bj>80)a[i].ans+=4000;if(a[i].qm>90)a[i].ans+=2000;if(a[i].xb=='Y'&&a[i].qm>85)a[i].ans+=1000;if(a[i].bj>80&&a[i].bgb=='Y')a[i].ans+=850; a[i].sum=i; tot+=a[i].ans;}sort(a+1,a+n+1,cmp);cout<<a[1].xm<<endl<<a[1].ans<<endl<<tot;return 0;
}

相关文章:

  • PDF分页处理:技术与实践
  • 千益畅行,共享旅游卡,满足您多样化的同行出行需求
  • Web考试前端等级:深度剖析与实战攻略
  • 搭建python虚拟环境,并在VSCode中使用
  • 让你的TypeScript代码更优雅,这10个特性你需要了解下
  • htb-linux-9-sense
  • Web安全:Web体系架构存在的安全问题和解决方案
  • Debian13将正式切换到基于内存的临时文件系统
  • 中电金信:产教联合共育人才 AFAC2024金融智能创新大赛启动
  • k8s之deployments相关操作
  • 【图 - 遍历(BFS DFS)】深度优先搜索算法(Depth First Search), 广度优先搜索算法(Breadth First Search)
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • 安装ps提示缺少dll文件是怎么回事,哪种解决方法更推荐
  • 【计算机视觉】数字图像处理基础:以像素为单位的图像基本运算(点运算、代数运算、逻辑运算、几何运算、插值)
  • Spring Boot整合WebSocket和Redis实现直播间在线人数统计功能
  • 【Leetcode】101. 对称二叉树
  • #Java异常处理
  • $translatePartialLoader加载失败及解决方式
  • “大数据应用场景”之隔壁老王(连载四)
  • 【css3】浏览器内核及其兼容性
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • crontab执行失败的多种原因
  • css布局,左右固定中间自适应实现
  • github从入门到放弃(1)
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java知识点总结(JavaIO-打印流)
  • Ruby 2.x 源代码分析:扩展 概述
  • SQL 难点解决:记录的引用
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 从tcpdump抓包看TCP/IP协议
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 入口文件开始,分析Vue源码实现
  • 入门级的git使用指北
  • ​TypeScript都不会用,也敢说会前端?
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • $(selector).each()和$.each()的区别
  • (03)光刻——半导体电路的绘制
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (c语言)strcpy函数用法
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (ZT)出版业改革:该死的死,该生的生
  • (翻译)terry crowley: 写给程序员
  • (六)c52学习之旅-独立按键
  • (七)Knockout 创建自定义绑定
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比