关闭

关闭

关闭

封号提示

内容

首页 9.C语言结构体.PPT

9.C语言结构体.PPT

9.C语言结构体.PPT

上传者: wanroutianze 2011-08-27 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《9.C语言结构体ppt》,可适用于高等教育领域,主题内容包含第九章第九章概述在前面所见到的程序中所用的变量大多数是互相独立的、无内在联系的。例如定义了整型变量a,b,c,它们都是单独存在的变量在内存中的地址也符等。

第九章第九章概述在前面所见到的程序中所用的变量大多数是互相独立的、无内在联系的。例如定义了整型变量a,b,c,它们都是单独存在的变量在内存中的地址也是互不相干的但在实际生活和工作中有些数据是有内在联系的。例如一个学生有学号姓名性别年龄地址等属性是属于同一个学生的。intnumcharnamecharsexintageintscorecharaddr概述如果将numnamesexagescoreaddr分别定义为互相独立的简单变量难以反映它们之间的内在联系而且这些数据的类型是不相同的。人们要求把这些类型不同的数据组成一个组合数据如定义一个名为student的变量在这个变量中包括学生的学号、姓名、性别等信息。这样使用起来就方便多了。结构体结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体自定义数据类型结构体类型定义struct结构体名{类型名成员名类型名成员名……………}“成员表列”也称为“域表”成员名命名规则与变量名相同。struct是关键字,不能省略合法标识符注意最后又一个分号例structstudent{intnumcharnamecharsexintagefloatscorecharaddr}经过上面的指定structstudent就是一个在程序中可以使用的合法类型名它和系统提供的标准类型(如int,char,float等)具有同样的作用都可以用来定义变量的类型只不过int等类型是系统定义的而结构体类型是由用户根据需要在程序中指定的。定义结构体类型变量的方法定义结构体类型变量的方法可以采取以下种方法定义结构体类型变量:()先声明结构体类型再定义变量名例如:structstudentstudent,student|||结构体类型名结构体变量名定义了student和student为structstudent类型的变量即它们具有structstudent类型的结构在定义了结构体变量后系统会为之分配内存单元。例如:student和student在内存中各占个字节(=)。()在声明类型的同时定义变量这种形式的定义的一般形式为:struct 结构体名{成员表列}变量名表列例如:structstudent{intnumcharnamecharsexintagefloatscorecharaddr   }student,student它的作用与第一种方法相同即定义了两个structstudent类型的变量:student,student()不指定类型名直接定义结构体类型变量其一般形式为:struct{    成员表列   }变量名表列即不出现结构体名。这种形式指定了一个无名的结构体类型它没有名字。显然不能再以此结构体类型去定义其他变量。这种方式用得不多。成员可以是另一个结构体变量例如:structdate*声明一个结构体类型strcutdate*   {intmonthintdayintyear}structstudent*声明一个结构体类型strcutstudent*{intnumcharnamecharsexintagestructdatebirthday*birthday是structdate类型*charaddr}先声明一个structdate类型它代表“日期”包括个成员:month(月)、day(日)、year(年)。然后在声明structstudent类型时将成员birthday指定为structdate类型。已声明的类型structdate与其他类型一样可以用来定义成员的类型。成员可以是另一个结构体变量结构体变量的初始化形式一:struct结构体名{类型标识符成员名类型标识符成员名……………}struct结构体名结构体变量={初始数据}例structstudent{intnumcharnamecharsexintagecharaddr}structstudentstu={,“WangLin”,‘M’,,“BeijingRoad”}形式二:(用的最多)struct结构体名{类型标识符成员名类型标识符成员名……………}结构体变量={初始数据}例structstudent{intnumcharnamecharsexintagecharaddr}stu={,“WangLin”,‘M’,,“BeijingRoad”}形式三:struct{类型标识符成员名类型标识符成员名……………}结构体变量={初始数据}例struct{intnumcharnamecharsexintagecharaddr}stu={,“WangLin”,‘M’,,“BeijingRoad”}例对结构体变量初始化#include<stdioh>voidmain(){structstudent{intnumcharnamecharsexcharaddr}a={″LiLin″′M′″BeijingRoad″}*对结构体变量a赋初值*printf(″No:dnname:snsex:cnaddress:sn″anumanameasexaaddr)  } 运行结果:No:name:LiLinsex:Maddress:BeijingRoad结构体变量的引用结构体变量的引用在定义了结构体变量以后,当然可以引用这个变量。但应遵守以下规则:()不能将一个结构体变量作为一个整体进行输入和输出。例如:已定义student和student为结构体变量并且它们已有值。printf(″d,s,c,d,f,\n″,student)引用结构体变量中成员的方式为结构体变量名成员名例如:studentnum表示student变量中的num成员,即student的num(学号)项。可以对变量的成员赋值,例如:studentnum=“”是成员(分量)运算符,它在所有的运算符中优先级最高,因此可以把studentnum作为一个整体来看待。上面赋值语句的作用是将整数赋给student变量中的成员num。()如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。例如:对上面定义的结构体变量student,可以这样访问各成员:studentnumstudentbirthdaymonth注意:不能用studentbirthday来访问student变量中的成员birthday,因为birthday本身是一个结构体变量。()对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。例如:studentscore=studentscoresum=studentscorestudentscorestudentagestudentage由于“.”运算符的优先级最高因此studentage是对studentage进行自加运算而不是先对age进行自加运算。()可以引用结构体变量成员的地址也可以引用结构体变量的地址。例如:scanf(″d″studentnum)(输入studentnum的值)printf(″o″&student)(输出student的首地址)但不能用以下语句整体读入结构体变量例如:scanf(″d%s%c%d%f%s″&student)结构体数组结构体数组一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算显然应该用数组这就是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据它们都分别包括各个成员(分量)项。定义结构体数组和定义结构体变量的方法相仿只需说明其为数组即可。例如:structstudent{intnumcharnamecharsexintagefloatscorecharaddr}structstudentstu以上定义了一个数组stu数组有3个元素均为structstudent类型数据。也可以直接定义一个结构体数组例如:structstudent{intnum…}stu结构体数组的初始化与其他类型的数组一样对结构体数组可以初始化例如:structstudent{intnumcharnamecharsexintagefloatscorecharaddr }stu[]={{″LiLin″′M′″BeijingRoad″}{″ZhangFun″′M′″ShanghaiRoad″}} 当然数组的初始化也可以用以下形式:structstudent   {intnum…}structstudent str={{…},{…},{…}}即先声明结构体类型然后定义数组为该结构体类型在定义数组时初始化。结构体数组初始化的一般形式是在定义数组的后面加上“={初值表列}”。例对候选人得票的统计程序。设有个候选人每次输入一个得票的候选人的名字要求最后输出各人得票结果。#include<stringh>#include<stdioh>structperson{charnameintcount}leader={“Li”,,“Zhang”,,“Fan”,}*定义结构体数组并初始化*结构体数组应用举例例对候选人得票的统计程序。设有个候选人每次输入一个得票的候选人的名字要求最后输出各人得票结果。#include<stringh>#include<stdioh>structperson{charnameintcount}leader={“Li”,,“Zhang”,,“Fan”,}*定义结构体数组并初始化*voidmain(){inti,jcharleadernamefor(i=i<=i){scanf(“s”,leadername)for(j=j<j)if(strcmp(leadername,leaderjname)==)leaderjcount}printf(“n”)for(i=i<i)printf(“s:dn”,leaderiname,leadericount)}voidmain(){inti,jcharleadernamefor(i=i<=i){scanf(“s”,leadername)for(j=j<j)if(strcmp(leadername,leaderjname)==)leaderjcount}printf(“n”)for(i=i<i)printf(“s:dn”,leaderiname,leadericount)}运行结果:LiLi  Fan  Zhang ZhangFan  Li  Fan  Zhang  LiResoult:  Li:4  Zhang:3  Fan:3程序定义一个全局的结构体数组leader它有3个元素每一个元素包含两个成员name(姓名)和count(票数)。在定义数组时使之初始化使位候选人的票数都先置零。 在主函数中定义字符数组leadername它代表被选人的姓名在次循环中每次先输入一个被选人的具体人名然后把它与个候选人姓名相比看它和哪一个候选人的名字相同。在输入和统计结束之后将人的名字和得票数输出。 指向结构体类型数据的指针指向结构体类型数据的指针一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量用来指向一个结构体变量此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。指向结构体变量的指针下面通过一个简单例子来说明指向结构体变量的指针变量的应用。例指向结构体变量的指针的应用#include<stringh>#include<stdioh>voidmain(){structstudent{longnumcharnamecharsexfloatscore}structstudentstustructstudent*pp=stustunum=strcpy(stuname,”LiLin”)stusex=‘M’stuscore=printf(″No:ld\nname:s\nsex:c\nscore:f\n″stunumstunamestusexstuscore)printf(″No:ld\nname:s\nsex:c\nscore:f\n″(*p)num(*p)name(*p)sex(*p)score)}例指向结构体变量的指针的应用#include<stringh>#include<stdioh>voidmain(){structstudent{longnumcharnamecharsexfloatscore}structstudentstustructstudent*pp=stustunum=strcpy(stuname,”LiLin”)stusex=‘M’stuscore=printf(″No:ld\nname:s\nsex:c\nscore:f\n″stunumstunamestusexstuscore)printf(″No:ld\nname:s\nsex:c\nscore:f\n″(*p)num(*p)name(*p)sex(*p)score)}定义指针变量p指向structstudent类型的数据p指向的结构体变量中的成员运行结果:No.:      name:LiLinsex:Mscore:No.:      name:LiLinsex:Mscore: 程序分析:在函数的执行部分将结构体变量stu的起始地址赋给指针变量p也就是使p指向stu,然后对stu的各成员赋值。第一个printf函数是输出stu的各个成员的值。用stunum表示stu中的成员num依此类推。第二个printf函数也是用来输出stu各成员的值但使用的是(*p)num这样的形式。为了使用方便和直观C语言允许把(*p)num改用p>num来代替它表示p所指向的结构体变量中的num成员。以下种形式等价:结构体变量.成员名(*p).成员名p>成员名其中>称为指向运算符。指向结构体变量的指针变量也可以用来指向结构体数组元素。请分析以下几种运算:p>n得到p指向的结构体变量中的成员n的值。p>n++ 得到p指向的结构体变量中的成员n的值用完该值后使它加1。++p>n 得到p指向的结构体变量中的成员n的值加1然后再使用它。例指向结构体数组的指针的应用#include<stdioh>structstudent{intnumcharnamecharsexintage}structstudentstu={{”LiLin”’M’}{”ZhangFun”’M’},{”WangMing”’F’}}voidmain(){structstudent*pprintf(″NoNamesexage\n″)for(p=stup<stu3p)printf(“dscd\n”,p>nump>namep>sexp>age)}例指向结构体数组的指针的应用#include<stdioh>structstudent{intnumcharnamecharsexintage}structstudentstu={{”LiLin”’M’}{”ZhangFun”’M’},{”WangMing”’F’}}voidmain(){structstudent*pprintf(″NoNamesexage\n″)for(p=stup<stu3p)printf(“dscd\n”,p>nump>namep>sexp>age)}运行结果:No. Name sexage 10101LiLinM  10102 ZhangFun M  10104WangMing F   注意:()如果p的初值为stu即指向第一个元素则p加1后p就指向下一个元素。例如:(p)>num 先使p自加1然后得到它指向的元素中的num成员值(即)。(p)>num 先得到p>num的值(即)然后使p自加1指向stu。请注意以上二者的不同。注意:()程序已定义了p是一个指向structstudent类型数据的指针变量它用来指向一个structstudent类型的数据,不应用来指向stu数组元素中的某一成员。例如:p=stuname如果要将某一成员的地址赋给p可以用强制类型转换先将成员的地址转换成p的类型。例如:p=(structstudent*)stuname用结构体变量和指向结构体的指针作函数参数将一个结构体变量的值传递给另一个函数有个方法:()用结构体变量的成员作参数。例如用stunum或stuname作函数实参将实参值传给形参。其用法和用普通变量作实参是一样的属于“值传递”方式。应当注意实参与形参的类型保持一致。将一个结构体变量的值传递给另一个函数有个方法:()用结构体变量作实参。用结构体变量作实参时采取的也是“值传递”方式将结构体变量所占的内存单元的内容全部顺序传递给形参形参也必须是同类型的结构体变量。这种传递方式在空间和时间上开销较大因此一般较少采用这种方法。()用指向结构体变量(或数组)的指针作实参将结构体变量(或数组)的地址传给形参。例有N个结构体变量stu内含学生学号、姓名和门课程的成绩要求输出平均成绩最高的学生的信息(包括学号、姓名、门课程成绩和平均成绩)。解题思路:按照功能函数化的思想分别用个函数来实现不同的功能:()用input函数来输入数据和求各学生平均成绩。()用max函数来找平均成绩最高的学生。()用print函数来输出成绩最高学生的信息。在主函数中先后调用这个函数用指向结构体变量的指针作实参最后得到结果。#include<stdioh>#defineN学生数为structstudent声明结构体类型structstudent{intnum学号charname姓名floatscore门课成绩floataver}平均成绩voidmain(){voidinput(structstudentstu)函数声明structstudentmax(structstudentstu)voidprint(structstudentstu)structstudentstuN,*p=stu定义结构体变量和指针input(p)调用input函数print(max(p))调用print函数以max函数的返回值为实参}voidinput(structstudentstu){intiprintf(“请输入各学生的信息:学号、姓名、三门课成绩:n”)for(i=i<Ni){scanf(“dsfff”, stuinum,stuiname,stuiscore,stuiscore,stuiscore)stuiaver=(stuiscorestuiscore,stuiscore)求各人平均成绩}}structstudentmax(structstudentstu){inti,m=for(i=i<Ni)if(stuiaver>stumaver)m=i找出平均成绩最高的学生在数组中的序号returnstum返回包含该生信息的结构体元素}voidprint(structstudentstud){printf(“n成绩最高的学生是:n”)printf(“学号:dn姓名:sn三门课成绩:f,f,fn平均成绩:fn”,studnum,studname,studscore,studscore,studscore,studaver)}运行结果:请输入各学生的信息:学号、姓名、三门课成绩:LiWangFun成绩最高的学生是:学号:姓名:Li三门课成绩:平均成绩:练习题练习题设有如下定义:structsk{intafloatb}dataint*p若要使p指向data中的a域正确的赋值语句是()A)p=aB)p=dataaC)p=dataaD)*p=dataaC练习题练习题以下程序的输出结果是()structabc{inta,b,c}main(){structabcs={{,},{,,}}inttt=sasbprintf(“dn”,t)}A)B)C)D)C练习题练习题若定义如下结构则能打印出字母M的语句是()structperson{charnameintage}structpersonclass={"Wujun",,"Liudan",,"Maling",,"zhangming",}A)printf("cn",classname)B)printf("cn",classname)C)printf("cn",classname)D)printf("cn",classname)B

职业精品

用户评论

0/200
    暂无评论

精彩专题

上传我的资料

热门资料

资料评价:

/47
0下载券 下载 加入VIP, 送下载券

意见
反馈

返回
顶部