11第十一章结构体和联合体练习
C#程序设计 第11章 结构体、联合体与位运算

第11章结构体、联合体与位运算本章介绍结构体、联合体及枚举类型等三种新的构造型数据类型以及位运算的基本方法,包括结构体的含义;结构体类型变量的定义、引用及初始化方法;结构体数组的定义和数组元素的引用;结构体类型指针的概念及链表的基本操作方法;联合体的含义;联合体类型变量的定义方法;枚举类型的定义; TYPEDEF的作用和位运算的基本方法等。
11.1 结构体类型通过前面有关章节的学习,我们认识了整型、实型、字符型等C语言的基本数据类型,也了解了数组这样一种构造型的数据结构,它可以包含一组同一类型的元素。
但仅有这些数据类型是不够的。
在实际问题中,有时需要将不同类型的数据组合成一个有机的整体,以便于引用。
例如,在新生入学登记表中,一个学生的学号、姓名、性别、年龄、总分等,它们属于同一个处理对象,却又具有不同的数据类型。
如图11-1。
每增加、删减或查阅一个学生记录,都需要处理这个学生的学号、姓名、性别、年龄、总分等数据,因此,有必要把一个学生的这些数据定义成一个整体。
图11-1虽然数组作为一个整体可用来处理一组相关的数据,但不足的是,一个数组只能按序组织一批相同类型的数据。
对于一组不同类型的数据,显然不能用一个数组来存放,因为数组中各元素的类型和长度都必须一致。
为了解决这个问题,C语言中给出了另一种构造数据类型——“结构体”。
11.1.1 结构体类型与结构体变量结构体是一种构造类型,它由若干“成员”组成。
每一个成员可以是一个基本数据类型或者又是一个构造类型。
结构体既然是一种构造而成的数据类型,那么在使用之前必须先定义它,如同在调用函数之前要先定义或声明一样。
定义一个结构体类型的一般形式为:struct 结构体名{ 成员1 类型1;成员2 类型2;...成员n 类型n;};“结构体”这个词是根据英文单词structure译出的。
结构体中的每个成员均须作类型说明,成员名的命名应符合标识符的书写规定,成员名可以与程序中的变量名同名,二者不代表同一对象,互不干扰。
结构体与联合体习题含答案

)(含答案结构体与联合体习题结构体与联合体习题2013年选择题1、若程序中有以下的说明和定义:struct abc{ int x;char y; } 花括号后少了分号。
struct abc s1,s2;。
则会发生的情况是______B) 程序将顺序编译、连接、执行A) 编译时错D) 能顺序通过编译、但连接出错C) 能顺序通过编译、连接、但不能执行2、有以下程序段struct st{ int x; int *y;}*pt;int a[]={1,2};b[]={3,4};struct stc[2]={10,a,20,b};pt=c;的是以下选项中表达式的值为11D) (pt++)->x C) ++pt->x A)*pt->y B) pt->x、有以下说明和定义语句3struct student{ int age; char num[8];};,?403}};structstudent *p=stu;______。
以下选项中引用结构体变量成员的表达式错误的是 stu[3].age D)B)p->num C) (*p).num A) (p++)->num 4、设有如下枚举类型定义 enum language{Basic=3,Assembly=6,Ada=100,COBOL,Fortran};。
Fortran枚举量的值为______D) 103 102 B) 7 C) A) 4。
、以下叙述中错误的是_________5增加新的类型可以通过typedef A)typedef可以用将已存在的类型用一个新的名字来代表B)typedef定义新的类型名后,原有类型名仍有效C)用typedef可以为各种类型起别名,但不能为变量起别名D)用6、有以下程序段typedef struct NODE{ int num; struct NODE *next;} OLD;以下叙述中正确的是A)以上的说明形式非法 B) NODE是一个结构体类型C) OLD是一个结构体类型 D) OLD是一个结构体变量7、以下选项中不能正确把cl定义成结构体变量的是______。
14.11 第 11章 结构体与共同体_C语言程序设计实验指导 (第2版)_[共8页]
![14.11 第 11章 结构体与共同体_C语言程序设计实验指导 (第2版)_[共8页]](https://img.taocdn.com/s3/m/fe2cf8e643323968001c92b7.png)
平均成绩。
#include <stdio.h> struct student { int num; int midscore; int finalscore; float ave; }stud1; void main() {
printf("please input the num,midterm score,final score\n"); scanf("%d%d%d",&stud1.num,&stud1.midscore,&stud1.finalscore); stud1.ave=(stud1.midscore+stud1.finalscore)/2.0; printf("The average score is %5.2f\n",stud1.ave); }
【3】结构体
【4】struct node *
【5】p=(struct aa *) malloc (sizeof (struct aa));
【6】28
【7】s.birth.year=1984; s.birth.month=11; s.birth.day=12;
【8】51
四、编程题
【1】用结构体类型编写程序。输入一个学生的学号、数学期中和期末成绩,然后计算并输出
第 14 章 《C 语言程序设计》习题参考答案
14.11 第 11 章 结构体与共同体
一、选择题
【1】B
【2】A
【3】A
【4】B
【5】B
【6】C
【7】A
【8】B
【9】B
【10】B
二、判断题
【1】
【2】√
【3】√
【4】
c语言char11

