




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十四章第十四章结构体、共用体和用户定义类型结构简介存储一个班级中 5 名学员的信息(学号、姓名、性别和成绩)问题:I. 使用数组MaryJohnPeterRoseKateFMFMF01020304058978.56797.564解决方案:scorenumsexname不能建立数组间的关系II. 使用多维数组MaryJohnPeterRoseKateFMFMF01020304058978.56797.564C 语言不允许一个数组包含多种数据类型III. 使用结构numnamesexscoreC 语言引入了称为结构的数据存储方式“结构” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象
2、,这些数据项称为结构的成员。 定义结构1struct structurenamedatatype variable1;datatype variable2;.;结构成员;结构名structstudentint num;char name20;char sex;定义结构float score;C 语言中的有效数据类型定义结构2struct student int num; char name20; char sex; float score;num name sexstudent 结构定义并不预留内存 结构定义放置在程序的开始部分,位于头文件声明之后 score 结构定义仅描述了一个结构的形式。
3、如果要在程序里使用结构,需要声明结构变量。声明结构变量声明结构变量struct student int num; char name20; char sex; float score;struct student student1,student2;I.先定义结构,再声明结构变量struct student int num; char name20; char sex; float score;student1,student2;II.在定义结构类型的同时声明结构变量struct int num; char name20; char sex; float score;student1,stud
4、ent2;III. 直接声明结构变量声明一个类型为 student 结构的变量,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。 声明结构变量 第四种方式 typedef struct char name12; char sex; struct date brthday; float sc4; STREC;STREC std,pers3,*pstd;struct date int month; int day; int year;嵌套结构struct int num; char name20; char sex; struct date birthday; float scor
5、e;student1,student2;表示结构变量成员的一般形式是:结构变量名.成员名例如:student1.num、student2.sex、student1.birthday.month内存student3struct student student3=3,Yao Ming ,M,90.5; 结构变量初始化3Yao MingM赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少。student3.sex90.5student3.scorestudent1student1.num=1;=Z
6、hang Zi Liang;student1.sex=M;printf(请输入成绩:请输入成绩:n);scanf(%f,&student1.score);结构变量赋值1Zhang Zi Liang Mq 用输入语句或赋值语句来给结构变量的各个成员赋值7878student2 = student1; student21Zhang Zi Liang M78问题描述:根据学员的成绩,输出不及格学员的详细信息。 使用结构示例#includestruct studentint num;/学号char *name;/姓名char sex;/性别float score;/成绩;void main() sta
7、tic struct student stu1=1,李亚鹏,M,61; static struct student stu2=2,周晶晶,F,92.5; static struct student stu3=3,姚光明,M,59; printf(不及格学员的名单如下:n); if(stu1.score60) printf(%dt%st%ct%5.2fn,stu1.num,,stu1.sex,stu1.score); if(stu2.score60) printf(%dt%st%ct%5.2fn,stu2.num,,stu2.sex,stu2.score);
8、if(stu3.score=60 & stu2.score=60 & stu3.score=60) printf(没有不及格的学员。n);不及格学员的名单如下:3 姚光明 M 59.00stu11李亚鹏M78stu22周晶晶F92stu33姚光明M59struct stu *pstu;(*pstu).num 或者: pstu-num结构指针变量q 一个指针当用来指向一个结构时, 称之为结构指针变量。q 结构指针变量中的值是所指向的结构变量的首地址。q 结构指针变量声明的一般形式为: struct 结构名 *结构指针变量名q 通过结构指针可以访问该结构变量的成员,一般形式为: (*结构指针变量)
9、.成员名 或者 结构指针变量-成员名 结构体变量的引用结构体变量的引用:(1)不能将一个结构变量作为一个整体进行输入和输出不能将一个结构变量作为一个整体进行输入和输出.例如已定义例如已定义st1,st2为结为结构体变量并且它们已有值构体变量并且它们已有值,不能这样引用不能这样引用:printf(“%d,%s,%c,%d,%f,%sn”,st1);只能对结构体变量中的各个成员分别只能对结构体变量中的各个成员分别进行输入和输出进行输入和输出. 结构体变量名结构体变量名.成员名成员名(2)如果成员本身又属一个结构体类型如果成员本身又属一个结构体类型,则要用若干个成员运算符则要用若干个成员运算符,一级
10、一级地一级一级地找到最低的一级成员找到最低的一级成员,只能对最低级的成员进行赋值或存取以及运算只能对最低级的成员进行赋值或存取以及运算.例如例如: student1.birthday.month(3)对结构体变量的成员可以像普通变量一样进行各种运算对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可根据其类型决定可以进行的运算以进行的运算).student1.num+ 或或+ student1.num 由于由于.运算符的优先级最高运算符的优先级最高,因此因此,student1.num+j是对是对student1.num进行自加运算进行自加运算,面不是先对面不是先对num进行自进行
11、自加运算加运算.(4)可以引用结构体变量成员的地址可以引用结构体变量成员的地址,也可以引用结构体变量的地址也可以引用结构体变量的地址.如下如下:scanf(“%d”,&student1.num); /输入输入student1.num的值的值printf(“%x”,&student1); /输出输出student1的首地址的首地址)但不能用以下语句整体读入结构体变量但不能用以下语句整体读入结构体变量.如如:scanf(“%d,%s,%c,%d,%f,%s”,&student1);结构体变量的地址主要用于作函数参数结构体变量的地址主要用于作函数参数,传递结构体的地址传递结构体的地址.#includ
12、estruct studentint num;char *name;char sex;float score;stu=1,张宾,F,55,*pstu;void main() pstu=&stu; printf(学号:%d 姓名:%sn,stu.num,); printf(性别:%c 成绩:%5.2fnn,stu.sex,stu.score); printf(学号:%d 姓名:%sn,(*pstu).num,(*pstu).name); printf(性别:%c 成绩:%5.2fnn,(*pstu).sex,(*pstu).score); printf(学号:%d 姓名:%sn,
13、pstu-num,pstu-name); printf(“性别:%c 成绩:%5.2fnn,pstu-sex,pstu-score);学号:1 姓名:张宾性别:F 成绩:55.00学号:1 姓名:张宾性别:F 成绩:55.00学号:1 姓名:张宾性别:F 成绩:55.00Press any key to continue 在上面的例子中(*pstu).num和(*pstu).name 是pstu指向了结构变量中的成员num和name.注意*p两侧的括弧不可省,因为成员运算符“ . ”优先于“ * ”运算符,*pstu.num就等价于*(pstu.num). 请分析以下几种运算符: 1:p-n
14、得到p指向的结构体变量中的成员n的值 2:p-n+ 得到p指向的结构体变量中的成员n的值,用完该值后使它加1 3:+p-n 得到p指向的结构体变量中的成员n的值使之加1(先加) 结构体数组应用举例结构体数组应用举例2: 对候选人得票的统计程序对候选人得票的统计程序.设有设有3个候选人个候选人,每次输入一个得票的候选人的每次输入一个得票的候选人的名字名字,要求最后输出各人得票结果要求最后输出各人得票结果.#includeStruct person char name20; int count;leader3=“Li”,0, “Zhang”,0, “fun”,0,;main() int I,j;C
15、har leader_name20;For(i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) If(strcmp(leader_name,)=0)leaderj.count+;Printf(“n”);For(i=0;i3;i+)Printf(“%5s:%dn”,,leaderi.count);struct student int num; char* name; char sex; float score;stu30;结构数组q 元素为结构类型的数组称为结构数组。q 在实际应用中,经常用结构
16、数组来表示具有相同数据结构的一个群体。例如一个班的学员档案,一个公司的职工档案等。定义了一个结构数组stu1,共有30个元素,stu0stu29。每个数组元素都具有struct student的结构形式。问题描述:求学员的总成绩和平均成绩,并统计不及格人数。 结构指针变量struct studentint num;char *name;char sex;float score;stuN= 1,李芳,F,45,2,于红,F,62.5,3,何万山,M,92.5,4,程亚丽,M,87,5,王明,M,58;void main()int i,count=0; float ave,sum=0;for(i=
17、0;iN;i+)sum+=stui.score;if(stui.score60)count+;printf(总分:%7.2fn,sum);ave=sum/5;printf(平均分:%5.2fn,ave);printf(不及格人数为:%dn,count);总分: 345.00平均分:69.00不及格人数为:2Press any key to continue指向结构体数组的指针指向结构体数组的指针例题:例题:struct student int num;Char name20;Char sex;Int age;Struct student stu3=10101,“Li Lin”,m,18,101
18、02,“Zhang Fun”,m,19,10104,“Wang Min”,F,20;main() struct student *p;Printf(“no./t name /t sex /t age n”);For(p=stu;pnum,p-name,p-sex,p-age); 注意以下两点:注意以下两点:1、如果、如果p的初值为的初值为stu,即指向每个元素,则即指向每个元素,则p+1后指向下一元素的起始地址。后指向下一元素的起始地址。例如例如(+p)-num先使先使p自加自加1,然后得到它指向的元素中的然后得到它指向的元素中的num成员值(即成员值(即10102).(p+)-num先得到先
19、得到p-num的值(即的值(即10101)然后使)然后使p自加自加1,指向,指向stu1.2、程序已定义了指针、程序已定义了指针p为指向为指向struct student 类型数据的变量,类型数据的变量,它只能指向它只能指向一个一个struct student型的数据型的数据(p的值是的值是stu数组的一个元素的起始地址),数组的一个元素的起始地址),而不能指向而不能指向stu数组元素中的某一成员(即数组元素中的某一成员(即p的地址不能是成员的地址),的地址不能是成员的地址),例如,下面是不对的。例如,下面是不对的。P=&;编译是将出错,千万不要认为反正编译是将出错,千万不要
20、认为反正p是存放地址的,可以将任何地址赋给是存放地址的,可以将任何地址赋给它,如果地址类型不相同,可以用强制类型转换。例如:它,如果地址类型不相同,可以用强制类型转换。例如:P=(struct student *)&;此时,在此时,在p中存放中存放stu1元素元素name成成员的起始地址。员的起始地址。191页对结构体变量中的成员进行操作页对结构体变量中的成员进行操作结构作为函数参数q可以将结构作为参数传递给函数,也可以定义返回结构值的函数。q结构作为函数参数有三种不同方法:192页6种方式q将结构成员的值传递给函数处理。q将整个结构作为参数值传递给函数。q将结构指针变量做函数的参数。把结构作为整体来处理,但作用方式和效果不同。结构成员作为函数参数struct film char name25; /电影名 char director25; /导演 int duration; /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电动汽车电池热管理技术在电动汽车充电过程中的影响研究报告
- 2024-2030年中国燃料电池专用车行业发展监测及投资战略研究报告
- 浙江特殊教育职业学院《民族艺术》2023-2024学年第一学期期末试卷
- 2024年河北省涿州三中学九年级数学第一学期期末考试模拟试题含解析
- 江苏省盐城市东台市三仓片区2025届化学九上期末调研模拟试题含解析
- 承德护理职业学院《文字与版式设计》2023-2024学年第一学期期末试卷
- 山东省东昌府区梁水镇中学心中学2024年物理八年级第一学期期末学业水平测试模拟试题含解析
- 新教科版小学科学六年级上册教学进展计划
- 中国城市轨道交通设备行业发展前景预测及投资战略咨询报告
- 四平高低压配电柜项目投资分析报告范文模板
- 人工智能训练师(三级)职业技能鉴定理论考试题(附答案)
- 卫生系统面试题目100及最佳答案
- DB11∕T 212-2024 园林绿化工程施工及验收规范
- 医疗废物与污水处理培训
- 夜市狂欢2025年夜间餐饮品牌竞争力评估报告
- 住宅工程施工质量常见问题专项治理自评报告
- 2025年云南高考真题化学试题答案
- 仓库物流车辆管理制度
- 日本数字文化产业的发展历程与经验借鉴
- 护士换错药不良事件讲课件
- 2025至2030中国智能算力行业产业运行态势及投资规划深度研究报告
评论
0/150
提交评论