试卷编号:825
所属语言:C语言
试卷方案:结构体与共用体
试卷总分:90分
共有题型:5种
一、填空共5题(共计10分)
第1题(2.0分)题号:205
结构体是不同数据类型的数据集合,作为数据类型,
必须先说明结构体【1】,再说明结构体变量.
答案:
=======(答案1)=======
类型
第2题(2.0分)题号:208
将函数funl 的入口地址赋给指针变量p的语句是【1】.
答案:
=======(答案1)=======
p=funl;
第3题(2.0分)题号:232
设有以下结构类型说明和变量定义,则变量a在内存所占字节数是【1】 . struct stud
{ char num[6];
int s[4];
double ave;
} a,*p;
答案:
=======(答案1)=======
第4题(2.0分)题号:345
若在程序中用到"strlen()"函数时,应在程序开头写上包含命令# include "【1】". 答案:
=======(答案1)=======
string.h
第5题(2.0分)题号:803
预处理命令行都必须以【1】号开始.
答案:
=======(答案1)=======
#
二、单项选择共20题(共计40分)
第1题(2.0分)题号:464
以下描述中,正确的是()。
A:预处理是指完成宏替换和文件包含中指定的文件的调用
B:预处理指令只能位于C源文件的开始
C:C源程序中凡是行首以#标识的控制行都是预处理指令
D:预处理就是完成C编译程序对C源程序第一遍扫描,为编译词法和语法分析作准备答案:C
第2题(2.0分)题号:472
下列程序运行结果为:
#define P 3
#define S(a) P*a*a
main()
{int ar;
ar=S(3+5);
printf("\n%d",ar);
}
A:192
B:29
D:25
答案:B
第3题(2.0分)题号:488
当定义一个结构体变量时,系统分配给它的内存是()。
A:各成员所需内存量的总和
B:结构中第一个成员所需内存量
C:结构中最后一个成员所需内存量
D:成员中占内存量最大者所需的容量
答案:A
第4题(2.0分)题号:489
设有如下定义: struct sk {int a; float b;} data,*p; 若要使p指向data中的a域,正确的赋值语句是()。
A:p=(struct sk*)&data.a;
B:p=(struct sk*) data.a;
C:p=&data.a;
D:*p=data.a;
答案:A
第5题(2.0分)题号:490
以下对枚举类型名的定义中正确的是()。
A:enum a={sum,mon,tue};
B:enum a {sum=9,mon=-1,tue};
C:enum a={"sum","mon","tue"};
D:enum a {"sum","mon","tue"};
答案:B
第6题(2.0分)题号:491
在下列程序段中,枚举变量c1,c2的值依次是()。
enum color {red,yellow,blue=4,green,white} c1,c2;
c1=yellow;c2=white;
printf("%d,%d\n",c1,c2);
A:1,6
B:2,5
D:2,6
答案:A
第7题(2.0分)题号:545
C程序中的宏展开是在()。
A:编译时进行的
B:程序执行时进行的
C:编译前预处理时进行的
D:编辑时进行的
答案:C
第8题(2.0分)题号:546
C语言中,定义结构体的保留字是()。
A:union
B:struct
C:enum
D:typedef
答案:B
第9题(2.0分)题号:547
结构体类型的定义允许嵌套是指()。
A:成员是已经或正在定义的结构体型
B:成员可以重名
C:结构体型可以派生
D:定义多个结构体型
答案:A
第10题(2.0分)题号:548
对结构体类型的变量的成员的访问,无论数据类型如何都可使用的运算符是()。
A:.
B:->
C:*
D:&
答案:A
第11题(2.0分)题号:549
相同结构体类型的变量之间,可以()。A:相加
B:赋值
C:比较大小
D:地址相同
答案:B
第12题(2.0分)题号:550
使用共用体变量,不可以()。
A:节省存储空间
B:简化程序设计
C:进行动态管理
D:同时访问所有成员
答案:D
第13题(2.0分)题号:551
enum a {sum=9,mon=-1,tue};
定义了()。
A:枚举变量
B:3个标识符
C:枚举数据类型
D:整数9和-1
答案:C
第14题(2.0分)题号:552
在定义构造数据类型时,不能()。
A:说明变量
B:说明存储类型
C:初始化
D:末尾不写分号
答案:D
第15题(2.0分)题号:557
若有int *p=(int *)malloc(sizeof(int));则向内存申请到内存
空间存入整数123的语句为()。
A:scanf("%d",p);
B:scanf("%d",&p);
C:scanf("%d",*p);
D:scanf("%d",**p);
答案:A
第16题(2.0分)题号:558
若有int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则输出结果不为5的语句为()。A:printf("%d",*(a+5));
B:printf("%d",p[5]);
C:printf("%d",*(p+5));
D:printf("%d",*p[5]);
答案:D
第17题(2.0分)题号:562
int (*p)[6]; 它的含义为()。
A:具有6个元素的一维数组
B:定义了一个指向具有6个元素的一维数组的指针变量
C:指向整型指针变量
D:指向6个整数中的一个的地址
答案:B
第18题(2.0分)题号:563
char *match(char c)是()。
A:函数定义的头部
B:函数预说明
C:函数调用
D:指针变量说明
答案:A
第19题(2.0分)题号:571
static struct {int a1;float a2;char a3;}a[10]={1,3.5,'A'};
说明数组a是地址常量,它有10个结构体型的下标变量,采用静态存
储方式,其中被初始化的下标变量是()。
A:a[1]
B:a[-1]
C:a[0]
D:a[10]
答案:C
第20题(2.0分)题号:701
以下叙述中不正确的是()。
A:预处理命令行都必须以#号开始
B:在程序中凡是以#号开始的语句行都是预处理命令行
C:C程序在执行过程中对预处理命令行进行处理
D:以下是正确的宏定义 #define IBM_PC
答案:C
三、程序填空共1题(共计10分)
第1题(10.0分)题号:73
/*-------------------------------------------------------
【程序填空】
---------------------------------------------------------
功能:用结构体调用的方法编程。要求输入A,B,C,D,E,F五个元素的数值,并按从大到小的顺序输出。
-------------------------------------------------------*/
#include
#define N sizeof tbl/sizeof tbl[0] /*取得数组有多少个元素*/
int A,B,C,D,E,F;
struct ele
{
char vn;
/***********SPACE***********/
int 【?】;
}tbl[]={{'A',&A},{'B',&B},{'C',&C},{'D',&D},{'E',&E},{'F',&F}},t;
main()
{
int k,j,m;
/***********SPACE***********/
for(k=0;k<【?】;k++)
{
printf("Enter data for %c\n",tbl[k].vn); scanf("%d",tbl[k].vp);
}
m=N-1;
while(m>0)
{
for(k=j=0;j /***********SPACE***********/ if(*tbl[j].vp<【?】) { t=tbl[j]; tbl[j]=tbl[j+1]; tbl[j+1]=t; k=j; } /***********SPACE***********/ 【?】; } for(k=0;k printf("%c(%d)",tbl[k].vn,*tbl[k].vp); printf("\n"); } 答案: =======(答案1)======= *vp =======(答案2)======= N =======(答案3)======= *tbl[j+1].vp =========或========= *tbl[ j + 1 ].vp =======(答案4)======= m=k 四、程序改错共2题(共计20分) 第1题(10.0分)题号:139 /*------------------------------------------------------ 【程序改错】 -------------------------------------------------------- 功能:下题是一段有关结构体变量传递的程序. ------------------------------------------------------*/ #include struct student { int x; char c; } a; f(struct student b) { b.x=20; /**********FOUND**********/ b.c=y; printf("%d,%c",b.x,b.c); } main() { a.x=3; /**********FOUND**********/ a.c='a' f(a); /**********FOUND**********/ printf("%d,%c",a.x,b.c); } 答案: =======(答案1)======= b.c='y'; =======(答案2)======= a.c='a'; =======(答案3)======= printf("%d,%c",a.x,a.c); 第2题(10.0分)题号:217 /*------------------------------------------------------ 【程序改错】 -------------------------------------------------------- 功能:用指针作函数参数,编程序求一维数组中的最大和最小的元素值. ------------------------------------------------------*/ #include #define N 10 /***********FOUND***********/ void maxmin(int arr[ ],int *pt1, *pt2, n) { int i; /***********FOUND***********/ *pt1=*pt2=&arr[0]; for(i=1;i { /***********FOUND***********/ if(arr[i]<*pt1) *pt1=arr[i]; if(arr[i]<*pt2) *pt2=arr[i]; } } main( ) { int array[N]={10,7,19,29,4,0,7,35,-16,21},*p1,*p2,a,b; /***********FOUND***********/ *p1=&a;*p2=&b; maxmin(array,p1,p2,N); printf("max=%d,min=%d",a,b); } 答案: =======(答案1)======= void maxmin(int arr[ ],int *pt1,int *pt2,int n) =========或========= maxmin(int arr[ ],int *pt1,int *pt2,int n) =========或========= void maxmin(int *arr,int *pt1,int *pt2,int n) =======(答案2)======= *pt1=*pt2=arr[0]; =========或========= *pt1=*pt2=*(arr+0); =========或========= *pt2=*pt1=arr[0]; =======(答案3)======= if(arr[i]>*pt1) *pt1=arr[i]; =========或========= if(*(arr+i)>*pt1) *pt1=arr[i]; =========或========= if(*pt1<*(arr+i)) *pt1=arr[i]; =========或========= if(*pt1 =======(答案4)======= p1=&a;p2=&b; 五、程序设计共1题(共计10分) 第1题(10.0分)题号:226 /*------------------------------------------------ 【程序设计】 -------------------------------------------------- 功能:编写函数实现两个数据的交换,在主函数中输入任意三个数据,调用函数对这三个数据从大到小排序。 ------------------------------------------------*/ #include void wwjt(); void swap(int *a,int *b) { /**********Program**********/ /********** End **********/ } main() { int x,y,z; scanf("%d%d%d",&x,&y,&z); if(x if(x if(y printf("%3d%3d%3d",x,y,z); wwjt(); } void wwjt() { FILE *IN,*OUT; int m,n; int i[2]; IN=fopen("in.dat","r"); if(IN==NULL) { printf("Read FILE Error"); } OUT=fopen("out.dat","w"); if(OUT==NULL) { printf("Write FILE Error"); } for(n=0;n<3;n++) { for(m=0;m<2;m++) { fscanf(IN,"%d",&i[m]); } swap(&i[0],&i[1]); fprintf(OUT,"%d\n",i[0]); fprintf(OUT,"%d\n",i[1]); } fclose(IN); fclose(OUT); } 答案:---------------------- int k; k=*a; *a=*b; *b=k; ---------------------- 试卷编号:825 所属语言:C语言 试卷方案:结构体与共用体 试卷总分:90分 共有题型:5种 ━━━━━━━━━━━━━━ 一、填空共5题(共计10分) ━━━━━━━━━━━━━━ 第1题(2.0分)题号:205 结构体是不同数据类型的数据集合,作为数据类型, 必须先说明结构体【1】,再说明结构体变量. 答案: =======(答案1)======= 类型 第2题(2.0分)题号:208 将函数funl 的入口地址赋给指针变量p的语句是【1】. 答案: =======(答案1)======= p=funl; 第3题(2.0分)题号:232 设有以下结构类型说明和变量定义,且sizeof(int)=2,则变量a在内存所占字节数是【1】. struct stud { char num[6]; int s[4]; double ave; } a,*p; 答案: =======(答案1)======= 22 第4题(2.0分)题号:345 若在程序中用到"strlen()"函数时,应在程序开头写上包含命令# include "【1】". 答案: =======(答案1)======= string.h 第5题(2.0分)题号:803 预处理命令行都必须以【1】号开始. 答案: =======(答案1)======= # ━━━━━━━━━━━━━━━━━ 二、单项选择共20题(共计40分) ━━━━━━━━━━━━━━━━━ 第1题(2.0分)题号:464 以下描述中,正确的是()。 A:预处理是指完成宏替换和文件包含中指定的文件的调用 B:预处理指令只能位于C源文件的开始 C:C源程序中凡是行首以#标识的控制行都是预处理指令 D:预处理就是完成C编译程序对C源程序第一遍扫描,为编译词法和语法分析作准备答案:C 第2题(2.0分)题号:472 下列程序运行结果为: #define P 3 #define S(a) P*a*a main() {int ar; ar=S(3+5); printf("\n%d",ar); } A:192 B:29 C:27 第十一章结构体与共用体 结构体变量引用规则: (1)不能将一个结构体变量作为一个整体进行输入和输出;只能对结构体变量中的各个成员分别进行输入和输出。“.”是成员(分量)运算符,它在所有的运算符中优先级最高。 (2)若成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。 (3)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。 (4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。 —>是指向运算符,优先级为第一级。 结构体变量所占的内存长度是各成员所占内存长度之和。每个成员分别占有其自己的内存单元。 共用体变量所占的内存长度等于最长的成员的长度。 只先有定义了共用体变量才能引用它,而且不能引用共用体变量,而只能引用共用体变量中的成员。 将一个变量定义为结构体类型:不仅要求指定变量为结构体类型,而且要求指定为某一特定结构体类型。 类型与变量的区别: 定义时先定义结构体类型,然后定义变量。类型不分配空间,变量分配空间。 可以采取以下3种方法定义结构体类型变量: (1)先声明结构体类型再定义变量名 例如:struct student student1, student2; | | | 结构体类型名结构体变量名 (2)在声明类型的同时定义变量;这种形式的定义的一般形式为: struct 结构体名 { 成员表列 }变量名表列; (3) 直接定义结构体类型变量 其一般形式为: struct { 成员表列 }变量名表列; 即不出现结构体名。 引用结构体变量中成员的方式为 结构体变量名.成员名 结构体与共用体小结 一,结构体得概念与定义 1,结构体得定义 struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }; 这里数据类型可以就是复合类型,例如又就是一个结构体类型,即嵌套; 2,结构体变量得定义 struct 结构体名变量名1,变量名2,,,变量名n; 或: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }结构体变量1,结构体变量2; 或: struct { 数据类型成员名1; 数据类型成员名1; 、、、 }结构体变量1,结构体变量2; 三种方式,第三种方式得话,每次要定义这个类型得结构体变量都要重复得写这一段代码; 其实定义了结构体后,struct 结构体名就就是一种新得类型,上述语句就像声明变量一样; 3,结构体变量得引用 只能对结构体变量中得各个成员分别输出,不能对一个结构体变量作为一个整体输出; 嵌套得结构体类型得引用: 结构体变量名、结构体类型成员名、内嵌结构体得成员名; 4,结构体变量得初始化 struct 结构体名变量名= {初始化数据}; 或者在定义得时候就初始化: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }变量名= {初始化数据}; 二,结构体数组 1,结构体数组得定义举例struct stu { int stu_nu; char name[20]; float score; }; struct stu student[5]; 或者: struct stu { int stu_nu; char name[20]; float score; }student[5]; 或者: struct { int stu_nu; char name[20]; float score; }student[5]; 跟定义结构体变量得三种形式就是一样得,只不过这里每次定义得结构体变量就是一个数组;每一个student[i]都就是struct stu类型得; 2,结构体数组得初始化与引用 略; 三,结构体与指针 1,指向结构体得指针得定义,同上,也就是三种形式; struct employees employee1,*p1; 或者: struct employees 习题六 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 w.day=25w.month=10; w.year=1993; C w.birth.day=25; w.birth.month=10; w.birth.year=1993; D birth.day=25; birth.month=10; birth.year=1993; (6)设有如下定义: 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 2.填空 (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成员的另外两种引用形式是x->b-> 和p.b. 。 struct st { int a; struct st *b; }*p, x; 一、填空题 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.在说明一个结构体变量时系统分配给它的存储空间是。(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->no 3.有如下定义: struct date { int year, month, day; }; struct worklist { char name[20]; char sex; struct date birthday; }person; 对结构体变量person的出生年份进行赋值时,下面正确的赋值语句是。 (1级) A) year=1958 B) birthday.year=1958 C) person.birthday.year=1958 D) person.year=1958 4.以下对结构体类型变量的定义中不正确的是。(1级) A)#define STUDENT struct student B) struct student STUDENT { int num; { int num; float age; float age; }std1; }std1; C) struct D) struct { int num; { int num; float age; float age; } student; }std1; struct student std1; 5.设有以下说明语句 struct stu { int a; float b; }stutype; 则下面的叙述不正确的是。(1级) A)struct是结构体类型的关键字 B)struct stu是用户定义的结构体类型 C)stutype是用户定义的结构体类型名 D)a和b都是结构体成员名 6.C语言结构体类型变量在程序执行期间。(0级) A)所有成员一直驻留在内存中 B)只有一个成员主留在内存中 C)部分成员驻留在内存中 第^一章结构体与共用体教学内容 (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 2013年结构体与联合体习题 选择题 1、若程序中有以下的说明和定义: struct abc { int x;char y; } 花括号后少了分号。 struct abc s1,s2; 则会发生的情况是______。 A) 编译时错B) 程序将顺序编译、连接、执行 C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连 接出错 2、有以下程序段 struct st { int x; int *y;}*pt; int a[]={1,2};b[]={3,4}; struct st c[2]={10,a,20,b}; pt=c; 以下选项中表达式的值为11的是 A) *pt->y B) pt->x C) ++pt->x D) (pt++)->x 3、有以下说明和定义语句 struct student { int age; char num[8];}; struct student stu[3]={{20,"200401"},{21,"200402"},{19,"200403"}}; struct student *p=stu; 以下选项中引用结构体变量成员的表达式错误的是______。 A) (p++)->num B) p->num C) (*p).num D) stu[3].age 4、设有如下枚举类型定义 enum language {Basic=3,Assembly=6,Ada=100,COBOL,Fortran}; 枚举量Fortran的值为______。 A) 4 B) 7 C) 102 D) 103 5、以下叙述中错误的是_________。 A)可以通过typedef增加新的类型 B)可以用typedef将已存在的类型用一个新的名字来代表 C)用typedef定义新的类型名后,原有类型名仍有效 D)用typedef可以为各种类型起别名,但不能为变量起别名 6、有以下程序段 typedef struct NODE 结构体与共用体小结 一,结构体的概念和定义 1,结构体的定义 struct 结构体名 { 数据类型成员名1; 数据类型成员名1; ... }; 这里数据类型可以是复合类型,例如又是一个结构体类型,即嵌套; 2,结构体变量的定义 struct 结构体名变量名1,变量名2,,,变量名n; 或: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; ... }结构体变量1,结构体变量2; 或: struct { 数据类型成员名1; 数据类型成员名1; ... }结构体变量1,结构体变量2; 三种方式,第三种方式的话,每次要定义这个类型的结构体变量都要重复的写这一段代码; 其实定义了结构体后,struct 结构体名就是一种新的类型,上述语句就像声明变量一样; 3,结构体变量的引用 只能对结构体变量中的各个成员分别输出,不能对一个结构体变量作为一个整体输出; 嵌套的结构体类型的引用: 结构体变量名.结构体类型成员名.嵌结构体的成员名; 4,结构体变量的初始化 struct 结构体名变量名= {初始化数据}; 或者在定义的时候就初始化:struct 结构体名 { 数据类型成员名1; 数据类型成员名1; ... }变量名= {初始化数据}; 二,结构体数组 1,结构体数组的定义举例struct stu { int stu_nu; char name[20]; float score; }; struct stu student[5]; 或者: struct stu { int stu_nu; char name[20]; float score; }student[5]; 或者: struct { int stu_nu; char name[20]; float score; }student[5]; 跟定义结构体变量的三种形式是一样的,只不过这里每次定义的结构体变量是一个数组;每一个student[i]都是struct stu类型的; 2,结构体数组的初始化和引用 略; 三,结构体与指针 1,指向结构体的指针的定义,同上,也是三种形式; struct employees employee1,*p1; 或者: struct employees https://www.sodocs.net/doc/576019918.html,/2005/03/25/12365.html 所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为: union 共用体名 {成员表列}; 7.5.1 共用体的定义 union data { int a ; float b ; d o u b l e c ; c h a r d ; } obj; 该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量o b j。共用体 数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。 [例7 - 8 ] union data /*共用体* / { int a; float b; double c; char d; } m m ; struct stud /*结构体* / { int a; float b; double c; char d; } ; m a i n ( ) { struct stud student printf("%d,%d",sizeof(struct stud),sizeof(union data)); } 程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的 共用体类型实际占用存储空间为其最长的成员所占的存储空间。详细说明如图7 - 6所示。 对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存 空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。 7.5.2 共用体变量的引用 可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为: union data /*共用体* / { int a; float b; double c; char d; } m m ; 其成员引用为:m m . a , m m . b , m m . c , m m . d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。 [例7-9] 对共用体变量的使用。 m a i n ( ) { union data { int a; float b; double c; char d; } m m ; m m . a = 6 ; printf("%d\n",mm.a); m m . c = 6 7 . 2 ; p r i n t f ( " % 5 . 1 l f \ n " , m m . c ) ; m m . d = ' W ' ; m m . b = 3 4 . 2 ; p r i n t f ( " % 5 . 1 f , % c \ n " , m m . b , m m . d ) ; } 实验九参考程序 实验 9- 1 /**************************************************************** * 实验 9.1 * * ( 1 )为某商店的商品设计合适的结构体 (PRODUCT) 。每一种商品包含编号 (number) 、 * 名称 (name) 、价格 (price) 、折扣 (discount)4 项信息,根据表 9-1 ,为这些信 息选择合适的数据类型。 * (2)建立 2个函数,以实现对商品的操作。 input 函数实现商品的输入; * display 函数显示商品信息。要求这 2个函数都以商品的结构体 (PRODUCT) 指针为 参数。 * (3 )在主函数中为商品键盘定义一个结构体变量 (keyboard) ,利用 input 函数实现键 盘信息的输入; * 定义一个结构体数组 (elec_device[3]) ,利用 input 函数实现冰箱、 空调、电视 信息的输入; * 最后利用 display 函数显示 4 种商品的信息。 * * 表 9-1 #include 结构体与共用体 一、选择题: 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) () 最终排名 Time Limit: 1000MS Memory limit: 65536K 题目描述 第四届山东理工大学ACM网络编程擂台赛比赛完后需要产生一个最终排名,排名按照题数多少来决定。但是有太多的队伍参与,手动计算排名已经不能满足比赛的需求。现在有一份名单记录各个队伍的ID和做出的题目数,需要你写一个程序,产生最终的排名。 为了简化题目,这里的排名规则为:做出题目数量多的队伍排在前面,如果题数相等,保持输入时的相对顺序不要改变。 输入 第一行包含一个正整数T( 1≤T≤15),表示有T组测试数据。每组数据第一行有一个正整数N(1< N≤10000),表示队伍数量。接下来N 行包含两个整数,1≤ID≤10^7, 0≤M≤100。ID为队伍的编号,M为做出的题数。 输出 每组数据输出包含N行,第i行有两个整数,ID和M表示排在第i位的队伍的ID和做出的题数。 示例输入 1 8 1 2 16 3 11 2 20 3 3 5 26 4 7 1 22 4 示例输出 3 5 26 4 22 4 16 3 20 3 1 2 11 2 7 1 #include 第十章结构体与共用体 、选择题 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.下面程序的运行结果是___________. 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 实验10 结构体与公用体 1.实验目的、要求 (1)掌握结构体类型变量的定义和使用。 (2)掌握结构体类型数组的概念和使用。 (3)掌握公用体的概念与使用。 2.实验内容 (1)输入程序并运行,观察运行结果 #include “stdio.h” int 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 ); return(0); } 运行此程序:按F2保存源程序,按F9完成一次编译连接,无提示错误,按任意键返回源程序行,按ctrl+F9运行,按alt+F5看结果,结果显示:6 (2)输入程序并运行,观察运行结果 union ks { int a; int b; }; union ks s[4]; union ks *p; #include “stdio.h” int main( ) { int n=1, i; printf(“\n”); for(i=0;i<4;i++) { s[i].a=n; s[i].b=s[i].a+1; n=n+2; } p=&s[0]; printf(“%d,”,p->a); printf(“%d” ,++ p->a); return(0); } 运行此程序:按F2保存源程序,按F9完成一次编译连接,无提示错误,按ctrl+F9运行,按任意键返回源程序行,按alt+F5看结果,结果显示:23 (3)编写程序 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生数据,要求打印出3门课总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩、平均分数)。要求用input 函数输入10个学生数据;用average函数求总平均分;用 一,结构体的概念和定义 1,结构体的定义 struct 结构体名 { 数据类型成员名1; 数据类型成员名1; ... }; 这里数据类型可以是复合类型,例如又是一个结构体类型,即嵌套; 2,结构体变量的定义 struct 结构体名变量名1,变量名2,,,变量名n; 或: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; ... . . }结构体变量1,结构体变量2; 或: struct { 数据类型成员名1; 数据类型成员名1; ... }结构体变量1,结构体变量2; 三种方式,第三种方式的话,每次要定义这个类型的结构体变量都要重复的写这 一段代码; 其实定义了结构体后,struct 结构体名就是一种新的类型,上述语句就像声明 变量一样; 3,结构体变量的引用 只能对结构体变量中的各个成员分别输出,不能对一个结构体变量作为一个整体 输出; 嵌套的结构体类型的引用: 结构体变量名.结构体类型成员名.嵌结构体的成员名; . . 4,结构体变量的初始化 struct 结构体名变量名= {初始化数据}; 或者在定义的时候就初始化: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; ... }变量名= {初始化数据}; 二,结构体数组 1,结构体数组的定义举例 struct stu { int stu_nu; char name[20]; float score; }; . . struct stu student[5]; 或者: struct stu { int stu_nu; char name[20]; float score; }student[5]; 或者: struct { int stu_nu; char name[20]; float score; }student[5]; 跟定义结构体变量的三种形式是一样的,只不过这里每次定义的结构体变量是一 个数组;每一个student[i]都是struct stu类型的; 2,结构体数组的初始化和引用 . . 第9章结构体与共用体 9.1典型考试题剖析 9.1.1选择题 【例1】若指针p已经正确定义,要使p指向两个连续的整型动态存储单元,不正确的语句是。 A) p=2*(int *)malloc(sizeof(int)); B) p=(int *)malloc(2*sizeof(int)); C) p=(int *)malloc(2*2); D) p=(int *)calloc(2,sizeof(int)); ?考点:动态存储分配函数。 ?分析:根据动态存储分配函数malloc和calloc的函数原型可以知道, calloc函数的调用形式为:void * calloc(unsigned n,unsigned size); 表示在动态存储区中分配n个长度为size的连续空间,函数返回一个指 向分配域起始地址的指针,因此答案D是正确的。malloc函数的调用形 式为:void * malloc(unsigned int size);表示是在内存的动态存储区 分配一个长度为size的连续空间,并返回一个指向分配域起始地址的指 针,答案B和C中malloc的参数分别为:2*(sizeof(int))和2*2, 都是整型数,因此调用形式正确。答案A中(int *)malloc(sizeof(int)) 的返回值为一个地址值,将地址的值乘以2是没有意义的。 ?答案:A 【例2】若有以下说明和定义: struct test { int m1; char m2; float m3; union uu { char u1[5]; int u2[2]; }ua; }myaa; 则sizeof(struct test)的值是。 A) 12 B) 16 C) 14 D) 9 ?考点:结构体类型和共用体类型所占内存的字节数。 ?分析:sizeof(struct test)的功能是求结构体类型test所占用的内 存字节数。它应该等于结构体每个成员所占的字节数之和。m1为int型,占2字节,m2为char型,占1字节,m3为float型,占4字节,接下 来是一个共用体类型uu,共用体所占的字节数应该等于成员中最长者所 占的字节数,u1占5字节,u2占4字节,那么该共用体类型应该占用5 字节,所以2+1+4+5=12。 ?答案:A 第十一章结构体与共用体 ●教学内容 (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;结构体与共用体
第11章 结构体与共用体
结构体与共用体小结
结构体和共用体习题
练习题-第十章 结构体与共用体(有答案)
结构体与共用体
第十一章结构体与共用体
结构体与联合体习题含答案
结构体与共用体小结
c语言结构体与共用体之间的区别
C语言结构体和共用体实验报告
十一章 结构体与共用体
结构体、共用体、枚举
电子技术第十章结构体与共用体
C程第十一章结构体上机习题
C程序实验报告十 结构体与共用体
结构体与共用体小结
C语言各章节单元测试题及答案——结构体与共用体
第十一章 结构体与共用体
第6章-结构体与共用体