in 洛谷:@zjx331 求关注
有的时候需要大量存储批量数据,可以考虑使用数组。但是数组只能存储一组同样数据类型的消息,于是我们就可以用结构体。
结构体就是把一些不同类型的信息聚合成一个整体,以便于处理信息。
结构体的定义形式:
struct 类型名 {
类型1 变量1;
类型2 变量2;
//……
类型n 变量n;
}结构体变量名;//[n]
struct 我们定义的类型名 结构体变量名//这里的"struct"不加也可以
我们来看一道例题:
1233:结构体(类)练习-2
富豪排行榜
1917年创立的福布斯杂志,在编制各种排行榜方面有97年历史,1982年首次推出富豪榜在全球产生空前影响,现在,一年一度的福布斯全球亿万富翁榜在全世界受到密切关注。福布斯每年编制一百多个有关人物、公司和生活时尚排行榜,在全球范围内,福布斯富豪榜的江湖地位毋庸置疑。他云集了世界各地的富豪们。
对于C语言,可定义一个结构体,描述富豪们的信息,参考如下:
struct magnate{
char name[20]; //姓名
double property;//财产,以亿元为单位。
};
从键盘输入两个整数 n ( 1 ≤ n ≤ 100 ) n (1 ≤ n ≤ 100) n(1≤n≤100)和 k ( 1 ≤ k ≤ n ) k ( 1≤ k ≤ n ) k(1≤k≤n),表示有 n n n位候选人,要从中选出排名前k位的富豪,然后是 n n n位候选人的名字和财产(亿元)。 (名字是由不超过 20 20 20个字母组成的字符串 ,任意两个人的财产都不一样)。要求输出排名前 K K K的富豪的名字和财产,按财产从大到小排序(每位富豪的数据占一行,其中姓名和财产之间用一个空格分隔)。
输入样例1:
20 4
Mnzzjs 321.12
Jjykaj 19.08
Zmrvug 83.88
Gspogqoj 35.27
Whqaqvn 152.91
Pwozu 164.91
Gpcvcb 273.73
Tuaqepu 90.69
Ohkpg 86.56
Yjpja 298.38
Wonuxbt 178.96
Hgkluswj 37.70
Zfasnxk 46.27
Lfisss 182.60
Yhuicnep 292.79
Zdawm 176.73
Yfeaf 13.18
Motrl 20.33
Sptqoakb 99.45
Psodta 201.26
输出样例1:
Mnzzjs 321.12
Yjpja 298.38
Yhuicnep 292.79
Gpcvcb 273.73
输入样例2:
5 3
Ffdixdmd 272.47
Avmje 151.07
Gtbhp 197.87
Brjcxz 159.74
Mtrqmeq 28.79
输出样例2:
Ffdixdmd 272.47
Gtbhp 197.87
Brjcxz 159.74
分析&代码
代码:
#include<bits/stdc++.h>
using namespace std;
struct magnate { //定义一个magnate结构体类型
char n[1145];//首富的姓名
double p;//首富的财产
} a[1145];//变量
int main() {
int o,k,i,j;
cin>>o>>k;
for(i=0; i<o; i++) {
cin>>a[i].n>>a[i].p;//输入每一个首富的名字与财产
}
for(i=0; i<o-1; i++) {//冒泡排序,从大到小排
for(j=i+1; j<o; j++) {
if(a[i].p<a[j].p) {//比资产
swap(a[i].p,a[j].p);//交换财产
swap(a[i].n,a[j].n);//交换名字
}
}
}
for(i=0;i<k;i++) {
cout<<a[i].n<<" "<<a[i].p<<endl;//输出前k名的首富
}
return 0;
}
分析:
例题中定义一个
magnate
\text{magnate}
magnate结构体类型,里面包括
n
\text{n}
n和
p
\text{p}
p两个成员变量,其中
n
\text{n}
n表示姓名,
p
\text{p}
p表示资产。然后定义了
a
\text{a}
a变量,类型是
magnate
\text{magnate}
magnate。
a[i]
为一个富豪,a[i].n
表示一个富豪的姓名,a[i].p
表示一个富豪的资产。然后进行输入,排序,输出。
选择题:
1.设有以下说明语句
struct ex
{ int x; float y;char z; } example;
则下面的叙述中不正确的是(B )。
A.struct是定义结构体类型的关键字
B.example是结构体类型名
C.x,y,z都是结构体成员名
D.struct ex是结构体类型名
2.已知学生记录描述为
struct student
{
int no;
char name[20];
char sex;
struct{int year; int month; int day; }birth;
};
struct student s;
设变量s中的“生日”应是“1984年11月11日”,下列对“生日”的正确赋值方式是( D)。
A. year=1984;month=11;day=11;
B. birth.year=1984;birth.month=11;birth.day=11;
C. s.year=1984;s.month=11;s.day=11;
D. s.birth.year=1984;s.birth.month=11;s.birth.day=11;
3.有如下定义
struct person { char name[9]; int age;};
struct person clss[10]={"Johu",17,"Paul",19,"Mary",18,"Adam",16};
根据上述定义,能输出字母M 的语句是(D )。
A. prinft(" %c\n",clss[3].name);
B. printf(" %c\n",clss[3].name[1]);
C. prinft(" %c\n",clss[2].name[1]);
D. printf(" %c\n",clss[2].name[0]);
4.设有如下定义:
struct sk {int a ;float b ;}data ,*p ;
若有p=&data ; ,则对data 中的a 域的正确引用是(B )。
A.(*p).data.a
B.(*p).a
C.p->data.a
D.p.data.a
5.p有以下说明和定义语句
struct student
{ int age; char num[8];};
struct student stu[3]={{20,"200401"},{21,"200402"},{19,"200403"}};
struct student *p=stu;
以下选项中引用结构体变量成员的表达式错误的是(D )。
A.(p++)->num
B.p->num
C.(*p).num
D.stu[3].age
6.有以下语句:
typedef struct stu
{
char name[20];
int age;
}TT;
下面叙述正确的是(A )。
A.可以用stu定义结构体变量
B.stu是结构体struct类型的变量
C.不可以用TT定义结构体变量
D.TT是struct stu类型的变量