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