欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    《结构和联合》PPT课件.ppt

    • 资源ID:5589841       资源大小:261.49KB        全文页数:47页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《结构和联合》PPT课件.ppt

    第8章 结构和联合,8.1 结构的定义以及结构变量的定义和使用8.2 结构数组与结构指针8.3 结构在函数间的传递8.8 综合举例,8.1 结构的定义以及结构变量的定义和使用,8.1.1 结构的定义 结构是由不同数据类型的数据组成的。组成结构的每个数据称为该结构的成员项,简称成员。在程序中使用结构时,首先要对结构的组成进行描述,这称为结构的定义。结构定义的一般形式如下:struct 结构名 数据类型 成员名1;数据类型 成员名2;.数据类型 成员名n;,例如,为了处理雇员的数据,在程序中可以定义如下的结构:struct Employee char name20;char sex;int old;int wage;该结构名字是Employee,它由四个成员项组成。第一个成员项是字符型数据name,它用于保存姓名字符串;第二个成员项是字符型数据sex,它用于保存性别字符;第三个成员项是int型整数old,它用于保存年龄数据;最后一个成员项是int型整数wage,它用于工资数据。,(1)结构的定义以关键字struct作为标识符,其后是定义的结构名,它们两者形成了特定结构的类型标识符。结构名由用户命名,命名原则与变量名等相同。结构名是这一组数据集合体的名字,可以像基本数据类型名一样,用来说明具体的结构变量。(2)在结构名下面的一对大括号中包围的是组成该结构的各个成员项。每个成员项由其数据类型和成员名组成。每个成员项后用分号“;”作为结束符。整个结构的定义也用分号作为结束符,注意不要忘记这个分号。,(3)结构的定义明确地描述了该结构的组织形式。在程序执行时,结构的定义并不引起系统为该结构分配内存空间。结构的定义仅仅是定义了一种特定的数据构造类型,它指定了这种构造使用内存的模式。在定义时没有指明使用这种构造具体对象(在结构的说明时将指明这点)。如上述结构Employee的定义,仅仅指定了在使用这种结构时应该按下图所示的配置情况占用内存,但这时并没有实际占用内存空间。,图 8.1,8.1.2 结构变量的定义 程序一旦定义了一个结构体,就相当于定义了一个新的结构类型,那么就可以把结构名当作像int、double等关键字一样使用,用说明语句定义该形式结构体的具体结构变量,其格式为:struct 结构名 结构变量名;结构变量的定义在程序的数据说明部分给出。例如,下列说明:struct Employee wang;这个说明指出了结构变量wang使用Employee结构,也就是说,结构变量wang是由前述的Employee的四个成员项组成,每个成员项的类型和名字都与Employee结构定义中给出的相同。,(1)结构变量的定义将引起系统按照结构定义时制定的内存模式,为被定义的结构变量分配一定的内存空间。例如,上述结构变量wang在内存中将占据与图8.1所示配置相同的内存空间。当多个结构变量使用结构时,它们可以在一起定义。例如:struct Employee wang,li,zhang;被定义的三个结构变量wang、li和zhang都具有Employee定义的结构。,(2)结构变量使用内存空间,所以它们也具有一定的存储类型。结构变量的存储类型概念、它的寿命、可见性及使用范围与普通变量、数组完全一致。(3)在程序中,结构变量的定义在该结构的定义之后,对于尚未定义的结构,不能用它对任何结构进行说明。,(4)在一些简单的程序设计中,结构的定义和结构变量的定义也可以同时进行,在这种情况下,有时省略结构名。这时,被定义的结构变量直接在结构定义的大括号后给出,例如:struct Employee char name20;char sex;int old;int wage;wang,song,zhou;这种形式与前面给出的结构定义和结构说明分开进行时功能相同。,(5)一个结构变量占用内存的实际大小,可以利用sizeof运算求出。sizeof运算的功能是计算出给定的运算量占用内存空间的字节数,它的运算表达式一般形式如下:sizeof(运算量)其中运算量可以是变量、数组或结构变量,也可以是数据类型的名称,如int、double、struct Employee 等。,8.1.3 结构变量的使用形式和初始化 C提供了两种类型的聚合数据类型:数组和结构。数组是相同类型的元素的集合,它的每个元素是通过下标引用或指针间接访问选择的。但在结构中情况并非如此,由于结构的成员可能长度不同,所以不能使用下标来访问它们。相反,每个结构成员都有自己的名字,它们是通过名字来访问的。此外,在结构说明的同时可以给各个成员项赋初值,即结构的初始化。,1、结构的使用形式 结构是不同数据类型的若干数据的集合体。在程序中使用结构时,一般情况下不能把结构作为一整体参加数据处理,而参加各种运算和操作的是结构的各个成员项数据。结构的成员项用以下一般形式表示:结构变量名.成员名 例如,上节给出的结构变量wang具有下列四个成员项:wang.name,wang.sex,wang.old,wang.wage 它们分别表示结构变量wang的四个组成数据。,在指明结构成员项时使用的“.”符号是C语言的一个运算符,它规定的运算是访问结构的成员。例如,wang.old实质上是一个运算表达式,它的运算是访问结构wang的成员old。因此,它代表了结构变量wang中名字为old的成员项。访问成员运算“.”是第一运算优先级中的一种运算,它的结合规律是从左向右。明确这一点,对于分析包括有访问成员运算的复杂运算表达式中各种运算的先后顺序有很大帮助。,当结构的成员项是指针变量时,要注意它的使用形式上的特点。例如:struct Employee1 char*name;char sex;int old;int wage;zhou;定义的Employee1结构中的成员项name是一个char型指针。如果结构变量zhou被说明为Employee1结构,则zhou的成员项 zhou.name是一个char型指针。那么下面的使用形式*zhou.name 表示是该指针指向的目标变量,它的意义可以从运算表达式的角度进分析。上述表达式中有两种运算:*(访问目标)和(访问成员)。运算优先于*运算。所以,访问成员运算在先,而访问目标运算在后。上面的表达式等价于:*(zhou.name),例8.1 结构在程序中的使用形式#include struct Employee/结构的定义 char*name;char sex;int old;char*tel;char*adr;void main()struct Employee wang,gao;/结构变量的定/义 wang.name=“wang hai”;/结构变量的成/员赋值 wang.sex=M;wang.old=34;wang.tel=010-12345678;wang.adr=beijing;gao.name=gao yang;gao.sex=F;,gao.old=42;gao.tel=021-87654321;gao.adr=shanghai;/显示结构变量的成员内容 printf(name sex old tel addressn);printf(n);printf(%-14s%-4c%-4d%-10s%-20sn,wang.name,wang.sex,wang.old,wang.tel,wang.adr);printf(%-14s%-4c%-4d%-10s%-20sn,gao.name,gao.sex,gao.old,gao.tel,gao.adr);运行结果如下:name sex old tel adrwang hai m 34 010-12345678 beijinggao yang f 42 021-87654321 shanghai,在文件的开始部分定义结构Employee,在函数main的说明部分说明了使用该结构的两个结构变量wang和gao。程序的执行部分由数据赋值和输出两大部分组成。在赋值部分中可以清楚地看到每个成员项的使用形式和使用特性。例如,其中的赋值语句:wang.name=wang jun;由于wang.name是一个char型指针变量,所以可以用一个字符串常量直接向它赋值。再者,从数据输出中看出,输出项wang.name对应输出转换说明符是%s,所以输出结果是指针wang.name所指向的字符串。由此可知,结构的成员项无论其表示形式多么复杂,它的类型和使用特性最终落实到成员名上。例如,成员名name在Employee结构定义时定义为char指针型,那么无论是wang.name、还是gao.name都是char指针型。它们在程序中使用时,与使用一个普通的字符指针完全相同,视作一个整体。,2、结构的初始化 在结构说明的同时,可以给这个结构的每个成员赋初值,这称为结构的初始化。结构初始化的一般形式如下:struct 结构名 结构变量=初始数据;其中大括号中包围的初始数据之间用逗号分隔,初始数据的个数与结构成员项的个数应该相同,它们是按先后顺序一一对应赋值。此外,每个初始数据必须符合与其对应的成员项的数据类型。,例如,前述Employee结构的结构变量wang在说明时可以初始化如下:struct Employee wang=wang hai,M,34,123-1111,beijing;它所实现的功能,与程序中下列赋值相同:wang.name=wang hai;wang.sex=M;wang.old=34;wang.tel=010-12345678;wang.adr=beijing;,8.2 结构数组与结构指针,8.2.1 结构数组 在C语言中,具有相同数据类型的数据可以组成数组,指向相同类型的指针可以组成指针数组。根据同样的原则,具有相同结构的结构也可以组成数组,称它们为结构数组。结构数组的每一个元素都是结构变量。结构数组的说明形式如下:struct 结构名 结构数组名元素个数=初值表;,例如,struct Employee man3;说明了结构数组man,它有三个元素man0、man1和man2,它们都是具有Employee结构的结构变量。结构数组适合于处理由若干具有相同关系的数据组成的数据集合体。与数组一样,在定义结构数组的同时可以用初始化列表给它的每个元素赋初值。在对结构数组进行初始化时,方括号 中的元素个数可以缺省。结构数组也具有数组的属性,结构数组名是结构数组存储首地址,如例中的man表示该结构数组存储首地址。,例8.2 结构数组的使用#include#define STUDENT 3/*用符号常量STUDENT表示学生人数 struct Data/定义一个结构 char name20;/姓名 short age;/年龄 char adr30;/地址 long tel;/电话号码;void main()struct Data manSTUDENT=/*定义一个结构数组并初始化 王伟,20,东八舍416室,87543641,李玲,21,南三舍219室,87543945,张利,19,东八舍419室,87543645;int i;,/输出显示表头提示信息 printf(“编号t姓名t年龄t地 址t电 话nn);/输出结构数组的数据 for(i=0;i STUDENT;i+)printf(%-dt%-st%-dt%-st%Ldn,i+1,mani.name,mani.age,mani.adr,mani.tel);/每个输出项都左对齐,编号从1开始 printf(n结构类型Data的数据长度:%d 字节。n,sizeof(struct Data);该程序的输出结果为:编号 姓名 年龄 地 址 电 话1 王伟 20 东八舍416室 875436412 李玲 21 南三舍219室 875439453 张利 19 东八舍419室 87543645结构类型Data的数据长度:56字节。,例8.3:选举,对候选人得票进行统计,设有4个候选人,N个人参加选举,每次输入一个得票的候选人的名字,要求最后输出个人的得票结果。程序如下:#include#include#define N 10/宏定义,定义参加选举人的个数struct person/结构定义 char name20;int count;void main()/结构数组定义及初始化 struct person leader4=wang,0,zhang,0,zhou,0,gao,0;char name20,i,j;/模拟选举过程,循环一次代表一次选举 for(i=0;iN;i+)gets(name);/从键盘输入候选人的名字 for(j=0;j4;j+)/在候选人中查找匹配的人 if(strcmp(name,leaderj.name)=0),leaderj.count+;/被投票的候选人的票数加1 break;printf(n);for(j=0;j4;j+)/输出选举结果 printf(%s:%dn,leaderj.name,leaderj.count);该程序的运行结果为:wangwangzhangzhangzhangzhangzhouzhougaogao/输入wang:2zhang:4zhou:2gao:2/输出,8.2.2 结构指针 在C语言中对于结构的数据可以使用指针进行处理。我们把指向结构的指针称为结构指针。指向结构的指针变量称为结构指针,它与其他各类指针在特性和使用方法上完全相同。结构指针的运算仍按地址计算规则进行,其定义格式为:struct 结构名*结构指针名=初始地址值;其中结构名必须是已经定义过的结构类型。例如:struct Employee*pman;struct Employee*pd;,存储类型是结构指针变量本身的存储类型。编译系统按指定的存储类型为结构指针pman和pd分配内存空间。由于结构指针是指向整个结构体而不是某个成员,因此结构指针的增(减)量运算,例如:“pman+;”将跳过一个结构变量的整体,指向内存中下一个结构变量或结构数组中下一个元素,结构指针本身的(物理)地址增量值取决于它所指的结构变量(或结构类型)的数据长度。,结构体可以嵌套,即结构体成员又是一个结构变量或结构指针。例如:struct student char name20;short age;char adr30;struct Date BirthDay;struct Date StudyDate;studt300;其中成员项BirthDay、StudyDate是具有Date结构类型的结构变量,称student为外层结构体,Date为内层结构体。,在结构嵌套中,当结构体的成员项具有与该结构体相同结构类型的结构变量或结构指针时,就形成了结构体的自我嵌套。这种结构体称为递归结构体。例如:struct Node int num;/数据场,节点序号 struct Node*next;/指针场,指向下一个节点的结构指针;该结构体中的成员项next是指向自身结构类型Node的结构指针,构成了递归结构体,链表、树和有向图等数据结构中广泛采用递归结构体。,使用结构指针对结构成员进行引用时,有两种形式:(1)使用运算符“.”,这时指针指向结构的成员项一般表示形式是:(*结构指针名).成员名 由于成员选择运算符.的优先级比取内容运算符*“高,所以需要使用圆括号。在C语言程序中结构指针使用相当频繁,所以C中提供了一种直观的特殊运算符:结构指针运算符“-”(横线加大于号)。在C语言程序中经常采用下面的形式。,(2)使用运算符-“结构指针名-成员名 它与前一种表示方法在意义上是完全等价的。例如,前面给出的pman指向的结构中的成员项old可以表示如下:pman-old在这种表示方法中,-(减号和大于号)也是一种运算符,它在第一运算优先级中。它表示的运算意义是,访问指针指向的结构中的成员项。,例8.4:结构指针的使用#include struct Date/定义一个结构 int month;int day;int year;void main()struct Date today,*date_p;/定义一个结构变量和结构指针变量 date_p=程序运行结果:Today is 4/15/1990,例8.5:结构指针运算#include struct Key/定义一个结构char*keyword;int keyno;void main()/定义一个结构数组 struct Key kd=are,123,my,456,you,789;struct Key*p;/定义一个结构指针变量 int a;char chr;p=kd;/将结构数组的首地址赋给结构指针p a=p-keyno;printf(p=%d,a=%dn,p,a);a=+p-keyno;/相当于chr=+(p-keyno),/结构指针无变化 printf(p=%d,a=%dn,p,a);/结构指针指向结构数组的下一个元素,结构指针发生变/化;给a赋值是指针变化后所指向目标的成员数据 a=(+p)-keyno;printf(p=%d,a=%dn,p,a);/给a赋值是指针变化前所指向目标的成员数据;结构指/针值发生变化,结构指针指向结构数组的下一个元素,a=(p+)-keyno;printf(p=%d,a=%dn,p,a);p=kd;/重新将结构数组的首地址赋给结构指针p chr=*p-keyword;/相当于chr=*(p-keyword)printf(p=%d,chr=%c(adr=%d)n,p,chr,p-keyword);/相当于chr=*(p-keyword)+,赋值之后,keyword指针发/生变化 chr=*p-keyword+;printf(p=%d,chr=%c(adr=%d)n,p,chr,p-keyword);/相当于chr=(*(p-keyword))+,给chr赋值的是/*(p-keyword),所以/r(前面keyword指针指向r);/赋值之后*(p-keyword)进行加1变为s chr=(*p-keyword)+;printf(p=%d,chr=%c(adr=%d)n,p,chr,p-keyword);/给chr赋值是指针变化前所指向目标的成员数据,chr=s;/结构指针值发生变化,结构指针指向结构数组的下一个/元素,chr=*p+-keyword;printf(p=%d,chr=%c(adr=%d)n,p,chr,p-keyword);/相当于chr=*(+(p-keyword),结构指针值无变化,将/my中的y赋给chr chr=*+p-keyword;printf(p=%d,chr=%c(adr=%d)n,p,chr,p-keyword);,程序运行结果:p=158,a=123p=158,a=124p=162,a=456p=166,a=456p=158,chr=a(adr=170)p=158,chr=a(adr=171)p=158,chr=r(adr=171)p=162,chr=s(adr=174)p=162,chr=y(adr=175)注意输出结果值中地址值每次运行时可能有所不同,但地址的相对值不变。,例8.6:指向结构数组的指针的应用#include struct student/定义一个结构 int No;char name20;char sex;int age;void main()/定义一个结构数组并初始化 struct student stu3=10101,Li Lin,M,18,10102,Zhang fan,M,19,10104,Wang Min,F,20;,/定义一个结构指针变量 struct student*p;printf(No.Name Sex Agen);for(p=stu;pNo,p-name,p-sex,p-age);程序运行结果:No.Name Sex Age10101 Li Lin M 1810102 Zhang fan M 1910104 Wang Min F 20,8.3 结构在函数间的传递,将一个结构体变量的值传递给另一个函数,有3种方法:(1)用结构体变量的成员作参数,用法和用普通变量作实参是一样的,属于“值传递”方式。应当注意实参和形参的类型保持一致。由于结构是不同数据类型的数据的集合体,采用这种方法,无实用价值,实际应用时,较少采用。(2)用结构体变量作实参。ANSI C支持在调用函数时,把结构作为参数传递给函数,采取的是“值传递”的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须是同类型的结构体变量。在函数调用期间,形参也要占用内存单元。(3)用结构变量的地址或结构数组的首地址作为实参,用指向相同结构类型的结构指针作为函数的形参来接受该地址值。用结构指针作为函数的形参与用指针变量作为形参在函数间传递一样,即采用地址传递方式,把结构变量的存储首地址或结构数组名作为实参向函数传递,函数的形参是指向相同结构类型的指针接收该地址值。,例8.7,采用值传递在函数间传递结构变量,计算雇佣天数和工资。#include struct Date int day;int month;int year;int yearday;char mon_name4;int day_of_year(struct Date pd);void main()struct Date HireDate;float laborage;/存放每天的雇佣工资 printf(请输入每天的工资:);scanf(%f,printf(从%d年元月1日到%d年%d月%d日的雇佣期限:%d天,n应付给你的工钱:%-.2f元。n,HireDate.year,HireDate.year,HireDate.month,HireDate.day,HireDate.yearday,laborage*HireDate.yearday);/计算某年某月某日是这一年的第几天int day_of_year(struct Date pd)int day_tab213=0,31,28,31,30,31,30,31,31,30,31,30,31,/非闰年的每月/天数 0,31,29,31,30,31,30,31,31,30,31,30,31;/闰年的每月 天数/*为了与月份一致,列号不使用为零的下标号。行号为0是非闰年的每月天数,为1是闰年的每月天数*/int i,day,leap;/leap为0是非闰年,为1是闰年 day=pd.day;/将当月的天数加入 leap=pd.year%4=0,该程序的运行结果为:请输入每天的工资:38.5(CR)请输入年份:2000(CR)请输入月份:10(CR)请输入日:1(CR)从2000年元月1日到2000年10月1日的雇佣期限:275天,应付给你的工钱:10587.50元。,例8.8 通信录的建立和显示程序(采用地址方式传递结构变量)#include#define MAX 3/用符号常量MAX表示建立通信录人数最/大记录数struct Address/定义一个通信录的结构,包括姓名、地址/和电话 char name20;char addr50;char tel15;int input(struct Address*pt);/通信录录入函数原型void display(struct Address*pt,int n);/通信录显示函数原型void main()struct Address manMAX;/定义一个结构数组,/存放学生通信录数据 int i;for(i=0;iMAX;i+)/建立通信录 if(input(/显示通信录/*建立通信录函数的定义,形参采用传址方式传递结构数据,struct Address*pt 也可写成数组形式struct Address pt,但实质上是指针变量;每调用一次,录入一个人的通信录数据*/int input(struct Address*pt),printf(Name?);gets(pt-name);if(pt-name0=0)return 0;/输入空字符串,停止录/入,返回0 printf(Address?);gets(pt-addr);printf(Telephone?);gets(pt-tel);return 1;/正常返回1/*通信录显示函数,显示整个通信录的数据,*/void display(struct Address*pt,int n)int i;printf(name address teln);printf(-n);for(i=0;iname,pt-addr,pt-tel);,该程序运行结果为:Name?王伟Address?东八舍416室Telephone?87543641Name?李玲Address?南三舍219室Telephone?87543945Name?张利Address?东八舍419室Telephone?87543645/输入/以下为输出name address tel-王伟 东八舍416室 87543641李玲 南三舍219室 87543945张利 东八舍419室 87543645,说明:(1)该程序由三个函数组成,其中input()函数用于以人机对话方式输入数据,它的形式参数pt是结构指针,用来接收结构地址。在main()函数中调用input()函数时,实参数是&mani,它是结构数组man 中的第i个结构的地址。程序中看出,main()的for循环中,通过i的递增依次把man 中的各个结构地址传送到input(),在input()中给该结构的各个成员项输入数据。在输入过程中,对name输入零时,整个输入过程结束。(2)输入数据后,调用display()函数显示输入结果。在调用display()时,实参数是结构数组man 的首地址,从而把整个结构数组传递到函数中。display()函数用结构指针pt接收传送来的地址。然后通过pt的加一运算,依次处理各个结构的数据。,例8.9 返回结构变量的函数/*该例题中调用了一个名为str_add_int的函数,该函数返回的是一个结构类型变量,在这个例题中,同时介绍了数字串与浮点数转换的方法*/#include#include#include struct Record/定义一个结构 char str20;int num;struct Record str_add_int(struct Record x);/函数原型声明void main()struct Record p,s=“31.45”,20;/*定义结构 变量p,s,并对s初始化*/*以传递值的方式,将结构变量s传递给函数str_add_int,经过该函数对s的复制值加工处理,后,再将结果通过return语句返回给main中的另一结构变量p*/p=str_add_int(s);printf(%s%dn,s.str,s.num);printf(%s%dn,p.str,p.num);struct Record str_add_int(struct Record x)/形参x和实参s的类型一致 float e;e=atof(x.str);/将字符串x.str转换为浮/点数并赋给e e=e+x.num;/浮点数与整数相加 gcvt(e,5,x.str);/将浮点数e再转换为字/符串,并赋给x.str return x;/将处理后的结果(结构/变量)返回给调用函数程序运行结果:31.45 2051.45 20,例8.10:返回结构变量的地址即结构指针型函数C语言中,结构的存储首地址可以作为函数的返值传递给调用它的函数。返值为结构地址的函数就是结构指针型函数。/*本题中调用了一个名为find的函数,根据小汽车的代号(不为0)在一个结构数组中来查找该种汽车数据的位置,该函数返回的是一个结构类型指针,该指针指向所找到的结构变量,如未找到,返回NULL*/#include#define NULL 0struct Sample/定义一个结构,包括小汽车代号、颜色和/类型等成员 int num;char color;char type;struct Sample*find(struct Sample*pd,int n);/查找函数原型void main()int num;struct Sample*result;/定义一个结构指针变量,接收被调/用函数的返回值/定义一个结构数组并初始化,存放了所有样品汽车数据 struct Sample car=101,G,c,210,Y,m,105,R,l,222,B,s,308,P,b,0,0,0;printf(Enter the number:);scanf(%d,/输入要查找样品的代号,/*以传递地址的方式,将结构数组名car和查找代号num传递给函数find,该函数返回查找的结果,找到,返回代号所对应的样品汽车数据的地址,否则,返回NULL*/result=find(car,num);if(result-num!=NULL)/找到,显示相关汽车数据 printf(number:%dn,result-num);printf(color:%cn,result-color);printf(type:%cn,result-type);else printf(not found);/未找到,给出提示信息struct Sample*find(struct Sample*pd,int n)int i;for(i=0;pdi.num!=0;i+)if(pdi.num=n)break;/找到,退出循环 if(pdi.num!=NULL)return pd+i;/返回查找结果 else return NULL;,该程序的运行结果为:Enter the number:101/输入number:101/输出color:Gtype:c 该程序是查找结构数组car 中的有关数据。键盘输入一个整数后,调用find()函数进行查找。然后把查到的结构地址作为返值返回。因此,find()函数定义为struct sample*型。在main()中用指向相同结构的指针result接收函数返值。在car 结构数组中,用一个全零结构作为结构数组的结束标志(汽车代号不为0)。采用这种方法便于程序处理。可以看出,结构数组中的结构数目无论如何变化,函数都不需要做任何修改。结构指针型函数是以地址传递方式向调用它的函数返回结构的数据。采用这种方式,不仅可以返回某个结构的地址,也可以返回结构数组的地址,从而把函数中处理的若干结构的数据返回给调用它的函数中。,8.8 综合举例,例8.14 编程处理某班N个学生4门课的成绩,它们是数学、物理、英语和计算机,按编号从小到大的顺序依次输入学生的姓名、性别和四门课的成绩。计算每个学生的平均分,并以清晰的打印格式从高分到低分的顺序打印平均分高于全班总平均成绩的男生的成绩单。,分析:从题目的要求来看,该问题可以分成三个功能块:输入数据、排序,求总平均成绩和输出,我们把它规划成四个函数。再来看主要的数据类型或数据结构的选择,由于学生的姓名、性别、各门功课的成绩及平均成绩具有一定的关联性,作为集合数据,将其规划为一个结构体:struct studentchar name20;/姓名char sex;/性别,m代表男,f代表女float score4;/学生的各科成绩float aver;/平均成绩;,这样学生的数据就可以存放在一个结构数组中。有了上面的分析结果,我们就可以规划出三个函数的原型:(1)输入数据:void input(struct student*p,int n);第一个参数用来接收存储学生数据的结构数组的首地址,第二个参数接收学生的个数,(2)排序:void sort(struct student*p,int n);第一个参数用来接收存储学生数据的结构数组的首地址,第二个参数接收学生的个数,(3)输出:void output(struct student*p,int n,float aver);第一个参数用来接收存储学生数据的结构数组的首地址,第二个参数接收学生的个数,第三个参数接收总平均成绩(4)求总平均成绩:float average(struct student*p,int n);第一个参数用来接收存储学生数据的结构数组的首地址,第二个参数接收学生的个数,函数返回总平均成绩。,#include#include#include#define N 10/符号常量代表学生人数struct student/结构定义 char name20;char sex;float score4;float aver;/用户定义的函数原型声明void input(struct student*p,int n);void sort(struct student*p,int n);float average(struct student*p,int n);void output(struct student*p,int n,float aver);void main()struct student stuN;/定义结构数组,存储学生的相关/信息 float t_aver;/总平均成绩 input(stu,N);/录入学生信息及成绩,计算每人的/平均成绩 sort(stu,N);/按成绩排序 t_aver=average(stu,N);/计算总平均成绩 output(stu,N,t_aver);/输出高于总平均成绩的男生的成/绩单,void input(struct student*p,int n)int i,j;float per_aver;char str20;for(i=0;iname);/输入姓名 printf(input student sex:n);gets(str);p-sex=str0;/取字符串的第一个字符 printf(input student score:n);for(per_aver=0,j=0;jscorej=atof(str);/将字符串转换为浮点数 per_aver+=p-scorej;/累计当前学生各科成绩 p-aver=per_aver/4;/计算当前学生的平均成绩 return;/程序返回控制,void sort(struct student*p,int n)struct student temp;/中间变量,用于交换 int i,j;for(i=0;in-1;i+)/选择法排序 for(j=i+1;jn;j+)if(pi.averpj.aver)/降序排序 temp=pi;/结构变量交换数据 pi=pj;pj=temp;float average(struct student*p,int n)int i;float temp;for(i=0,temp=0;in;i+)temp=temp+pi.aver;/计算个人平均成绩/的累加和 return temp/n;/总平均成绩,void output(struct student*p,int n,float aver)int i;printf(Name Sex maths physics english computer averagen);printf(-);for(i=0;iaver)printf(%10s%10c%8.2f%8.2f%8.2f%8.2f%8.2fn,pi.name,pi.sex,pi.score0,pi.score1,pi.score2,pi.score3,pi.aver);,小结,本章内容是C语言数据类型的进一步扩展,特别是结构类型在软件编制中有广泛的用途。因此应重点掌握结构类型的定义、结构变量的定义及初始化、结构变量成员的引用方法,结构变量的输入、输出与赋值方法。,

    注意事项

    本文(《结构和联合》PPT课件.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开