第十章 结构体和共同体.ppt_第1页
第十章 结构体和共同体.ppt_第2页
第十章 结构体和共同体.ppt_第3页
第十章 结构体和共同体.ppt_第4页
第十章 结构体和共同体.ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十章 结构体与共同体 P203,10.1 概述,在C语言中数据的基本类型变量有整型、实型、字符型等等。,还有一个构造类型数据-数组, 特点:数组中各元素是属于同一类型的。,姓名、性别应为字符型;,学号可为整型或字符型;,年龄应为整型;,成绩可为整型或实型。,定义一个结构的一般形式为:P207 struct 结构名 成员表列 ;,成员列表由若干个成员组成。对每个成员也必须作类型说明。,类型说明符 成员名;,说明的形式为:,例如: struct studentint num;char name20;char sex; int age;float score;char addr30; ;,在这个结

2、构定义中,结构名为student,该结构由6个成员组成。,注意:,(2)在括号后的分号是不可少的。,(1)各成员都应进行类型说明: 类型名 成员名; “成员列表”称为“域表”,每一个成员也称为结构体中的一个域,成员名的规定与变量名相同。,(3)struct student是一个类型的名称,与系统提供的标准类型int、float、char等具有相同的作用。可以用来定义变量的类型 。,由此可见: 结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。,10.2 定义结构体类型变量的方法,一、先声明结构体类型再定义变量 P210,例如: struct studentint num;ch

3、ar name20;char sex; int age;float score;char addr30;;,struct student student1,student2;,student1,student2,1)在定义了结构体变量之后,系统会为之分配内存单元。,注意:,例如:student1,student2在内存中各占59字节 (2+20+1+2+4+30=59),2)当程序的规模比较大时,可将结构体类型的声明集中放到一个文件(以.h为后缀的“头文件”)中。,二、 在定义结构类型的同时说明结构变量 P211,一般形式为: struct 结构名 成员表列 变量名表列;,struct stu

4、dentint num;char name20;char sex; int age;float score;char addr30; student1,student2;,注意:成员也可以是一个结构体变量。P208,例如: struct date int month;int day;int year;,struct studentint num;char name20;char sex; int age;struct date birthday;char addr30; student1,student2;,10.3 结构体变量的引用 P212,引用的一般方式:结构体变量 . 成员名,其中“.

