版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章结构体8.1结构体类型与结构体变量8.2动态分配存储空间8.3顺序存储与链式存储程序设计基础1第8章结构体教学目标理解结构体数据类型的本质、掌握结构体变量的定义和使用方法掌握结构体数据类型与数组、指针、函数等结合使用的方法与技巧理解以链表为代表的动态分配存储空间的思想和使用方法程序设计基础2第8章知识导图程序设计基础3【例8.1】结构体类型变量应用举例。定义一个结构体用来存储一个学生的学号、姓名、性别、考试成绩和家庭住址。定义一个学生,并为其赋值,最后输出这个学生的所有信息。
8.1结构体类型与结构体变量分析:1.定义结构体类型;2.定义一个结构体变量并为其赋值;3.输出学生信息;8.1结构体类型与结构体变量分析:1.定义结构体类型;2.定义一个结构体变量并为其赋值;3.输出学生信息;structstudentstu1={2001,"Zhaoqi",'F',95.5,"QingfengRoad"};structstudent{intid;charname[21];charsex;floatscore;charaddress[40];};printf("Id:%d\nName:%s\nSex:%c\n",stu1.id,,stu1.sex);printf("Score:%f\nAddress:%s\n",stu1.score,stu1.address);8.1.1结构体类型定义一个结构体类型的一般形式为:struct结构体名{成员变量表列[成员函数表列]//结构体内可以包含函数成员};程序设计基础68.1.1结构体类型struct是定义结构体类型的关键字,结构体名是由程序设计者按C语言标识符命名规则指定的该结构体类型名。成员函数表列是可选项。成员变量表列列出该结构体的成员变量程序设计基础78.1.1结构体类型描述一个学生实体的完整结构体描述。structstudent{intid; //存储学生的学号charname[21]; //存储学生的姓名charsex; //存储学生的性别floatscore; //存储学生的成绩charaddress[40];//存储学生的家庭住址};程序设计基础88.1.1结构体类型结构体的成员也允许是其他结构体类型的变量,即一个结构体类型中的某些成员又是其他结构体类型。例:在上面定义的结构体中,出生日期没有作为结构体的成员,可以先把年份、月份、日期三个属性定义成一个结构体date。structdate{intyear;
//年intmonth;
//月intday;
//日};程序设计基础98.1.1结构体类型用结构体类型structdate声明一个变量作为结构体student的成员变量。程序设计基础108.1.1结构体类型描述一个学生实体的完整结构体描述。structstudent{intid;//学号charname[21];//姓名charsex;//性别floatscore;//成绩charaddr[50];//家庭住址structdatebirthday;//结构体类型的变量作为成员,要求结构体date必须已定义structstudentsa;//错误,不允许尚未完成定义的结构体类型定义非指针变量structstudent*next;//允许尚未完成定义的结构体类型定义指针变量作为成员};程序设计基础118.1.2结构体变量1.声明结构体变量(1)先定义结构体类型,再声明结构体变量。(2)定义结构体类型的同时声明结构体变量。(3)直接声明结构体类型变量。程序设计基础128.1.2结构体变量2.用typedef把数据类型名化繁为简typedef的应用主要有如下4种情形:(1)为基本数据类型定义新的类型名。也就是说,系统默认的所有基本类型都可以利用typedef关键字来重新定义类型名。(2)为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称。以结构体为例。(3)为数组定义简洁的类型名称。(4)为指针定义简洁的名称程序设计基础138.1.2结构体变量3.结构体变量的使用方法使用结构体变量主要是使用它作为变量能够存储信息这一属性。结构体变量名引用其成员的一般形式为:结构体变量名.成员名;圆点是个运算符,可读作“的”。程序设计基础148.1.2结构体变量4.结构体变量的初始化结构体变量和其他变量一样,可以在声明变量的同时进行初始化。程序设计基础158.1.2结构体变量5.结构体变量的输入与输出C语言不允许把一个结构体变量作为一个整体进行输入或输出。printf("%d\n",stu1);scanf("%d",&stu1);错误!那么下面这行代码能不能正确的输出stu1中的各个数据项?程序设计基础168.1.2结构体变量5.结构体变量的输入与输出printf("%d,%s,%c,%3.2f,%s\n",stu1);在用printf()输出时,一个格式符对应一个输出项,有明确的起止范围。printf不支持直接输出结构体变量,必须逐成员输出。程序设计基础178.1.3结构体数组如果要处理50名学生的数据,如一个班的学生成绩等应该使用结构体数组。在实际应用中,经常用结构体数组表示具有相同数据结构的一个群体。程序设计基础188.1.3结构体数组1.结构体类型数组的定义定义结构体类型数组,有3种方法。(1)先定义结构体类型,再定义结构体数组。例如:structstudent{intid;charname[21];};structstudents1[30];程序设计基础198.1.3结构体数组1.结构体类型数组的定义定义结构体类型数组,有3种方法。(2)定义结构体类型的同时定义结构体数组。例如:structstudent{
intid;
charname[21];}s1[30],s2[20];程序设计基础208.1.3结构体数组1.结构体类型数组的定义定义结构体类型数组,有3种方法。(3)直接定义结构体类型数组。例如:struct{intid;charname[21];}s1[30],s2[20];程序设计基础218.1.3结构体数组2.结构体数组的初始化在对结构体数组初始化时,要将每个元素的数据分别用花括号括起来。structstudent{intid;charname[21],sex;floatscore;charaddr[50];}stu[3]={{61102378,"YuanJie",'M',95,"80WenchangRoad"},{61102097,"YanKan",'M',80,"80WenchangRoad"},{61102100,"LiLing",'F',89,"88BeijingRoad"}};程序设计基础228.1.3结构体数组3.结构体数组的使用方法一个结构体数组的元素就是一个结构体变量,使用结构体数组的元素和使用结构体变量的规则完全相同。(1)引用结构体数组某个元素中的一个成员。(2)可以将一个结构体数组元素赋值给同一结构体数组中的另一元素,或者赋给同一类型的结构体变量。程序设计基础238.1.3结构体数组3.结构体数组的使用方法一个结构体数组的元素就是一个结构体变量,使用结构体数组的元素和使用结构体变量的规则完全相同。(1)引用结构体数组某个元素中的一个成员。(2)可以将一个结构体数组元素赋值给同一结构体数组中的另一元素,或者赋给同一类型的结构体变量。(3)不能把结构体数组元素作为一个整体直接进行输入或输出,只能以单个成员为对象进行输入或输出。程序设计基础248.1.3结构体数组【例8.3】建立学生通讯录。分析:(1)创建结构体变量(2)定义结构体数组(3)输入学生信息(4)输出学生信息程序设计基础258.1.3结构体数组分析:(1)创建结构体变量structstudents{
charname[21];//存储学生姓名
charphone[12];//存储电话号码};程序设计基础268.1.3结构体数组分析:(2)定义结构体数组structstudentspeople[NUM];//定义结构体数组程序设计基础278.1.3结构体数组分析:(3)输入学生信息for(i=0;i<NUM;i++){printf("inputname:");scanf("%s",people[i].name);//也可用gets(people[i].name);输入printf("inputtelephone:");scanf("%s",people[i].phone);//也可用gets(people[i].phone);输入}程序设计基础288.1.3结构体数组分析:(4)输出学生信息printf("name\t\tphone\n");for(i=0;i<NUM;i++)printf("%s\t\t%s\n",people[i].name,people[i].phone);}程序设计基础298.1.4结构体指针变量一个结构体变量在内存中占用一段连续的内存空间,可以声明一个指针变量,用于指向这个结构体变量,该指针变量称为结构体指针变量。程序设计基础308.1.4结构体指针变量1.指向结构体变量的指针指向结构体变量的指针声明的一般形式为:struct结构体名*指针变量名;例如structstudent*pstu;其访问的一般形式为:结构体指针变量->成员名程序设计基础318.1.4结构体指针变量【例8.4】结构体指针变量使用举例。程序设计基础32#include<stdio.h>structstudent//定义结构体,顺势定义结构体变量st1并初始化{intid;charname[21];charsex;floatscore;}st1={202210,"Lijin",'F',94.5},*p1;//同时定义结构体指针p1main(){p1=&st1;//令指针p1指向结构体变量st1printf("Number=%d\nName=%s\n",st1.id,);//结构体变量的访问方式printf("Sex=%c\nScore=%f\n\n",st1.sex,st1.score);printf("Number=%d\nName=%s\n",(*p1).id,(*p1).name);//仍以变量的方式访问printf("Sex=%c\nScore=%f\n\n",(*p1).sex,(*p1).score);printf("Number=%d\nName=%s\n",p1->id,p1->name);//指针方式访问printf("Sex=%c\nScore=%f\n\n",p1->sex,p1->score);}程序设计基础338.1.4结构体指针变量2.指向结构体数组的指针结构体指针变量和结构体数组也可以配合使用,以实现多种方式的编程。使用方法和普通指针变量与数组的配合方法一样。程序设计基础348.1.4结构体指针变量【例8.5】指向结构体数组的指针举例。程序设计基础35#include<stdio.h>structst{intid;charname[21];charsex;floatscore;}st1[3]={{10001,"Zhengqiang",'F',86.5},{10002,"Liangmei",'M',90.0},{10003,"Liuli",'F',72.5}};//定义结构体数组st1并初始化它main(){structst*p1;//定义结构体指针printf("Id\tName\t\tSex\tScore\t\n");for(p1=st1;p1<st1+3;p1++)//语句1令指针p1指向数组st1printf("%d\t%-15s\t%c\t%f\t\n",p1->id,p1->name,p1->sex,p1->score);}程序设计基础368.1.5结构体与函数1.用结构体变量作为函数参数C语言允许像使用基本数据类型的变量一样,把自定义的结构体变量用作函数参数。即,在定义函数时,可以使用结构体类型的变量作形参,在调用函数时,可以使用结构体变量作实参,系统会使用赋值原算法“=”进行形参与实参的结合,实现直接将实参结构体变量的各个成员的值整体地按名称相同的原则传递给形参结构体变量对应的成员变量。程序设计基础378.1.5结构体与函数【例8.6】用结构体变量作函数参数问题描述:随着全球气候变化加剧,各国提出“碳中和”目标,企业需定期上报碳排放数据并制定减排计划。具体用户需求是要求能够记录企业的碳排放数据(包括企业名称、碳排放量、碳抵消量等),并计算企业的净碳排放量(碳排放量-碳抵消量)。程序设计基础38【例8.6】#include<stdio.h>typedefstruct{//定义结构体数据类型,并将该结构体名字定义为CarbonRecordcharcompanyName[50];//企业名称floatEmission;//碳排放量(吨)floatOffset;//碳抵消量(吨)}CarbonRecord;voidShowCarbon(CarbonRecordrec); //函数声明,形参为结构体变量,进行“值”传递程序设计基础39【例8.6】intmain()//主函数{CarbonRecordrecord; //定义结构体变量recordprintf("请输入企业名称:");//输出操作提示scanf("%s",panyName); //按成员变量访问,companyName是数组名printf("请输入碳排放量(吨):");//输出操作提示scanf("%f",&record.Emission);//&求的是成员变量Emission的地址printf("请输入碳抵消量(吨):");//输出操作提示scanf("%f",&record.Offset);//&求的是成员变量Offset的地址ShowCarbon(record); //调用函数,已赋值的结构体变量record作实参return0;}程序设计基础40【例8.6】voidShowCarbon(CarbonRecordrec)//函数的定义,即函数的代码{ //此函数的功能是将形参变量rec的各成员变量值输出,rec是一个结构体变量printf("\n企业名称:%s\n",panyName);printf("碳排放量:%.2f吨\n",rec.Emission);printf("碳抵消量:%.2f吨\n",rec.Offset);printf("净碳排放量:%.2f吨\n",rec.Emission-rec.Offset);}程序设计基础418.1.5结构体与函数2.用结构体指针变量作函数形参C语言允许使用结构体指针作为形参变量,调用时用实参传递结构体变量的地址,这样,形参指针就“指向”实参结构体变量。程序设计基础428.1.5结构体与函数【例8.7】将例8.6改用结构体指针变量作函数形参,对比“地址”传递方式与“值”传递方式的异同。程序设计基础43【例8.7】#include<stdio.h>typedefstruct{//定义结构体数据类型,并将该结构体名字定义为CarbonRecordcharcompanyName[50];//企业名称floatEmission;//碳排放量(吨)floatOffset;//碳抵消量(吨)}CarbonRecord;voidShowCarbon(constCarbonRecord*rec); //形参为指针,进行"地址"传递voidinputCarbon(CarbonRecord*rec); //形参为指针,进行"地址"传递程序设计基础44【例8.7】main(){CarbonRecordrecord;//定义结构体变量recordinputCarbon(&record);//函数调用,实参是个具体的地址值ShowCarbon(&record);}程序设计基础45【例8.7】voidinputCarbon(CarbonRecord*rec){printf("请输入企业名称:");//操作提示scanf("%s",rec->companyName);//指针方式引用成员变量printf("请输入碳排放量(吨):");//操作提示scanf("%f",&rec->Emission);//&求的是成员变量Emission的地址printf("请输入碳抵消量(吨):");//操作提示scanf("%f",&rec->Offset);//&求的是成员变量Offset的地址}//也可以把所有的rec->改写为(*rec).程序设计基础46【例8.7】voidShowCarbon(constCarbonRecord*rec)//形参为指针,要作地址传递{printf("\n企业名称:%s\n",(*rec).companyName);printf("碳排放量:%.2f吨\n",(*rec).Emission);printf("碳抵消量:%.2f吨\n",(*rec).Offset);printf("净碳排放量:%.2f吨\n",(*rec).Emission-(*rec).Offset);}//也可以把所有的(*rec).改写为rec->程序设计基础478.1.5结构体与函数3.函数返回值是结构体类型函数的返回值也可以是结构体类型。【例8.8】返回结构体类型值的函数举例。程序设计基础48【例8.8】#include<stdio.h>structdatafun(); //函数声明,返回值类型是structdata,功能是输入各成员值structdata//定义结构体{inta,b,c;};程序设计基础49【例8.8】main(){inti,j;structdataarg;//定义结构体变量argarg=fun();//调用函数fun,实现输入各成员值,然后赋给argprintf("结构体变量的各成员值如下:\n");printf("成员a=%d;",arg.a);printf("成员b=%d;",arg.b);printf("成员c=%d;",arg.c);printf("\n");}程序设计基础50【例8.8】structdatafun() //函数fun()的返回值的数据类型是structdata{structdatad1; //定义结构体变量d1printf("输入3个成员变量的值:\n");//操作提示//按结构体的成员单独使用scanf("%d%d%d",&d1.a,&d1.b,&d1.c);returnd1; //把结构体变量d1作为返回值}程序设计基础518.2动态分配存储空间1.为什么要进行动态分配存储空间所谓动态分配存储空间是指在程序执行的过程中根据需要分配存储空间,这样可以需要多少分配多少,既保证够用,又不浪费。程序设计基础528.2动态分配存储空间2.实现动态管理存储空间的函数要对存储空间进行动态分配,需要实现分配指定大小的存储空间、回收(释放)给出首地址的一块存储空间,C语言提供了函数实现上述功能,分别是malloc()、calloc()、realloc()和free(),前面3个是有关分配存储空间的函数,而free()是用于释放存储空间的函数。程序设计基础538.2动态分配存储空间(1)malloc()函数函数原型为:void*malloc(unsignedintsize);其功能是在内存中分配一个长度为size个字节的连续空间,并将成功分配的存储空间的首地址作为函数值返回。如果分配失败,返回NULL。NULL是值0的符号常量。程序设计基础548.2动态分配存储空间(2)free()函数函数原型为:voidfree(void*p);功能是释放由malloc()等函数动态分配的存储空间,被释放的存储空间的首地址由形参指针变量给出。程序设计基础558.2动态分配存储空间(3)calloc()函数函数原型为:char*calloc(unsignedintnum,unsignedintsize);功能是分配num个大小为size字节的空间。程序设计基础568.2动态分配存储空间(4)realloc()函数函数原型为:void*realloc(void*ptr,unsignedintsize);参数ptr为需要重新分配的内存空间指针,size为新的内存空间的大小。功能是用于重新分配内存空间,程序设计基础578.2动态分配存储空间【例8.9】malloc()、realloc()、free()的使用示例。程序设计基础588.3顺序存储与链式存储对数据的处理包含增添、删除、更改、查找四种操作。所谓增添是指将数据以某种方式存储起来,而删除、更改属于数据维护工作,据统计,查找是使用最多的操作,因此,在大量的数据集中如果能做到查找速度快,则程序的效率就高。程序设计基础598.3顺序存储与链式存储对数据的处理包含增添、删除、更改、查找四种操作。所谓增添是指将数据以某种方式存储起来,而删除、更改属于数据维护工作,据统计,查找是使用最多的操作,因此,在大量的数据集中如果能做到查找速度快,则程序的效率就高。大量数据在存储时,有顺序存储和链式存储两种方式。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京市丰台区2025-2026学年高二下学期期末考试生物试题(文字版含答案)
- 激发潜能勇攀学术高峰:小学主题班会课件
- 关于协议履行情况的检查函(3篇)范文
- 智能家居设备连接与维护综合解决方案
- 消防水泵房管理制度及操作规程
- 科技项目经理研发团队KPI考核表
- 2026(四级)公营养师理论知识真题及答案
- 低压电工复审题库及参考答案
- 行动强化法制教育提升法律素养小学主题班会课件
- 2025年汽车维修工(高级技师)职业鉴定考试题库资料及答案
- 2026年计算机一级WPS Office真题冲刺高频模拟含解析
- 景观照明工程监理实施细则
- 特种设备作业人员资格复审申请表
- 《微针治疗操作规范》团体标准(征求意见稿)
- 危险药品运输制度规范
- 2026江西吉安市吉水县城控人力资源服务有限公司招聘劳务外包1人备考题库(一)有答案详解
- 2025年肇庆学院辅导员招聘考试真题汇编附答案
- 加油站改造工程安全文明施工方案
- 数控车床装配流程及工艺标准说明
- 2025银行合规管理岗位考试真题及答案
- 智慧园艺课件
评论
0/150
提交评论