分享

【C 】结构体讲解

 长沙7喜 2020-04-16

一、什么是结构体?

结构体是C++提供给用户自定义数据类型的一种机制,它可以把各种不同类型的数据组成一个整体。你可以暂时把结构体理解为一种自定义的数据类型。

二、怎么定义结构体和结构体变量?

我们可以用以下两种形式定义结构体变量:

1.定义结构体的同时定义结构体变量
struct 结构体类型名//struct是关键字{ 成员表; //可以有多个成员 成员函数; //可以有多个成员函数,也可以没有}结构体变量表; //可以同时定义多个结构体变量,用“,”隔开

样例:

struct student{  string name;  int chinese,math;} a[100];

2.先定义结构体再定义结构体变量

struct 结构体类型名{ 成员表;//可以有多个成员 成员函数;//可以有多个成员函数,也可以没有};结构体类型名 结构体变量表; //可以同时定义多个结构体变量

样例:

struct student{  string name;  int chinese,math;}; student a[100];

注意:

①在定义结构体变量时,结构体变量名和结构体类型名不能相同。

②在定义结构体时,系统并不分配内存,只有在定义结构体变量时,系统才分配内存。

三、结构体变量的特点

1.结构体变量可以整体操作

样例:

swap(a[i],a[i+1]);
2.结构体变量的初始化和数组的初始化类似

样例:

student a={'xiaoming',90,100};

四、结构体变量成员的访问

我们可以使用点运算符'.'对结构体变量成员进行访问:结构体变量名.成员名

样例:

#include<iostream>using namespace std;struct student//定义结构体类型 { string name; int chinese,math;}; student a,b;//定义结构体变量 int main(){ cin>>a.name>>a.chinese>>a.math; cout<<a.name<<' '<<a.chinese<<' '<<a.math; return 0;}

五、结构体的嵌套

在一个结构体中可以嵌套另一个结构体,但是结构体不能嵌套本身。

样例:

#include<iostream>using namespace std;struct jgt1//定义结构体类型 {  string a;  double b;}; struct jgt2//定义结构体类型{  int c;  jgt1 d;//结构体嵌套 };jgt2 e;int main(){  cin>>e.c>>e.d.a>>e.d.b;  cout<<e.c<<endl<<e.d.a<<endl<<e.d.b;  return 0;}

六、结构体的成员函数

定义在结构体内部可以像成员一样被访问的函数称为结构体的成员函数。

成员函数调用的一般形式:

结构体变量名.成员函数

样例:

#include<iostream>using namespace std;struct student//定义结构体类型 { string name; int chinese,math;  int sum()  { return chinese+math;  }}; student a,b;//定义结构体变量 int main(){ cin>>a.name>>a.chinese>>a.math; cin>>b.name>>b.chinese>>b.math; cout<<a.name<<' '<<a.sum()<<endl; cout<<b.name<<' '<<b.sum(); return 0;}

七、结构体的构造函数

构造函数也是定义在结构体内部的函数。构造函数一般为无参函数。如果结构体中定义了构造函数,那么每定义一个结构体变量,C++都会调用一次结构体的构造函数。

需要尤为注意的是构造函数的定义形式比较特殊。

样例:

#include<iostream>#include<cstring>//memset()using namespace std;struct student //定义结构体类型 {  string name;  int score[7];//用数组存放七科成绩   student()  {    memset(score,0,sizeof(score));  } }; student a[100];//定义结构体变量 int main(){  cout<<a[1].score[0];//输出学生a[1]的第一科成绩   return 0;}

八、结构体的重载运算符

已知一个学习小组有6名学生,学号依次为student1~student6。期中考试后,我们拿到了如下的一个成绩表:

现要求你编程实现:

①按语文成绩从高到低进行重新排序。

不用结构体样例:

#include<iostream>#include<algorithm> #include<string>using namespace std;string name[7]; //学号 int y[7],s[7];//语文成绩、数学成绩 int main(){ cout<<'请输入六个学生的学号、语文成绩、数学成绩:'<<endl; for(int i=1;i<=6;i++) cin>>name[i]>>y[i]>>s[i]; for(int i=1;i<=5;i++)//冒泡排序 { for(int j=1;j<=6-i;j++) { if(y[j]<y[j+1]) { swap(name[j],name[j+1]); swap(y[j],y[j+1]); swap(s[j],s[j+1]); } } } cout<<'这六位学生按语文成绩从高到低排列依次为:'<<endl;   for(int i=1;i<=6;i++) cout<<name[i]<<' '<<y[i]<<' '<<s[i]<<endl; return 0;}

结构体样例:

#include<iostream>#include<algorithm> using namespace std;
struct student //定义结构体类型 { string name;//学号 int y,s; //y:语文成绩 s:数学成绩 }; student a[7];//定义结构体变量
int main(){  cout<<'请输入六个学生的学号、语文成绩、数学成绩:'<<endl; for(int i=1;i<=6;i++) cin>>a[i].name>>a[i].y>>a[i].s; for(int i=1;i<=5;i++)//冒泡排序 { for(int j=1;j<=6-i;j++) { if(a[j].y<a[j+1].y) swap(a[j],a[j+1]); } } cout<<'这六位学生按语文成绩从高到低排列依次为:'<<endl; for(int i=1;i<=6;i++) cout<<a[i].name<<' '<<a[i].y<<' '<<a[i].s<<endl; return 0;}

结构体重载运算符样例:

#include<iostream>#include<algorithm> using namespace std;
struct student //定义结构体类型 { string name;//学号 int y,s; //y:语文成绩 s:数学成绩 }; student a[7];//定义结构体变量
bool operator<(student a,student b)//重载运算符 { if(a.y<b.y) return true; else return false;}
int main(){  cout<<'请输入六个学生的学号、语文成绩、数学成绩:'<<endl; for(int i=1;i<=6;i++) cin>>a[i].name>>a[i].y>>a[i].s; for(int i=1;i<=5;i++)//冒泡排序 { for(int j=1;j<=6-i;j++) { if(a[j]<a[j+1]) swap(a[j],a[j+1]); } } cout<<'这六位学生按语文成绩从高到低排列依次为:'<<endl; for(int i=1;i<=6;i++) cout<<a[i].name<<' '<<a[i].y<<' '<<a[i].s<<endl; return 0;}

②按总成绩从高到低进行重新排序。

不用结构体样例:

#include<iostream>#include<algorithm> #include<string>using namespace std;string name[7]; //学号 int y[7],s[7];//语文成绩、数学成绩 int main(){  cout<<'请输入六个学生的学号、语文成绩、数学成绩:'<<endl;  for(int i=1;i<=6;i++) cin>>name[i]>>y[i]>>s[i];  for(int i=1;i<=5;i++)//冒泡排序   {    for(int j=1;j<=6-i;j++)    {      if(y[j]+s[j]<y[j+1]+s[j+1])      {        swap(name[j],name[j+1]);        swap(y[j],y[j+1]);        swap(s[j],s[j+1]);      }    }  }   cout<<'这六位学生按总成绩从高到低排列依次为:'<<endl;   for(int i=1;i<=6;i++) cout<<name[i]<<' '<<y[i]<<' '<<s[i]<<endl;  return 0;}

结构体样例:

#include<iostream>#include<algorithm> using namespace std;
struct student //定义结构体类型 { string name;//学号 int y,s; //y:语文成绩 s:数学成绩 }; student a[7];//定义结构体变量
int main(){  cout<<'请输入六个学生的学号、语文成绩、数学成绩:'<<endl; for(int i=1;i<=6;i++) cin>>a[i].name>>a[i].y>>a[i].s; for(int i=1;i<=5;i++)//冒泡排序 { for(int j=1;j<=6-i;j++) { if(a[j].y+a[j].s<a[j+1].y+a[j+1].s) swap(a[j],a[j+1]); } } cout<<'这六位学生按总成绩从高到低排列依次为:'<<endl; for(int i=1;i<=6;i++) cout<<a[i].name<<' '<<a[i].y<<' '<<a[i].s<<endl; return 0;}

结构体重载运算符样例:

#include<iostream>#include<algorithm> using namespace std;
struct student //定义结构体类型 { string name;//学号 int y,s; //y:语文成绩 s:数学成绩 }; student a[7];//定义结构体变量
bool operator<(student a,student b)//重载运算符 { if(a.y+a.s<b.y+b.s) return true; else return false;}
int main(){  cout<<'请输入六个学生的学号、语文成绩、数学成绩:'<<endl; for(int i=1;i<=6;i++) cin>>a[i].name>>a[i].y>>a[i].s; for(int i=1;i<=5;i++)//冒泡排序 { for(int j=1;j<=6-i;j++) { if(a[j]<a[j+1]) swap(a[j],a[j+1]); } } cout<<'这六位学生按总成绩从高到低排列依次为:'<<endl; for(int i=1;i<=6;i++) cout<<a[i].name<<' '<<a[i].y<<' '<<a[i].s<<endl; return 0;}

总结:

重载运算符就是定义两个结构体变量的比较方式;即定义两个结构体变量比较大小的依据。

扩展:用sort()函数对结构体进行排序

已知n个学生的姓名、语文成绩、数学成绩,按语文成绩从高到低对n名同学进行排序。
参考代码:
#include<iostream>#include<algorithm>using namespace std;struct student{ string name;//姓名 int y,s;//语文成绩 数学成绩 };student a[100];bool comp(student a,student b)//自定义比较函数 { return a.y>b.y;//按语文成绩从高到低排序 //return a.y<b.y; //按语文成绩从低到高排序}int main(){ int n; cin>>n; cout<<'请输入'<<n<<'名学生的姓名、语文成绩、数学成绩:' <<endl; for(int i=0;i<n;i++) cin>>a[i].name>>a[i].y>>a[i].s; sort(a,a+n,comp); cout<<n<<'名学生按语文成绩从高到低排列如下:'<<endl; for(int i=0;i<n;i++) cout<<a[i].name<<' '<<a[i].y<<' '<<a[i].s<<endl; return 0;}

九、结构体的简单应用

参考代码:

#include<iostream>#include<algorithm>using namespace std;struct jgt{  int num;//数值   int rank;//排名  int flag;//标签 };jgt a[1001];bool comp1(jgt a,jgt b)//自定义比较函数comp1 {  return a.num<b.num;//按数据大小升序排序 }bool comp2(jgt a,jgt b)//自定义比较函数comp2{  return a.flag<b.flag;//按标签大小升序排序 } int main(){  int n;  cin>>n;  for(int i=1;i<=n;i++)    {    cin>>a[i].num;    a[i].flag=i;  }  sort(a+1,a+1+n,comp1);//按数值排序  for(int i=1;i<=n;i++) a[i].rank=i;//确定排名   sort(a+1,a+1+n,comp2);//按标签排序   for(int i=1;i<=n;i++) cout<<a[i].rank<<' ';   return 0;}
分析:

该题利用了结构体变量可整体操作的特点。


十、课后练习题两道

结构体解题参考代码:
#include<iostream>#include<string>using namespace std;char ans[5]={' ','A','B','C','D'};struct tiku{ string QES,ANS;};tiku a[101];struct timu{ string qes; string ans[4];};timu b[101];int main(){ int m,n; cin>>m>>n; for(int i=1;i<=m;i++) cin>>a[i].QES>>a[i].ANS;//输入题库 for(int i=1;i<=n;i++) cin>>b[i].qes>>b[i].ans[0]>>b[i].ans[1]>>b[i].ans[2]>>b[i].ans[3];//输入题目 for(int i=1;i<=n;i++)//枚举题目 {      for(int j=1;j<=m;j++)//枚举题库 { if(b[i].qes==a[j].QES)        for(int k=0;k<4;k++)//枚举选项 { if(b[i].ans[k]==a[j].ANS) cout<<(char)('A'+k)<<endl; } } } return 0;}
数组解题参考代码:
#include<iostream>#include<string>using namespace std;string qes[1001],ans[1001];int main(){    int m,n;    cin>>m>>n;    for(int i=1;i<=m;i++) cin>>qes[i]>>ans[i];//输入题库     for(int i=1;i<=n;i++)//输入题目     {        string t,a,b,c,d;        int flag;        cin>>t>>a>>b>>c>>d;//每道题的问题、答案         for(int j=1;j<=m;j++)//枚举题库         {            if(t==qes[j])            {                flag=j;                break;             }         }        if(ans[flag]==a) cout<<'A'<<endl;        else if(ans[flag]==b) cout<<'B'<<endl;        else if(ans[flag]==c) cout<<'C'<<endl;        else cout<<'D'<<endl;    }    return 0;}


结构体解题参考代码:
#include<iostream>#include<algorithm> using namespace std;struct vol{ int num;//报名号 int score;//笔试成绩 }; vol a[5001];bool comp(vol a,vol b)//自定义排序函数 { if(a.score==b.score) return a.num<b.num;//如果成绩相同按报名号从小到大排序 else return a.score>b.score;// 否则按成绩由高到低排序 }int main(){ int n,m,line,k; cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i].num>>a[i].score; sort(a+1,a+1+n,comp); m=(int)(m*1.5); //分数线选手 line=a[m].score; //分数线 for(k=1;a[k].score>=line;k++);//循环体为空 cout<<line<<' '<<k-1<<endl;//输出分数线和进入面试的人数 for(int i=1;i<=k-1;i++) cout<<a[i].num<<' '<<a[i].score<<endl; return 0;}
数组解题参考代码:
#include<iostream>using namespace std;int num[5001],score[5001];//报名号,笔试成绩 int main(){    int n,m,line,k;    cin>>n>>m;    m=(int)(1.5*m);    for(int i=1;i<=n;i++) cin>>num[i]>>score[i];//输入报名号,笔试成绩     for(int i=1;i<=n-1;i++)    {        for(int j=1;j<=n-i;j++)//冒泡排序         {            if(score[j]<score[j+1])//按成绩从高到低排序             {                swap(score[j],score[j+1]);                swap(num[j],num[j+1]);            }            if(score[j]==score[j+1])//成绩相同时按报名序号从小到大排序             {                if(num[j]>num[j+1])                {                    swap(score[j],score[j+1]);                    swap(num[j],num[j+1]);                }            }        }    }    line=score[m];//分数线     for(k=1;score[k]>=line;k++);//循环体为空     cout<<line<<' '<<k-1<<endl;     for(int i=1;i<=k-1;i++) cout<<num[i]<<' '<<score[i]<<endl;    return 0;}
对数组下标排序解题参考代码:
#include<iostream>#include<algorithm> using namespace std;int num[5001],score[5001],sub[5001];//报名号,成绩,sub:下标bool comp(int a,int b)//自定义排序函数 { if(score[a]==score[b]) return num[a]<num[b];//成绩相等按编号从小到大排序 return score[a]>score[b];//否则按成绩由高到低排序 }int main(){ int n,m,line,k; cin>>n>>m; for(int i=1;i<=n;i++) { sub[i]=i;//初始化下标 cin>>num[i]>>score[i];//输入报名号和笔试成绩 } sort(sub+1,sub+1+n,comp);//对下标排序 line=score[sub[(int)(m*1.5)]];//分数线 for(k=1;score[sub[k]]>=line;k++);//算录取人数 cout<<line<<' '<<k-1<<endl; for(int i=1;score[sub[i]]>=line;i++)cout<<num[sub[i]]<<' '<<score[sub[i]]<<endl;//输出}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多