CSP初赛复习:结构体与联合体
一、结构体
C++ 提供了结构体(struct)来解决这类问题。
1.1结构体的定义
C++ 中的结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
使用结构体,必须要先声明一个结构体类型,再定义和使用结构体变量。
第一种定义声明方式:


第二种定义方式: 也可以不定义结构类型,而直接定义结构变量。

例 1 :定义一个反映学生基本情况的结构类型
struct date //日期结构类型:由年、月、日三项组成
{ int year;
int month;
int day;
}; //分号不能少
struct std_info //学生信息结构类型:由学号、姓名、性别和生日组成
{ char no[11];
char name[9];
char sex[3];
struct date birthday;
}; //分号不能少
struct score //成绩结构类型:由学号和三门成绩共4项组成
{ char no[11];
int score1;
int score2;
int score3;
}; //分号不能少
1.2 结构体变量的初始化
结构变量初始化的格式,与一维数组相似: 结构变量 = {初值表}
struct std_info stud={“2000281021”, “张红“ , "男”, {1983,9,20} };
1.3 访问结构成员
1. 结构体变量的引用方式:结构体变量 . 成员
[例2] 利用[例1]中定义的结构类型struct std_info,定义一个结构变量student,用于存储和显示一个学生的基本情况。
#include<bits/stdc++.h>
struct date
{ int year;
int month;
int day;
};
struct std_info
{ char no[11];
char name[9];
char sex[3];
struct date birthday;
} stud={"2000281021","张红","男",{1983,9,20}};
int main()
{ printf("No: %s\n",stud.no);
printf("Name: %s\n",stud.name);
printf("Sex: %s\n",stud.sex);
printf("Birthday: %d-%d-%d\n",stud.birthday.year,
stud.birthday.month,
stud.birthday.day );
}
1.4 结构体数组 (具有相同结构类型的变量集合)
1、定义一个结构体数组:

[例3] 定义一个结构,该结构由课程号,课程名、学时数和任课教师等四个成员项组成,建立一个由四门课程构成的结构数组 ,每门课程都具有所定义的结构类型。通过键盘输入,对各个数组元素的每个成员项赋值,然后输出每门课程的有关信息。
#include<bits/stdc++.h>
#define N 4
using namespace std;
struct sct
{ char cno[4];
char cname[20];
int chour;
char teacher[10];
};
int main()
{ struct sct course[N];
int i;
for(i=0;i<N;i++)
{ printf("Enter cnum:");
scanf("%s",course[i].cno);
printf("Enter cname:");
scanf("%s",course[i].cname);
printf("Enter chour:");
scanf("%d",&course[i].chour);
printf("Enter teacher:");
scanf("%s",course[i].teacher);
}
printf("学号\t 课程名\t 学时\t 教师 \n");
for(i=0;i<N;i++)
printf("%-8s%-12s%-8d%-20s\n",course[i].cno,
course[i].cname,
course[i].chour,
course[i].teacher);
}
2. 结构数组的引用方式
结构数组的每一个元素,都是结构类型数据,均包含结构类型的所有成员。
[例4] 利用[例1]中定义的结构类型struct std_info,定义一个结构数组student,用于存储和显示三个学生的基本情况。
#include<bits/stdc++.h>
struct date{ int year; int month; int day; };
struct std_info{ char no[11]; char name[9]; char sex[3];
struct date birthday; } ;
struct std_info stud[3]={{"20028102","张明","男",{1982,9,20}},
{"20028105","李明","男",{1983,8,15}},
{"20028112","王琳","女",{1983,3,10}}};
int main()
{ int i;
printf("No.\tName\tSex\tBirthday\n"); /*打印表头*/
for(i=0; i<3; i++) /*输出三个学生的基本情况*/
{ printf("%s\t",stud[i].no);
printf("%s\t",stud[i].name);
printf("%s\t",stud[i].sex);
printf("%d-%d-%d\n",stud[i].birthday.year,
stud[i].birthday.month,
stud[i].birthday.day );
}
}
二、联合体
在 C++ 中,联合体(共用体)也称联合(union),是一种数据格式,能存储不同类型数据,但同一时间只能存储其中的一种类型数据。例如,存放一个人的信息,如果是成年人,存放他的身份证号码;否则,存放他的学籍号。这里面就有两个成员,但是任何一个人只能使用其中的一个。
使用共用体前必须先声明一个共用体类型,才可以定义和使用共用体变量。例如,要声明一个记录个人信息的共用体,可以这样:
union person // 声明一个共用体类型 person
{ char id[18]; // 声明一个字符数组,存储身份证号码
int num; // 声明一个整数,存放学籍号
};
例1、成绩统计
【问题描述】
兴趣小组收集学员成绩信息,每个学员的成绩有两种表示方法,一种用 best、good、poor 三种等级来表示,还有一种就是直接用分数来表示(百分制)。请保存学员成绩信息,并且统计有多少人是用等级来表示成绩的,用分数来表示成绩的人的平均分是多少(取整就行)。
【输入格式】
第 1 行一个正整数 n,表示学员人数,n≤1000。
第 2~n+1 行,每行一个字符和一个字符串,中间用一个空格隔开。第一个字符表示这个学生成绩类型,有 C、N 两种分别代表等级表示和分数表示,第二个字符串表示成绩信息。
【输出格式】
一行两个整数,分别表示用等级表示成绩的人数和用分数表示成绩人的平均分(取整),中间用一个空格隔开。
【输入样例】
5
C best
C good
N 90
C poor
N 98
【输出样例】
3 94
#include<bits/stdc++.h>
using namespace std;
int main()
{ union res // 声明一个共用体 res
{ char rank[5]; // 用等级表示成绩
int x; // 用分数表示成绩 }; struct stu
{ char f; // 代表学生用哪种方式记录成绩
res score; // 定义 score 为共用体
} a[1001];int n,count = 0, num = 0; cin >> n; for(int i = 1; i <= n; i++)
{ cin >> a[i].f; switch(a[i].f)
{ case 'C':for(int j=0;j<4;j++) cin>>a[i].score.rank[j]; count++;break;
case 'N':cin>>a[i].score.x; num += a[i].score.x; }
}cout<<count<<" "<<num/(n-count)<<endl; return 0;}

添加 家长论坛微信
全部 0条评论