首页 2004-2-12-C语言——结构

2004-2-12-C语言——结构

举报
开通vip

2004-2-12-C语言——结构结构结构的定义与使用结构的基本应用结构与数组的关系结构与指针的关系结构与函数的关系链表简单应用本章要点第十章结构、联合与枚举类型第一节结构类型第二节结构与数组第三节结构与指针第四节结构与函数第五节联合第六节枚举第七节用typedef定义数据类型第八节链表基础§10-1结构类型提出问题 一个学生有学号/姓名/性别/年龄/地址等属性: intnum; charname[20]; charsex; intage; intcharaddr[30]; 如果将这些属性分别定义为互相独立变量中,则难以反映出属性...

2004-2-12-C语言——结构
结构结构的定义与使用结构的基本应用结构与数组的关系结构与指针的关系结构与函数的关系链 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 简单应用本章要点第十章结构、联合与枚举类型第一节结构类型第二节结构与数组第三节结构与指针第四节结构与函数第五节联合第六节枚举第七节用typedef定义数据类型第八节链表基础§10-1结构类型提出问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 一个学生有学号/姓名/性别/年龄/地址等属性: intnum; charname[20]; charsex; intage; intcharaddr[30]; 如果将这些属性分别定义为互相独立变量中,则难以反映出属性之间的内在联系——同一个学生的相关属性。§10-1结构类型结构的定义 结构是逻辑上相互联系的一组分量的集合。 结构中的分量可以是不同类型的数据,结构中的分量称为结构的成员。 在使用结构之前,首先要对结构的组成进行描述,称为结构的定义。 结构定义说明了该结构的组成成员,以及每个成员的类型。§10-1结构类型结构定义的一般形式 struct结构类型名称 {数据类型成员名1; 数据类型成员名2;…… 数据类型成员名n; };§10-1结构类型说明: struct为关键字。 结构类型名称是所定义的结构类型标识,由用户自己定义; {}中包围的是组成该结构的成员; 每个成员的数据类型既可以是简单的数据类型(int、char、float、double...),也可以是复杂的构造数据类型(数组类型或结构类型)。§10-1结构类型结构定义实例为了描述日期可以定义如下结构: structdate{ intyear; /*年。整型作为结构中的成员*/ intmonth; /*月*/ intday; /*日*/};§10-1结构类型结构定义实例为了处理通信录,可以定义如下结构: structaddress{ charname[30];/*姓名。字符数组作为结构中的成员*/ charstreet[40]; /*街道名称*/ charcity[20]; /*城市*/ charstate[2]; /*省市代码*/ unsignedlongzip;/*邮政编码。无符号长整型*/ };§10-1结构类型结构变量的说明 C语言提供的基本数据类型,例如int/long/double等,都是由系统事先定义好的,我们可直接使用。 在使用变量之前,要先声明(说明)变量。 结构是一种构造型数据类型,结构定义描述了结构的组成。 要使用结构必须先说明结构类型的变量。 定义结构是定义了一种由成员组成的复合类型,而只有用这种结构类型说明了一个变量,才会产生具体的实体(变量)。§10-1结构类型结构变量说明的一般形式 struct结构类型名称结构变量名; 系统为所说明的结构变量按照结构定义时说明的组成(成员分量),分配存储数据的实际内存单元。 例:将变量today说明为date型的结构变量: structdatetoday; 说明多个address型的结构变量: structaddresswang,li,zhang; 结构变量同样有存储类型,存储特性与一般变量完全相同。§10-1结构类型结构变量占用内存情况 结构变量的各个成员分量在内存中占用连续存储区域,所占内存大小为结构中每个成员分量占用内存的长度之和。2字节2字节2字节today(structdate)6个字节yearmonthdaywang(structaddress)96个字节30字节40字节20字节2字节4字节namestreetcitystatezip§10-1结构类型求结构变量占用内存大小——sizeof运算sizeof是单目运算,其功能是求出运算对象所占的内存空间的字节数目。 使用的一般形式为:sizeof(变量或类型说明符)2字节2字节2字节today(structdate)6个字节yearmonthdaywang(structaddress)96个字节30字节40字节20字节2字节4字节namestreetcitystatezip§10-1结构类型例C10-1.C:sizeof运算的意义。intmain() {charstr[20]; structdate /*定义结构date*/ { intyear,month,day; }today; /*说明结构变量today*/ structaddress /*定义结构address*/ { charname[30],street[40],city[20],state[2]; unsignedlongintzip; }wang; /*说明结构变量wang*/ ...... }§10-1结构类型例C10-1.C:sizeof运算的意义。 printf("char:%d\t",sizeof(char)); printf("int:%d\t",sizeof(int)); printf("long:%d\t",sizeof(long)); printf("float:%d\n",sizeof(float)); printf("double:%d\t",sizeof(double)); printf("str:%d\t",sizeof(str));printf("date:%d\t",sizeof(structdate)); printf(“today:%d\t",sizeof(today)); printf("wang:%d\n",sizeof(wang));§10-1结构类型关于结构类型的说明类型与变量是不同的概念。在定义结构变量时一般先定义一个结构类型,然后再说明变量为该结构类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对说明的变量分配空间。§10-1结构类型关于结构类型的说明对结构中的成员,可以单独使用,它的作用与地位相当于普通变量。成员也可以是结构。成员名可以与程序中的变量名相同,二者代表不同的对象。§10-1结构类型例如:structdate {intmonth; intday; intyear; }; structstudent {intnum; charname[20]; chargender; intage; structdatebirthday; charaddr[30]; }student1,student2;程序中可以另定义一个变量year,它和structdate中的成员year是两回事,互不干扰。dmybirthdayage…namenumaddr§10-1结构类型引用结构变量中的成员分量访问结构中的成员是通过成员的名字,称为“按名引用”。在程序中使用结构中成员的方法为:结构变量名.成员名称 例如:将变量today赋值为:2007/12/20,则要对其各个成员分别赋值: today.year=2007;today.month=12;today.day=20;指明结构成员的符号“.”是运算符,含义是访问结构中的成员。“.”操作的优先级最高。结合性为从左到右。 §10-1结构类型 structperson /*定义person结构类型*/ {charname[30]; chargender; structdatebirthday;/*结构的嵌套定义*/ }man; man:1980年3月28日出生的zhang先生: strcpy(man.name,”zhang”); /*注意:不能写成man.name="zhang";*/ man.gender=’M’;/*为结构中的字符成员赋值*/ man.birthday.year=1980; man.birthday.month=3; man.birthday.day=28; /*为嵌套定义的结构中的成员赋值*/用结构描述一个人的基本情况。§10-1结构类型如果要将“zhang”改为“zhong”,只要将结构变量man中的数组成员name下标为2的元素‘a’改为‘o’即可。可以使用下列语句: man.name[2]='o';为结构变量中的数组成员的一个元素赋值。§10-1结构类型对结构变量的整体操作 能够对结构进行整体操作的运算符只有:赋值:=取地址:& 例如: structdatesunday,today; sunday=today;/*结构变量整体赋值*/§10-1结构类型结构类型的引用说明不能将一个结构变量作为一个整体直接访问。例如,已定义student1为结构变量并且已有值。 不能这样引用:printf(”%s,%c,%d,%d,%d\n”,student1);如果成员本身又是一个结构类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。§10-1结构类型结构类型的引用说明只能对最低级的成员进行赋值或存取以及运算。 例如,对上面定义的结构变量student1,可以这样访问各个成员: student1.name student1.gender student1.birthday.month student1.birthday.day student1.birthday.year§10-1结构类型对成员变量可以象普通变量一样进行各种运算。 student2.birthday.year=student1.birthday.year; sum=student1.birthday.month+12; student1.age++; ++student1.age;可以引用成员的地址,也可引用结构变量的地址。 例如:scanf(”%d”,&student1.num); printf(”%p”,&student1); 但不能用以下语句整体读入结构变量。例如: scanf(”%d,%s,%c,%d,%d,%d,%s”,&student1);§10-1结构类型例C10-2.C:输入今天的日期,然后输出该日期。 #include<stdio.h> main() {structdate/*在函数中定义结构类型date*/{intyear,month,day; }; structdatetoday;/*说明结构变量today*/ printf("Entertodaydate:"); scanf("%d%d%d",&today.year,&today.month,&today.day);printf("Today:%d.%d.%d\n",today.year,today.month,today.day); }§10-1结构类型对结构变量进行初始化在说明变量的同时,可以对每个成员置初值,称为结构的初始化。和数组一样,只有当结构体变量为全局变量或静态变量时,才能进行初始化。不能对自动变量进行初始化。结构初始化的一般形式:struct结构类型名称结构变量={初始化数据}; {}中的初始化数据用逗号分隔。初始化数据的个数与结构成员的个数应相同,它们是按成员的先后顺序一一对应赋值的。每个初始化数据必须符合与其对应的成员的数据类型。§10-1结构类型 structdate/*在函数的外部定义结构date*/{ intyear,month,day;}; structperson/*在函数外定义结构person*/ {charname[14],sex; structdatebirthday; }; 对date类型的变量,可以进行初始化: structdatetoday={1992,10,1}; 又如对变量man的初始化可以用如下形式: structpersonman ={"zhao",'M',{1980,3,28}};§10-1结构类型例C10-3.C:用结构描述个人基本情况,打印个人档案。 structpersonxu={"Xulihui",'M',{1962,10,4}}; main() {staticstructpersonfang={"Fangjin",'M',{1963,9,13}}; staticstructpersonyuan={"Yuanzhiping",'M',1963,10,5}; /*说明内部静态结构变量fang、yuan,并初始化结构变量*/ §10-1结构类型例C10-3.C:用结构描述个人基本情况,打印个人档案。…… printf("namegenderbirthday\n"); printf("-------------------------------\n"); printf("%-14s%-4c%4d.%2d.%2d\n",xu.name,xu.gender,xu.birthday.year,xu.birthday.month,xu.birthday.day); printf("%-14s%-4c%4d.%2d.%2d\n",fang.name,fang.gender,fang.birthday.year,fang.birthday.month,fang.birthday.day); printf("%-14s%-4c%4d.%2d.%2d\n",yuan.name,yuan.gender,yuan.birthday.year,yuan.birthday.month,yuan.birthday.day);}§10-2结构与数组结构与数组的关系在结构中使用数组类型作为结构的一个成员;用结构类型作为数组元素的基类型构成数组。§10-2结构与数组结构数组 结构数组是一个数组,数组中的每一个元素都是结构类型。 说明结构数组的方法:先定义一个结构,再用结构类型说明一个数组变量。 例: 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 100个人的基本情况。 可说明一个有100个元素的数组。数组的基类型为结构,在说明数组时可以写成:structpersonman[100]; man就是有100个元素的结构数组,数组的每个元素为person型。§10-2结构与数组要访问结构数组中的具体元素,必须遵守数组使用的 规定 关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定 ,按下标进行访问;要访问结构数组中某个具体元素下的成员,又要遵守有关访问结构成员的规定,使用“.”访问运算符和成员名。例如:要将数组man中的3号元素赋值为:"Fangjin",'M',1963,9,13,就可以使用下列语句: strcpy(man[3].name,"Fangjin"); man[3].sex='M'; man[3].birthday.year=1963; man[3].birthday.month=9; man[3].birthday.day=13;§10-2结构与数组 为了将“Fangjin”改为“Fangjun”,修改其中的字母'i':  man[3].name[5]='u';/*为数组中元素的数组成员中的一个字符赋值*/结构数组中每个元素的起始下标从0开始数组名称表示该结构数组的存储首地址。结构数组存放在连续的内存区域中,所占内存大小为结构类型的大小乘以数组元素的数量。structpersonman[100]:37*100=3700字节301222301222301222......namesymdnsymdnsymdman[0]man[1]man[99]§10-2结构与数组例C10-5.C:简单的密码加密程序。 最简单的加密过程是先定义一张字母加密对照表。将需要加密的一行文字输入加密程序,程序根据加密表中的对应关系,可以很简单地将输入的文字加密输出,对于表中未出现的字符则不加密。 输入输出输入 输出输入输出输入输出ad b w ckd;e ii akb;cw e§10-2结构与数组建立加密对照表structtable /*定义结构table*/{ charinput;/*成员input存输入的字符*/ charoutput;/*成员output存输出的字符*/};structtabletranslate[]=/*外部结构数组translate并初始化*/{'a','d','b','w','c','k','d',';','e','i','i','a','k','b',';','c','w','e’}; /*建立加密对照表*/§10-2结构与数组“structtabletranslate[]={...}”有三个作用:说明了一个外部的结构数组translate;表示数组的大小由后面给出的初始化数据决定;对结构数组进行初始化。 在程序中给出了数组初始化数据,所以结构数组translate有9个元素。adbwckd;eiiakb;cwetranslate[0]translate[1]translate[2]translate[3]translate[4]translate[5]translate[6]translate[7]translate[8]§10-2结构与数组例C10-5.C:简单的密码加密程序。structtable{ charinput,output;};structtabletranslate[]={'a','d','b','w','c','k','d',';','e','i','i','a','k','b',';','c','w','e‘};intmain(){ charch; intstr_long,i; str_long=sizeof(translate)/sizeof(structtable); /*计算元素个数*/ while((ch=getchar())!='\n') {for(i=0;translate[i].input!=ch&&i<str_long;i++); if(i<str_long)putchar(translate[i].output);/*加密*/ elseputchar(ch);} /*原样输出*/}§10-2结构与数组 structs { intx;int*y;} /*y:结构中的成员是指向整型的指针*/ intdata[5]={10,20,30,40,50};/*整型数组*/ structsarray[5]={100,&data[0],200,&data[1],300,&data[2],400,&data[3],500,&data[4]}; /*array:结构数组,初始化*/数组array的每个元素有两个成员,初始化状态如下:1002003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]§10-2结构与数组 intmain(){ inti=0;/*说明变量i并赋初值*/ structss_var; /*s_ver:一般的结构变量*/ s_var=array[0];/*整体赋给s_var*/ printf("%d\n",s_var.x); printf("%d\n",*s_var.y); printf("Forarray:\n"); printf("%d\n",array[i].x); printf("%d\n",*array[i].y); printf("%d\n",++array[i].x); printf("%d\n",++*array[i].y); printf("%d\n",array[++i].x); printf("%d\n",*++array[i].y); printf("%d\n",(*array[i].y)++); printf("%d\n",*(array[i].y++)); printf("%d\n",*array[i].y++); printf("%d\n",*array[i].y);}例C10-4.C:分析程序运行结果。§10-2结构与数组例C10-4.C:分析程序运行结果 各个printf语句中对数组操作的含义如下(i=0): ①s_var.x 取s_var的成员x的值 ②*s_var.y 取s_var的成员指针y所指的内容 ③array[i].x 取array[i]的x的值 ④*array[i].y 取array[i]的指针y所指的内容1001010010010100101002003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]s_var100§10-2结构与数组 ①++array[i].x ②++*array[i].y ③array[++i].x ④*++array[i].y1001011011120030取array[i]的x的值,x加1后输出101取array[i]的y所指的内容,y的内容加1后输出11i先加1后取array[1]的成员x的值200将array[i]的指针y先加1后再取y所指的内容输出301002003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]i0§10-2结构与数组 ①(*array[i].y)++ ②*(array[i].y++) ③*array[i].y++ ④*array[i].y30314050取array[i]的指针y的内容,输出30,y的内容再加1取array[i]的指针y的内容,输出31,指针y再加1同*(array[i].y++),根据运算符的结合性,隐含了括号,输出40输出501012003004005001120304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]i01§10-3结构与指针结构与指针的关系其一是将指针作为结构中的一个成员;其二是指向结构的指针(称为结构指针)。§10-3结构与指针结构指针说明的一般形式struct结构类型名称*结构指针变量名; 例如: structdate*pdate,today; 说明了两个变量,一个是指向结构date的结构指针pdate,today是一个date结构变量。 执行语句:pdate=&today;daypdateyearmonthtoday§10-3结构与指针通过指针访问结构中的成员 采用运算符“->”进行操作。结构指针->成员名 “->”运算符优先级是最高的(15级),从左至右结合 注意:C语言中优先级为15的运算符有4种:()[].-> 通过结构指针pdate访问成员year的操作可以写成:pdate->year=2007; 等价于:today.year=2007;(*pdate).year=2007;/*必须加括号*/ 如果结构指针p指向一个结构数组,那么对指针p的操作等价于对数组下标的操作。§10-3结构与指针例C10-7.C:用结构指针改写加密程序 structtable { charinput,output; }; structtabletranslate[]={’a’,’d’,’b’,’w’,’c’,’k’,'d',';','e','i',’i’,’a’,’k’,’b’,’;’,’c’,’w’,’e’};/*加密对照表*/ ……}§10-3结构与指针例C10-7.C:用结构指针改写加密程序……charch; structtable*p,*pend;/*p和pend:指向结构的指针*/ pend=&translate[sizeof(translate)/sizeof(structtable)-1];/*pend指向结构数组translate的最后一个元素*/ while((ch=getchar())!='\n') { for(p=translate;p->input!=ch&&p!=pend;p++); if(p->input==ch)putchar(p->output); else putchar(ch); }}§10-3结构与指针例C10-8.C:请分析程序的运算结果structs{ intx,*y; /*y:结构中的成员是指向整型的指针*/}*p; /*p:指向结构的指针*/intdata[5]={10,20,30,40,50,}; /*data:整型数组*/structsarray[5]={100,&data[0],200,&data[1],300,&data[2],400,&data[3],500,&data[4]}; /*array:结构数组*/§10-3结构与指针例C10-8.C:请分析程序的运算结果……intmain(){ p=array; /*指针p指向结构数组的首地址*/ printf("%d\n",p->x); printf("%d\n",(*p).x); printf("%d\n",*p->y); printf("%d\n",*(*p).y); printf("%d\n",++p->x); printf("%d\n",(++p)->x); printf("%d\n",p->x++); printf("%d\n",p->x); printf("%d\n",++(*p->y)); printf("%d\n",++*p->y); printf("%d\n",*++p->y); printf("%d\n",p->x); printf("%d\n",*(++p)->y); printf("%d\n",p->x); printf("%d\n",*p->y++); printf("%d\n",p->x); printf("%d\n",*(p->y)++); printf("%d\n",p->x); printf("%d\n",*p++->y); printf("%d\n",p->x);}§10-3结构与指针例C10-8.C:请分析程序的运算结果 结构数组array的初始化后的状态如下:10010101①p->x ②(*p).x ③*p->y ④*(*p).y⑤++p->x取结构指针p指向的结构的成员x的值,输出100取结构指针p的内容的成员x的值,输出100取结构指针p的指针成员y的内容,输出10取指针p的内容的指针成员y的内容,输出10p所指的x加1,x先加1后再输出101。p不加11002003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]p§10-3结构与指针例C10-8.C:请分析程序的运算结果200201202122①(++p)->x ②p->x++ ③p->x ④++(*p->y)⑤++*p->y p先加1后再取x的值,x不加1,输出200先取x的值,然后x再加1,输出200输出201p所指的y的内容先加1,输出21。p不加1,y不加1同上,由运算的结合性隐含了括号,输出221012003004005001020304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]p§10-3结构与指针①*++p->y②p->x ③*(++p)->y④p->x⑤*p->y++⑥p->x30201300p所指的y先加1后再取y的内容,输出30,p不加1,y的内容不加1输出201p先加1后再取所指y的内容,输出30输出300取p所指的y的内容,输出30,然后p所指的y加1输出3001012013004005001022304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]p§10-3结构与指针①*(p->y)++②p->x ③*p++->y④p->x 4030050400取p所指的y的内容,输出40,然后p所指的y再加1输出300取p所指的y的内容,输出50,然后p再加1输出4001012013004005001022304050array[0]array[1]array[2]array[3]array[4]data[0]data[1]data[2]data[3]data[4]p§10-3结构与指针指针运算与++运算规律小结 其实只有四种形式: 由++的前缀/后缀形式,决定操作的时机。 *p++ 或者*(p++)取得*p,执行后,自增p(*p)++ 取得*p,执行后,自增*p*++p或者*(++p)先增p,取得*p++*p或者++(*p)先增*p,取得*p§10-3结构与指针指针运算与++运算规律小结 由运算符的优先级和结合性决定++操作的对象; 由++的前缀/后缀形式,决定操作的时机。 ++p->x p->x++ ++*p->y *++p->y *(++p)->y *p->y++ *(p->y)++ *p++->y§10-3结构与指针例C10-9.C 可用结构表示学生的学号和成绩,编写程序,对班中30名学生按成绩进行排序,并输出排序后的学号、成绩和全班平均分。 structstuinf { intstid; /*学生学号*/ intscore; /*学生成绩*/ }stu[STNUM]; /*stu:结构数组*/ structstuinf*p[STNUM];/*p:由指向结构的指针构成的指针数组*/§10-3结构与指针 若是5个学生的数据,则在完成初始化操作后,数组的关系如下:算法分析:程序中使用结构数组stu,指针数组p;程序在结构数组和指针数组之间建立指针关系。程序中只用对指针数组进行排序,就可以实现对指向的成绩的排序(选择排序)。stu数组01020304059095857392p数组p[0]p[1]p[2]p[3]p[4]stu数组01020304059095857392p数组p[0]p[1]p[2]p[3]p[4]§10-3结构与指针 #defineSTNUM5 ...... intmain() { structstuinf*ptemp,*p[STNUM];inti,j,k,sum=0; for(i=0;i<=STNUM-1;i++) {scanf("%d%d",&stu[i].stid,&stu[i].score); p[i]=&stu[i]; sum+=stu[i].score; } for(i=0;i<=STNUM-2;i++) {k=i; for(j=i;j<=STNUM-1;j++) if(p[k]->score<p[j]->score)k=j; if(k!=i) {ptemp=p[i];p[i]=p[k];p[k]=ptemp;} } for(i=0;i<=STNUM-1;i++) printf("%d,%d\n",(*p[i]).stid,p[i]->score); printf("averagescore=%d\n",sum/STNUM); }§10-4在函数之间传递结构结构与函数的关系向函数中传递结构的成员;在函数之间传递整个结构;向函数传递结构的地址(指针)。§10-4在函数之间传递结构向函数中传递结构的成员 在函数中传递结构成员的方法与传递简单变量的方法相同:在函数之间传递成员的值;在函数之间传递成员的地址。实例:printf("%d",man.birthday.year);传递结构成员的值scanf("%d",&man.birthday.year);传递结构成员的地址gets(man.name);传递结构成员的地址§10-4在函数之间传递结构在函数之间传递整个结构 将结构作为整体,在函数之间传递:将结构变量作为形参;函数的返回值为一个结构类型。§10-4在函数之间传递结构例C10-12.C:利用结构变量求解两个复数之积。①(3+4i)×(5+6i)②(10+20i)×(30+40i)structcomplx{intreal,im;/*real:复数的实部im:复数的虚部*/};structcomplxcmult(za,zb)/*返回值为结构类型*/ structcomplxza,zb;/*形参为结构类型*/{ structcomplxw; w.real=za.real*zb.real-za.im*zb.im; w.im=za.real*zb.im+za.im*zb.real; return(w); /*返回结果,为结构*/}§10-4在函数之间传递结构例C10-12.C:利用结构变量求解两个复数之积 voidcpr(za,zb,z) /*输出复数za×zb=z*/ structcomplxza,zb,z; /*形式参数为结构类型*/ { printf("(%d+%di)*(%d+%di)=",za.real,za.im,zb.real,zb.im); printf("(%d+%di)\n",z.real,z.im); } main() { staticstructcomplxza={3,4}; staticstructcopmlxzb={5,6}; structcomplxz,x,y; structcomplxcmult();/*说明返回值是complx型*/ voidcpr(); z=cmult(za,zb); cpr(za,zb,z); x.real=10;x.im=20;y.real=30;y.im=40; z=cmult(x,y); cpr(x,y,z); }§10-4在函数之间传递结构向函数传递结构的地址 向函数中传递结构的地址要将函数的形式参数定义为指向结构的指针。 在调用时要使用结构的地址作为实际参数。 structbook{ charname[20];floatprice;};sortbook(term,pbook,count)structbookterm; /*形参:结构变量term*/structbook*pbook;intcount;/*指向结构数组首元素的指针pbook*/§10-4在函数之间传递结构例C10-14.C:输入10本书的名称和单价,按照单价排序。使用插入排序算法。插入排序的基本思想是:在数组中,有N个已经从小到大已经排好序的元素,要加入1个新的元素时,可以从数组的第1个元素开始,依次与新元素进行比较。当数组中首次出现第i个元素的值大于新元素时,则新的元素就应当插在原来数组中的第i-1个元素与第i个元素之间。此时可以将数组中第i个元素之后(包括第i个元素)的所有元素向后移动1个位置,将新元素插入,使它成为第i个元素。这样就可以得到已经排好序的N+1个元素。§10-4在函数之间传递结构例C10-14.C:输入10本书的名称和单价,按照单价排序。 #defineNUM10 structbook { charname[20]; floatprice; }; main() {structbookterm,books[NUM]; intcount; for(count=0;count<NUM;){printf(“Enterbooknameandprice.book%d=",count+1); scanf(”%s%f”,term.name,&term.price); sortbook(term,books,count++);/*插入排序*/ } printf("--------BOOKLIST---------\n"); for(count=0;count<NUM;count++) printbook(&books[count]);/*输出*/ }§10-4在函数之间传递结构sortbook(term,pbook,count)structbookterm; /*形参:结构变量term*/structbook*pbook;/*指向结构数组首元素的指针*/intcount; /*数组中已存入count个有序元素*/{inti; structbook*q,*pend=pbook; for(i=0;i<count;i++,pend++); for(;pbook<pend;pbook++) if(pbook->price>term.price)break; for(q=pend-1;q>=pbook;q--) *(q+1)=*q; *pbook=term; /*在pbook处插入新元素term*/}printbook(structbook*pbook){printf("%-20s%6.2f\n",pbook->name,pbook->price);}§10-5联合联合与结构的异同联合与结构都是由多个成员分量组成的一个整体;联合与结构在定义、说明和使用(成员引用、指针)上十分相似。结构:多个成员分量分别占用不同的存储空间构成一个整体;成员分量之间是相互独立的,所进行的各种操作互不影响。联合:多个成员分量共同占用同一存储空间;成员分量之间是相互联系的,所进行的操作相互依赖。§10-5联合定义联合定义一般形式 union联合类型名 { 数据类型成员名1; 数据类型成员名2; …… 数据类型成员名n; }; 其中union为关键字。实例 unionu_type/*定义联合类型u_type*/ { charch; inti; doublereal; }cnvt,*pcnvt;/*说明联合类型的变量*/§10-5联合联合类型占用内存情况 联合类型的变量占用内存空间的大小等于成员分量中最长的成员分量所占用内存的长度。 对于联合变量cnvt,其内存占用情况如图所示:占用4个字节变量cnvt成员ch成员i成员li§10-5联合例C10-16.C:分析以下程序的运行结果。 main() {union{ /*定义联合并说明联合变量mix*/ longi; /*定义long型成员*/ intk; /*定义int型成员*/ charii; /*定义char型成员*/ chars[4]; /*定义char型数组成员*/ }mix; mix.i=0x12345678;/*通过联合中的long型成员i为联合赋初值*/ printf("mix.i=%lx\n",mix.i); printf("mix.k=%x\n",mix.k); printf("mix.ii=%x\n",mix.ii); printf("mix.s[0]=%x\tmix.s[1]=%x\n",mix.s[0],mix.s[1]); printf("mix.s[2]=%x\tmix.s[3]=%x\n",mix.s[2],mix.s[3]); }§10-5联合联合在内存中的数据存储情况:mix.i=0x12345678mix.imix.kmix.iimix.s[0]mix.s[1]mix.s[2]mix.s[3]=12345678=5678=78=78=56=34=12mix0x78ii0x780x56k0x780x560x340x12i0x780x560x340x12ss[0]s[1]s[2]s[3]地址§10-6枚举类型枚举类型定义形式enum类型标识符{枚举值表}; 例如,定义weekday枚举类型:enumweekday{Sun,Mon,Tue,Wed,Thu,Fir,Sat}; 定义weekday枚举类型并说明枚举变量day1和day2:enumweekday{Sun,Mon,Tue,Wed,Thu,Fir,Sat}day1,day2; 注意:Sun,Mon,Tus,Wed...等称为枚举常量。 它们的值是必须为整型常量,可以根据需要在定义的时候进行指定。若没不定枚举常量值的情况,系统自动按照0、1、2...的顺序,自动赋值。§10-6枚举类型枚举类型定义实例 若有:enumweekday{Sun,Mon,Tue,Wed,Thu,Fir,Sat}; 则:Sun的枚举值为0,Thu的枚举值为4,Sat的枚举值为6。 若有:enumweekday{Sun=7,Mon,Tue,Wed=3,Thu,Fir,Sat}; 则:Sun的枚举值为7,Tue的枚举值为9,Thu的枚举值为4,Sat的枚举值为6。§10-6枚举类型枚举运算枚举变量赋值枚举变量=枚举常量; 例如:day1=Sat; 不能直接将整数赋值为枚举变量。 错误: day2=5; 正确: day2=(enumweekday)5;枚举变量的比较运算枚举元素与整型数据的比较本节内容请大家自学!§10-7用typedef定义数据类型用户自定义类型 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 类型(如int、char、long、double等):系统已经定义好的数据类型,用户可以直接使用,无须再进行定义。 用户自定义类型:用户根据自己的实际要求,自己定义的新的数据类型。 除结构、联合和枚举等类型之外,还可以用类型说明语句typedef定义新的类型说明符来代替已有的类型。§10-7用typedef定义数据类型typedef语句的一般形式typedef已定义的类型新的类型说明符实例typedefintINTEGER;typedeffloatREAL; typedefint*pointi; 在具有上述typedef语句的程序中,下列语句就是等价的: inti,j;floatpai;等价于INTEGERi,j;REALpai;pointip;等价于int*p;p是一个指向int的指针变量§10-7用typedef定义数据类型例C10-18.C:改写“用结构变量求解两个复数之积”的程序。 typedefintINTEGER; typedefstructcomplx{/*定义新的类型COMP(结构)*/ INTEGERreal,im;/*real为复数的实部,im为复数的虚部*/ }COMP; main() {staticCOMPza={3,4},zb={5,6}; COMPz,cmult();/*说明COMP型的变量z和函数cmult*/ voidcpr(); z=cmult(za,zb); cpr(za,zb,z); }§10-7用typedef定义数据类型 COMPcmult(za,zb)/*计算复数za×zb,返回COMP类型结果*/ COMPza,zb; {COMPw; w.real=za.real*
本文档为【2004-2-12-C语言——结构】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_921415
暂无简介~
格式:ppt
大小:7MB
软件:PowerPoint
页数:0
分类:互联网
上传时间:2019-01-17
浏览量:10