分校C课件第14讲结构体32-1-3节_第1页
分校C课件第14讲结构体32-1-3节_第2页
分校C课件第14讲结构体32-1-3节_第3页
分校C课件第14讲结构体32-1-3节_第4页
分校C课件第14讲结构体32-1-3节_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

第十四讲结构体相关数据的集合。数据的类型可以不相同。用来定义保存在文件中的记录。与指针一起创建动态的数据结构:链表队列栈树C语言程序设计1第十四讲结构体结构体的概念结构体类型的定义结构体变量定义和声明初始化使用结构体数组C语言程序设计本讲是教材第11章,但我们由于课时和全国C的大纲关系,第四至10节不讲,有兴趣者,自己学习.本课件后面还有一些有趣的例子,如冼牌,选举计票程序,有兴趣者也可以自学.结构体是派生的数据类型使用其他类型的对象来构造结构体。11.1定义结构体2结构体结构体数组是由相同类型的数据构成,而现实生活中由一些不相同类型的数据构成的一组数据是相当多的,例如学号、姓名和学生成绩。C语言提供了这种数据结构称为结构体,它是一种较为复杂而又非常灵活的构造型的数据类型。一个结构体类型可以由若干个成员(或域)的成分组成,不同的结构体类型其成员不同。对于一个具体的结构体而言其成员的数量是固定的(同数组),各成员的数据类型可以不同,这是结构体与数组的重要相同和不同点。3结构体类型定义的一般形式为:struct结构体名{类型名1成员名1;类型名2成员名2;……类型名n成员名n;};结构体其中,struct是关键字,是结构体类型的标志。结构体名是由用户定义的标识符,它规定了所定义的结构体类型的名称。结构体类型的组成成分称为成员,成员名的命名规则与变量名相同。如果成员的类型相同,则可以同变量一样在一个类型名后写出几个成员名,他们之间用逗号分隔。structstudent{longintxuhao;charname[8];inteng,coup,sum;floatave;};4structdate{intyear;intmonth;intday;};也可以写成:structdate{intyear,month,day;};structstudent{intnum;charname[8],sex;floatscore[4];};struct:引入结构体定义。date:结构体的名称,必须与struct一起使用。structdate结构体包含3个int*类型的成员:yearMonthday例如A:这里structstudent结构体包含有:Int型num(学号)charname[8](姓名),sex(性别)Floatscore[4](成绩数组)例如B:5结构体类型的定义结构体定义说明同一个结构体内不可以有同名的成员。不同结构体的成员名可以相同,不互相冲突。结构体structdate{intyear,month,day;};structBook{

chartitle[50],writer[20],publisher[50];

intyear,month;};intyear,month,day;6结构体类型的定义结构体定义说明结构体的成员可以是基本类型和构造类型(数组和其他结构体)。结构体structdate{intyear,month,day;}birthday;structStuRec{intnum;charname[20]; //这里包含了数组

structdatebirthday; //这里包含了上面的结构体,称结构体的嵌套};结构体的成员不可以包含自身但可以包含自身的指针structstudent{charname[20];chargender;floatscores[4];

structstudentnext;/*error*/

structstudent*nextPtr;/*correct*/};7结构体定义说明只是创建了新的数据类型,并不能保留内存空间。必须定义结构体变量来获得内存空间。定义(声明)结构体变量有三种方法:定义结构体类型后,像声明普通变量一样声明结构体变量。结构体structdate{intyear,month,day;};structdatebirth;yearmonthdayFF00FF04FF08birthbirth的存储形式TC中与VC中的不同11.2定义和使用结构体变量8结构体变量定义声明结构体变量2.在定义结构体类型的同时,声明结构体变量结构体structdate{intyear,month,day;}birth,days[4],*bPtr;struct{intyear,month,day;}birth,days[4],*bPtr;没有结构体名,无法再次使用。3.直接(只)声明结构体变量省略类型名。⑴类型与变量是不同的概念,注意区分。系统能对变量赋值、存取、运算,而类型则不能,编译时,系统只对变量分配存储空间,而类型则不分配。⑵结构体中的成员也可以是一个结构体变量,即结构体的嵌套。9structstudent

/*student是结构体名,结构体成员有num,name,sex,date,scre[4]*/

