《C语言程序设计》课件Chapter6 复杂数据类型_第1页
《C语言程序设计》课件Chapter6 复杂数据类型_第2页
《C语言程序设计》课件Chapter6 复杂数据类型_第3页
《C语言程序设计》课件Chapter6 复杂数据类型_第4页
《C语言程序设计》课件Chapter6 复杂数据类型_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第6章复杂数据类型概述在事务处理中,常需要将一些关系密切但类型不同的数据项组织在一起,并为其取一个整体名字,形成一个结构。C语言中,就称其为结构体。结构体通常由不同数据类型的数据项(成员)组成一个结构体可包含若干成员,每个成员具有自己的名字及数据类型。结构体类型的定义和简单类型不同,结构体类型是根据需要由程序员自行定义,因此在使用之前必须先定义结构体类型一般格式:struct结构体名{结构体成员表;};struct是关键字,称为结构体定义标识符,而结构体名则由程序员自己命名。大括号中的结构体成员表包含若干成员,每一个成员都具有如下的形式:数据类型标识符成员名;struct

stud_type{charname[10];longnum;charsex;intage;floatscore[5];charaddress[10];};对一个学生的描述,其结构体类型定义如下:说明:(1)

定义一个结构体类型只是描述了此结构体的组织形式,在编译时并不为其分配存储空间,即仅描述此数据结构的形态或者说模型,故不能对定义的一个结构体类型进行赋值、存取或运算。(2)

结构体的成员可以是简单变量、数组、指针、结构体等。(3)

结构体类型定义可以放在函数内部,也可以放在函数外部。若放在内部,则只在函数内有效;

若放在外部,则从定义点到源文件尾之间的所有函数都有效。(4)

结构体成员的名字可以同程序中的其它变量同名,

二者不会相混,系统会自动识别它。结构体变量结构体变量的定义(1)先定义类型再定义变量structstud_type{charname[10];longnum;charsex;intage;floatscore[5];};structstud_typestudent1,student2;(2)在定义类型的同时定义变量structstud_type{charname[10];longnum;charsex;intage;floatscore[5];}student1,student2;(3)直接定义结构体变量struct{charname[10];longnum;charsex;intage;floatscore[5];}student1,student2;

说明:(1)

在定义结构体类型时,系统并不分配内存空间,仅当定义结构体变量时,系统才为被定义的每一变量分配相应的存储单元。(2)

结构体变量的定义一定要在结构体类型定义之后或同时进行,对尚未定义的结构体类型,不能用它来定义结构体变量。结构体变量的初始化所谓结构体变量初始化,就是对其成员变量赋初值在赋值时应注意按顺序及类型依次为每个结构体成员指定初始值。一般格式:struct结构体类型名结构体变量={初始化值列表};说明:(1)初始化值列表中初始化数据之间用逗号分隔。(2)

初始化数据的个数一般与成员的个数相同,若小于成员数,则剩余的成员将被自动初始化为0。(3)

初始化数据的类型要与相应成员变量的类型一致。

初始化时只能对整个结构体变量进行,不能仅对结构体类型中的某些成员进行初始化赋值。structdate_type{intyear;intmonth;intday;};structstud_type{charname[10];longnum;charsex;structdate_typebirthday;floatscore;};main(){structstud_types1={"wang",196103,'m',1978,10,12,98};structstud_types2={"liu",196105,'m',1980,9,22,88};}结构体变量的引用对结构体变量成员的引用在C语言程序中,不允许对结构变量整体进行输入输出操作和除赋值外的各种运算,只能是对其成员进行此类操作。引用结构体变量成员的一般形式:结构体变量名.成员名其中“.”是结构体成员运算符,其优先级别最高,结合性是自左至右。如:对上例定义的结构体变量s1,s2,可如下操作:scanf("%s",);scanf("%f",&s1.score);s1.birthday.year=1978;s1.birthday.month=10;s1.birthday.day=12;s2.birthday.year=s1.birthday.year+2;printf("%s=%f",,s1.score);若有以下定义,则正确的赋值语句为

