在实际问题中,一组数据往往具有不同的数据类型。例如,人口大普查时,我们需要记录每一位公民的姓名,年龄,性别,住址,身份证号码。这些信息分别要用整型,字符型,字符串型来记录。为了解决问题,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
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< 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
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
using namespace std;
struct stu{
string name;
int a;
}m[1005];
int n;
int main(){
cin>>n;
for(int i=1;i>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
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>n;
for(int i=1;i>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
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>n;
for(int i=1;i>a[i].name;
a[i].id=i;
}
int m,k;
for(int i=1;i>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>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<
考试成绩 查看测评数据信息
在一次考试中,每个学生的成绩都不相同,现知道了每个学生的学号和成绩,求考第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
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>n>>k;
for(int i=1;i>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
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.sumy.ans;
}
int main(){
scanf("%d",&n);
for(int i=1;i>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<
#include
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;
}
#include
using namespace std;
struct stu{
string name;
int a;
}m[1005];
int n;
int main(){
cin>>n;
for(int i=1;i>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;
}
#include
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>n;
for(int i=1;i>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;
}
#include
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>n;
for(int i=1;i>a[i].name;
a[i].id=i;
}
int m,k;
for(int i=1;i>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>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<
#include
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>n>>k;
for(int i=1;i>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元。
现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。
#include
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.sumy.ans;
}
int main(){
scanf("%d",&n);
for(int i=1;i>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<