C语言程序设计教程(第8章-结构体等构造数据类型)_第1页
C语言程序设计教程(第8章-结构体等构造数据类型)_第2页
C语言程序设计教程(第8章-结构体等构造数据类型)_第3页
C语言程序设计教程(第8章-结构体等构造数据类型)_第4页
C语言程序设计教程(第8章-结构体等构造数据类型)_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

第8章结构体等构造数据类型本章需要掌握的知识点结构体的类型说明结构体变量的定义结构体成员的引用使用指针操作结构体数据内容安排8.1结构体

8.2结构体数组

8.3结构体与指针

8.4结构体与函数

*8.5联合体

*8.6枚举

8.7类型定义8.1结构体C语言提供结构体的目的结构体类型说明结构体变量的定义和初始化结构体成员的引用1.C语言提供结构体的目的举例:编写一个学生成绩打印程序要求:请求用户输入学生的基本情况,其中包括每位学生的学号、姓名和成绩,将每位同学的成绩添加5分,然后按照以下格式输出学生的成绩列表。格式描述如下:学号姓名成绩

1张三992王五60

。。。。。实例的数据分析数据特点:描述学生基本信息的数据不是一个单独的数值、或者字符或者字符串。而是由学号、姓名和成绩等多个数据项一起构成的。基于旧知识的数据对象描述将学号、姓名和成绩分别定义为互相独立的简单变量。缺点:难以反映它们之间的内在联系。从而导致数据难于理解和处理。结构体的引入在C语言中,专门提供结构体机制来描述和处理这些由多个数据项组成的数据。2.结构体类型的声明

结构体通常是由多个数据项所组成的集合体。构成结构体的数据项称之为结构体成员,每一个成员具有各自的名字,可以分别属于不同的数据类型。struct

[结构体名]{

类型标识符成员名;类型标识符成员名;

…………….};成员类型可以是基本型或结构体型struct是关键字,不能省略合法标识符可省:无名结构体例structstudent{intcode;//学号

charname[20]; floatscore;};可换成charcode[13];3结构体变量的定义和初始化1、结构体变量的定义2、结构体变量的初始化1、结构体变量的定义定义方法共3种先声明结构体类型,再定义结构体变量声明结构体类型的同时定义结构体变量使用无名结构体类型直接定义各种方法的适用情况?a、先声明结构体类型再定义变量例structstudent{intcode;charname[20]; floatscore;};

structstudentstu1,stu2;

struct结构体名{

类型标识符成员名;类型标识符成员名;

…………….};struct结构体名变量名列表;b、声明类型的同时定义变量例structstudent{intcode;charname[20]; floatscore;}stu1,stu2;

struct结构体名{

类型标识符成员名;类型标识符成员名;

…………….}变量名列表;c、使用无名结构体类型直接定义例struct

{intcode;charname[20]; floatscore;}stu1,stu2;

struct

{

类型标识符成员名;类型标识符成员名;

…………….}变量名列表;各种方法的适用情况结构体类型只需使用一次,可以使用c方法。类型和变量的定义无法放置在一起的情况,必须使用a方法。如果变量的定义和类型的声明能够放置在一起,a、b方法都合适。结构体变量的初始化例structstudent{intcode;charname[20];floatscore; };structstudentstu1={2,“WangWu”,99};struct结构体名{

类型标识符成员名;类型标识符成员名;

…………….};struct结构体名结构体变量={初始数据列表};注意事项类型和变量是不同的概念,不要混同。变量是一个具体的数据对象,可以参与运算。而类型不是。成员的类型也可以是一个结构体类型。codenamebirthdaymonthdayyear例structdate{intmonth;intday;intyear;};structstudent{intcode;charname[20];

structdatebirthday;}stu;4结构体变量及其成员的引用结构体变量的引用结构体变量成员的直接引用结构体变量成员的逐级引用1、结构体变量的引用可以将一个结构体变量作为一个整体赋值给另一个同类型的结构体变量。