。structcomplex{floatreal;floatimage;};structvalue{intno;structcomplexcom;}val1;A)com.real=1; B)plex.real=1;C).real=1; D)val1.real=1;√例.输入一个职工的工资信息,整体赋值给另一个变量,在屏幕上输出。structym_type{inty;intm;};structsalary_type{charnum[5]; charname[17];

structym_typeym; floatsalary; floatother; floatcost;};结构体数组结构体数组的定义

structdate_type

{intyear;intmonth;intday;};structstud_type{charname[10];longnum;charsex;

structdate_typebirthday;floatscore;charaddress[10];}s1[3];structstud_type

s2[5];结构体数组的初始化stuctstud_types3[2]={{"wang",196103,'m',1978,10,12,98,"xian"},{"zhang",196102,'f',1977,1,10,87,"Beijing"}};例.用结构体数组存储学生信息,每个学生有姓名、学号和成绩。从键盘按学号顺序输入N名学生信息,再按成绩从高到低的顺序输出各学生的全部信息。

#defineN5struct{intnum;charname[11];intscore;}t,s[N];main(){

/*输入基本信息*//*选择排序成绩*//*输出基本信息*/}/*选择排序成绩*/

for(i=0;i<N-1;i++){k=i;for(j=i+1;j<N;j++)

if(s[k].score<s[j].score)k=j;if(k!=i){

t=s[i];s[i]=s[k];s[k]=t;}}/*输入基本信息*/inti,j,k;printf("\n请输入第一个学生的学号:");scanf("%d",&k);printf("\n请输入学生的姓名、成绩\n");for(i=0;i<N;i++){printf("%d",s[i].num=k+i);

scanf("%s%d",s[i].name,&s[i].score);}/*输出基本信息*/printf("按成绩排序输出:\n");for(i=0;i<N;i++)

printf("%d%-10s%5d\n",s[i].num,s[i].name,s[i].score);结构体和函数结构体成员可以作为函数的实参,而形参为与成员同类型的变量。此时传递的是单个成员值,与同类型的变量传递规则相同。例.在main()函数中,输入一个学生信息,再调用print函数输出。#include"stdio.h"structst_type{charnum[7];charname[21];charsex;intage;floatscore;};voidprint(structst_types){printf("输出:学号姓名性别年龄成绩\n");printf("%9s%20s%4c%6d%8.1f\n",s.num,,s.sex,s.age,s.score);}main(){structst_types0;printf("请输入姓名(可含空格):");gets();printf("请输入学号、性别、年龄、成绩(各项用空格分开)\n");scanf("%s%c%d%f",s0.num,&s0.sex,&s0.age,&s0.score);

print(s0);}返回值为结构体类型的函数

定义返回值为结构体类型函数的一般形式为:结构体类型名

函数名(形参表)#include"stdio.h"structst_type{charnum[7];charname[21];charsex;intage;floatscore;};main(){inti;

structst_types[2];for(i=0;i<2;i++)s[i]=input();for(i=0;i<2;i++)

print(s[i]);}

input(){structst_types0;printf(“请输入姓名、学号、性别、年龄、成绩\n");

scanf("%s%s%c%d%f",,s0.num,&s0.sex,&s0.age,&s0.score);returns0;}voidprint(

){printf("输出:学号姓名性别年龄成绩\n");printf("%11s",s0.num);printf("16s",);printf("%4c",s0.sex);printf("%8.2f\n",s0.score);}整体输入输出分行输入输出structst_typestructst_types0结构体与指针指向结构体变量的指针结构体指针变量的定义:struct结构体名

*指针变量名;structstudent{intnum;charname[20];charsex;intage;}stu;structstudent*pt=&stu;agesexnamenumstup&stu使用结构体指针变量引用成员形式(*结构体指针名).成员名结构体指针名->成员名结构体变量名.成员名structstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;(*p).nump->numstu.nump=&stu.numagesexnamenumstup&stu#include<stdio.h>#include<string.h>structplayer{intnum;charname[20];charsex;

intage;};main(){structplayerx,*p;p=&x;x.num=10011;strcpy(,"KobeBryant");

p->sex='M';p->age=39;

printf("\nNo:%d\nname:%s\nsex:%c\nscore:%d\n",(*p).num,p->name,x.sex,p->age);}结构体数组与指针structstudent{intnum;charname[20];charsex;intage;}stu[3]=

