第6章-结构体与共用体
一、判断题
1. 结构体的定义不为它分配具体的内存空间。
答案:T
2. C++语言结构体类型变量在程序执行期间,所有成员驻留在内存中。
答案:T
3. 一个共用体变量中可以同时存放其所有成员。
答案:F
4. 若有定义union dt{int a; char b; double c;}data;,变量data所占的内存字节数与成员c所占字节数相等。
答案:F
5. 用typedef可以增加新类型。
答案:F
6. 共用体类型数据中所有成员的首地址都是同一地址。
答案:T
7. 可以用已定义的共用体类型来定义数组或指针变量的类型。
答案:T
8. 共用体类型数据中的成员可以是结构体类型,但不可以是共用体类型。
答案:F
9. 可以对共用体变量直接赋值。
答案:F
二、选择题
1. 下面关于结构体概念的叙述中,正确的说法是()。
A. 相同类型数据的集合称为结构体
B. 不同类型数据的集合称为结构体
C. 数据的集合称为结构体
D. 整数的集合称为结构体
答案:C
2. 设有以下说明语句:
struct abc
{
int m;
float n;
}stype;
则下面错误的叙述是()。
A. struct是定义结构体类型的关键字
B. stype是结构体类型名
C. m和n都是结构体成员名
D. stype是结构体变量名
答案:B
3. 以下对枚举类型ee的定义中,正确的定义是()。
A. enum ee {A, B, C, D};
B. enum ee {'A', 'B', 'C', 'D' };
C. enum ee = {A, B, C, D};
D. enum ee = {'A', 'B', 'C', 'D' };
答案:A
4. 以下关于同类型结构体与同类型共用体赋值的叙述中,正确的说法是()。
A. 共用体变量之间可以直接赋值,结构体变量之间也可以直接赋值
B. 共用体变量之间可以直接赋值,结构体变量之间不可以直接赋值
C. 共用体变量之间不可以直接赋值,结构体变量之间可以直接赋值
D. 共用体变量之间不可以直接赋值,结构体变量之间也不可以直接赋值
答案:A
5. 设有如下定义:
struct data
{
int i;
union test
{
char ch;
double q;
}t;
double f;
}b;
若字符型变量占1个字节,整型变量占4个字节,双精度变量占8个字节,则结构体变量b占用内存的字节数是()。
A. 8
B. 9
C. 18
D. 20
答案:D
6. 以下关于数据类型int的别名定义中,正确的定义是()。
A. typedef int Integer;
B. typedef int = Integer;
C. typedef Integer int;
D. typedef Integer = int;
答案:A
7. 设有枚举类型定义:
enum color { red = 3, yellow, blue = 10, white, black };
则枚举常量black的序号值是()。
A. 4
B. 5
C. 7
D. 12
答案:D
8. 一个结构体变量所占的内存字节数是()。
A. 结构体中第一个成员所需的内存字节数
B. 结构体中最后一个成员所需的内存字节数
C. 结构体中占用内存最大的成员所需的字节数
D. 结构体中各成员所需的内存字节数之和
答案:D
9. 当定义一个共用体变量时系统分配给它的内存字节数是()。
A. 共用体中第一个成员所需的内存字节数
B. 共用体中最后一个成员所需的内存字节数
C. 共用体中占用内存最大的成员所需的字节数
D. 共用体中各成员所需的内存字节数之和
答案:C
10.以下关于结构体与共用体数据成员定义的叙述中,正确的说法是()。
A. 结构体类型定义中不能出现共用体类型的成员,共用体类型定义中也不能出现结构体
类型的成员
B. 结构体类型定义中不能出现共用体类型的成员,共用体类型定义可以出现结构体类型
的成员
C. 结构体类型定义中可以出现共用体类型的成员,共用体类型定义中不能出现结构体类
型的成员
D. 结构体类型定义中可以出现共用体类型的成员,共用体类型定义中也可以出现结构体
类型的成员
答案:D
11.在说明一个结构体变量时系统分配给它的存储空间是()。
A. 该结构体中第一个成员所需存储空间
B. 该结构体中最后一个成员所需存储空间
C. 该结构体中占用最大存储空间的成员所需存储空间
D. 该结构体中所有成员所需存储空间的总和
答案:D
12.若有以下说明和语句:
struct worker
{ int no; char ﹡name; }work, ﹡p=&work;
则以下引用方式不正确的是()。
A. work.No
B. (﹡p).no
C. p->no
D. work->no
答案:D
13.有如下定义:
struct date { int year, month, day; };
struct worklist { char name[20]; char sex;
struct date birthday; }person;
对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是()。
A. year=1958
B. birthday.year=1958
C. person.birthday.year=1958
D. person.year=1958
答案:C
14.以下对结构体类型变量的定义中不正确的是()。
A. #define STUDENT struct student
STUDENT
{ int num;
float age;
}std1;
B. struct student
{ int num;
float age;
}std1;
C. struct
{ int num;
float age;
}std1;
D. struct
{ int num;
float age;
} student;
struct student std1;
答案:D
15.设有以下说明语句
struct stu
{ int a; float b; }stutype;
则下面的叙述不正确的是()。
A. struct是结构体类型的关键字
B. struct stu是用户定义的结构体类型
C. stutype是用户定义的结构体类型名
D. a和b都是结构体成员名
答案:C
16.C++语言结构体类型变量在程序执行期间()。
A. 所有成员一直驻留在内存中
B. 只有一个成员主留在内存中
C. 部分成员驻留在内存中
D. 没有成员驻留在内存中
答案:A
17.以下程序的运行结果是()。
# include
main( )
{ struct date
{ int year, month, day; }today;
printf(“%d\n”,sizeof(struct date));
}
A. 6
B. 8
C. 10
D. 12
答案:A
18.有如下定义
struct person{char name[9]; int age;};
stru ct person class[10]={“Johu”, 17,
“Paul”, 19
“Mary”, 18,
“Adam 16,};
根据上述定义,能输出字母M的语句是()。
A. prinft(“%c\n”,class[3].mane);
B. pfintf(“%c\n”,class[3].name[1]);
C. prinft(“%c\n”,class[2].name[1]);
D. printf(“%^c\n”,class[2].name[0]);
答案:D
19.设有如下定义
struct ss
{ char name[10];
int age;
char sex;
} std[3],* p=std;
下面各输入语句中错误的是()。
A. scanf("%d",&(*p).age);
B. scanf("%s",&https://www.360docs.net/doc/cd9428038.html,);
C. scanf("%c",&std[0].sex);
D. scanf("%c",&(p->sex))
答案:B
20.设有以下说明语句,则下面的叙述中不正确的是()。
struct ex {
int x ; float y; char z ;
} example;
A. struct结构体类型的关键字
B. example是结构体类型名
C. x,y,z都是结构体成员名
D. struct ex是结构体类型
答案:B
21.若程序中有下面的说明和定义:
struct stt
{ int x;
char b;
}
struct stt a1,a2;
则会发生的情况是()。
A. 程序将顺利编译、连接、执行。
B. 编译出错。
C. 能顺利通过编译、连接,但不能执行。
D. 能顺利通过编译,但连接出错。
答案:B
22.已知教师记录定义为:
struct student
{ int no;
char name[30];
struct
{ unsigned int year;
unsigned int month;
unsigned int day;
}birthday;
} stu;
struct student *t = &stu;
若要把变量t中的生日赋值为“1980年5月1日”,则正确的赋值方式为()。
A. year = 1980;
month = 5;
day = 1;
B. t.year = 1980;
t.month = 5;
t.day = 1;
C. t.birthday.year = 1980;
t.birthday.month = 5;
t.birthday.day = 1;
D. t-> birthday.year = 1980;
t-> birthday.month = 5;
t-> birthday.day = 1;
答案:D
23.以下结构类型可用来构造链表的是()。
A. struct aa{ int a;int * b;};
B. struct bb{ int a;bb * b;};
C. struct cc{ int * a;cc b;};
D. struct dd{ int * a;aa b;};
答案:B
24.以下程序的输出结果是()。
amovep(int *p, int a[3][3],int n)
{ int i, j;
for( i=0;i for(j=0;j main() { int *p,a[3][3]={{1,3,5},{2,4,6}}; p=(int *)malloc(100); amovep(p,a,3); printf("%d %d \n",p[2],p[5]);free(p); } A. 56 B. 25 C. 34 D. 程序错误 答案:A 25.以下程序的输出结果是()。 struct HAR { int x, y; struct HAR *p;} h[2]; main() { h[0].x=1;h[0].y=2; h[1].x=3;h[1].y=4; h[0].p=&h[1].x; h[1].p=&h[0].x; printf("%d %d \n",(h[0].p)->x,(h[1].p)->y); } A. 12 B. 23 C. 14 D. 32 答案:D 三、程序填空题 1. 题目描述:结构体数组中存有3个人的姓名和年龄,输出3个人中最年长者的姓名和年龄。代码: #include struct man { char name[20]; int age; }person[]={"李明",18, "王华",19, "张平",20}; int main() { struct man *p,*q; int old; p=person; old= (1) ; q= (2) ; for( ; (3) ; p++) if(old { q=p; old= (4) ; } cout<< (5) <<" "< return 0; } 答案: (1)p->age (2) p (3)p (4) p->age (5)q->name 2. 题目描述:输入学生的信息存入结构体数组。每个学生的信息包括姓名、学号、性别。若是男同学(字符'm'表示男同学,'w'表示女同学),则需登记视力正常与否(正常—'Y',不正常—'N');若是女同学,则要登记身高和体重(不登记视力)。 代码: #include const int N=10; struct { char name[10]; int number; char sex; union{ char eye; struct { int height; int weight; }f; }body; }per[N]; int main() { int i; for(i=0;i { cin>>per[i].name>>per[i].number>>per[i].sex; if(per[i].sex=='m') cin>> (1) ; else cin>> (2) >> (3) ; } return 0; } 答案: (1)per[i].body.eye (2)per[i].body. f.height (3)per[i].body. f.weight 3. 题目描述:以下程序的功能是计算两个复数的差。 代码: #include struct complex { float re; float im; }; complex *sub(complex *x, complex *y) { (1) ; z=new complex; z->re=x->re-y->re; z->im=x->im-y->im; return (2) ; } int main() { complex *t; complex a,b; a.re=10; a.im=20; b.re=3; b.im=4; t=sub( (3) ); cout< return 0; } 答案: (1)complex *z (2)z (3)&a,&b 4. 题目描述:下面的程序按学生姓名查询其排名和平均成绩,查询可连续进行,指导输入0是结束。 代码: #include #include const int NUM = 4; struct student { int rank; char *name; double score; }; (1) stu[NUM]={3,"Tom",89.3, 4,"Marry",78.2, 1,"Jack",95.1, 2,"Jim",90.6}; int main() { char name[10]; int i; while(1) { cout<<"请输入姓名:"; cin>>name; if(strcmp(name,"0")==0) break; for(i=0;i if( (2) ) { cout<<"姓名:"< cout<<"名次:"< cout<<"成绩:"< (3) ; } if(i>=NUM) cout<<"未发现该学生!\n"; } return 0; } 答案: (1)student (2)strcmp(stu[i].name,name)==0 (3)break 5. 题目描述:下面的程序可以非常完备的求标准一元二次方程“ax2+bx+c=0”的解。代码: #include #include struct { double a,b,c; }coe; int main() { double x1,x2,delt,re,im; cout<<"请输入一元二次方程的3个系数:"; cin>>coe.a>>coe.b>>coe.c; if (coe.a==0) //处理一元二次方程 { if(coe.b==0) //处理常量方程“c=0” if( (1) ) { cout<<"方程有无穷多个解\n"; return 0; } else { cout<<" (2) \n"; return 0; } x1= (3) ; cout<<"方程的解为:"< (4) ; } delt= (5) ; re= (6) ; im=sqrt(fabs(delt))/(2*coe.a); //计算虚部 if( (7) ) //处理有两个实数解的方程{ x1=re+im; x2= (8) ; cout<<"方程的两个实数根为:"< cout<<"x1="< cout<<"x2="< return 0; } if(!delt) { x1= (9) ; cout<<"方程的两个相等的实数根为:"< cout<<"x1="< return 0; } cout<<"方程的两个复数根为:"< cout<<"x1="< cout<<"x2="< return 0; } 答案: (1)coe.c==0 (2)方程无解 (3)-coe.c/coe.b (4) return (5)coe.b*coe.b-4*coe.a*coe.c (6)-coe.b/(2*coe.a) (7)delt>0 (8)re-im (9)re+im (10)– 四、程序设计题 1. 题目标题:求二元一次方程组的解 时间限制:MS 内存限制:KB 题目描述:用结构体表示一个二元一次方程,求二元一次方程组的解: a1x+b1y=c1 (1) a2x+b2y=c2 (2) 输入描述: 输出描述: 样例输入:9x+7y=6↙ 3x-8y=5 样例输出:方程组的解为: x=0.892473 y=-0.290323 参考答案: #include "iostream.h" struct eyyc { double a,b,c; } ; void main( ) { double x,y,a1,a2; char ch; eyyc equation1,equation2,equation3; cout<<"请输入第1个二元一次方程(输入格式举例:3x-1y=9):"; cin>>equation1.a>>ch>>equation1.b>>ch>>ch>>equation1.c; cout<<"请输入第2个二元一次方程(输入格式举例:5x+2y=4):"; cin>>equation2.a>>ch>>equation2.b>>ch>>ch>>equation2.c; a1=equation1.a; a2=equation2.a; equation1.a*=a2; // 方程1乘以a2 equation1.b*=a2; equation1.c*=a2; equation2.a*=a1; // 方程2乘以a1 equation2.b*=a1; equation2.c*=a1; equation3.a=equation1.a-equation2.a; // 方程1减方程2 equation3.b=equation1.b-equation2.b; equation3.c=equation1.c-equation2.c; if (equation3.b==0) // y的系数为0时 { if (equation3.c==0) cout<<"任何实数都是方程组的解"; else cout<<"方程组无解"; cout< return; } y=equation3.c/equation3.b; x=(equation1.c-equation1.b*y)/equation1.a; // 根据方程1求x的值 cout<<"方程组的解为:\n"; cout<<"x="< cout<<"y="< } 2. 题目标题:求任意两点之间的距离 时间限制:MS 内存限制:KB 题目描述:用结构体表示平面上的点,求任意两点之间的距离。 输入描述: 输出描述: 样例输入:1,1↙ 2,2 样例输出:两点之间的距离为:1.41421 参考答案: #include "iostream.h" #include "math.h" struct point { double x; // 横坐标 double y; // 纵坐标 } ; void main( ) { double distance; point p1,p2; char ch; cout<<"请输入第1个点的坐标(输入格式举例:3,-8):"; cin>>p1.x>>ch>>p1.y; cout<<"请输入第2个点的坐标(输入格式举例:3,-8):"; cin>>p2.x>>ch>>p2.y; distance=sqrt(pow(p1.x-p2.x,2)+pow(p1.y-p2.y,2)); cout<<"两点之间的距离为:"< } 3. 题目标题:将一个分数化成最简分数 时间限制:MS 内存限制:KB 题目描述:定义一个分数结构体,使用引用参数将一个分数化成最简分数输入描述: 输出描述: 样例输入:6/10 样例输出:化简结果:3/5 参考答案: #include "iostream.h" #include "stdlib.h" struct Fraction { int numerator; // 分子 int denominator; // 分母 }; void Simplify(Fraction &x); void main() { Fraction x; char ch; while(1) { cout<<"请输入一个分数(输入格式:-3/5):"; cin>>x.numerator>>ch>>x.denominator; if (x.denominator) break; } Simplify(x); cout<<"化简结果:"; cout< } // 分数化简 void Simplify(Fraction &x) { int m,n,r; m=abs(x.denominator); n=abs(x.numerator); while(r=m%n) // 求m,n的最大公约数 { m=n; n=r; } x.denominator/=n; // 化简 x.numerator/=n; if (x.denominator<0) // 将分母转化为正数 { x.denominator=-x.denominator; x.numerator=-x.numerator; } } 4. 题目标题:求一元二次方程的解 时间限制:MS 内存限制:KB 题目描述:对于任意系数a,b,c,在复数范围内求一元二次方程ax2+bx+c=0的解。用结构 体描述方程。 输入描述: 输出描述: 样例输入:1 2 3 样例输出:方程的两个复数根为: x1=-1+1.41421i x2=-1-1.41421i 参考答案: #include "iostream.h" #include "math.h" struct { double a,b,c; } coe; void main( ) { double x1,x2,delt,re,im; cout<<"请输入一元二次方程的三个系数:"; cin>>coe.a>>coe.b>>coe.c; if (coe.a==0) // 处理一元一次方程:bx+c=0 { if (coe.b==0) // 处理常量方程:c=0 if (coe.c==0) { cout<<"方程有无穷多个解\n"; return; } else { cout<<"方程无解\n"; return; } x1=-coe.c/coe.b; cout<<"方程的解为:"< return; } delt=coe.b*coe.b-4*coe.a*coe.c; // 计算根的判别式 re=-coe.b/(2*coe.a); // 计算实部 im=sqrt(fabs(delt))/(2*coe.a); // 计算虚部 if (delt>0) // 处理有两个实数解的方程 { x1=re+im; x2=re-im; cout<<"方程的两个实数根为:"< cout<<"x1="< cout<<"x2="< return; } if (!delt) { x1=re+im; cout<<"方程的两个相等的实数根为:"< cout<<"x1="< return; } cout<<"方程的两个复数根为:"< cout<<"x1="< cout<<"x2="< } 5. 题目标题:求平均成绩 时间限制:MS 内存限制:KB 题目描述:每个学生有3门课程结业考试成绩。输入每个学生的姓名和成绩,计算并输出每个学生的姓名和平均成绩。 输入描述: 输出描述: 样例输入:张三 89 76 68↙ 李四 90 80 70↙ n 样例输出:平均成绩如下: 张三:77.6667 李四:80 参考答案: #include "iostream.h" #include "string.h" struct Student { char *name; // 姓名 int score[3]; // 考试成绩 double average; // 平均成绩 }; void main() { Student d[100]; int i,n,x1,x2,x3; char s[41]; cout<<"请输入每个学生的姓名和3门课程考试成绩(输入姓名时若输入“n”则结束输入):\n"; n=0; while(n<99) { cout<<"NO."< cin>>s; if (strcmp(s,"n")==0) break; n++; d[n].name=new char[strlen(s)+1]; strcpy(d[n].name,s); cin>>x1>>x2>>x3; d[n].score[0]=x1; d[n].score[1]=x2; d[n].score[2]=x3; d[n].average=(x1+x2+x3)/3.0; // 计算平均成绩 } cout<<"平均成绩如下:\n"; for(i=1;i<=n;i++) cout< for(i=1;i<=n;i++) // 释放内存 delete []d[i].name; } 6. 题目标题:图书馆图书检索(按作者姓名) 时间限制:MS 内存限制:KB 题目描述:图书馆的图书检索卡记载的内容包括:书名、作者姓名、出版日期、页数、定价等内容。根据上述内容定义一个结构体类型,并按照作者姓名进行查找,按 照出版日期顺序从远到近打印出该作者的所有著作。 输入描述: 输出描述: 样例输入:王五 样例输出:N0.1: 书名:数据结构 作者:王五 出版日期:2004年8月18日 页码数:200页 定价:25元 参考答案: #include "iostream.h" #include "string.h" #define n 6 struct DATE { int year; // 年份 int month; // 月份 int day; // 日期 } ; struct BOOK { char name[41]; // 书名 char author[11]; // 作者 DATE date; // 出版日期 int pages; // 页码数 double price; // 定价 } ; void print(BOOK book); void main( ) { BOOK book[n]={ { "C语言程序设计技术","张三",{2006,3,1},270,29 } , { "C++程序设计教程","张三",{2008,10,1},280,31.5 }, { "C语言程序设计","李四",{2005,6,12},320,32.8 }, { "数据结构","王五",{2004,8,18},200,25 }, { "会计电算化基础教程","张三",{1996,8,1},246,21.5 }, { "计算机应用基础教程","张三",{1998,5,1},266,18.5 }, }; BOOK result[n]; char name[21]; int i,count; cout<<"请输入作者姓名:"; cin>>name; count=0; for(i=0;i if (strcmp(book[i].author,name)==0) { result[count]=book[i]; count++; } if (!count) { cout<<"没有该作者主编的著作\n"; return; } int j,p; BOOK t; for(i=0;i { p=i; for(j=i+1;j { if (result[j].date.year>result[p].date.year) continue; if (result[j].date.year if (result[j].date.month } if (p==i) continue; t=result[p]; result[p]=result[i]; result[i]=t; } for(i=0;i cout< } // 输出查找结果 void print(BOOK book) { 第十一章结构体与共用体 结构体变量引用规则: (1)不能将一个结构体变量作为一个整体进行输入和输出;只能对结构体变量中的各个成员分别进行输入和输出。“.”是成员(分量)运算符,它在所有的运算符中优先级最高。 (2)若成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。 (3)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。 (4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。 —>是指向运算符,优先级为第一级。 结构体变量所占的内存长度是各成员所占内存长度之和。每个成员分别占有其自己的内存单元。 共用体变量所占的内存长度等于最长的成员的长度。 只先有定义了共用体变量才能引用它,而且不能引用共用体变量,而只能引用共用体变量中的成员。 将一个变量定义为结构体类型:不仅要求指定变量为结构体类型,而且要求指定为某一特定结构体类型。 类型与变量的区别: 定义时先定义结构体类型,然后定义变量。类型不分配空间,变量分配空间。 可以采取以下3种方法定义结构体类型变量: (1)先声明结构体类型再定义变量名 例如:struct student student1, student2; | | | 结构体类型名结构体变量名 (2)在声明类型的同时定义变量;这种形式的定义的一般形式为: struct 结构体名 { 成员表列 }变量名表列; (3) 直接定义结构体类型变量 其一般形式为: struct { 成员表列 }变量名表列; 即不出现结构体名。 引用结构体变量中成员的方式为 结构体变量名.成员名 第10章结构体与共用体 考核知识点 ●结构体与共用体类型数据的定义方法和引用方法 ●用指针和结构体构成链表,单向链表的建立、输出、插入与删除 重要考点 ●对结构体的声明及定义 ●访问结构体的成员的方法 ●熟悉对链表的操作 10.1 用typedef说明一种新类型名 C语言规定可以用typedef说明一种新的类型名,说明新类型名的语句一般形式为:typedef 类型名称标识符; 其中,“类型名”一定是在此语句之前已有定义的类型标识符。“标识符”是一个用户定义标识符,用来标识新的类型名。typedef语句的作用仅仅是用“标识符”来代表已存在的“类型名”,并没有产生新的数据类型,因此,原有的类型名依然有效。 提示: 声明一个新的类型名的具体步骤如下: ⑴先按定义变量的方法写出定义的主体(如float a;). ⑵将变量名换成新类型名(如将a换成FLO)。 ⑶在最左面加上关键字typedef(如typedef FLO). ⑷然后可以用新类型名去定义其他的变量(如FLO b;). 10.2 结构体类型 在实际工作中,当我们需要把一些不同类型,但相互之间又存在着联系的信息组合应用时,就要用到结构体。结构体是一种看似复杂却非常灵活的构造数据类型。在通常情况下,一个结构体类型由若干个称为成员(或称为域)的部分组成。不同的结构体类型可根据需要由不同的成员组成。但对于某个具体的结构体类型,其成员的数量必须固定,这一点与数组相同;但结构体中各个成员的类型可以不同,这是结构体与数组的重要区别。例如,我们常用的“时间”可以由以下3个部分描述:小时(hour)、分(minute)、秒(second)。它们都可以用整型数表示,可以把这3个成员组成一个整体,并给它取名为time,这就是一个简单的结构体。 声明一个结构体类型的一般形式为: struct 结构体名 {成员表列}; struct是C语言中的关键字,是结构体类型的标志。“结构体名”用做结构体类型的标志,它又称“结构体标记”(structure)。大括号内是该结构体中各成员,成员表列是由若干个变量类型名及变量名组成的。这些成员共同组成一个结构体。例如,上面提到的“时间”结构体类型可以说明如下: struct time { int hour; int minute; int second; 1 声明一个结构体类型的一般形式为: struct 结构体名 {成员表列}; 如:struct student { int num;char name[20];char sex; int age;float score;char addr[30]; }; 2 定义结构体类型变量的方法 (1)先声明结构体类型再定义变量名 例如:struct student student1, student2; | | | 结构体类型名结构体变量名 (2)在声明类型的同时定义变量 这种形式的定义的一般形式为: struct 结构体名 { 成员表列 }变量名表列; (3)直接定义结构体类型变量 其一般形式为: struct { 成员表列 }变量名表列; 即不出现结构体名。 注意: 成员名可以与程序中的变量名相同,二者不代表同一对象。 3 可以引用结构体变量成员的地址,也可以引用结构体变量的地址。 例如: scanf(″%d″,&student1.num); (输入student1.num的值) printf(″%o″,&student1); (输出student1的首地址) 4 结构体数组的初始化 struct student {int num;char name[20]; char sex; int age; float score; char addr[30]; }stu[2]={{10101,″LiLin″,′M′,18,87.5,″103 BeijingRoad″},{10102,″Zhang Fun″,′M′,19,99,″130 Shanghai Road″}}; 5 指向结构体变量的指针 #include 第^一章结构体与共用体教学内容 (1) 结构体的定义与结构体变量; (2) 结构体数组; (3) 结构体指针; ⑷链表; (5) 共用体; (6) 枚举类型; 基本要求 掌握结构体的定义方法及其作用;重点掌握链表及其应用了解共用体的概念及其应用 一、概述 、引入原由 我们前面讲过数组,数组类型中的各个元素的类型是相同的,在日常应用中,仅仅有这些数据类型是不够的。有时需要将不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。例如:学生的信息(姓名、性别、年龄、成绩、学号)。那么如何实现这种结构呢?采用的是结构体。 女口:struct student { int num; char n ame[20]; char sex; int age; float score; }; 、结构体类型的一般形式 struct 结构体名 {成员表列}; 成员表列:类型名成员名 女口:struct student {int nu m;char sex;}; 二、结构体类型变量的定义、引用、初始化 、定义方法 1、先声明类型再定义变量名 struct stude nt {int nu m;char sex;}; struct stude nt stu1,stu2; 2、在声明类型的同时定义变量 struct stude nt {int nu m;char sex;} stu1,stu2; 3、直接定义结构体类型变量(不给出结构体名) struct {int nu m;char sex;} stu1,stu2; 4、说明: 1 )类型与变量不同(变量:分配空间,可以赋值、存储、运算) 2)成员与普通变量地位相当,域名可以单独使用 3)成员也可以是一个结构体变量 如: struct date 第十章结构体与共用体 一、选择题 1.在说明一个结构体变量时系统分配给它的存储空间是。(0级) A)该结构体中第一个成员所需存储空间 B)该结构体中最后一个成员所需存储空间 C)该结构体中占用最大存储空间的成员所需存储空间 D)该结构体中所有成员所需存储空间的总和 2.若有以下说明和语句: struct worker {int no; char ﹡name;}work, ﹡p=&work; 则以下引用方式不正确的是。(1级) A) work.no B) (﹡p).noC) p->no D)work->no3.有如下定 义: struct date { int year,month,day; }; structworklist {char name[20]; char sex; struct datebirthday; }person; 对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。 (1级) A) year=1958B) birthday.year=1958 C) person.birthday.year=1958 D) person.year=19 58 4.以下对结构体类型变量的定义中不正确的是。(1级) A)#define STUDENT struct studentB) struct student STUDENT{ int num; { intnum;floatage; floatage; }std1; }std1; C)struct D) struct {intnum;{ intnum; float age;float age; } student; }std1;structstudent std1; 5.设有以下说明语句 struct stu { int a; float b;}stutype; 则下面的叙述不正确的是。(1级) A)struct是结构体类型的关键字 B)struct stu是用户定义的结构体类型 C)stutype是用户定义的结构体类型名 一、填空题 1.若有如下结构体定义: struct student { int num; float age; char sex; }stud; 则stud所占的内存空间是9 字节。 2.已有定义和语句: union data { int i; char c; float f; }a,*p; p=a; 则对a中成员c的正确访问形式可以是 a.c 或: p->c或:(*p).c。(只需 写出一种) 二、单项选择题: 1.若有下列定义: struct b { float a[5]; double c; int d;}x; 则变量x在内存中所占的字节为下列哪一个:( C ) A.6 B. 10 C. 30 D. 14 2.设有以下说明语句,则下面的叙述不正确的是( C ) struct stu { int a; float b; } stutype; A. struct 是结构体类型的关键字。 B. struct stu 是用户定义的结构体类型。 C. stutype是用户定义的结构体类型名。 D. a和b都是结构体成员名。 3.下面程序的运行结果是( ) #include }today; printf(“%d\n”,sizeof(struct date)); } A. 6 B. 8 C. 10 D. 12 4.设有以下说明语句,则下面的叙述正确的是( B ) typedef struct { int a; float b; } stutype; A. stutype是结构体变量名。 B. stutype 是结构体类型名。 C. struct是结构体类型名。 D. typedef struct是结构体类型名。 三、填程序 1.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。请填 空。 static struct man { char name[20]; int age; }person[ ]={{“LiMing”,18},{“WangHua”,19},{“ZhangPing”,20}}; main( ) { struct man *p,*q; int old=0; p=person; for(; p 结构体与共用体 一、选择题: 1.已知赋值语句wang.year=2004;则wang的变量类型是() A. 字符或文件 B. 整型或实型 C. 共用或结构 D. 实型或指针 2.Turbo C中,以下类型数据在存储器中占的字节数为 ( ) struct test { int x; float y; char z; } ; A. 2 B. 3 C. 6 D. 7 3.以下语句中,成员data的正确引用方式为( ) struct node { int data; char name[10]; }stree; struct node *p=&stree; A. p.data B. p->data C. (*p)->data D. stree->data 4、当执行以下程序段时,输出的结果是。()struct data { char a; int b; float c; }; printf(“%d”, sizeof(struct data)); A. 1 B. 2 C. 4 D. 7 5.下面程序段的运行结果是。 struct stu { int num; char name[10]; float scrose ; }; printf(“%d\n”, sizeof (struct stu )); (A)14 (B)12 (C)16 (D)3 6. 若有定义: typedef char* string; #define str char * int a=4; struct { int x, *y; }z={10, &a}, *p=&z; 则下列不等价的是: A. string name, sign; 与 str name, sign; B. *p->y++ 与 *(p->y++) C. ++*p->y 与 ++(*p->y) D. ++p->x与++(p->x) () 习题六 1. 从下列四个选项中选择一个正确的填入括号中。 (1)在说明一个结构体变量时系统分配给它的存储空间是( D)。 A该结构体中第一个成员所需存储空间 B该结构体中最后一个成员所需存储空间 C该结构体中占用最大存储空间的成员所需存储空间 D该结构体中所有成员所需存储空间的总和 (2)在说明一个共用体变量时系统分配给它的存储空间是(D )。 A该共用体中第一个成员所需存储空间 B该共用体中最后一个成员所需存储空间 C该共用体中占用最大存储空间的成员所需存储空间 D该共用体中所有成员所需存储空间的总和 (3)共用体类型在任何给定时刻, ( B)。 A所有成员一直驻留在内存中 B只有一个成员驻留在内存中 C部分成员驻留在内存中 D没有成员驻留在内存中 (4)以下定义结构体类型的变量st1,其中不正确的是(A ) A typedef stuct student { int num; int age; }STD; STD st1; B struct student { int num,age; }st1; C struct { int num; float age; }st1; D struct student { int num; int age; }; struct student st1; (5)已知职工记录描述为: struct workers { int no; char name[20]; char sex; struct { int day; int month; int year; }birth; }; struct workers w; 设变量w中的”生日”应是”1993年10月25日”,下列对”生日”的正确赋值方式是( C)。 A day=25; month=10; year=1993; B ==10; =1993; C =25; =10; =1993; (6)设有如下定义: struct sk { int a; float b; }data,*p; 若有p=&data;则对data中的a成员的正确引用是( B)。 A (*p). B (*p).a C p-> D 填空 (1)若有以下说明和定义且数组w和变量k已正确赋值,则对w数组中第k个元素中各成员的正确引用形式是 w[k-1].b、 w[k-1].c 、 w[k-1].d 。 struct aa { int b; char c; double d; }; struct aa w[10]; int k=3; (2)若有以下说明和定义,则对成员的另外两种引用形式是 x->b-> 和 . 。 struct st { int a; struct st *b; }*p, x; p=&x; 3.阅读下面程序,写出运行结果。 第十章结构体与共用体 、选择题 1?在说明一个结构体变量时系统分配给它的存储空间是___________ 。(0级)A该结构体中第一个成员所需存储空间 B)该结构体中最后一个成员所需存储空间 C)该结构体中占用最大存储空间的成员所需存储空间 D)该结构体中所有成员所需存储空间的总和 2?若有以下说明和语句: struct worker { int no; char * name; }work, * p=&work; 则以下引用方式不正确的是。(1级) A)work . no B) ( * p). no C) p->no D)work->no3.有如下定义: struct date { int year, mon th, day; }; struct worklist { char n ame[20]; char sex; struct date birthday; }pers on; 对结构体变量person的出生年份进行赋值时, (1级) A) year=1958 C) person. birthday . year=1958 4.以下对结构体类型变量的定义中不正确的是A) #define STUDENT struct student STUDENT { int num; float age; }std1; C) struct { int num; float age; }std1; 5.设有以下说明语句 struct stu { int a; float b; }stutype; 则下面的叙述不正确的是_____________ A)struct是结构体类型的关键字 B)struct stu是用户定义的结构体类型 C)stutype是用户定义的结构体类型名 D)a和b都是结构体成员名 6.C语言结构体类型变量在程序执行期间 A)所有成员一直驻留在内存中 B)只有一个成员主留在内存中 C)部分成员驻留在内存中 D)没有成员驻留在内存中 下面正确的赋值语句是 _______________ B)birthday . year=1958 D) person. year=1958 ___________ 。(1 级) B)struct stude nt { int num; float age; }std1; D) struct { int num; float age; } stude nt; struct stude nt std1; (1级) 第十一章 结构体与共用体 1、 填空 (1) 为了建立如图所示的存储结构(即每个结点含两个域,data 是数据域,next 是指向结点的指针域),请填空。 Struct link {char data; ; }node; (2) 以下程序的输出结果是 。 main() {struct cmplx{int x;int y;} cnum[2]={1,3,2,7}; printf(“%d\n ”,cnum[0].y/cnum[0].x*cnum[1].x);} 2、 选择 (1) 根据以下定义,能输出字母M 的语句是 A.printf(“%c\n ”,class[3].name); B.printf(“%c\n ”,class[3].name[1]); C.printf(“%c\n ”,class[2].name[1]); D.printf(“%c\n ”,class[2].name[0]); struct person { char name[9];int age;}; struct person class[10]={ “John ”,17, “Paul ”,19, “Mary ”,18, “Adam ”,16,}; (2) 对整个结构能够进行的操作是 。 A. 对结构进行赋值 data next B.对结构进行存取 C.对结构进行运算 D.对结构进行&操作 (3)不是结构类型的特点的选项为。 A.结构体变量可以有不同类型的成员 B.结构体中的成员都占有存储空间 C.结构体变量既可以做函数参数,又可以从函数中返回 D.结构体变量的成员既可以读又可以写 3、判断 (1)能在一个存储区内处理不同的类型的数据叫结构。() (2)在编译时对结构类型不分配空间,只能对变量分配空间。() (3)结构一旦定义,系统就给它分配所需的内存单元。() 4、程序设计 (1)设有以下结构类型说明: struct stud {char num[5],name[10]; int s[4]; double ave; } 请编写: <1>readrec把30名学生的学号、姓名、四项成绩及平均分放在一个结构体数组中,学生的学号、姓名和四项成绩由键盘输入,然后计算出平均分放在结构提对应的域中。 第十一章结构体与共用体 问题与思考 1.下面程序的运行结果是___________. main() { struct cmplx{int x; int y; }cnum[2]={1,3,2,7}; printf("%d\n",cnum[0].y/cnum[0].x*cnum[1].x); } a)0 b)1 c)3 d)6 2.以下对结构体变量stu1中成员age的非法引用是____b____. struct student {int age; int num; }stu1,*p; p=&stu1; a) b) c)p->age d)(*p).age 3.以下scanf函数调用语句中对结构体变量成员的不正确引用是_____d___. struct pupil {char name[20]; int age; int sex; }pup[5],*p; p=pup; a)scanf("%s",pup[0].name); b)scanf("%d",&pup[0].age); c)scanf("%d",&(p->sex)); d)scanf("%d",p->age); 4.以下程序的运行结果是___10,x_____. struct n{ int x; char c; }; main() {struct n a={10,'x'}; func(a); printf("%d,%c",,; } func(struct n b) { =20; ='y'; } 5.若有定义: struct num {int a; int b; float f; }n={1,3,}; struct num *pn=&n; 则表达式pn->b/*++pn->b的值是___12_____,表达式(*pn).a+pn->f的值是. 6.以下程序的运行结果是____7,3____. struct ks {int a; int *b; }s[4],*p; main() { int n=1; printf("\n"); for(i=0;i<4;i++) { s[i].a=n; s[i].b=&s[i].a; n=n+2; } p=&s[0]; p++; printf("%d,%d\n",(++p)->a,(p++)->a); } 7.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。请在_______内填入正确内容。 stati struct man{ char name[20]; int age; }person[]={"li=ming",18, "wang-hua",19, "zhang-ping",20 第十一章结构体与共用体 ●教学内容 (1) 结构体的定义与结构体变量; (2) 结构体数组; (3) 结构体指针; (4) 链表; (5) 共用体; (6) 枚举类型; ●基本要求 掌握结构体的定义方法及其作用;重点掌握链表及其应用。 了解共用体的概念及其应用 一、概述 一、引入原由 我们前面讲过数组,数组类型中的各个元素的类型是相同的,在日常应用中,仅仅有这些数据类型是不够的。有时需要将不同类型的数据组合成一个有机的整体,以便于引用。这些组合在一个整体中的数据是互相联系的。例如:学生的信息(姓名、性别、年龄、成绩、学号)。那么如何实现这种结构呢?采用的是结构体。 如:struct student { int num; char name[20]; char sex; int age; float score; }; 二、结构体类型的一般形式 struct 结构体名 {成员表列}; 成员表列:类型名成员名 如:struct student {int num;char sex;}; 二、结构体类型变量的定义、引用、初始化 一、定义方法 1、先声明类型再定义变量名 struct student {int num;char sex;}; struct student stu1,stu2; 2、在声明类型的同时定义变量 struct student {int num;char sex;} stu1,stu2; 3、直接定义结构体类型变量(不给出结构体名) struct {int num;char sex;} stu1,stu2; 4、说明: 1)类型与变量不同(变量:分配空间,可以赋值、存储、运算) 2)成员与普通变量地位相当,域名可以单独使用 3)成员也可以是一个结构体变量 如:struct date {int month; 一、判断题 1. 结构体的定义不为它分配具体的内存空间。 答案:T 2. C++语言结构体类型变量在程序执行期间,所有成员驻留在内存中。 答案:T 3. 一个共用体变量中可以同时存放其所有成员。 答案:F 4. 若有定义union dt{int a; char b; double c;}data;,变量data所占的内存字节数与成员c所占字节数相等。 答案:F 5. 用typedef可以增加新类型。 答案:F 6. 共用体类型数据中所有成员的首地址都是同一地址。 答案:T 7. 可以用已定义的共用体类型来定义数组或指针变量的类型。 答案:T 8. 共用体类型数据中的成员可以是结构体类型,但不可以是共用体类型。 答案:F 9. 可以对共用体变量直接赋值。 答案:F 二、选择题 1. 下面关于结构体概念的叙述中,正确的说法是()。 A. 相同类型数据的集合称为结构体 B. 不同类型数据的集合称为结构体 C. 数据的集合称为结构体 D. 整数的集合称为结构体 答案:C 2. 设有以下说明语句: struct abc { int m; float n; }stype; 则下面错误的叙述是()。 A. struct是定义结构体类型的关键字 B. stype是结构体类型名 C. m和n都是结构体成员名 D. stype是结构体变量名 答案:B 3. 以下对枚举类型ee的定义中,正确的定义是()。 A. enum ee {A, B, C, D}; B. enum ee {'A', 'B', 'C', 'D' }; C. enum ee = {A, B, C, D}; D. enum ee = {'A', 'B', 'C', 'D' }; 答案:A 4. 以下关于同类型结构体与同类型共用体赋值的叙述中,正确的说法是()。 A. 共用体变量之间可以直接赋值,结构体变量之间也可以直接赋值 B. 共用体变量之间可以直接赋值,结构体变量之间不可以直接赋值 C. 共用体变量之间不可以直接赋值,结构体变量之间可以直接赋值 D. 共用体变量之间不可以直接赋值,结构体变量之间也不可以直接赋值 答案:A 5. 设有如下定义: struct data { int i; union test { char ch; double q; }t; double f; }b; 若字符型变量占1个字节,整型变量占4个字节,双精度变量占8个字节,则结构体变量b占用内存的字节数是()。 A. 8 B. 9 C. 18 D. 20 答案:D 6. 以下关于数据类型int的别名定义中,正确的定义是()。 A. typedef int Integer; B. typedef int = Integer; C. typedef Integer int; D. typedef Integer = int; 试题汇编之:结构体与共用体 一.选择题 1.共用体定义为“union data{char ch;int x;}a;”下列语句正确的是。 A:a.ch=?x?;a=10; B:a a=?x?,10; C:a.x=10;a.ch=?x?; D:a=?x?; 2.共用体定义为“union data{char ch;int x;}a;”下列语句不正确的是。 A:a={…x?,10}; B:a.x=10;a.x++; C:a.ch=?x?;a.ch++; D:a.x=10;a.ch=?x?; 3.对于:struct node{double x;char c;}*p;下列哪个赋值是错的。 A:p->x=2B:p.x=2.0 C.p->c=2 D.(*p).c=?a? 4.对于以下结构定义:struct{int len;char *str;}*p;(*p)->str++中的++加在。 A:指针str上B:指针p上. C.str所指的内容上 D:表达式语法有错 5.对如下定义:struct{char a1;int a2;}xx; union{char a1;int a2;int a3;}yy; 如果sizeof(xx)的值为3,则sizeof(yy)的值应为: A:2 B:4 C:5 D:定义有错 6.以下结构体变量定义语句中错误的是。 A.struct staffer{ long int code; float salary;} one; B.struct staffer{ long int code; float salary;} staffer one; C.typedef struct { long int code ; float salary;} STAFFER; D.struct { long int code; float salary; }one;- 7.形如上题中定义的结构体变量,下列对此变量的输入形式中正确的是。 A: scanf(“%ld%f”,one); B: scanf(“%ld%f”,&one); C: scanf(“%ld%f”,one.code,one.salary); D: scanf(“%ld%f”,&one.code,&one.salary); 8.有如下结构体类型的定义则。 (1)struct mm{ int x,y; struct mm bl;} (2)struct mm{int x,y; struct mm* p;} A: (1)正确,(2)不正确。B: (1)(2)都正确。C: (1)不正确(2)正确D: (1)(2)都不正确 9.某结构体变量定义如下,对此结构体变量中的元素引用,形式正确的是。 struct a{ int a;char c;} bl,*p; p=&bl; A: bl->a B: (*p).c C: p.c D: *p.a 10.下面定义中,对成员变量x的引用形式中正确的是。 struct mm{int x,y;}; struct aa{char c; struct mm zb;} bl; A: bl.zb.x B: bl.x C: bl.mm.x D: zb.x第11章 结构体与共用体
第10章 结构体及共用体
第10章 结构体、共用体、枚举类
第十一章结构体与共用体
电子技术 第十章 结构体与共用体
练习题-第十章 结构体与共用体(有答案)
十一章 结构体与共用体
结构体和共用体习题
电子技术第十章结构体与共用体
结构体与共用体习题
C程第十一章结构体上机习题
第十一章 结构体与共用体
第6章-结构体与共用体
第十章结构体与共用体