C语言程序设计课件:结构和其他类型_第1页
C语言程序设计课件:结构和其他类型_第2页
C语言程序设计课件:结构和其他类型_第3页
C语言程序设计课件:结构和其他类型_第4页
C语言程序设计课件:结构和其他类型_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计

结构和其他类型 11.1结构概念

11.2结构操作

11.2.1结构引用和初始化

11.2.2结构数组

11.2.3结构指针变量

11.3结构应用

11.4动态结构类型

11.5联合

11.5.1联合定义

11.5.2联合变量赋值和引用

11.5.3联合和结构的差异

11.6枚举类型

11.6.1枚举类型定义

11.6.2枚举类型的赋值和使用

11.7使用typedef 11.1结构概念1.结构定义“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。定义一个结构的一般形式为:struct结构名{成员表列

};注意:不要忽略最后的分号成员表由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:类型说明符成员名;成员名的命名应符合标识符的书写规定。2.结构类型变量说明说明结构变量有以下三种方法。(1)先定义结构,再说明结构变量。如:structstu{intnum;charname[20];charsex;floatscore;};structstuboy1,boy2;说明结构变量有以下三种方法。(2)在定义结构类型的同时说明结构变量。例如:structstu{intnum;charname[20];charsex;floatscore;}boy1,boy2;说明结构变量有以下三种方法。(3)直接说明结构变量。

例如:struct{intnum;charname[20];charsex;floatscore;}boy1,boy2;11.2结构操作11.2.1结构引用和初始化1.结构的引用结构分量又称成员,表示结构变量成员的一般形式是:结构变量名.成员名运算符“.”是访问结构成员,其左操作数必须是结构变量名,右操作数是结构的成员名。根据结构成员的表示方法。如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用。例如:boy1.birthday.month即第一个人出生的月份成员,可以在程序中单独使用,与普通变量完全相同。如果结构不包含指针类型成员和动态数据结构成员,类型相同的结构可赋值。#include<stdio.h>voidmain(){structstu{intnum;char*name;charsex;floatscore;}boy1,boy2;boy1.num=102;="Zhangping";printf("inputsexandscore\n");scanf("%c%f",&boy1.sex,&boy1.score);boy2=boy1;printf("Number=%d\nName=%s\n",boy2.num,);printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}2.结构初始化如果结构变量是静态存储类或外部存储类,则初始化语句表达式应为常量表达式。如果变量是自动存储类或寄存器存储类,则初始化语句表达式允许为任意表达式。例11-2外部结构变量初始化。structstu/*定义结构*/{intnum;char*name;charsex;floatscore;}boy2,boy1={102,"Zhangping",'M',78.5};voidmain(){boy2=boy1;printf("Number=%d\nName=%s\n",boy2.num,);printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}structstu{intnum;char*name;charsex;floatscore;}boy[5];11.2.2结构数组