{int

num;

char

name[8],sex;

struct

date

/*date是结构体名,其结构体变量表是birthday,成员包括年月日*/

{int

year,month,day;}birthday;

floatscore[4];

/*score[4]是数组,数组成员类型浮点型*/

}xuesh;⑶结构体中的成员名可以和程序中的变量同名;不同结构体中的成员名也可以同名。11.4结构体的嵌套10结构体的操作结构体变量可以执行的操作将结构体变量赋给相同类型的结构体变量。得到结构体变量的地址。访问结构体变量的成员。使用sizeof确(测)定结构体变量的大小。结构体11结构体变量的初始化给全部成员赋初值结构体structstudent{intnum;

charname[8],sex;structdate{intyear,month,day;}birthday;

floatsco[4];}xuesh={101,“王小宁”,‘F’,1975,5,21,83.6,88,75.5,90};将结构体变量各成员的初值顺序地放在一对大括号中,并用逗号分隔。对结构体类型变量赋初值时,按每个成员在结构体中的顺序一一对应赋值。同变量一样结构体变量在定义时也可以进行初始化。12结构体变量的初始化初始化结构体变量给部分成员赋初值。结构体structStuRec{

intnum;

charname[20];

structdate{intyear,month,day;}birthday;

floatscore;}student={101,“王小宁”};num(2B)name(20B)birthday(6B)score(4B)yearmonthday101王小宁0000.013访问结构体成员的两种方式结构体成员运算符:.用于结构体变量结构体指针运算符:->用于指向结构体的指针等价于(*cardPtr).face结构体structcardmyCard;printf(“%s”,myCard.face);structcard*cardPtr;printf(“%s”,cardPtr->face);structcard{char*face;char*suit;}myCard.face;11.5结构体指针14案例分析:结构体变量的成员问题:访问结构体变量的成员。(cw1301.c)结构体#include<stdio.h>structcard{

char*face;

char*suit;}a;Intmain(){

structcarda,*aPtr;a.face="Ace";a.suit="Spades";

aPtr=&a;printf("%s%s%s\n%s%s%s\n%s%s%s\n", a.face,"of",a.suit, aPtr->face,"of",aPtr->suit, (*aPtr).face,"of",(*aPtr).suit);}与数组的不同:结构变量名不是指针AceofSpadesAceofSpadesAceofSpades注意:结构不能作为整体输入输出。必须逐个成员输入输出。15问题:编写函数实现结构体的复制。结构体#include<stdio.h>structdate

{intyear,month,day;};voidshow(char*,structdate);voidcopy(structdate,structdate);voidclone(structdate,structdate*);intmain(){

structdated1,d2,d3,d4;d1.year=2004;d1.month=5;d1.day=1;show(“d1”,d1);//结构体变量作实参,值传递

d2=d1;show("d2",d2);实现(cw1302.c)11.6结构体与函数16案例分析:结构体作为函数的参数结构体copy(d1,d3);show("d3",d3);clone(d1,&d4);show("d4",d4);}voidshow(char*name,structdated){printf("%s:%d-%d-%d\n",name,d.year,d.month,d.day);}voidcopy(structdates,structdated){d=s;}voidclone(structdates,structdate*dPtr){*dPtr=s;}d1:2004-5-1d2:2004-5-1d3:0-0-24(TC)在VC中运行的结果不一样-858993460-858993460-858993460d4:2004-5-1用指针作形参用地址作实参传递//结构体变量作实参,值传递,d3未赋值作实参值不确定空返回,无值返回(cw1302.c)续17一、结构体数组的定义定义结构体数组的方法和定义结构体变量的方法一样,只是必须说明其为数组。定义结构体变量的三种方法都可以用来定义结构体数组。二、结构体数组的初始化和一般数组一样,结构体数组也可以进行初始化。数组每个元素的初值都放在一对大括号中,括号中依次排列元素各成员的初始值三、结构体数组的引用对结构体数组的引用一般是对数组元素的成员进行引用。引用只要遵循对数组元素的引用规则和对结构体变量成员的引用规则即可。11.3定义结构体数组18结构体数组结构体数组数组的元素是结构体变量。常用结构体来表示记录,那么结构体数组就可以表示一组记录。案例分析全班N个学生,每个学生有学号、姓名、四门课的成绩。结构体学号姓名成绩1成绩2成绩3成绩4101WangHai80787681102ZhaoFei68667175………………………………130LiRui8276818419结构体数组结构体数组案例分析那么,可以定义结构体数组来保存N个学生的数据。这样,每个学生的数据就对应一个结构体变量(一条记录),便于编程处理。结构体structstudent{

intnum;

charname[20];