{{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19},{10103,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<stu+3;p++)printf("%-6d%s\t%-3c%d\n",

p->num,p->name,p->sex,p->age);}10101LiLinM18stu[0]pstu[1]stu[2]p+1p+210102ZhangFunM1910103WangMinF20结构体指针作函数参数用结构体变量的成员作参数---单值传递用结构体变量作参数---多值传递用指向结构体变量或数组的指针作参数---地址传递。#defineN4#include<string.h>#defineFMT"%5d%-11s%5d%8d%8d%10.1f\n"structst{intnum;charname[11];ints[3];floataver;};voidinput(){scanf("%d%s%d%d%d",&q->num,q->name,&q->s[0],&q->s[1],&q->s[2]);q->aver=(q->s[0]+q->s[1]+q->s[2])/3.0;}main(){structsta[N],*p=a;while(p<a+N)

input(p++);for(p=a;p<a+N;p++)printf(FMT,p->num,p->name,p->s[0],p->s[1],p->s[2],p->aver);}structst*q一个班体育课成绩,男生测验1500米成绩为×分×秒,女生测验柔韧性(分A、B、C、D和E5等)和仰卧起坐次数,将测验数据放在一张表中,表中包括学号、姓名、性别和体育成绩。最后一项“体育成绩”的内容根据性别填写不同的内容,编写程序,输入、输出表中的信息。共用体共用体定义的一般形式:union共用体名{成员表列;}变量表列;共用体变量所占的内存长度等于最长的成员的长度共用体变量的引用方式只有先定义了共用体变量才能引用它不能引用共用体变量,只能引用共用体变量中的成员例.一个班体育课成绩,男生测验1500米成绩为×分×秒,女生测验柔韧性(分A、B、C、D和E5等)和仰卧起坐次数,将测验数据放在一张表中,表中包括学号、姓名、性别和体育成绩。最后一项“体育成绩”的内容根据性别填写不同的内容,编写程序,输入、输出表中的信息。structMscore{intm;floats;};structFscore{charg;intn;};

structSTU{charnum[7];charname[10];charsex;

union{structMscoresm;

structFscoresf;}score;}st[N];

main(){intn,i;for(i=0;i<N;i++){printf("请输入:学号、姓名、性别\n");scanf("%s%s%c",st[i].num,st[i].name,&st[i].sex);

if(st[i].sex=='m'||st[i].sex=='M'){printf("请输入他的1500米成绩(分秒):");scanf("%d%f",&st[i].score.sm.m,&st[i].score.sm.s);}

else{printf(“请输入她的仰卧起坐次数和柔韧性等级:");scanf("%d%c",&st[i].score.sf.n,&st[i].score.sf.g);}/*输出成绩*/}/*输出成绩*/for(i=0;i<N;i++){printf(“%-8s%-10s”,st[i].num,st[i].name);

if(st[i].sex=='m'||st[i].sex=='M')printf(“男1500米:%d分%4.1f秒\n",st[i].score.sm.m,st[i].score.sm.s);

elseprintf(“女仰卧起坐:%d次,柔韧性:%c等\n",st[i].score.sf.n,st[i].score.sf.g)};共用体类型数据的特点1.同一个内存段可以用来存放几种不同类型的成员,但在每一瞬间只能存放其中一种,而不是同时都存放;2.共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用;3.共用体变量的地址和它的成员的地址都是同一地址;4.共用体类型可以出现在结构体类型定义中。枚

枚举类型定义一般形式是:enum类型标识符{枚举值名表};花括号中的枚举值形式如下:常量标识符1,常量标识符2,…,常量标识符n

enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};

枚举类型的变量

enumweekdayd1,d2;

/*定义枚举变量d1和d2*/d1=Sun;d2=d1;

正确d1=7;错误d1=(enumweekday)2;相当于d1=Tue;

enumlanguage{English=6,French,Chinese=

温馨提示

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

评论

0/150

提交评论