《C语言程序设计》第八章 结构体、共同体和枚举

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

8.5 实验 结构体、共用体和枚举
z 实验目的与要求
1、 掌握结构体类型变量的定义和使用; 2、 掌握结构体类型数组的概念和使用; 3、 掌握共用体的概念和使用; 4、 掌握枚举类型的概念。
z 实验内容和步骤
(1)输入并运行以下程序
main( ) {union {char i[2];
int k; }m; m.i[ 0 ]=3; m.i[ 1 ]=0; printf ( “%d\n”,m.k );
选项 D,表达式类似于(*x)+ +,其值为 x 指向单元的 值。计算后使该值增 1,但 x(即 p-> b)并未增值。
答案:D。
108
第八章
结构体、共同体和枚举
8.4 习题
8.1 设有以下说明语句
struct stu { int a;
float b; } stutype; 则下面的叙述不正确的是( )。
} math; scanf(“%d,%d”,&math.mid,&math.end); math.average=( math.mid + math.end )/2;
printf(“average=%d\n”,math.average);
}
8.14
struct stu { int num;
int mid; int end; int ave; } s[ 3 ]; main() { int i; struct stu *p; for(p=s;p<s+3;p+ +) { scanf(“%d,%d,%d”,&(p->num),&(p->mid),&(p->end)); p->ave=( p->mid + p->end )/2;
8.6 设有以下语句:
struct st { int n;
struct st *next; }; static struct st a[ 3 ]={ 5,&a[ 1 ],7,&a[ 2 ],9,’\0’ },*p; p=&a[ 0 ]; 则以下表达式的值为 6 的是()。 A. p+ +->n B. p->n+ + C. ( *p ).n+ + D. + +p->n
第八章
结构体、共同体和枚举
第八章 结构体、共同体和枚举
8.1 基本要求
z 熟练掌握结构体类型的概念和定义方法以及结构体变量的定义和引用. z 掌握结构体类型数组的概念。 z 掌握指向结构体类型的指针概念和应用. z 熟练掌握运算符“.”和“->”的应用。 z 了解共用体的概念和应用。 z 了解用 typedef 定义新的类型名。
z 实验分析与讨论 z 根据实验过程书写实验报告上交老师检查
8.6 习题参考答案
8.1.C
8.2. D
8.7. C
8.8. B
8.13.
8.3. D 8.9. A
main()
8.4. D 8.10.B
8.5. D 8.11.C
8.6. D 8.12.B
{ struct study
{ int mid; int end; int average;
}a ;
Hale Waihona Puke Baidu
main() { a.ch[ 0 ]=13;
a.ch[ 1 ]=0;
printf (“%d\n”,a.i );
}
A. 13
B. 14
C. 208
D. 209
8.10 下面对 typedef 的叙述中不正确的是( )。 A.用 typedef 可以定义各种类型名但不能用来定义变量 B.用 typedef 可以增加新类型 C.用 typedef 只是将已存在的类型用一个新的标识符来代表 D.使用 typedef 有利于程序的通用和移植
} 程序中定义 stud 为 struct student 类型的数组,p 为指向 struct student 类型数据的指针变量,第一个 for 循环输入 10 个 学生的数据,在第二个 for 循环中,先使变量 max 的值等于 stud[ 0 ].score(即第一个学生的成绩),然后用 max 与其余 9 个学生的成绩相比,若后者大于 max,则将大者放入 max,并 记下此时的 i 值(由变量 temp 保存)。接着使 p=stud + temp, 即将 p 定位于成绩最高者的那个数组元素处。最后输出 p 所指 的元素中各个成员的值。 z 例题 8-2 对于下述说明,表达式( )不能使变量 p->b 的值加 1。
{ max=stud[ i ].score;temp= i;} p=stud + temp; printf ( “\n The maximum score:\n” ); printf ( “No:%d \nname:%s\nscore:%4.1f\n”,p->num,p->name,
p->score );
} 然后将上述语句改为: m.k=266; printf(“%d,%d\n”,m.i[ 0 ],m.i[ 1 ]);
112
第八章
结构体、共同体和枚举
运行并分析结果。 (2)试利用结构体类型编制一程序,实现输入一个学生 的数学期中和期末成绩,然后计算并输出其平均成绩。 (3)试利用指向结构体的指针编制一程序,实现输入三 个学生的学号,数学期中和期末成绩,然后计算其平均成绩并 输出成绩表。 (4)试定义枚举类型 months,用枚举常量代表一年的十二个月份。
8.4 下面程序的运行结果是( )。 main( ) { struct cmplx {int x; } cnum[ 2 ]={ 1,3,2,7 }; printf(“%d\n”,cnum[ 0 ].y/cnum[ 0 ].x*cnum[ 1 ].x);
109
第八章
结构体、共同体和枚举
}
A. 0
B. 1
8.7
以下对 C 语言中共用体类型数据的叙述正确的是( )。
A. 可以对共用体变量名直接赋值
B. 一个共用体变量中可以同时存放其所有成员
C. 一个共用体变量中不能同时存放其所有成员
D. 共用体类型定义中不能出现结构体类型的成员
8.8
下面程序的运行结果是( )。
#include “stdio.h”
main( )
A. struct 是结构体类型的关键字
B. struct stu 是用户定义的结构体类型 C. stutype 是用户定义的结构体类型名 D. a 和 b 都是结构体成员名
8.2 若有以下定义:
struct data { int i;
char ch ;
double f ; } b; 则结构体变量占用的内存字节数是( )。
C. 0
D.不确定
8.13 试利用结构体类型编制一程序,实现输入一个学生的数学期中和期 末成绩,然后计算并输出其平均成绩。
8.14 试利用指向结构体的指针编制一程序,实现输入三个学生的学号, 数学期中和期末成绩,然后计算其平均成绩并输出成绩表。
8.15 试定义枚举类型 months,用枚举常量代表一年的十二个月份。
选项 A,表达式的含义是使 p->b 的值加 1。
选项 B,表达式(p++)->b 的值为 p->b,第一个+ + 运算使 p->b 增加 1,整个表达式的值是增 1 后的 p->b 所指 单元的值。在该表达式计算后,p 增 1。
选项 C,解此表达式要用到运算符的结合性。计算时表 达式等同于*(p->b),计算后,根据(+ +)运算符的右结合 性,先使 p->b 增 1,再取其所指单元的值。
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 ]);
8.3 典型例题
z 例题 8-1 有 10 个学生,每个学生包括学号,姓名,成绩, 要求找出成绩最高者的姓名和成绩。程序如下:
main ( )
{ struct student {int num; char name[15]; float score;; };
struct student stud[10],*p; int i,temp=0; float max; for( i=0;i<10;i+ +)
struct st
{int a;
int *b;
}*p;
A. + +p->b
B. *+ +( ( p+ +)->b )
C *p->b+ +
D ( * ( p+ +)->b )++
解:本题应注意运算符的优先级和结合性。C 语言中,(.) 和(->)是最高级别的运算符,而(*)和(+ +)的结合性 是自右至左。
{ union { long a; int b; char c;
} m;
110
第八章
结构体、共同体和枚举
printf(“%d\n”,sizeof(m));
}
A. 2
B. 4
C. 6
D. 8
8.9
下面程序的运行结果是( )。
#include“stdio.h”
union pw { int i;
char ch[ 2 ];
对后一种举例如下: struct student {┇
}; struct student stud,arr[3],*p; 结构体变量的引用有三种形式:
106
第八章
结构体、共同体和枚举
1. 结构体变量名.成员名 2. (*指针变量名).成员名 3. 指针变量名->成员名 其中圆点(.)称为成员运算符,箭头(->)称为结构 指向运算符,C 语言中,圆点运算符和箭头运算符都是优先 级最高的运算符。 结构体变量的输入和输出,它必须按成员项逐个地输入 或输出,不能将结构体变量作整体地输入或输出。 共用体类型,是指将不同的成员项存放于同一段内存单 元,共用体的大小与其组成成员中字节数最大的那个成员相 同。共用体变量的定义与引用类似于结构体变量的定义与引 用。枚举类型指明这种类型的变量取值只能是指定的若干个 枚举常量之一。每个枚举常量代表一个具体的值。 用 typedef 可定义新的类型名来代替已有的类型名。其方法如下: 1. 先按定义变量的方法写出定义体; 2. 将变量名换成新类型名; 3. 在最前面加上 typedef; 4. 用新类型名去定义变量。
C. 3
D. 6
8.5 以下 scanf 函数调用语句中对结构体变量成员的不正确引用是( )。
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);
A. 1
B. 2
C. 8
D. 11
8.3 根据以下定义,能打印出字母 M 的语句是( )。 st ruct person { char name[9 ]; int age; };
struct person class[ 10 ]={“John”,17,“Paul”,“Mary”,18, “Adam”,16};
8.2 内容小结
一种结构体类型可由若干个成员组成,这些成员的类型可 以相同也可以不同,但相互之间有某种关系。结构体类型有千 千万万种。
结构体类型说明的一般形式为: struct 结构体标识名 {类型名 1 结构体成员名表 1;
┇ 类型名 n 结构体成员名表 n; }; 对结构体类型的变量,数组和指针变量的定义有三种方式: 1. 紧跟在结构体类型说明之后进行定义。 2. 在说明一个无名结构体类型的同时,直接进行定义。 3. 先说明一个结构体类型,再单独进行定义。
main( )
{
union u
111
第八章
结构体、共同体和枚举
{ char * name; int age;
int income;
} s; s.name= “WANGLING”;
s.age= 28;
s.income=1000; printf (“%d\n”,s.age );
}
A. 28
B.1000
8.11 下面程序的运行结果是( )。
typedef union { long a[ 2 ]; int b[ 4 ];
char c[ 8 ];
TY our; main()
} TY;
{ printf(“%d\n”,sizeof(our));
}
A. 32
B. 16
C. 8
D. 24
8.12
下面程序的运行结果是( )。
scanf ( “%d %s %f”,&stud[ i ].num,stud[ i ].name,&sdud[ i ].score ); max=stud[ 0 ].score; for( i=1;i<10;i+ + )
if ( stud[ i ].score > max )
107
第八章
结构体、共同体和枚举
相关文档
最新文档