方式二:可以在说明结构体时真接定义变量, 方式二:可以在说明结构体时真接定义变量,如: struct student{ int num; char name[20]; …} s1, s2, b[10], *p; 方式三:可在说明一个无名结构体类型时, 方式三:可在说明一个无名结构体类型时,同时直接定义变 。(此方式只可在不再需要定义此类型变量的场合下 量。(此方式只可在不再需要定义此类型变量的场合下 使用) 使用) struct { int num; char name[20]; …}s1, s2, b[10], *p;
name “ Li Lin”
sex ‘M’ year 1982
birthday month 12 day 4
score 85.5
a
二、对结构体变量的成员操作: 对结构体变量的成员操作:
结构体变量中的每个成员都属于某个具体的数据类型。因此, 结构体变量中的每个成员都属于某个具体的数据类型。因此, 对结构体变量中的每个成员的操作与普通变量一样, 对结构体变量中的每个成员的操作与普通变量一样,包括 输入输出。换句话说,如果某个成员是某基本类型, 输入输出。换句话说,如果某个成员是某基本类型,就可 以将该成员作为基本类型变量来处理。 以将该成员作为基本类型变量来处理。 例: scanf(“%ld %ld”,&a.num); /*长整型量输入 长整型量输入* scanf( %ld ,&a.num); /*长整型量输入*/ gets(); /*字符串输入 字符串输入* gets(); /*字符串输入*/ sex=ˊMˊ; /*字符变量赋值 字符变量赋值* a.sex=ˊMˊ; /*字符变量赋值*/ score=93 93. /*实型变量赋值 实型变量赋值* a.score=93.5; /*实型变量赋值*/ (i=0 name[i]!=ˊ\ for (i=0;[i]!=ˊ\0ˊ;i++) printf(“% ,a name[i]); ,a. /*输出字符值 输出字符值* printf( %c”,[i]); /*输出字符值*/ sum=sum+a.score;
C语言11结构体与共用体

struct [结构体名]
{
类类结述…型 型结构…不标 标构体…分识 识的类…配符 符组型…内织定.存成 成形义员员式描名名;;
};2020/5/11
struct student { char name[20];
unsigned int nuloat score[3]; }; 3
} 2020/5/11 stu;
7
• 结构体变量的初始化
struct 结构体名
{ 类型标识符 成员名;
struc类t 型stu标de识nt符 成员名; { in…t n…u…m;……. }; char name[20]; strucctha结r 构sex体; 名 结构体变量={初始数据};
int age; strucctha结r a构dd体r[名30]; }{;stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”}; struc类t 型stu标de识nt符stu成1=员{11名2,;“Wang Lin”,‘M’,19, “200 Beijing Road”};
类型标识符 成员名;
……………. } 结构体变量={初始数据};
2020/5/11
8
• 结构体数组的定义和内存分配
形式一:
形式二:
struct student
struct student
{ int num;
{ int num;
char name[20];
char name[20];
char sex;
stu[1]
main()
age
{ struct student *p;
num
for(p=stu; p<stu+3; p++)
第11章结构体与共用体共39页PPT资料

13.05.2020
10
#include<stdio.h>
#include<string.h>
struct person
{char name[20];
int count;
}leader[3]={"Li",0,"Zhang",0,"Fun",0}; void main()
{int i,j;
char leader_name[20];
➢在定义时初始化(eg11.1)
struct student { int num; char name[20]; char sex;
a.num=89031; a.sex=‘M’; name如何赋初值?
char addr[20];
}aa=;{89031,"Li Lin",'M',"123 Beijing Road"};
‘M’ 59B
18
87.5
stu[0]
“123 Beijing”
10102
“zhang fun” ‘M’ 19 99
“123 shanghai”
stu[1]
3)结构体数组的应用举例 例 11.2 对候选人得票的统计程 序。有3个候选人,每次输入一个 得票的候选人的名字,要求最后输 出各人的得票结果。
结构体类型
char sex;
short int age;
13.05.2020
float score;
struct student stu;
char addr[30];
};
1
➢ 结构体类型的形式:
struct 结构体名
C++语言选择题40道:C++结构体与联合.Tex

C++结构体与联合试题1.结构体成员的访问哪个符号是正确的?o A. &o B. ->o C. .o D. ::答案: C解析: 结构体成员通过.操作符访问。
2.在C++中,结构体和类的主要区别是?o A. 结构体不能有方法o B. 类不能继承结构体o C. 结构体默认的访问属性是publico D. 类默认的访问属性是public答案: C解析: 结构体在C++中的默认访问属性是public,而类的默认访问属性是private。
3.联合体(union)成员的访问方式与结构体相同吗?o A. 不相同o B. 相同,但只在初始化时有效o C. 相同o D. 联合体不能访问成员答案: C解析: 联合体成员与结构体成员的访问方式相同,都是通过.或->操作符访问。
4.在C++中,联合体的成员变量共享什么?o A. 内存空间o B. 类别信息o C. 名称空间o D. 函数指针答案: A解析: 联合体的所有成员共享同一段内存空间。
5.结构体和联合体的成员初始化,以下说法正确的是?o A. 结构体成员不能初始化o B. 联合体成员只能在定义时初始化o C. 结构体和联合体成员都可以在定义时初始化o D. 结构体和联合体成员都不能在定义时初始化答案: C解析: 结构体和联合体成员都可以在定义时初始化。
6.以下哪种说法是关于结构体的?o A. 所有成员的总和决定了结构体的大小o B. 结构体成员不共享内存空间o C. 结构体成员的初始化顺序无关紧要o D. 结构体的大小等于最大成员的大小答案: A解析: 结构体的大小是其所有成员总和的大小。
7.以下代码union Data { int i; float f; } d;中,变量d.i和d.f共享多少字节?o A. 4字节o B. 8字节o C. 12字节o D. 16字节答案: A解析: union Data中的int和float类型数据在32位系统下都占用4字节,二者共享同一段内存。
结构体和联合体例题

第11章结构体与联合体例题例11-1.以下叙述中错误的是()。
2007.9A)用typedef可以增加新类型√B)typedef只是将已存在的类型用一个新的名字来代表C)用typedef可以为各种类型说明一个新名,但不能用来为变量说明一个新名D)用typedef为类型说明一个新名,通常可以增加程序的可读性例11-2 设有以下说明:typedef struct ST{lont a;int b;char c[2];}NEW;则下面叙述中正确的是()。
2005.4A) 以下说明形式非法B)ST是一个结构体类型C)NEW是一个结构体类型√D)NEW是一个结构体变量例11-3.有以下程序段:typedef struct node{int data;struct node *next;} *NODE;NOE p;以下叙述中正确的是()。
2007.4A)p是指向struct node结构变量的指针的指针B)NODE p;语句出错C) p是指向struct node结构变量的指针√D)p是struct node结构变量例11-4.设有说明:struct DATA{int year;int month;int day;};请写出一条定义语句,该语句定义d为上述结构体变量,并同时为其成员year、month、day依次赋值为2006、10、1:。
(2007.4)例11-5.以下程序运行后的输出结果是()(2005.9)#include<stdio.h>struct STU{int num;float TotalScore;};void f(struct STU p){struct STU s[2]={{20044,550},{20045,537}};p.num=s[1].num;p.TotalScore=s[1].TotalScore;}main(){struct STU s[2]={20041,703},{20042,580}};f(s[0]);printf("%d %3.0f\n",s[0].num,s[0].TotalScore);}程序运行后的输出结果是()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
B、将一组具有相同数据类型的数据作为一个整体,以便于其中的成员共享同一存储空间
C、将一组相关数据作为一个整体,以便程序中使用
D、将一组具有相同数据类型的数据作为一个整体,以便程序中使用
5、以下typedef的叙述不正确的是()。
A、用typedef可以定义各种类型名,但不能用来定义变量
复数的加法定义为:
(a+bi)+(c+di)=(a+c)+(b+d)i
复数的乘法定义为:
(a+bi)(c+di)=(ac-bd)+(bc+ad)i
请在程序的空白处填入一条语句或一个表达式。
#include <stdio.h>
struct mulp_number
{
float real,virtual;
}stud[5]={“李萍”,92,”王兵”,72,”钟虎”,83,”孙逊”,60,”徐军”,88};
(4)A、linkB、pC、p—>linkD、top—>link
(5)A、p—>linkB、top—>linkC、topD、link
18、阅读以下程序,请选择正确的编号填空。
#include <stdio.h>
typedef struct str1
{
char c[5];
char *s;
}st;
main()
sum.virtual=(2);
mul.real=(3)—(4);
mul.virtual=(5)+(6);
printf(“sum.real=%f,sum.virtual=%f\n”,
sum.real,sum.virtual);
printf(“mul.real=%f,mul.virtual=%f\n”,
A、该共用体中第一个成员所需存储空间
B、该共用中最后一个成员所需存储空间
C、该共用体中占用最大存储空间的成员所需存储空间
D、共用体中所有成员所需存储空间的总和
3、共用体类型在任何给定时刻,()。
A、所有成员一直驻留在结构中
B、只有一个成员驻留在结构中
C、部分成员驻留在结构中
D、没有成员驻留在结构中
4、使用共用体union的目的是()。
{
int no;
char name[10];
float score;
}
C、struct student
{
int no;
char name[10];
float score;
}stud[20];
D、struct
{
int no;
char name[10];
float score;
}stud[100];
12、正确的k值是()。
{
int x;
char * y;
}tab[2]={{1,”ab”},{2,”cd”}},*p=tab;
则:表达式*p—>y的结果是(1)。
表达式*(++p)—>y的结果是(2)。
3、有如下定义:
struct
{
int x;
int y;
}s[2]={{1,2},{3,4}},*p=s;
则:表达式++p—>x的结果是(1)。
}
A、12,34 B、34,12
C、12,00 D、34,00
16、以下程序的功能是读入一行字符,且每个字符存入一个结点,按输入顺序建立一个链表的结点序列,然后再按相反顺序输出并释放全部结点,请选择正确的编号填空。
#include <stdio.h>
#include <alloc.h>
#define getnode(type) ((type*)malloc(sizeof(type)))
{
staticsts1[2]={{“ABCD”,”EFGH”},
{“IJK”,”LMN”}};
static struct str2
{
st sr;
int d;
}s2={“OPQ”,”RST”,32767};
st *p[ ]={&s1[0],&s1[1]};
printf(“%c\n”,p[0]—>c[1]); /*输出(1)*/
B、birthday.year=1958
C、person.birthday.year=1958
D、person.year=1958
11、在如下结构体定义中,不正确的是()。
A、struct student
{
int no;
char name[10];
float score;
}
B、struct stud[20]
}
while (top!=NULL)
{
p=(5);
top=p—>link;
printf(“%c”,p—>info);
free(p);
}
}
(1)A、*pB、*linkC、*topD、link
(2)A、topB、pC、nodeD、struct node
(3)A、topB、top—>linkC、pD、p—>link
表达式(++p)—>x的结果是(2)。
4、以下程序的执行结果是。
struct stru
{
int x;
char c;
};
main()
{
struct stru a={10,’x’};
func(a);
printf(“%d,%c\n”,a.x,a.c);
}
func(struct stru b)
{
b.x=20;
b.c=’y’;
}
5、以下程序的执行结果是。
struct stru
{
int x;
char c;
};
main()
{
struct stru a={10,’x’},*p=&a;
func(p);
printf(“%d,%c\n”,a.x,a.c);
}
func(struct stru b)
{
b—>x=20;
b—>c=’y’;
8、若有以下说明和语句:
struct worker
{
int no;
char *name;
}work,*p=&work;
则以下引用方式不正确的是()。
A、work.noB、(*p).no
C、p—>noD、work—>no
9、以下程序执行后的正确结果是()。
struct tree
{
int x;
char *s;
mul.real,mul.virtual);
}
12、以下程序用于在结构体数组中查找分数最高和最低的同学姓名和成绩。请在程序中的空白处填入一条语句或一个表达式。
#include <stdio.h>
main()
{
int max,min,i,j;
static struct
{
char name[8];
int score;
printf(“%s\n”,(++p[0])—>s);/*输出(2)*/
printf(“%c\n”,s2.sr.c[2]); /*输出(3)*/
printf(“%d\n”,s2.d+1); /*输出(4)*/
}
(1)A、MB、JC、DD、B
(2)A、ABCDB、EFGHC、LMND、IJK
(3)A、QB、VC、YD、T
}
6、以下程序的执行结果是。
main()
{
union
{
int i[2];
long k;
char c[4];
}r,*p=&r;
p—>i[0]=0x39;
p—>i[1]=0x38;
printf(“%x,%x,%x\n”,p—>c[0],p—>c[1],
p—>c[2],p—>c[3]);
}
7、以下程序的执行结果是。
}a;
a.x=0x1234;
printf(“%x,%x\n”,a.b.c1,a.b.c2);
}
A、12,34 B、34,12
C、12,00 D、34,00
15、以下程序的执行结果是()。
minin()
{
union
{
char s[2];
int i;
}a;
a.i=0x1234;
printf(“%x,%x\n”,a.s[0],a.s[1]);
struct st a[ ]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]};
main()
{
p=a;
printf(“%d,”,p—>x);
printf(“%d,”,(++p)—>x);
printf(“%d,”,*(++p)—>y);
printf(“%d\n”,++(*(++p)—>y));
(4)A、-32768B、32768C、65535D、0
二、填空题:
1、以下程序的执行结果是。
typedef struct
{
long x[2];
int y[4];
char z[8];
}MYTYPE;
MYTYPEa;