structstudents1={1,”wangli”,90},s2;s2=s1;不能将一个结构体变量作为一个整体进行输入和输出。只能对结构体变量中的各个成员分别进行输入和输出。printf("%d,%s,%f\n",s1);2、结构体变量成员的引用成员(分量)运算符引用方式:结构体变量名.成员名例structstudent{intcode;charname[20]; floatscore;}s1,s2;s1.code=10;s2.score=85.5;s1.score=s2.score+10;printf(“code=%d,score=%d”,s1.code,s1.score)3、结构体变量成员的逐级引用结构体嵌套时需逐级引用例structdate{intmonth;intday;intyear;};structstudent{intcode;

structdatebirthday;}stu;stu.birthday.month=12;8.2结构体数组结构体数组的定义结构体数组的初始化结构体数组元素成员的引用1、结构体数组的定义类型说明符数组名[常量表达式];inta[100];structstudentstus[20];2、结构体数组的初始化首先考虑数组的初始化。然后考虑数组中每一个元素的初始化,也就是对每一个元素进行结构体的初始化。structstudent{ charnumber[13]; charname[20]; floatClanguage;};structstudents[3]={{"01","WangXiao2",78}, {"02","Zhang3",99}, {"03","Li4",91} }3、结构体数组元素成员的引用先数组元素再结构体成员假如有定义structstudentstus[20];

那么stus[0].code就是引用stus数组中第1个元素中的code成员。补充:结构体基本应用举例需求描述数据结构描述程序输入部分程序处理部分程序输出部分程序的整体组合1、需求描述要求:请求用户输入学生的基本情况,其中包括每位学生的学号、姓名和C语言课程的成绩,将每位同学的成绩添加5分,然后按照以下格式输出学生的成绩列表。格式描述如下:学号姓名成绩

1张三992王五60

。。。。。2、数据结构描述#defineNUM20structstudent{intcode;charname[20];intscore;};structstudentstus[NUM];3、程序输入部分 inti=0;

printf("Pleaseinputcode,name,scoreofstudent%d:\n",i+1); scanf("%d",&stus[i].code); scanf("%s",stus[i].name); scanf("%d",&stus[i].score); for(i=0;i<NUM;i++){}4、程序处理部分

stus[i].score=stus[i].score+5;

for(i=0;i<NUM;i++){

}5、程序输出部分printf(“\n%-15s%-20s%-5s\n”,“学号”,“姓名","C语言成绩"); printf(“%-15d",stus[i].code); printf("%-20s",stus[i].name); printf("%-5d",stus[i].score); printf("\n");for(i=0;i<NUM;i++){

}-代表左对齐,15代表显示数据用的域宽6、程序的整体组合#include<stdio.h>voidmain(){/*数据结构描述部分*//*程序输入部分*//*程序处理部分*//*程序输出部分*/}StuStructInput.c8.3结构体与指针结构体指针指向结构体数组的指针1、结构体指针定义:struct

结构体名*结构体指针名;numnamesexagestupstructstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;如何通过指针访问结构体成员的值?方法一:使用指针运算符*引用结构体成员形式例intn;int*p=&n;*p=10;

n=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;(*p).num=101()不能省略如何通过指针访问结构体成员的值?方法二:使用指向运算符->引用结构体成员

structstudent{longintnum; charname[20]; charsex; floatscore;}stu_1,*p;p=&stu_1;p->sex='M';p->score=89.5;访问p指向的结构体变量的sex成员2、指向结构体数组的指针structstudent{intnum;charname[20];charsex;intage;}stu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19}, {10104,"WangMin",'F',20}};voidmain(){structstudent*p;for(p=stu;p<stu+3;p++)printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);}numnamesexagestu[0]pstu[1]stu[2]p+18.4结构体与函数用结构体变量作参数用指向结构体变量的指针作参数1、用结构体变量作函数参数用结构体变量作为函数参数,可以从调用函数向被调用函数完整地传递结构体变量中的所有成员。StruVarPara.c1、用结构体变量作函数参数

for(i=0;i<NUM;i++) ListStudents(stus[i]);//实参是结构体变量的名字

voidListStudents(structstudentstu){ printf("%-15d",stu.code); printf("%-20s",); printf("%-5d",stu.score); printf("\n");}StruVarPara.c关键问题结构体数据对象跟数组对象作为参数传递时有何不同?2、用指向结构体变量的指针作函数参数被调用函数获取调用函数数据对象的地址,从而可以通过指针访问调用函数中的结构体对象。StruPtVarPara.c2、用指向结构体变量的指针作函数参数StruPtVarPara.c

for(i=0;i<NUM;i++)

ListStudents(&stus[i]);//实参是结构体变量的地址

voidListStudents(structstudent*pStu){ printf("%-15d",pStu->code); printf("%-20s",pStu->name); printf("%-5d",pStu->score); printf("\n");}关键问题传递地址相比较于传递整个数据对象有何优点?开销小,速度快!类型定义的格式如下:例2:typedefstructstudentSTUDENT;STUDENTz3;8.7类型定义

typedef

原类型名新类型名;例1:

typedefintCOUNTER;

COUNTERi;使用类型定义可以提高程序的可读性使用类型定义还

温馨提示

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

评论

0/150

提交评论