一、什么是结构体? 结构体是C++提供给用户自定义数据类型的一种机制,它可以把各种不同类型的数据组成一个整体。你可以暂时把结构体理解为一种自定义的数据类型。 二、怎么定义结构体和结构体变量? 我们可以用以下两种形式定义结构体变量: struct 结构体类型名//struct是关键字 { 成员表; //可以有多个成员 成员函数; //可以有多个成员函数,也可以没有 }结构体变量表; //可以同时定义多个结构体变量,用“,”隔开 样例:
2.先定义结构体再定义结构体变量 struct 结构体类型名 { 成员表;//可以有多个成员 成员函数;//可以有多个成员函数,也可以没有 }; 结构体类型名 结构体变量表; //可以同时定义多个结构体变量 样例:
注意: ①在定义结构体变量时,结构体变量名和结构体类型名不能相同。 ②在定义结构体时,系统并不分配内存,只有在定义结构体变量时,系统才分配内存。 三、结构体变量的特点 样例: swap(a[i],a[i+1]); 样例:
四、结构体变量成员的访问 样例: #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 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; } 七、结构体的构造函数 需要尤为注意的是构造函数的定义形式比较特殊。 样例:
八、结构体的重载运算符 现要求你编程实现: ①按语文成绩从高到低进行重新排序。 不用结构体样例: #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];//定义结构体变量
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> 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; } 结构体重载运算符样例:
总结: 扩展:用sort()函数对结构体进行排序 #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<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<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> #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;//输出 } |
|