C++016-C++结构体
在线练习:
结构体
参考:https://www.cnblogs.com/ybqjymy/p/16561657.html
https://blog.csdn.net/weixin_45984283/article/details/124211891
目标
1、掌握结构体的基本使用
2、学会使用sort()函数
3、学会结构体排序
结构体
结构体是一个由程序员定义的数据类型,可以容纳许多不同的数据值。在定义结构体时,系统对之不分配实际内存。只有定义结构体变量时,系统才为其分配内存。
定义结构体
struct 结构体名{ 结构体成员列表 };
如:
struct PayRoll { int empNumber; string name; double hours,payRate,grossPay; };
实例化结构体
1. 先定义结构体类型再单独进行变量定义
#include <bits/stdc++.h> using namespace std; struct Student { int Code; char Name[20]; char Sex; int Age; }; int main() { struct Student Stu; struct Student StuArray[10]; struct Student *pStru; return 0; }
2. 紧跟在结构体类型说明之后进行定义
#include <bits/stdc++.h> using namespace std; struct Student { int Code; char Name[20]; char Sex; int Age; }Stu,StuArray[10],*pStu; int main() { Stu; StuArray[10]; //pStru; return 0; }
3. 在说明一个无名结构体变量的同时直接进行定义
这种情况下,之后不能再定义其他变量。
#include <bits/stdc++.h> using namespace std; struct { int Code; char Name[20]; char Sex; int Age; }Stu,Stu1[10],*pStu; int main() { return 0; }
4. 使用typedef说明一个结构体变量之后再用新类名来定义变量
#include <bits/stdc++.h> using namespace std; typedef struct { int Code; char Name[20]; char Sex; int Age; }Student; Student Stu1,Stu[10],*pStu; int main() { return 0; }
Student是一个具体的结构体类型,唯一标识。这里不用再加struct
5. 使用new动态创建结构体变量
使用new动态创建结构体变量时,必须是结构体指针类型。访问时,普通结构体变量使用使用成员变量访问符".“,指针类型的结构体变量使用的成员变量访问符为”->"。
注意:动态创建结构体变量使用后勿忘delete。
#include <iostream> using namespace std; struct Student { int Code; char Name[20]; char Sex; int Age; }Stu,StuArray[10],*pStu; int main(){ Student *s = new Student(); // 或者Student *s = new Student; s->Code = 1; cout<<s->Code; delete s; return 0; }
题目描述
【描述】统计2位同学的姓名、年龄、语文成绩、数学成绩、英语成绩,输出总分较高的同学姓名,如果总分相同,则分别输出两位同学的姓名,中间用空格隔开。
【输入】2行,两个同学的姓名、年龄、语文成绩、数学成绩、英语成绩,每个同学的信息占一行;
【输出】1行,总分较高的同学的姓名或者两位同学的姓名,中间空格隔开;
【样例输入】
zhang3 12 93 100 98
li4 17 86 100 96
【样例输出】
zhang3
#include<iostream> #include<stdio.h> #include<string> using namespace std; struct STU { string name; int age,yu,shu,ying; int sum() { return yu+shu+ying; } }; int main() { STU a; STU *b = new STU(); int suma,sumb; cin>>a.name>>a.age>>a.yu>>a.shu>>a.ying; cin>>b->name>>b->age>>b->yu>>b->shu>>b->ying; // suma=a.yu+a.shu+a.ying; // sumb=b->yu + b->shu + b->ying; suma=a.sum(); sumb=b->sum(); if(suma>sumb) cout<<a.name; else if(suma<sumb) cout<<b->name; else cout<<a.name<<" "<<b->name; return 0; }
sort()函数
sort函数介绍
注意:使用sort()需要加头文件#include;如果使用了万能头则不必添加;
#include<algorithm> #include<bits/stdc++.h>
调用形式: sort ( first_pointer , first_pointer+n , cmp )
第一个参数:数组的首地址,通常是数组名。
第二个参数:首地址+数组的长度n。
第三个参数:排序规则函数的名称(自定义函数cmp),若无此函数,sort会默认按数组升序排序(从小到大)。
题目描述
【描述】输入n和n名学生的成绩,把成绩从小到大排
序后输出。
【输入】2行。第一行是n;第二行是n名学生的成绩,
空格分隔。
【输出】排序后的学生成绩。
【样例输入】
5
5 3 4 2 1
【样例输出】
1 2 3 4 5
#include<bits/stdc++.h> using namespace std; int main() { int n,a[101]; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n); for(int i=1;i<=n;i++) cout<<a[i]<<" "; return 0; }
参数填写:sort ( first_pointer , first_pointer+n , cmp );
当cmp函数省略时,只能对数组进行排序,而且默认从小到大
结构体排序cmp
注意:结构体排序必须写cmp函数cmp函数格式:
bool cmp(类型a,类型b){ 比较规则; )
比较规则:如果返回值为1,那么a排在前面;否则b排在前面。
注意:不要把返回值写成恒为1或者0的形式。
//#include<iostream> //#include<stdio.h> //#include<string> #include<bits/stdc++.h> using namespace std; struct STU { string name; int age,yu,shu,ying; int sum() { return yu+shu+ying; } } a[101]; bool cmp(STU a,STU b) { //当a的总分大于b的总分返回为真,既降序 return a.sum()>b.sum(); } int main() { int n; cin>>n; for(int i=1;i<n+1;i++) { cin>>a[i].name>>a[i].yu>>a[i].shu>>a[i].ying; } // suma=a.yu+a.shu+a.ying; // sumb=b->yu + b->shu + b->ying; sort(a+1,a+n+1,cmp); for(int i=1;i<n+1;i++) cout<<a[i].yu<<" "<<a[i].shu<<" "<<a[i].ying<<endl; return 0; }
联合体union
联合体的对齐操作,参考:https://zhuanlan.zhihu.com/p/184956286
结构体与联合体异同点
union,中文名“联合体、共用体”,在某种程度上是类似结构体struct的一种数据结构,联合体(union)和结构体(struct)同样可以包含很多种数据类型和变量。
两者区别如下:
结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。
联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”,即任何两个成员不会同时有效;但优点是内存使用更为精细灵活,也节省了内存空间。
当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的:
联合体是一个结构体;
它的所有成员相对于基地址的偏移量都为0;
此结构空间要大到足够容纳最"宽"的成员;
其内存对齐方式要适合其中所有的成员;
#include<iostream> using namespace std; struct STU1 { int n; char s[11]; double d; } S1; struct STU2 { int n; char s[5]; double d; } S2; union U1 { int n; char s[11]; double d; }; union U2 { int n; char s[5]; double d; }; int main() { cout<<sizeof(S1)<<'\t'<<sizeof(S2)<<endl; cout<<"S1各数据地址:\n"<<&S1<<'\t'<<&S1.d<<'\t'<<&S1.s<<'\t'<<&S1.n<<endl; cout<<"S2各数据地址:\n"<<&S2<<'\t'<<&S2.d<<'\t'<<&S2.s<<'\t'<<&S2.n<<endl; cout<<"----------------"<<endl; U1 u1; U2 u2; cout<<sizeof(u1)<<'\t'<<sizeof(u2)<<endl; cout<<"u1各数据地址:\n"<<&u1<<'\t'<<&u1.d<<'\t'<<&u1.s<<'\t'<<&u1.n<<endl; cout<<"u2各数据地址:\n"<<&u2<<'\t'<<&u2.d<<'\t'<<&u2.s<<'\t'<<&u2.n<<endl; }
在线练习:
总结
本系列为C++学习系列,会介绍C++基础语法,基础算法与数据结构的相关内容。本文为C++结构体案例,包括相关案例练习。