第七章结构体与共同体

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C语言程序设计(第7章结构体与共用体)017.1结构体类型变量的定义和引用7.1.1结构体类型变量的定义7.1.2结构体类型变量的引用7.1.3结构体类型变量的初始化7.2结构体数组的定义和引用前面的课程我们学习了一些简单数据类型(整型、实型、字符型)的定义和应用,还学习了数组(一维、二维)的定义和应用,这些数据类型的特点是:当定义某一特定数据类型,就限定该类型变量的存储特性和取值范围。对简单数据类型来说,既可以定义单个的变量,也可以定义数组。而数组的全部元素都具有相同的数据类型,或者说是相同数据类型的一个集合。在日常生活中,我们常会碰到一些需要填写的登记表,如住宿表、成绩表、通讯地址等。在这些表中,填写的数据是不能用同一种数据类型描述的,在住宿表中我们通常会登记上姓名、性别、身份证号码等项目;在通讯地址表中我们会写下姓名、邮编、邮箱地址、电话号码、E-mail等项目。这些表中集合了各种数据,无法用前面学过的任一种数据类型完全描述,因此C引入一种能集中不同数据类型于一体的数据类型—结构体类型。结构体类型的变量可以拥有不同数据类型的成员,是不同数据类型成员的集合。7.1结构体类型变量的定义和引用在上面描述的各种登记表中,让我们仔细观察一下住宿表、成绩表、通讯地址等。住宿表由下面的项目构成:下载(33.09KB)2010-1-2604:17这些登记表用C提供的结构体类型描述如下:住宿表:structaccommod{charname[20];/*姓名*/charsex;/*性别*/charjob[40];/*职业*/intage;/*年龄*/longnumber;/*身份证号码*/};成绩表:structscore{chargrade[20];/*班级*/longnumber;/*学号*/charname[20];/*姓名*/floatos;/*操作系统*/floatdatastru;/*数据结构*/floatcompnet;/*计算机网络*/};通讯地址表:structaddr{charname[20];chardepartment[30];/*部门*/charaddress[30];/*住址*/longbox;/*邮编*/longphone;/*电话号码*/charemail[30];/*Email*/};这一系列对不同登记表的数据结构的描述类型称为结构体类型。由于不同的问题有不同的数据成员,也就是说有不同描述的结构体类型。我们也可以理解为结构体类型根据所针对的问题其成员是不同的,可以有任意多的结构体类型描述。下面给出C对结构体类型的定义形式:struct结构体名{成员项表列;};有了结构体类型,我们就可以定义结构体类型变量,以对不同变量的各成员进行引用。7.1.1结构体类型变量的定义结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对问题事先自行定义,所以结构体类型变量的定义形式就增加了灵活性,共计有三种形式,分别介绍如下:1)先定义结构体类型,再定义结构体类型变量:structstu/*定义学生结构体类型*/{charname[20];/*学生姓名*/charsex;/*性别*/longnum;/*学号*/floatscore[3];/*三科考试成绩*/};structstustudent1,student2;/*定义结构体类型变量*/structstustudent3,student4;用此结构体类型,可以定义更多的该结构体类型变量。2)定义结构体类型同时定义结构体类型变量:structdata{intday;intmonth;intyear;}time1,time2;也可以再定义如下变量:structdatatime3,time4;用此结构体类型,同样可以定义更多的该结构体类型变量。3)直接定义结构体类型变量:struct{charname[20];/*学生姓名*/charsex;/*性别*/longnum;/*学号*/floatscore[3];/*三科考试成绩*/}person1,person2;/*定义该结构体类型变量*/法由于无法记录该结构体类型,所以除直接定义外,不能再定义该结构体类型变量。7.1.2结构体类型变量的引用学习了怎样定义结构体类型和结构体类型变量,怎样正确地引用该结构体类型变量的成员呢?C规定引用的形式为:类型变量名.成员名若我们定义的结构体类型及变量如下:structdata{intday;intmonth;intyear;}time1,time2;则变量time1和time2各成员的引用形式为:time1.day、time1.month、time1.year及time2.day、time2.month、time2.year,如图7-1所示。类型变量的各成员与相应的简单类型变量使用方法完全相同。7.1.3结构体类型变量的初始化由于结构体类型变量汇集了各类不同数据类型的成员,所以结构体类型变量的初始化就略显复杂。结构体类型变量的定义和初始化为:structstu/*定义学生结构体类型*/{charname[20];/*学生姓名*/charsex;/*性别*/longnum;/*学号*/floatscore[3];/*三科考试成绩*/};structstustudent={liping,'f',970541,98.5,97.4,95};上述对结构体类型变量的三种定义形式均可在定义时初始化。结构体类型变量完成初始化后,即各成员的值分别为:student.name=liping、student.sex='f'、student.num=970541、student.score[0]=98.5、student.score[1]=97.4、student.score[2]=95。其存储在内存的情况如图7-2所示。我们也可以通过C提供的输入输出函数完成对结构体类型变量成员的输入输出。由于结构体类型变量成员的数据类型通常是不一样的,所以要将结构体类型变量成员以字符串的形式输入,利用C的类型转换函数将其转换为所需类型。类型转换的函数是:intatoi(char*str);转换str所指向的字符串为整型,其函数的返回值为整型。doubleatof(char*str);转换str所指向的字符串为实型,其函数的返回值为双精度的实型。longatol(char*str);转换str所指向的字符串为长整型,其函数的返回值为长整型。使用上述函数,要包含头文件stdlib.h。对上述的结构体类型变量成员输入采用的一般形式:chartemp[20];gets(student.name);/*输入姓名*/student.sex=getchar();/*输入性别*/gets(temp);/*输入学号*/student.num=atol(temp);/*转换为长整型*/for(i=0;i3;i++)/*输入三科成绩*/{gets(temp);student.score=atoi(temp);}对该结构体类型变量成员的输出也必须采用各成员独立输出,而不能将结构体类型变量以整体的形式输入输出。C答应针对具体问题定义各种各样的结构体类型,甚至是嵌套的结构体类型。structdata{intday;intmouth;intyear;};structstu{charname[20];structdatabirthday;/*出生年月,嵌套的结构体类型*/longnum;}person;该结构体类型变量成员的引用形式:person.name、person.birthday.day、person.birthday.month、person.birthday.year、person.num。7.2结构体数组的定义和引用单个的结构体类型变量在解决实际问题时作用不大,一般是以结构体类型数组的形式出现。结构体类型数组的定义形式为:structstu/*定义学生结构体类型*/{charname[20];/*学生姓名*/charsex;/*性别*/longnum;/*学号*/floatscore[3];/*三科考试成绩*/};structstustud[20];/*定义结构体类型数组stud,*//*该数组有20个结构体类型元素*/其数组元素各成员的引用形式为:stud[0].name、stud[0].sex、stud[0].score;stud[1].name、stud[1].sex、stud[1].score;......stud[19].name、stud[19].sex、stud[19].score;[例7-1]设某组有4个人,填写如下的登记表,除姓名、学号外,还有三科成绩,编程实现对表格的计算,求解出每个人的三科平均成绩,求出四个学生的单科平均,并按平均成绩由高分到低分输出。NumberNameEnglishMathemrPhysicsAverage1Liping789876.2Wanglin669086.3Jiangbo897076.4Yangming9010067.题目要求的问题多,采用模块化编程方式,将问题进行分解如下:1)结构体类型数组的输入。2)求解各学生的三科平均成绩。3)按学生的平均成绩排序。4)按表格要求输出。5)求解组内学生单科平均成绩并输出。6)定义main()函数,调用各子程序。第一步,根据具体情况定义结构体类型。structstu{charname[20];/*姓名*/longnumber;/*学号*/floatscore[4];/*数组依此存放English、Mathema、Physics,及Average*/};由于该结构体类型会提供给每个子程序使用,是共用的,所以将其定义为外部的结构体类型,放在程序的最前面。第二步,定义结构体类型数组的输入模块。voidinput(arr,n)/*输入结构体类型数组arr的n个元素*/structstuarr[];intn;{inti,j;chartemp[30];for(i=0;in;i++){printf(\ninputname,number,English,mathema,physic\n);/*打印提示信息*/gets(arr.name);/*输入姓名*/gets(temp);/*输入学号*/arr.number=atol(temp);for(j=0;j3;j++){gets(temp);/*输入三科成绩*/arr.score[j]=atoi(temp);}}}第三步,求解各学生的三科平均成绩。在结构体类型数组中第i个元素arr的成员score的前三个元素为已知,第四个Average需计算得到。voidaver(arr,n)structstuarr[];intn;{inti,j;for(i=0;in;i++)/*n个学生*/{arr.score[3]=0;for(j=0;j3;j++)arr.score[3]=arr.score[3]+arr.score[j];/*求和*/arr.score[3]=arr.score[3]/3;/*平均成绩*/}}第四步,按平均成绩排序,排序算法采用冒泡法。voidorder(arr,n)structstuarr[];intn;{structstutemp;inti,j,x,y;for(i=0;in-1;i++)for(j=0;jn-1-i;j++)if(arr[j].score[3]arr[j+1].score[3]){temp=arr[j];/*结构体类型变量不答应以整体输入或输出,但答应相互赋值*/arr[j]=arr[j+1];/*进行交换*/arr[j+1]=temp;}}第五步,按表格要求输出。voidoutput(arr,n)/*以表格形式输出有n个元素的结构体类型数组各成员*/intn;structstuarr[];{inti,j;printf(********************TABLE********************\n);/*打印表头*/print

1 / 35
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功