5、”是成员(分量)运算符,它在所有的运算符中优先级最高,因此可以把student1 . num作为一个整体来看待。,例如:student1 . num=21101;,main() int i,n; struct employee e; printf(请输入职工人数n:); scanf(%d, ,struct employee int num; char name20; float jbgz,jj,bx,sfgz; 基本工资、奖金、保险,2、如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。,student1 . nu

6、m student1 . birthday . month,注意: 1、不能将一个结构体变量作为一个整体进行输入和输出。,例如:printf(%d,%s,%c,%d,%f,%sn” , student1);,3、对结构体变量的成员可以像普通变量一样进行各种运算,student1 . score = student2 . score;,sum = student1 . score + student2 . score+;,printf(“%ld”, 输出student1的首地址,4、可以引用结构体变量成员的地址,也可以引用结构体变量的地址。,scanf(“%d”,(5) 把结构体变量作为一个整体

7、,整体赋值 P212,如果两个结构体变量具有相同的类型,则允许将一个结构体变量得知直接赋给另一个结构变量。赋值时,将赋值符号右边结构体变量的每一个成员的值都付给了左边结构体变量中相应的成员。这是结构体变量中唯一的整体操作方式。,main() struct stu int num; char *name; char sex; float score;boy1,boy2; boy1.num=102; =Zhang ping; printf(input sex and scoren); scanf(%c %f,10.5 结构体数组 P215,一、定义结构体数组,struct stu

8、dent int num;char name20;char sex; int age;float score;char addr30; ; struct student stru3;,如果要存放一个班同学的信息,怎样放置数据比较简单?,定义了一个数组stru,共有三个元素。其中每个元素为structure student类型的数据。,stru1,stru2,stru0,结构体数组与一般数组的区别是每个数组元素都是一个结构体类型的数据,他们都分别包括各个成员(分量)项。,在内存中数组的各元素连续存放(体现在表格中就是横方向存放),二、结构体数组的初始化,可以看到结构体数组的初始化的一般形式是在定

9、义数组的后面加上: =初值列表;,struct student int num;char name20;char sex; int age;float score;char addr30; stru3= 7021101,“张雅素”,F,17,98,“朝阳区”,7021105,“牛万瑞”,M,20,90,“西城区”, 7021110,“王冰梅”,F,19,89,“宣武区”;,三、举例 例:对候选人得票的统计程序。设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出得票结果。,(1)Leader是一个全局的结构体数组,它有3个元素,每个元素包含两个成员name、count。,(2)lead

10、er_name20数组存放着被选人的名字。,(3)leaderj.count+,(4)strcmp()函数的用途?,struct person char name20; int count;leader3= Li,0 , Zhang,0, Fun,0;,main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; printf(n); for(i=0;i3;i+) p

11、rintf(%5s:%dn,,leaderi.count); getch();,例2:计算学生的平均成绩和不及格的人数。,struct stuint num;char name20;char sex;float score;boy5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58,;,main()int i,c=0;float ave,s=0;for(i=0;i5;i+)s+=boyi.score;if(boyi.score6

12、0) c+=1;printf(s=%fn,s);ave=s/5;printf(average=%fncount=%dn,ave,c);,能否改进程序,将不及格的人名单输出在屏幕上?,数据是用初始化的形式给出的,能否从键盘中输入?,例3:建立同学通讯录,#includestdio.h#define NUM 3struct memchar name20;char phone10;,main()struct mem manNUM;int i;for(i=0;iNUM;i+)printf(input name:n);gets();printf(input phone:n);gets(

13、mani.phone);printf(nametttphonenn);for(i=0;iNUM;i+)printf(%sttt%sn,,mani.phone);,10.6 指向结构体类型数据的指针 P218,一、指向结构体变量的指针,一个指针变量当用来指向一个结构体变量时, 称之为结构体指针变量。,结构体指针变量中的值是所指向的结构变量的首地址。 通过结构指针即可访问该结构变量。,有了结构指针变量,就能更方便地访问结构变量的各个成员。,结构指针变量说明的一般形式为: struct 结构名 *结构指针变量名,main() struct student int num; char

14、 name20; char sex; int age; float score; char addr30; ;,struct student stu_1; struct student *p; p=,注意:,1、p= char name20; char sex; float score; boy5=,101,Zhou ping,M,45, 102,Zhang ying,M,62.5, 103,Liou fang,F,92.5, 104,Cheng ling,F,87, 105,Wang ming,M,58, ;,main() struct stu *ps; printf(NotNametttS

15、extScoretn); for(ps=boy;psnum, ps-name, ps-sex, ps-score); getch(); ,注意:,ps=boy; 即指针ps指向数组的第一个元素的起始地址,则ps+1后ps就指向下一个元素的起始地址。,就本题而言,ps+1意味着ps所增加的值为多少字节?,三、用结构体变量和指向结构体的指针作为函数参数 P219,将一个结构体变量的值传递给另一个函数,有以下三种方法:,1、用结构体变量的成员作参数。例如:用stu.num或作函数是实参,将实参值传给形参。用法和用普通变量作实参是一样的,同属于“值传递”方式。,2、允许用结构变量作函数

16、参数进行整体传送。 但是这种传送要将全部成员逐个传送,形参也必须是同类型的结构体变量 。属于“值传递”方式。,3、最好的办法就是使用指针,即用指针变量作函数参数进行传送。 这时由实参传向形参的只是地址,从而减少了时间和空间的开销。,例如:有一个结构体变量stu,内含学生学号、姓名和3门课的成绩。要求在main()中赋以值,在另一函数print中将它们打印输出。,例: 中国有句俗语叫“三天打鱼、两天晒网”,某人从90年1月1日起开始“三天打鱼、两天晒网”。问这个人在以后的某一天中是在“打鱼”,还是在“晒网”。,1、计算出从1990年1月1日到所填日期共有多少天?,2、如何区分是在打鱼、还是在晒网?,使用数组是存在的两个问题:,1、用数组存放数据时,必须事先定一固定的长度(即元素的个数),显然这样会浪费内存。,2、用数组的方法必须占用一块连续的内存区域。,10.7 用指针处理链表,每一个结点都应包括两个部分: 一为用户需要用的实际数据, 二为下一个结点的地址。,结构体变量用于做链表中的结点是最合适的。,例如: struct student int num; float score; struct student *next; ;,Next是指针类型的成员,它指向st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论