《C程序设计》课教学方案教师:序号15授课时间授课班级上课地点学习内容第9章用户自己建立数据类型课时4教学目标专业能力了解如何定义和使用结构体变量掌握如何用结构体数组和结构体指针了解什么是枚举类型和共用体类型方法能力学会有效的处理数据,使程序清晰明了社会能力提高逻辑思维能力目标群体普专教学环境多媒体教室教学方法理论教学与上机训练相结合,即学即练时间安排教学过程设计第一节第9章用户自己建立数据类型9.1定义和使用结构体变量9.1.1自己建立结构体类型用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项,是属于同一个学生的,因此组成一个组合数据,如student_1的变量,反映它们之间的内在联系声明一个结构体类型的一般形式为:struct结构体名{成员表列};说明:(1)结构体类型并非只有一种,而是可以设计出许多种结构体类型,例如structTeacherstructWorkerstructDate等结构体类型各自包含不同的成员(2)成员可以属于另一个结构体类型。structDate{intmonth;intday;intyear;};structStu{intnum;charname[20];charsex;intage;structDatebirthday;charaddr[30];};前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。相当于设计好了图纸,但并未建成具体的房屋。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。9.1.2定义结构体类型变量1.先声明结构体类型,再定义该类型变量声明结构体类型structStudent,可以用它来定义变量structStudentstudent1,student2;2.在声明类型的同时定义变量structStudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;3.不指定类型名而直接定义结构体类型变量其一般形式为:struct{成员表列}变量名表列;指定了一个无名的结构体类型。(1)结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。(2)结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。(3)对结构体变量中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。9.2使用结构体数组例9.3有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票结果。解题思路:设一个结构体数组,数组中包含3个元素每个元素中的信息应包括候选人的姓名(字符型)和得票数(整型)输入被选人的姓名,然后与数组元素中的“姓名”成员比较,如果相同,就给这个元素中的“得票数”成员的值加1第二节输出所有元素的信息#includestring.h#includestdio.hstructPerson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,“Sun”,0};intmain(){inti,j;charleader_name[20];for(i=1;i=10;i++){scanf(“%s”,leader_name);for(j=0;j3;j++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}for(i=0;i3;i++)printf(%5s:%d\n“,leader[i].name,leader[i].count);return0;}9.3结构体指针9.3.1指向结构体变量的指针指向结构体对象的指针变量既可以指向结构体变量,也可以用来指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。例如:structStudent*pt;9.3.2指向结构体数组的指针9.3.3用结构体变量和结构体变量的指针作函数参数将一个结构体变量的值传递给另一个函数,有3个方法。(1)用结构体变量的成员作参数。例如,用stu[1].num或stu[2].name作函数实参,将实参值传给形参。用法和用普通变量作实参是一样的,属于“值传递”方式。应当注意实参与形参的类型保持一致。(2)用结构体变量作实参。用结构体变量作实参时,将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大在被调用函数期间改变形参(也是结构体变量)的值,不能返回主调函数一般较少用这种方法(3)用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。第三节9.4用指针处理链表9.4.1什么是链表链表是一种常见的重要的数据结构它是动态地进行存储分配的一种结构链表必须利用指针变量才能实现9.4.2建立简单的静态链表例9.8建立一个如图所示的简单链表,它由3个学生数据的结点组成,要求输出各结点中的数据。9.4.3建立动态链表所谓建立动态链表是指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起前后相链的关系。解题思路:定义3个指针变量:head,p1和p2,它们都是用来指向structStudent类型数据用malloc函数开辟第一个结点,并使p1和p2指向它读入一个学生的数据给p1所指的第一个结点读入一个学生的数据给p1所指的第一个结点使head也指向新开辟的结点再开辟另一个结点并使p1指向它,接着输入该结点的数据再开辟另一个结点并使p1指向它,接着输入该结点的数据使第一个结点的next成员指向第二个结点,即连接第一个结点与第二个结点使p2指向刚才建立的结点使第一个结点的next成员指向第二个结点,即连接第一个结点与第二个结点使p2指向刚才建立的结点再开辟另一个结点并使p1指向它,接着输入该结点的数据使第二个结点的next成员指向第三个结点,即连接第二个结点与第三个结点使p2指向刚才建立的结点再开辟另一个结点并使p1指向它,接着输入该结点的数据输入的学号为0,表示建立链表的过程完成,该结点不应连接到链表中第四节9.5共用体类型9.5.1什么是共用体类型有时想用同一段内存单元存放不同类型的变量。使几个不同的变量共享同一段内存的结构,称为“共用体”类型的结构。定义共用体类型变量的一般形式为:union共用体名{成员表列}变量表列;例如:unionData{inti;charch;floatf;}a,b,c;“共用体”与“结构体”的定义形式相似,但它们的含义是不同的。结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元。而共用体变量所占的内存长度等于最长的成员的长度。9.5.2引用共用体变量的方式只有先定义了共用体变量才能引用它,但应注意,不能引用共用体变量,而只能引用共用体变量中的成员。例如,前面定义了a,b,c为共用体变量,下面的引用方式是正确的:a.ia.cha.f在使用共用体类型数据时要注意以下一些特点:(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一个成员,而不是同时存放几个。(2)可以对共用体变量初始化,但初始化表中只能有一个常量。(3)共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就取代。(4)共用体变量的地址和它的各成员的地址都是同一地址。(5)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。(6)以前的C规定不能把共用体变量作为函数参数,但可以使用指向共用体变量的指针作函数参数。C99允许用共用体变量作为函数参数。(7)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。作业3教学反馈(注:单元格可合并、拆分)