[其它考试]第11章结构体1.ppt

上传人:音乐台 文档编号:2002595 上传时间:2019-01-30 格式:PPT 页数:42 大小:865KB
返回 下载 相关 举报
[其它考试]第11章结构体1.ppt_第1页
第1页 / 共42页
[其它考试]第11章结构体1.ppt_第2页
第2页 / 共42页
[其它考试]第11章结构体1.ppt_第3页
第3页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[其它考试]第11章结构体1.ppt》由会员分享,可在线阅读,更多相关《[其它考试]第11章结构体1.ppt(42页珍藏版)》请在三一文库上搜索。

1、,第十一章 结构体、联合,本章目标,1.理解结构体,联合体的数据类型,2.学会定义结构体、联合体的数据类型的变量,3.能够正确使用结构体、联合体的成员, 已了解的数据类型:,整型,浮点型,字符型,11.1 引言,数组,简单数据类型,用户定义的数据类型,特点:所有的元素都是同一种类型,存在的问题:难以处理较复杂的数据,指针型,如:建立一份学生档案,对每一个学生至少需要以下一些信息。,学号(unsigned no) 姓名(char name20) 性别(char sex) 年龄(int age),成绩(float score) 地址(char ddr30),C 程序可将上述数据的集合定义为一种结构

2、体类型:,struct student unsigned num; char name20; char sex; int age; float score; char addr30; ;,分号不能少,我们可以根据需要定义很多类似的类型,如struct goods,struct book等等。,一、结构体定义的一般形式:,11.2 结构体的定义,struct 结构体名 成员表列 ;,成员表列的写法:类型标识符 成员名; 可以是我们学过的任何类型 每一个成员也称为结构体中的域,如:struct date, int year;,int month;,int day;,;,结构体名,成员表列,域,也可

3、写成: struct date int year,month,day; ;,注意:,1.这只是定义一种新类型的方法,尚未定义变量。 struct date 是一个类型名,类似于int,2.struct 关键词(保留字),表示定义一种结构体类型。,3.一个C程序可定义多个结构体类型;定义的位置可在函数之内,也可在函数之外;位置决定有效范围; 如:结构体类型1定义; void main( ) 结构体类型2定义; ; fun1() ; ,1. 先定义结构体类型再定义结构体变量,有三种方法可用来定义结构体变量:,例: struct student int num; char sex; char nam

4、e20; float score; ;,11.2 结构体变量的定义,结构体类型,struct student x1, x2;,类型标识符,结构体变量,x1, x2为student 结构体类型的变量,x1, x2可存放student类型数据。,例:struct student int num; char name20; char sex; int age; char addr30; x1, x2;,struct 结构体名 成员表列 变量名表列;,2. 在定义结构体类型的同时定义变量:,定义形式,定义形式 struct 成员表列 变量名表列; 不出现结构体类型名 称为无名结构体,3. 直接定义结构

5、类型变量,例:struct int num; char name20; char sex; int age; char addr30; x1, x2;,1. 类型名与变量名是不同的概念。只能对变量赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。,几点说明:,2.结构体变量占用内存情况: 各成员按定义顺序连续存储 长度是该结构体变量中所有成员占内存之和 可用sizeof运算符求出一个结构体的长度,例: struct student int num; char name20; char sex; int age; char addr30; ; struct student x1