floatscores[4];};structstudentstudents[30];20程序举例设某班有N名学生,每个学生数据包括学号,姓名,性别,年龄,平均成绩。要求输入任意一个学号,输出该学生的所有数据。分析:从一组数据中查找所需要的具有某特征的内容,最简单的是顺序查找。直到找到或找完为止。/*Cw1303.c教材P171L11-1*/#include<stdio.h>#defineN2structstudent

//定义结构体{longintnum;

//学号

charname[7];

//姓名

charsex[3];

//性别

intage,score;

//成绩}stu[N];

//定义结构体数组main(){inti,t=-1;

//t=-1为未查找到时的标志

longintxuehao;

//查找学号变量

structstudentstu[N];

//定义结构体类型数组(cw1303.c)案例分析:结构体数组21printf("请按下列顺序输入%d个学生的信息:\n",N);//为结构体变量赋值printf("\t学号姓名性别年龄平均\n");for(i=0;i<N;i++){printf("NO%d:\t",i+1);scanf("%ld%s%s%d%d",&stu[i].num,&stu[i].name,&stu[i].sex,&stu[i].age,&stu[i].score);}printf("请输入需查找学生的学号:");scanf("%ld",&xuehao);for(i=0;i<N;i++){if(xuehao==stu[i].num){t=i;break;}}if(t!=-1)/*以下输出检索结果*/printf("%ld%8s%4s%4d%4d\n",stu[t].num,stu[t].name,stu[t].sex,stu[t].age,stu[t].score);elseprintf("查无此人!\n");}(cw1303.c)续22案例分析:结构体数组检索问题:某班有n个学生,每个学生的数据包括学号、姓名、年龄和性别。要求给定任意一个学号,程序能输出检索的结果,并显示对应的学生的数据。分析定义结构体表示学生用结构体数组保存学生数据采用顺序查找法结构体输入学生信息输入查询条件查找学生信息,报告结果23案例分析:结构体数组检索实现(cw1304.c)结构体#include<stdio.h>#defineMAX20intmain(){structStuRec{ intnum; charname[20]; chargender; intage;}

student[MAX];inti,N,num;24案例分析:结构体数组检索实现结构体printf("\tInputaintegerasthenumberofstudents:");scanf("%d",&N);printf("\tInput%dstudents'information:\n",N);printf("\n\tNo.\tName\tGender\tAge\n");for(i=0;i<N;i++){printf("student%d:\n\t",i+1);scanf("%d%s%c%d",&student[i].num,student[i].name,&student[i].gender,&student[i].age);}(cw1304.c)续25案例分析:结构体数组检索实现结构体printf("\n\tInputanumber:");scanf("%d",&num);printf("\n\tPleasewait.Searching...\n");

for(i=0;i<N;i++)if(num==student[i].num)break;

if(i<N){printf("\n\tNo.:%d\n\tName:%s\n\tGender:%c\n\tAge:%d\n",student[i].num, student[i].name, student[i].gender, student[i].age);}

elseprintf("\n\tNotfound!\n");}输入查找条件查找(cw1304.c)续26案例分析:结构体数组检索问题:可以多次查找。结构体输入学生信息输入查询条件查找学生信息,报告结果是否继续查询YN人机交互27案例分析:结构体数组检索实现(cw1304m.c)部分代码结构体do{scanf("%d",&num);

for(i=0;i<N;i++)if(num==student[i].num) break;

if(i<N) {/*Found!*/}

else

printf("\n\tNotfound!\n");printf("\n\tContinue?(y/n)");c=getchar();}while(c=='y'||c=='Y');1001<Enter>y<Enter>(cw1304.c)续28小结:知识要点结构体是由若干个不同类型数据项构成的集合。结构体类型的定义:1.结构体类型定义的一般形式 2.结构体类型定义中的注意事项结构体类型变量:结构体数组:1.结构体数组定义的三种方法2.结构体数组的初始化3.对结构体数组元素的成员进行引用1.结构体类型变量定义的三种方法2.结构体类型变量的初始化3.对结构体变量中成员的引用4.对整个结构体变量的引用29#include<stdio.h> //预处理调用输入输出头文件#include<stdlib.h>//#defineN10 //定义符号常量structstu //定义结构体{ longintsno; //学号长整型

intscore[4]; //成绩浮点数一维数组三元素}stud[N]; //定义结构体数组voidsort(structstuarr[]) //定义结构体数组成绩排序{ inti,j; //定义循环变量

structstutemp; //定义结构体临时变量

for(i=0;i<N;i++

温馨提示

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

评论

0/150

提交评论