例如:structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping","M",45},{102,"Zhangping","M",62.5},{103,"Hefang","F",92.5},{104,"Chengling","F",87},{105,"Wangming","M",58};};例11-4计算学生的平均成绩和不及格的人数。#include<stdio.h>structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping",'M',45},{102,"Zhangping",'M',62.5},{103,"Hefang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58},};voidmain(){inti,c=0;floatave,s=0;for(i=0;i<5;i++){s+=boy[i].score;if(boy[i].score<60)c+=1;}printf("s=%f\n",s);ave=s/5;printf("average=%f\ncount=%d\n",ave,c);}1.结构指针变量的说明结构指针变量说明的一般形式为:

struct结构名*结构指针变量名;结构名和结构变量是两个不同的概念。结构名只能表示一个结构形式,编译系统并不对它分配内存空间。只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。。其访问的一般形式为:(*结构指针变量).成员名或为:结构指针变量->成员名

例如:(*pstu).num或:pstu->num应该注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。下面通过例子来说明结构指针变量的具体说明和使用方法。11.2.3结构指针变量

结构指针变量。#include"stdio.h"structstu{intnum;char*name;charsex;floatscore;}boy1={102,"Zhangping",'M',78.5},*pstu;voidmain(){pstu=&boy1;printf("Number=%d\nName=%s\n",boy1.num,);printf("Sex=%c\nScore=%f\n\n",boy1.sex,boy1.score);printf("Number=%d\nName=%s\n",(*pstu).num,(*pstu).name);printf("Sex=%c\nScore=%f\n\n",(*pstu).sex,(*pstu).score);printf("Number=%d\nName=%s\n",pstu->num,pstu->name);printf("Sex=%c\nScore=%f\n\n",pstu->sex,pstu->score);}11.3结构应用例11-7用结构指针变量作函数参数编程,实现例11-7,计算一组学生的平均成绩和不及格人数。#include"stdio.h"structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping",'M',45},{102,"Zhangping",'M',62.5},{103,"Hefang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58},};voidmain(){structstu*ps;voidave(structstu*ps);ps=boy;ave(ps);}voidave(structstu*ps){intc=0,i;floatave,s=0;for(i=0;i<5;i++,ps++){s+=ps->score;if(ps->score<60)c+=1;}printf("s=%f\n",s);ave=s/5;printf("average=%f\ncount=%d\n",ave,c);}例11-8输入学生信息,统计总分后输出学生信息。#include<stdio.h>structDATE/*日期结构*/{ intyear;/*年*/ intmonth;/*月*/ intday;/*日*/};structStudent/*学生信息结构*/{ charno[10];/*学号*/ charname[8];/*姓名*/ charsex[3];/*性别*/ structDATEbirthday;/*出生日期结构嵌套定义*/ intscore[4];/*三门课的分数和总分*/};例11-8输入学生信息,统计总分后输出学生信息。structStudentstscore(structStudentstud,intn);/*统计总分*/voidmain() {structStudentstud1={"A02053101","李伟","男",{1986,5,15},{75,90,83,0}};printf("学生信息:\n");printf("%s%s%s%4d%3d%3d%4d%4d%4d%4d\n",stud1.no,,stud1.sex,stud1.birthday.year,stud1.birthday.month,stud1.birthday.day,stud1.score[0],stud1.score[1],stud1.score[2],stud1.score[3]);stud1=stscore(stud1,3);printf("输出学生信息:\n");printf("%s%s%s%4d%3d%3d%4d%4d%4d%4d\n",stud1.no,,stud1.sex,stud1.birthday.year,stud1.birthday.month,stud1.birthday.day,stud1.score[0],stud1.score[1],stud1.score[2],stud1.score[3]);}structStudentstscore(structStudentstud,intn)/*统计总分*/{inti;for(i=0;i<n;i++)stud.score[3]+=stud.score[i];

returnstud;}11.4动态结构类型1.分配内存空间函数malloc调用形式:(类型说明符*)malloc(size);功能:在内存的动态存储区中分配一块长度为size字节的连续区域。函数的返回值为该区域的首地址。“类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。size是一个无符号数。例如:pc=(char*)malloc(100);表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。2.分配内存空间函数calloccalloc也用于分配内存空间。调用形式:(类型说明符*)calloc(n,size);功能:在内存动态存储区中分配n块长度为size字节的连续区域。函数的返回值为该区域的首地址。(类型说明符*)用于强制类型转换。calloc函数与malloc函数的区别仅在于一次可以分配n块区域。例如:ps=(struetstu*)calloc(2,sizeof(structstu));其中的sizeof(structstu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。3.释放内存空间函数free调用形式:free(void*ptr);功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。例11-9输入一个学生数据到分配区域。#include<stdio.h>#include<stdlib.h>/*或#include<malloc.h>*/voidmain(){structstu{intnum;char*name;charsex;floatscore;}*ps;ps=(structstu*)malloc(sizeof(structstu));ps->num=102;ps->name="Zhangping";ps->sex='M';ps->score=62.5;printf("Number=%d\nName=%s\n",ps->num,ps->name);printf("Sex=%c\nScore=%f\n",ps->sex,ps->score);free(ps);}11.5联合11.5.1联合定义定义一个联合类型的一般形式为:union联合名

{成员表;};成员表中含有若干成员,成员的一般形式为:类型说明符成员名;成员名的命名应符合标识符的规定。例如:

unionperdata{intclass;charoffice[10];};联合变量说明联合变量的说明和结构变量的说明方式相同,也有三种形式。即先定义,再说明;定义同时说明和直接说明。以perdata类型为例,说明如下:

unionperdata{intclass;charofficae[10];};unionperdataa,b;/*说明a,b为perdata类型*/或者可同时说明为:

unionperdata{intclass;charoffice[10];}a,b;经说明后的a、b变量均为perdata类型。a、b变量的长度应等于perdata的成员中最长的长度,即等于office数组的长度,共10个字节。a、b变量如赋予整型值时,只使用了2个字节,而赋予字符数组时,可用10个字节。11.5.2联合变量赋值和引用

对联合变量的赋值、使用都只能是对变量的成员进行。

联合变量的成员表示为:联合变量名.成员名;

例如,a被说明为perdata类型的变量之后,可使用a.class、a.office不允许只用联合变量名作赋值或其它操作。还要再强调说明的是,一个联合变量,每次只能赋予一个成员值。换句话说,一个联合变量的值就是联合变员的某一个成员值。例11-11设有一个教师与学生通用的表格,教师数据有姓名、年龄、职业、教研室四项。学生有姓名、年龄、职业、班级四项。编程输入人员数据,再以表格输出。voidmain(){struct{charname[10];intage;charjob;union{intclass;charoffice[10];}depa;}body[2];intn,i;for(i=0;i<2;i++){printf("inputname,age,jobanddepartment\n");scanf("%s%d%c",body[i].name,&body[i].age,&body[i].job);if(body[i].job=='s')scanf("%d",&body[i].depa.class);elsescanf("%s",body[i].depa.office);}例11-11设有一个教师与学生通用的表格,教师数据有姓名、年龄、职业、教研室四项。学生有姓名、年龄、职业、班级四项。编程输入人员数据,再以表格输出。printf("name\tagejobclass/office\n");for(i=0;i<2;i++){if(body[i].job=='s')printf("%s\t%3d%3c%d\n",body[i].name,body[i].age,body[i].job,body[i].depa.class);elseprintf("%s\t%3d%3c%s\n",body[i].name,body[i].age,body[i].job,body[i].depa.office);}}11.5.3联合和结构的差异

“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和。

“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。应该说明的是,这里所谓的共享不是指把多个成员同时装入一个联合变量内,而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。联合类型必须经过定义之后,才能把变量说明为该联合类型。不能对联合变量初始化,但可以对结构变量初始化。不能把联合变量作为函数参数,但结构变量可以作为函数参数。11.6枚举类型11.6.1枚举类型定义枚举类型定义的一般格式:enum类型名{标识符表};例如,定义一个颜色枚举类型:enumCOLOR{red,yellow,blue,white,black};枚举类型的值是常量,必须是标识符。枚举类型是有序类型,即red为0,yellow为1,blue为2,white为3,black为4等,是枚举类型常量的值。enumCHARACTER{’A’,’B’,’C’,’D’}; /*错误*/enumINT{1,2,3,4,5}; /*错误*/枚举类型常量的可以重新定义。例如:enumCOLOR{red,yellow=10,blue,white,black};COLOR的值,即red为0,yellow为10,blue为11,white为12,black为13。枚举变量定义的一般格式:enum类型名变量表;例如,定义颜色枚举类型变量:enumCOLORc1,c2;11.6枚举类型11.6.2枚举类型的赋值和使用1.枚举型变量可赋枚举值常量,但不能赋序号。2.枚举型可进行比较。enumCOLOR{red,yellow,blue,white,black};enumCOLORc1,c2,c3=blue;c1=red;c2=white;c1=0;c2=3; /*错误*/c1=(enumCOLOR)0; /*正确*/c2=(enumCOLOR)3; /*正确*/c1==c2,值为0c2>=c1,值为1c2!=c1,值为13.枚举型数据不能直接输入、输出,需编一段程序实现。枚举型数据输入:printf("输入颜色代码(0,1,2,3,4):");scanf("%d",&code);switch(code){case0:c1=red;break;case1:c1=yellow;break;case2:c1=blue;break; case3:c1=white;break; case4:c1=black;break;default:printf("输入颜色代码错误!\n");exit(1);}例11-12用枚举数组输出颜色。#include<stdio.h>voidmain() {enumCOLOR{red,yellow,blue,white,black}; /*颜色枚举类型*/enumCOLORc[5]={(enumCOLOR)0,(enumCOLOR)1,(enumCOLOR)2,(enumCOLOR)3,(enumCOLOR)4}; /*颜色数组*/ inti; printf("输出颜色:\n"); for(i=0;i<5;i++) switch(c[i]) {casered:printf("red\n");break; caseyellow:printf("yellow\n");break; caseblue:printf("blue\n");break; casewhite:printf("white\n");break; caseblack:printf("black\n");break;} }

11.7使用typedef结构类型定

温馨提示

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

评论

0/150

提交评论