6、; printf(“%d”,sizeof(x1);,X1 59个字节,sizeof运算符,能够求出变量或类型所占的内存字节数,例如: sizeof(int) 求int类型占内存字节数,3. 一个结构体类型的变量可以是另一个结构体的成员,struct date int m; int d; iny y; ;,struct student int num; char name20; char sex; struct date birthday; float score; char tel15; stu1, stu2;,结构体变量的初始化就是指在定义结构体变量的同时给该变量赋初值。,1 1.3 结构体

7、变量的初始化,struct student x2=2, “Li Hua “, 90;,二、定义完结构体后,定义结构变量并初始化,如:struct student, unsigned No;,char name20;,float score;, x1=1,”LiMing”,85.5;,一、定义结构体的同时定义变量并初始化,但不能这样写:,struct student, unsigned No=1;,Char name20=“Li”;,float score=88;, x;,11.4 访问结构成员,访问结构体变量实质上是引用其成员,有两种运算符可访问结构成员,. 成员运算符 - 指向运算符,成员运

8、算符(.),stu1.num 引用结构体变量stu1的num成员; stu1.name 引用stu1的name成员(字符数组名); stu1.namei 引用name成员的第i个元素; stu1.birthday.y 对最低级成员进行引用;,引用形式:结构体变量名 . 成员名 其中:成员运算符 . : 一级,自左而右;,【例】按以上定义输入 scanf(“%d“, /*成员tel的指针*/ Li Feng 021-8482500 ,【例】按以上定义输出 printf(“munber:%7dn“, stu1.num); printf(“%d,%d,%dn“, stu1.birthday.y, s

9、tu1.birthday.m, stu1.birthday.d); printf(“name:%sn“, stu1.name); 或: for(i=0; stu1.namei!=0; i+) /*数组成员输出*/ printf(“%c“, stu1.namei); 说明:. 与 运算符同为一级,自左而右运算。,注意:,1. 不能整体引用,只能对各个成员分别引用。 printf(“%d,%s,%f“,stu1); 有个特例: 结构体变量间的赋值运算 如:stu2=stu1;,2. 每一个成员的作用与普通简单变量的引用相同。,stu1.num=110234; stu1.birthday.y=198

10、1; sum=stu1.score+stu2.score; stu1.num+; /. 1级 + 2级,课堂练习,编写一个程序,首先定义一个复数数据类型,即结构类型。然后定义该类型的3个变量,任意输入两个复数存入到其中两个变量,按照复数的运算规进行加法运算,把和存入第3个变量。最后按照复数表示的格式(例如:3+4i或5-6i)把和进行输出,11.5 结构体数组 数组是同类型元素的集合;结构体数组也是同 类型元素的集合,只不过每个元素的类型均为相同 的结构体类型。 前面介绍的结构体变量可用来表示一位学生的 基本情况,要表示多个学生的基本情况时,采用结 构体数组比较方便。,1. 结构体数组的定义和

11、初始化 例:struct student int num; char name20; float score; stu3= 99001, “Li Feng“, 89.5, 99002, “Wang Yi“, 70.5, 99003, “Zhao Hui“, 92 ; 说明: 1) 数组stu各元素类型相同,都为struct student型;,2) 结构体数组stu的存储结构,stu0,stu1,stu2,99001 Li Feng0 89.5 99002 Wang Yi0 70.5 99003 Zhao Hui0 92.0,4 20 28 4,84 byte,2. 结构体数组的引用 引用形式

12、:数组名下标 . 成员名 如: stu0.num 访问stu数组首元素的成员num; stu1.score 访问以1为下标那个元素的score成员;,【例】编程求三位学生的平均成绩,每个学生包含3种信息:学号、姓名、成绩。 struct student int num; char name20; float score; ; void main( ) struct student stu3= 99031, “Li Lin“, 89.0, 99032, “Wang Fang“, 71.0, 99033, “Zhao Ping“, 92.0 ;,float sum; int i; sum=0; f

13、or(i=0; i3; i+) sum=sum+stui.score;/*累加各元素score成员*/ printf(“ntaverage=%fn“, sum/3.0); ,课堂练习,编程求10位学生成绩最高者的学号、姓名、成绩,每个学生包含3种信息:学号、姓名、成绩。要求信息从键盘输入。,【例】30张选票,对三名侯选人之一投票选举,输 入得票人名字,按名字计数,输出最后选举结果。 #include “stdio.h“ #define N 30 struct person char name20; int count; ;,led0,led1,led2,led0.name,led0.count

