第7章C语言结构体与共用体.docx
- 文档编号:10158300
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:41
- 大小:154.10KB
第7章C语言结构体与共用体.docx
《第7章C语言结构体与共用体.docx》由会员分享,可在线阅读,更多相关《第7章C语言结构体与共用体.docx(41页珍藏版)》请在冰点文库上搜索。
第7章C语言结构体与共用体
7.1结构体类型变量的定义和引用
7.1.1结构体类型变量的定义
7.1.2结构体类型变量的引用
7.1.3结构体类型变量的初始化
7.2结构体数组的定义和引用
前面的课程我们学习了一些简单数据类型(整型、实型、字符型)的定义和应用,还学习了数组(一维、二维)的定义和应用,这些数据类型的特点是:
当定义某一特定数据类型,就限定该类型变量的存储特性和取值范围。
对简单数据类型来说,既可以定义单个的变量,也可以定义数组。
而数组的全部元素都具有相同的数据类型,或者说是相同数据类型的一个集合。
在日常生活中,我们常会碰到一些需要填写的登记表,如住宿表、成绩表、通讯地址等。
在这些表中,填写的数据是不能用同一种数据类型描述的,在住宿表中我们通常会登记上姓名、性别、身份证号码等项目;在通讯地址表中我们会写下姓名、邮编、邮箱地址、电话号码、E-mail等项目。
这些表中集合了各种数据,无法用前面学过的任一种数据类型完全描述,
因此C引入一种能集中不同数据类型于一体的数据类型—结构体类型。
结构体类型的变量可以拥有不同数据类型的成员,是不同数据类型成员的集合。
7.1结构体类型变量的定义和引用
在上面描述的各种登记表中,让我们仔细观察一下住宿表、成绩表、通讯地址等。
住宿表由下面的项目构成:
这些登记表用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;i<3;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个人,填写如下的登记表,除姓名、学号外,还有三科成绩,编程实现对表格的计算,求解出每个人的三科平均成绩,求出四个学生的单科平均,并按平均成绩由高分到低分输出。
Number Name English Mathemr Physics Average
1 Liping 78 98 76 .
2 Wanglin 66 90 86 .
3 Jiangbo 89 70 76 .
4 Yangming 90 100 67 .
题目要求的问题多,采用模块化编程方式,将问题进行分解如下:
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;i { printf("\ninputname,number,English,mathema,physic\n");/*打印提示信息*/ gets(arr.name);/*输入姓名*/ gets(temp);/*输入学号*/ arr.number=atol(temp); for(j=0;j<3;j++) { gets(temp);/*输入三科成绩*/ arr.score[j]=atoi(temp); } } } 第三步,求解各学生的三科平均成绩。 在结构体类型数组中第i个元素arr的成员score的前三个元素为已知,第四个Average需计算得到。 voidaver(arr,n) structstuarr[]; intn; { inti,j; for(i=0;i { arr.score[3]=0; for(j=0;j<3;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;i for(j=0;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");/*打印表头*/ printf("----------------------------------------------------\n"); /*输出一条水平线*/ printf("|%10s|%8s|%7s|%7s|%7s|%7s|\n","Name","Number","English","Mathema","physics","average"); /*输出效果为: |Name|Number|English|Mathema|Physics|Average|*/ printf("----------------------------------------------------\n"); for(i=0;i { printf("|%10s|%8ld|",arr.name,arr.number);/*输出姓名、学号*/ for(j=0;j<4;j++) printf("%7.2f|",arr.score[j]);/*输出三科成绩及三科的平均*/ printf("\n"); printf("---------------------------------------------------\n"); } } 第六步,求解组内学生单科平均成绩并输出。 在输出表格的最后一行,输出单科平均成绩及总平均。 voidout_row(arr,n)/*对n个元素的结构体类型数组求单项平均*/ intn; structstuarr[]; { floatrow[4]={0,0,0,0};/*定义存放单项平均的一维数组*/ inti,j; for(i=0;i<4;i++) { for(j=0;j row =row +arr[j].score;/*计算单项总和*/ row=row/n;/*计算单项平均*/ } printf("|%19c|",'');/*按表格形式输出*/ for(i=0;i<4;i++) printf("%7.2f|",row); printf("\n------------------------------------------\n"); } 第七步,定义main()函数,列出完整的程序清单。 #include #include structstu { charname[20]; longnumber; floatscore[4]; }; main() { voidinput();/*函数声明*/ voidaver(); voidorder(); voidoutput(); voidout_row(); structstustud[4];/*定义结构体数组*/ floatrow[3]; input(stud,4);/*依此调用自定义函数*/ aver(stud,4); order(stud,4); output(stud,4); out_row(stud,4); } /****************************/ voidinput(arr,n) structstuarr[]; intn; { inti,j; chartemp[30]; for(i=0;i { printf("\nInputName,Number,English,Mathema,Physic\n"); gets(arr.name); gets(temp); arr.number=atol(temp); for(j=0;j<3;j++) { gets(temp); arr.score[j]=atoi(temp); } } } /*****************************************/ voidaver(arr,n) structstuarr[]; intn; { inti,j; for(i=0;i { arr.score[3]=0; for(j=0;j<3;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;i for(j=0;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) intn; structstuarr[]; { inti,j; printf("********************TABLE********************\n"); printf("-------------------------------------------------\n"); printf("|%10s|%8s|%7s|%7s|%7s|%7s|\n","Name","Number","English","mathema","physics","average"); printf("-------------------------------------------------\n"); for(i=0;i { printf("|%10s|%8ld|",arr.name,arr.number); for(j=0;j<4;j++) printf("%7.2f|",arr.score[j]); printf("\n"); printf("----------------------------------------------\n"); } } /*********************************************/ voidout_row(arr,n) intn; structstuarr[]; { floatrow[4]={0,0,0,0}; inti,j; for(i=0;i<4;i++) { for(j=0;j row=row+arr[j].score; row=ro
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 C语言 结构体与共用体 语言 结构 共用
![提示](https://static.bingdoc.com/images/bang_tan.gif)