(高职)C语言程序设计模块六构造数据类型应用训练ppt课件.pptx
C语言程序设计模块六构造数据类型应用训练ppt课件模块六模块六 构造数据类型应用训练构造数据类型应用训练能力目标 掌握结构体类型定义、变量的声明及其引用方法; 了解枚举类型及其变量的定义和引用方法。知识准备知识准备引例任务 输入一条学生成绩,并显示。输入一条学生成绩,并显示。#include struct stu char name30; float score3;stu1;void main( ) printf(请输入学生姓名及三门课的成绩:n); scanf(%s%f%f%f,stu1.name,&stu1.score0,&stu1.score1,&stu1.score2); printf(学生:%s的三门课成绩分别为:,stu1.name); printf(%.2f,%.2f,%.2fn,stu1.score0,stu1.score1,stu1.score2); 程程序序清清单单程序运行程序运行 请输入学生姓名及三门课的成绩:请输入学生姓名及三门课的成绩:杨甜杨甜 80 90 70 80 90 70学生:杨甜的三门课成绩分别为:学生:杨甜的三门课成绩分别为:80.00,90.00,70.0080.00,90.00,70.00u引例解析:从引例可以看到,在主程序前面定义一个struct stu类型,其中包括存储姓名的字符数组name30和存储三门课程成绩的单精度实型数组score3。u这就是c语言中的结构体,即把不同类型的、关系又非常密切的数据项组织在一起,就构成了结构体,它是一种用户自定义数据类型。程程序序清清单单#include struct birthday int year; int month; int day; ;struct exam char name30; char sex; int age; char addr40; int number; float score3; struct birthday birth; ;做中学做中学6-1 6-1 结构体变量的定义、引用和初始化。结构体变量的定义、引用和初始化。6.1 结构体类型及其变量程程序序清清单单void main( ) struct exam exame1=张申,M,23,山丹街1号,301,98,67,87,1982,9,3; struct exam exame2=李淼,F,24,小北街2号,304,82,89,97,1981,5,14; printf(%s %c %d ,exame1.name,exame1.sex,exame1.age); printf(%4d.%2d.%2d ,exame1.birth.year,exame1.birth.month,exame1.birth.day); printf(%s %d ,exame1.addr,exame1.number); printf(%3.0f %3.0f %3.0fn,exame1.score0,exame1.score1,exame1.score2); printf(%s %c %d ,exame2.name,exame2.sex,exame2.age); printf(%4d.%2d.%2d ,exame2.birth.year,exame2.birth.month,exame2.birth.day); printf(%s %d ,exame2.addr,exame2.number); printf(%3.0f %3.0f %3.0fn,exame2.score0,exame2.score1,exame2.score2);输出结果输出结果 张申 M 23 1982. 9. 3 山丹街1号 301 98 6 87李淼 F 24 1981. 5.14 小北街2号 304 82 89 97张申 M 23 山丹街 1 号 301 98 67 87 1982 9 3 图 6-1 exam1 的初始化 知识点u 结构体类型的定义结构体类型的一般语法格式: struct 结构体类型名 类型名1 成员变量名1; 类型名2 成员变量名2; 类型名n 成员变量名n; ;u 结构体变量的定义、引用和初始化v 结构体变量的定义 结构体变量的定义方法有3种:l 用已定义的结构体类型来定义结构体变量。如: struct exam exam1,exam2; 在这种结构体变量语法格式中,struct关键字和结构体名(如本例的exam)都不能省略。l 定义结构体类型的同时定义结构体变量。如: struct exam char name30; char sex; int age; char addr40; exam1,exam2; /*定义结构体数据类型,定义结构体变量exam1,exam2 */l 直接定义结构体变量,这种定义不出现结构体类型名。例如: struct char name30; char sex; int age; char addr40; exam1,exam2; /*定义结构体数据类型,定义结构体变量exam1,exam2 */v 结构体变量的引用 引用结构体变量的一般格式为: 结构体变量.成员 exam1.age=18; strcpy(exam1.name, 王帆); “.”是成员运算符,也称为分量运算符,它的优先级在所有的运算符中最高,因此exam1.name将作为一个整体等同于一个变量名来参与各种运算,其运算规则与同类型的变量相同。注 意 当使用上例中的birth成员时,需要用成员运算符逐级地找到最低一级的成员,如: exam1.birth.year=1983; 写成下面的格式是不对的: exam1.birth=1980,04,20;v 结构体变量的初始化 同其它类型的变量一样,结构体变量的初始化可以在定义时完成。如果需要在程序中进行初始化,则需要逐个成员逐级对最低一级的成员赋初值。做中学做中学6-2 6-2 输入输入5 5个考生的姓名及考试成绩,并统计各科的平均个考生的姓名及考试成绩,并统计各科的平均 成绩。成绩。算法设计算法设计 每个考生的信息包括姓名以及多门课程考试成绩,定义一个结构体类型stu包括字符数组name30和实型数组score3成员,N个考生的信息通过已定义的结构体类型stu数组stu1N来实现。将每个考生的对应成绩相加后求平均成绩,即为各科的平均成绩。6.2 结构体数组 将若干个相同结构体类型的数据组合在一起构成的集合,就成为结构体数组。结构体数组与一般数组不同的是,每个数组元素都是结构体类型的数据。程程序序清清单单#include #define N 5struct stu char name30; float score3;stu1N;void main( ) int i,j; float aver3=0; printf(请输入考生姓名及三门课的成绩:n); for (i=0;iN;i+) printf(第%d名学生:,i+1); scanf(%s %f,stu1i.name,&stu1i.score0); scanf( %f %f,&stu1i.score1,&stu1i.score2); for (i=0;i3;i+) /*计算每科的总成绩*/ for (j=0;jN;j+) averi=averi+stu1j.scorei; printf(平均成绩:n第一科:%3.1f ,aver0/N); printf(第二科:%3.1f 第三科:%3.1fn,aver1/N,aver2/N);程序运行程序运行 请输入考生姓名及三门课的成绩:请输入考生姓名及三门课的成绩:第第1 1名学生:名学生:mark 60 70 80 mark 60 70 80 第第2 2名学生:名学生:sumn 75 85 95sumn 75 85 95第第3 3名学生:名学生:yang 85 95 65yang 85 95 65第第4 4名学生:名学生:ning 45 78 96ning 45 78 96第第5 5名学生:名学生:chen 87 67 92chen 87 67 92平均成绩:平均成绩:第一科:第一科:70.4 70.4 第二科:第二科:79.0 79.0 第三科:第三科:85.685.6知识点u 结构体数组的定义和初始化 定义结构体数组与定义结构体变量一样,可以在定义结构体类型的同时定义,也可以在定义结构体类型之后定义,也可以直接定义。如:struct stu char name30; char sex2; int age; char addr40; int number; float score;stu12=“张文”,“男”,21,“上海路2#”,301,80,“贾丽”,“女”,18,“建设路123#”,302,92; 知识点u 结构体数组的成员变量v 同一般数组一样,结构体数组的引用也是通过数组名和下标来引用的。v 其引用格式为: 数组名下标.成员变量名6.3 枚举类型6.3.1 枚举类型的定义v 定义枚举类型的一般格式为: enum 枚举类型名 枚举元素1,枚举元素2,枚举元素n;v C语言将枚举元素作为整型常量处理 如:enum weekSun=7,Mon=1,Tue,Wed,Thu,Fri,Sat; C语言将第一个枚举元素的值指定为7,第二个元素的值指定为1,对于后面没有指定值的枚举元素,自动按照前一个元素的值加1的原则定义它的值,即Tue=2,Wed=3,Thu=4,Fri=5,Sat=6。各个枚举元素为常量,程序中不能对枚举元素赋值。如语句Sat=4;是不对的。 6.3.2 枚举类型变量v 枚举变量的定义l 定义枚举类型之后定义枚举变量: enum weekSun=7,Mon=1,Tue,Wed,Thu,Fri,Sat; enum week day1,day231;l 在定义枚举类型的同时定义枚举变量: enum weekSun=7,Mon=1,Tue,Wed,Thu,Fri,Satday1,day231;l 直接定义枚举变量; enum Sun=7,Mon=1,Tue,Wed,Thu,Fri,Satday1,day231;u 枚举类型变量的定义和引用v 枚举类型变量的引用 枚举变量的引用方法同普通类型的变量一样。但是枚举变量的取值只能在该枚举类型定义的取值范围内。做中学做中学6-3 6-3 输出一个星期的英文名称。输出一个星期的英文名称。#include enum weekSun=7,Mon=1,Tue,Wed,Thu,Fri,Sat; /*定义枚举类型*/void main( )enum week day; /*定义枚举类型变量*/int i=2;char* name=Monday,Tuesday,Wednesday,Thursday,Friday,Satday,Sunday;for (day=Mon;day=Sun;day=(enum week)i+) /*用枚举类型变量控制循环输出*/printf(%2d: %sn,day,nameday-1); 程程序序清清单单输出结果输出结果 1: Monday 2: Tuesday 3: Wednesday 4: Thursday 5: Friday 6: Satday 7: Sunday6.4 自定义数据类型u 简单的名字替换v 例如:typedef int INTEGER;v 功能:是将int型定义为INTEGER,这二者等价,在程序中就可以用INTEGER作为类型名来定义变量了。u 定义结构体类型v 例如:typedef struct char name20; long num; float score;STUDENT; v 功能:将一个结构体类型:struct ;v 定义为花括弧后的名字STUDENT。以后就可以用它来定义变量了。u 定义数组类型v typedef int COUNT20; /*定义COUNT为整型数组*/v typedef char NAME20; /*定义NAME为字符数组*/v COUNT a,b; /*a,b为整型数组*/v NAME c,d; /*c,d为字符数组*/ u定义指针类型v typedef char * STRING; /*定义STRING为字符指针类型*/v STRING p1,p2,p10; /* p1,p2为字符指针变量,p为字符指针数组名*/v 归纳起来,用typedef定义一个新类型名的方法如下:l 先按定义变量的方法写出定义体(如char a20 ;)l 将变量名换成新类型名(如char NAME20 ;)l 在最前面加上typedef(如typedef char NAME20 ;)l 然后可以用新类型名去定义变量(如NAME c,d;)边学边练边学边练 设计一个程序,输入、显示和修改处理对某个学生的信息。总结归纳总结归纳u 结构体类型v 类型定义v 变量定义v 成员变量引用v 变量初始化v 数组定义v 数组成员变量的引用u 共用体类型v 类型定义v 变量定义v 成员变量引用