14、,void main( ) struct person led3= “Li“, 0, “Zhang“, 0, “Wang“, 0; char lname20; int i, j; for(i=1; i=N; i+) /*i控制选票张数*/ printf(“Input NO.%d name:“, i); gets(lname); for(j=0; j3; j+) /*j控制数组下标*/ if(strcmp(ledj.name, lname)=0)/*串比较*/ ledj.count+=1; break; /*计票*/ for(i=0; i3; i+) printf(“n%-10s:%d“, le

15、di.name,ledi.count); ,11.6 指针与结构体 1. 指向结构体变量的指针 一个结构体变量的指针是该变量存储区域的起 始地址,它指向结构体这个整体。 在程序中可定义一个指向结构体类型的指针 变量,并将该指针变量指向某结构体变量,之后便 可利用指针变量访问各成员。,【例】利用结构体指针,对某学生基本情况赋值并输出。 #include struct student int num; char name20; float score; ; void main( ) struct student stu1, *p; stu1.num=99001; strcpy(stu1.name,

16、 “Li Feng“); stu1.score=89.5; p=,p,name0 name1 name19,468 472 473 491 492,stu1,&stu1,printf(“num:%dn“, (*p).num); printf(“name:%sn“, (*p).name); printf(“score:%7.2fn“, (*p).score); ,括号不能少, .的优先级高于*,p,name0 name1 name19,468 472 473 491 492,stu1,&stu1,指向成员运算符:- (减号大于号),优先级和结合性: 1级,自左而右; 作用:通过指向结构体变量的指

17、针来访问结构体变量的成员。 如:,printf(“num:%dn“, p-num); printf(“name:%sn“, p-name); printf(“score:%7.2fn“, p-score);,p,name0 name1 name19,468 472 473 491 492,stu1,&stu1,p-score:访问p所指向变量的score成员; p-namei:访问p指向变量的name成员第i个元素。,说明: 1) 当p= stu1.num (*p).num p-num,p,name0 name1 name19,468 472 473 491 492,stu1,&stu1,2.

18、 用结构体指针变量访问结构体数组元素 【例】输入/输出三位学生基本情况,计算平均成绩,stu0,stu1,stu2,99001 Li Feng 89.5 99002 Wang Yi 70.5 99003 Zhao Hui 92.0,p,#include #include struct student int num; char name20; float score; ; void main( ) struct student *p, stu3; int i; float sum=0;,for(i=0; inum, p-name, p-score); for(p=stu,i=0; iscore

19、; /*累加成绩*/ printf(“taverage=%-7.2fn“, sum/3.0); ,说明: 1) 若p=stu; p+的增量为元素类型长28,从而使 p指向下一个元素; 2) 当p=stu; 且保持不变时, p+i的值:stu+i元素类型长 =stu+i28 p+i含义:数组元素stri的地址; 即: p+i stu+i ,1) 用结构体变量作参数 2) 用指向结构体的指针变量作参数,3. 结构体指针作为函数参数,【例】一结构体类型,可表示学号、姓名、三门课成绩及平均成绩,编程对两个学生的成绩求个人平 均分、输出所有数据项。 要求: 1) 分别用结构体变量stu1、stu2存储数

20、据; 2) 由函数aver实现平均分计算; 3) 由函数pfun实现输出;,struct student int num; char name20; float score3; float aver; ;,num name score0 score1 score2 aver,99001 Li Hong 89.0 76.0 90.0 0,12byte,void pfun(struct student s)/*实形参对应成员值传递*/ int i; printf(“%10d%20s“, s.num, s.name); for(i=0; i3; i+) /*输出成绩成员的各元素*/ printf(“

21、%7.2f“, s.scorei); printf(“%7.2fn“, s.aver); ,void aver(struct student *p) int i; float sum=0; for(i=0; iscorei; p-aver=sum/3.0; ,void aver(struct student *p); void pfun(struct student s); void main( ) /*定义结构体变量并赋初值*/ struct student stu1=99001,“LiHong“,89,76,90,0; struct student stu2=99002,“Wang Li“,70.5,85.5,76,0; aver( ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1