资源描述
第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构与函数的关系:结构与函数的关系:向结构中传递函数的成员;向结构中传递函数的成员;在函数之间传递整个结构;在函数之间传递整个结构;向函数传递结构的地址指针。向函数传递结构的地址指针。向函数中传递结构的成员向函数中传递结构的成员在在函函数数中中传传递递结结构构成成员员的的方方法法与与传传递递简简单单变变量量的方法相同:的方法相同:在函数之间传递成员的值;在函数之间传递成员的值;在函数之间传递成员的地址。在函数之间传递成员的地址。一、结构、结构指针作为函数的参数一、结构、结构指针作为函数的参数第四节第四节第四节第四节 在函数之间传递结构在函数之间传递结构在函数之间传递结构在函数之间传递结构第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型实例实例printf(“%dprintf(“%d,man.birthday.year);,man.birthday.year);传递成员的传递成员的值值 scanf(“%d scanf(“%d,&man.birthday.year);,&man.birthday.year);传递成员的地传递成员的地址址gets(man.name);gets(man.name);传递结构成员的地传递结构成员的地址址第四节第四节第四节第四节 在函数之间传递结构在函数之间传递结构在函数之间传递结构在函数之间传递结构第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型在函数之间传递整个结构在函数之间传递整个结构将结构作为整体,在函数之间传递:将结构作为整体,在函数之间传递:将结构变量作为将结构变量作为形参形参;函数的函数的返回值返回值为一个结构类型。为一个结构类型。第四节第四节第四节第四节 在函数之间传递结构在函数之间传递结构在函数之间传递结构在函数之间传递结构第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型例例例例:利用结构变量求解两个复数之积。利用结构变量求解两个复数之积。利用结构变量求解两个复数之积。利用结构变量求解两个复数之积。、(3+4(3+4(3+4(3+4i)(5+6i)i)(5+6i)i)(5+6i)i)(5+6i)、(10+20i)(30+40i)(10+20i)(30+40i)(10+20i)(30+40i)(10+20i)(30+40i)struct complxstruct complxstruct complxstruct complx int real;int real;int real;int real;/*real/*real/*real/*real为复数的实部为复数的实部为复数的实部为复数的实部*/*/*/*/int im;int im;int im;int im;/*im/*im/*im/*im为复数的虚部为复数的虚部为复数的虚部为复数的虚部 */*/*/*/;struct complxstruct complxstruct complxstruct complx cmultcmultcmultcmult(zazazaza,zbzbzbzb)/*/*/*/*函数返回值为结构类型函数返回值为结构类型函数返回值为结构类型函数返回值为结构类型*/*/*/*/struct complxstruct complxstruct complxstruct complx zazazaza,zbzbzbzb;/*/*/*/*形式参数为结构类型形式参数为结构类型形式参数为结构类型形式参数为结构类型*/*/*/*/struct complxstruct complxstruct complxstruct complx w w w w;w.real=w.real=w.real=w.real=zazazaza.real*.real*.real*.real*zbzbzbzb.real-.real-.real-.real-zazazaza.im*.im*.im*.im*zbzbzbzb.im;.im;.im;.im;w.im=w.im=w.im=w.im=zazazaza.real*.real*.real*.real*zbzbzbzb.im+.im+.im+.im+zazazaza.im*.im*.im*.im*zbzbzbzb.real;.real;.real;.real;return(return(return(return(w w w w););););/*/*/*/*返回计算结果,返回值的类型为结构返回计算结果,返回值的类型为结构返回计算结果,返回值的类型为结构返回计算结果,返回值的类型为结构*/*/*/*/例例例例C10_401C10_401C10_401C10_401第四节第四节第四节第四节 在函数之间传递结构在函数之间传递结构在函数之间传递结构在函数之间传递结构第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型向函数传递结构的地址向函数传递结构的地址向函数中传递结构的地址要将函数的向函数中传递结构的地址要将函数的形参形参定义为定义为指向结构的指向结构的指针指针,在调用时要用结构的在调用时要用结构的地址地址作为作为实参实参。例例:输入输入1010本书的名称和单价,按照单价排序。本书的名称和单价,按照单价排序。程序中使用插入排序算法。程序中使用插入排序算法。第四节第四节第四节第四节 在函数之间传递结构在函数之间传递结构在函数之间传递结构在函数之间传递结构第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型插插入入排排序序的的根根本本思思想想是是:在在数数组组中中,有有 N N 个个已已经经从从小小到到大大已已经经排排好好序序的的元元素素,要要参参加加1 1个个新新的的元元素素时时,可可以以从从数数组组的的第第 1 1 个个元元素素开开始始,依次与新元素进行比较。依次与新元素进行比较。当当数数组组中中首首次次出出现现第第 i i 个个元元素素的的值值大大于于新新元元素素时时,那那么么新新元元素素就就应应当当插插在在原原来来数数组组中的第中的第i-1i-1个元素与第个元素与第 i i 个元素之间。个元素之间。此此时时可可以以将将数数组组中中第第 i i 个个元元素素之之后后包包括括第第 i i 个个元元素素的的所所有有元元素素向向后后移移动动 1 1 个个位位置置,将将新新元元素素插插入入,使使它它成成为为第第 i i 个个元元素素。这这样样就就可可以以得得到到已已经经排排好好序序的的 N+1 N+1 个个元元素。素。第四节第四节第四节第四节 在函数之间传递结构在函数之间传递结构在函数之间传递结构在函数之间传递结构第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型5 55 55 52 23 36 67 79 91111 5 55 55 55 55 55 55 55 55 55 55 55 52 2 25 55 55 55 535 55 55 55 55 55 5 5 55 59 97 76 61111插入排序法例如插入排序法例如插入排序法例如插入排序法例如第四节第四节第四节第四节 在函数之间传递结构在函数之间传递结构在函数之间传递结构在函数之间传递结构第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型#define NUM 10#define NUM 10#define NUM 10#define NUM 10struct bookstruct bookstruct bookstruct book /*/*/*/*定义结构定义结构定义结构定义结构book*/book*/book*/book*/char name20;char name20;char name20;char name20;/*/*/*/*书名书名书名书名*/*/*/*/float price;float price;float price;float price;/*/*/*/*单价单价单价单价*/*/*/*/;main()main()main()main()struct book term,booksNUM;struct book term,booksNUM;struct book term,booksNUM;struct book term,booksNUM;int count;int count;int count;int count;/*/*/*/*数组数组数组数组booksbooksbooksbooks的元素计数器的元素计数器的元素计数器的元素计数器*/*/*/*/for(count=0;countNUM;)for(count=0;countNUM;)for(count=0;countNUM;)for(count=0;countNUM;)printf(“Enter Name and Price.book%d=,printf(“Enter Name and Price.book%d=,printf(“Enter Name and Price.book%d=,printf(“Enter Name and Price.book%d=,count+1);count+1);count+1);count+1);scanf(“%s%f scanf(“%s%f scanf(“%s%f scanf(“%s%f,term.name,&term.price);,term.name,&term.price);,term.name,&term.price);,term.name,&term.price);sortbook(term,books,count+);sortbook(term,books,count+);sortbook(term,books,count+);sortbook(term,books,count+);/*/*/*/*传递结构变量传递结构变量传递结构变量传递结构变量termtermtermterm和结构数组和结构数组和结构数组和结构数组bookbookbookbook数组的首地址数组的首地址数组的首地址数组的首地址*/*/*/*/printf(-BOOK LIST-n);printf(-BOOK LIST-n);printf(-BOOK LIST-n);printf(-BOOK LIST-n);for(count=0;countNUM;count+)for(count=0;countNUM;count+)for(count=0;countNUM;count+)for(count=0;countNUM;count+)printbook(&bookscount);printbook(&bookscount);printbook(&bookscount);printbook(&bookscount);/*/*/*/*传递数组中传递数组中传递数组中传递数组中1 1 1 1个元素的地址个元素的地址个元素的地址个元素的地址*/*/*/*/第四节第四节第四节第四节 在函数之间传递结构在函数之间传递结构在函数之间传递结构在函数之间传递结构第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型sortbook(sortbook(sortbook(sortbook(termtermtermterm,pbookpbookpbookpbook,count),count),count),count)struct bookstruct bookstruct bookstruct book termtermtermterm;/*/*/*/*形参:结构变量形参:结构变量形参:结构变量形参:结构变量term*/term*/term*/term*/struct bookstruct bookstruct bookstruct book *pbookpbookpbookpbook;/*/*/*/*指向结构数组首元素的指针指向结构数组首元素的指针指向结构数组首元素的指针指向结构数组首元素的指针pbook*/pbook*/pbook*/pbook*/int count;int count;int count;int count;/*/*/*/*数组中已存入数组中已存入数组中已存入数组中已存入countcountcountcount个有序元素个有序元素个有序元素个有序元素*/*/*/*/int i;int i;int i;int i;struct bookstruct bookstruct bookstruct book*q q q q,*,*,*,*pendpendpendpend =pbookpbookpbookpbook;for(i=0;icount;i+,pend+);for(i=0;icount;i+,pend+);for(i=0;icount;i+,pend+);for(i=0;icount;i+,pend+);for(;for(;for(;for(;pbookpbookpbookpbook price -price -price -price termtermtermterm.price).price).price).price)break;break;break;break;forforforfor(q q q q=pendpendpendpend-1;-1;-1;-1;q q q q=pbookpbookpbookpbook;q q q q-)-)-)-)*(*(*(*(q q q q+1)=*+1)=*+1)=*+1)=*q q q q;*pbook pbook pbook pbook=termtermtermterm;/*/*/*/*在在在在pbookpbookpbookpbook处插入新元素处插入新元素处插入新元素处插入新元素term*/term*/term*/term*/第四节第四节第四节第四节 在函数之间传递结构在函数之间传递结构在函数之间传递结构在函数之间传递结构第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型printbook(printbook(pbookpbook)struct bookstruct book*pbookpbook;printf(%-20s%6.2fn,printf(%-20s%6.2fn,pbookpbook-name,-name,pbookpbook-price);-price);例例例例C10_402C10_402C10_402C10_402第四节第四节第四节第四节 在函数之间传递结构在函数之间传递结构在函数之间传递结构在函数之间传递结构第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型定义结构变量定义结构变量定义结构变量定义结构变量stustustustu:structstruct studentstudent int int int int numnumnumnum;float score;float score;float score;float score;char char char char sexsexsexsex;stu;stu;stu;stu;结构变量结构变量结构变量结构变量stustu占用内存情况占用内存情况占用内存情况占用内存情况 numscoresex2 2个字节个字节个字节个字节4 4个字节个字节个字节个字节1 1个字节个字节个字节个字节sizeof(stu)sizeof(stu)sizeof(stu)sizeof(stu)是是是是 7 7 7 7。第五节第五节第五节第五节 联合类型联合类型联合类型联合类型第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型unionunionunionunion定义定义定义定义联合联合联合联合变量变量变量变量stustustustu:student student int int int int numnumnumnum;float score;float score;float score;float score;char char char char sexsexsexsex;stu;stu;stu;stu;联合变量联合变量联合变量联合变量stustu占用内存情况占用内存情况占用内存情况占用内存情况 4个字节个字节 2个字节个字节 1个字节个字节unionunionunionunionunionunionunionunionunionunionunionunion 联合变量联合变量联合变量联合变量占用空间的占用空间的占用空间的占用空间的大小大小大小大小等于成员分量中等于成员分量中等于成员分量中等于成员分量中最长最长最长最长的成员占用内存的长度。的成员占用内存的长度。的成员占用内存的长度。的成员占用内存的长度。4个字节个字节第五节第五节第五节第五节 联合类型联合类型联合类型联合类型第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型0 0 x x 7 87 80 0 x x 5 65 60 0 x x 3 43 40 0 x x 1 21 2unionunionunionunion long i;long i;long i;long i;int k;int k;int k;int k;char c;char c;char c;char c;mix;mix;mix;mix;mix.i=0 x12345678;mix.i=0 x12345678;mix.i=0 x12345678;mix.i=0 x12345678;printf(“%xnprintf(“%xnprintf(“%xnprintf(“%xn,mix.i);,mix.i);,mix.i);,mix.i);printf(“%xnprintf(“%xnprintf(“%xnprintf(“%xn,mix.k);,mix.k);,mix.k);,mix.k);printf(“%xnprintf(“%xnprintf(“%xnprintf(“%xn,mix.c);,mix.c);,mix.c);,mix.c);ffe0ffe1ffe2ffe3高地址高地址低地址低地址 1 2 1 2 3 4 3 4 5 6 5 6 7 8 7 8 00010001 00100010 00110011 01000100 01010101 01100110 01110111 10001000低低高高ffe3 ffe2 ffe1 ffe0 第五节第五节第五节第五节 联合类型联合类型联合类型联合类型第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型 mix.c=A;mix.c=A;1 2 1 2 3 4 3 4 5 6 5 6 7 8 7 8 00010001 00100010 00110011 01000100 01010101 01100110 01110111 10001000低低高高ffe3 ffe2 ffe1 ffe0 1 2 1 2 3 4 3 4 5 6 5 6 4 4 1 1 00010001 00100010 00110011 01000100 01010101 01100110 01000100 00010001低低高高ffe3 ffe2 ffe1 ffe0 printf(“%ldnprintf(“%ldn,mix.i);,mix.i);printf(“%dnprintf(“%dn,mix.k);,mix.k);printf(“%cnprintf(“%cn,mix.c);,mix.c);3054198413054198412208122081A A例例例例C10_501C10_501C10_501C10_501第五节第五节第五节第五节 联合类型联合类型联合类型联合类型第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型枚举类型的特点:枚举类型的特点:l数据的取值是有限个数的数据类型。数据的取值是有限个数的数据类型。l定义枚举类型的格式定义枚举类型的格式 enumenum 枚举类型名枚举类型名 可能的取值表可能的取值表;例如:例如:enum enum weekday sun,weekday sun,monmon,tuetue,wed,wed,thuthu,frifri,datdat;l说明枚举类型变量的格式说明枚举类型变量的格式 enum enum 枚举类型名枚举类型名 变量标识符;变量标识符;第六节第六节第六节第六节 枚举类型枚举类型枚举类型枚举类型第十章第十章第十章第十章 结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型结构、联合与枚举类型用户自定义类型用户自定义类型用户自定义类型用户自定义类型标标标标准准准准类类类类型型型型如如如如intintintint、charcharcharchar、floatfloatfloatfloat等等等等:系系系系统统统统已已已已经经经经定义好的类型,用户可以直接使用,无须再进行定义。定义好的类型,用户可以直接使用,无须再进行定义。定义好的类型,用户可以直接使用,无须再进行定义。定义好的类型,用户可以直接使用,无须再进行定义。用用用用户户户户自自自自定定定定义义义义类类类类型型型型:用用用用户户户户根根根根据据据据自自自自己己己己的的的的实实实实际际际际要要要要求求求求,自自自自己己己己定定定定义义义义的的的的新新新新的的的的数数数数据据据据类类类类型型型型。除除除除结结结结构构构构和和和和联联联联合合合合等等等等类类类类型型型型之之之之外外外外,还还还还可可可可以以以以用用用用类类类类型型型型说说说说明明明明语语语语句句句句typedeftypedeftypedeftypedef定定定定义义义义新新新新的的的的类类类类型型型型标标标标识识识识符符符符来来来来代替已有的类型。代替已有的类型。代替已有的类型。代替已有的类型。typedeftypedeftypedeftypedef语句的一般形式语句的一般形式语句的一般形式语句的一般形式typedef typedef typedef typedef 已定义的类型已定义的类型已定义的类型已定义的类型 新的类型新的类型新的类型新的类型实例实例实例实例 typedef int INTEGER;typedef int INTEGER;typedef int INTEGER;typedef int INTEGER;typedef float REAL;typedef float REAL;typedef float REAL;typedef float REAL;等价:等价:等价:等价:int i,j;INTEGER i,j;int i,j;INTEGER i,j;int i,j;INTEGER i,j;int i,j;INTEGER i,j;float pai float pai float pai float pai;REAL pai;REAL pai;REAL pai;REAL pai;第七节用第七节用第七节用第七节用typedeftypedeftypedeftypedef定义类型定义类型定义类型定义类型
展开阅读全文