版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计技术基础第九章结构体与共用体程序设计技术基础第九章结构体与共用体2022/12/2329.1.1结构体类型的定义9.1.2结构体变量的定义9.1.3结构体变量的初始化和引用9.1结构体类型2022/12/1629.1.1结构体类型的定义.1结构体类型的定义结构体是一种自定义的数据类型,需要先定义才能使用。定义一个结构体类型的一般形式为:struct结构体名{
成员说明表列};2022/12/2339.1.1结构体类型的定义结构体是一种自定义的数据类型,需其中,成员说明表列是组成该结构体类型的所有数据的说明,若有n个成员,则每个成员均需作数据类型说明,可表示为:{
数据类型
成员标识符1;
数据类型
成员标识符2; ……
数据类型
成员标识符n;}2022/12/234其中,成员说明表列是组成该结构体类型的所有数据的说明,若有n【例9-1】有一个学生成绩表,如表9-1所示,定义一个结构体类型表示此结构。2022/12/235numbernamesexmathcomputer10001Lifunm788810002Lilinf8789学生成绩表【例9-1】有一个学生成绩表,如表9-1所示,定义一个结构第九章结构体与共用体2022/12/236structstudent{longnumber;charname[20];charsex;floatmath;floatcomputer;};定义如下:第九章结构体与共用体2022/12/166struct说明:(1)结构体名和结构体成员名遵循C语言标识符的命名规则,建议用具有一定意义的单词来命名。如【例9-1】中的student。(2)结构体成员的类型定义形式与简单变量的定义形式相同。2022/12/237说明:2022/12/167(3)struct是关键字,不能省略。(4)“structstudent”作为一个整体表示类型名,和普通数据类型一样都可用来定义变量的类型。(5)一对{}外面最后的分号是结构体定义的结束标志,不能省略。2022/12/238(3)struct是关键字,不能省略。2022/12/169.1.2结构体变量的定义1.先定义结构体类型,再定义其变量
一般形式为:struct结构体名{
成员说明表列};struct结构体名结构体变量列表;2022/12/2399.1.2结构体变量的定义1.先定义结构体类型,再定义其例如,前面已经定义了一个结构体类型structstudent,可以用它来定义具有该类型的结构体变量stu1,如下:structstudentstu1;2022/12/2310例如,前面已经定义了一个结构体类型structstuden2.定义结构体类型的同时定义结构体变量一般形式为:struct结构体名{
成员说明表列}变量名表列;例如,在定义structstudent的同时,定义与它具有相同结构的结构体变量stu2。2022/12/23112.定义结构体类型的同时定义结构体变量2022/12/16第九章结构体与共用体2022/12/2312structstudent{longnumber;charname[20];charsex;floatmath;floatcomputer;}stu2;第九章结构体与共用体2022/12/1612struct3.不出现结构体名,直接定义结构体变量一般形式为:struct{
成员说明表列}变量名表列;例如,2022/12/23133.不出现结构体名,直接定义结构体变量2022/12/16第九章结构体与共用体2022/12/2314structstudent{longnumber;charname[20];charsex;floatmath;floatcomputer;}stu3;第九章结构体与共用体2022/12/1614struct第三种方法只定义了结构体变量stu3,没有出现结构体名,因此,该方法不能再用来定义其他同类型的结构体变量。说明:在一个结构体中也可以包含另一个结构体。如:2022/12/2315第三种方法只定义了结构体变量stu3,没有出现结构体名,因此第九章结构体与共用体2022/12/2316structdate/*定义结构体date*/{intmonth;intday;intyear;};structstudent{longnumber;charname[20];structdatebirthday; /*birthday是structdate类型*/charsex;floatmath;floatcomputer;};第九章结构体与共用体2022/12/1616struct这里定义了一个结构体类型structdate,代表“日期”,包含3个成员:month、day、year。在定义structstudent类型时,成员birthday的类型定义为structdate类型。structstudent的结构如表9-2所示。2022/12/2317numbernamebirthdaysexmathcomputer
structstudent结构这里定义了一个结构体类型structdate,代表“日期9.1.3结构体变量的初始化和引用1.结构体变量的初始化对结构体变量进行初始化,也就是给结构体变量的各个成员赋初值。(1)对已经定义的结构体变量初始化例如,在【例9-1】中已经定义了结构体类型structstudent,再定义一个结构体变量stu1并进行初始化。structstudentstu1={10001,"Lifun",'m',78,88};。2022/12/23189.1.3结构体变量的初始化和引用1.结构体变量的初始化(2)同时完成结构体类型定义、结构体变量定义和初始化structstudent{longnumber;charname[20];charsex;floatmath;floatcomputer;}stu2={10002,"Lilin",'f',87,89};2022/12/2319(2)同时完成结构体类型定义、结构体变量定义和初始化20222.结构体变量的引用(1)引用结构体变量的成员访问结构体变量的成员必须用成员运算符。其一般形式为:结构体变量名.成员名例如,、stu2.math等。2022/12/23202.结构体变量的引用2022/12/1620如果成员本身又是一个结构体类型的变量(结构体嵌套),则在访问该结构体变量的成员时,应采取逐级访问的方法,通过成员运算符逐级找到最底层的成员再引用。如想要得到学生的出生日期,则可以这样引用:stu2.birthday.month、stu2.birthday.day、stu2.birthday.year2022/12/2321如果成员本身又是一个结构体类型的变量(结构体嵌套),则在访问(2)整体引用结构体变量同类型的结构体变量,可以将一个结构体变量整体赋值给另一个结构体变量。例如:structstudentstu1={10001,"Lifun",'m',78,88};structstudentstu3;stu3=stu1;通过赋值,结构体变量stu3中每个成员的值和结构体变量stu1每个成员的值相同。2022/12/2322(2)整体引用结构体变量2022/12/1622第九章结构体与共用体2022/12/2323#include<stdio.h>structsalary/*定义结构体类型,描述工资信息*/{floatbase;/*基础工资*/floatallowances;/*津贴*/floattaxes;/*税金*/};【例9-2】阅读下面程序,了解结构体成员的引用方法。第九章结构体与共用体2022/12/1623#includ第九章结构体与共用体2022/12/2324structworker/*定义结构体类型,描述职工基本信息*/{longnumber;/*工号*/charname[12];/*姓名*/structsalarysal; /*工资*/};第九章结构体与共用体2022/12/1624struct第九章结构体与共用体2022/12/2325intmain(){structworkerwk1={120101,"Liyue",2780.5,1356.5,124.11};structworkerwk2;wk2=wk1;[0]='M';[1]='a';wk2.number=120102;wk2.sal.allowances=2168.5;wk2.sal.taxes=(wk2.sal.base+wk2.sal.allowances)*0.03;printf("工号\t姓名\t基础工资\t津贴\t\t税金\n");printf("%ld\t%s\t%.2f\t\t%.2f\t\t%.2f\n",wk1.number,, wk1.sal.base,wk1.sal.allowances,wk1.sal.taxes);printf("%ld\t%s\t%.2f\t\t%.2f\t\t%.2f\n",wk2.number,, wk2.sal.base,wk2.sal.allowances,wk2.sal.taxes);return0;}第九章结构体与共用体2022/12/1625intma2022/12/23269.2结构体数组2022/12/16269.2结构体数组1结构体数组的定义结构体数组的定义方法如下:structstudentxs[30];它定义了一个有30个元素的结构体数组xs,数组中每个元素都是structstudent类型。也可以直接定义结构体数组,如:2022/12/23271结构体数组的定义结构体数组的定义方法如下:2022/12第九章结构体与共用体2022/12/2328structstudent{longnumber;charname[20];charsex;floatmath;floatcomputer;}xs[30];第九章结构体与共用体2022/12/1628struct第九章结构体与共用体2022/12/2329structstudent{longnumber;charname[20];charsex;floatmath;floatcomputer;}xs[30];或者第九章结构体与共用体2022/12/1629struct2结构体数组的初始化结构体数组的初始化是对结构体数组元素成员的初始化,形式和多维数组的初始化类似。其一般形式是在定义结构体数组的后面加上:={初值表列};
例如,structstudentxs[30]={{10001,"Lifun",'m',78,88},{10002,"Wangli",'f',89,90}};2022/12/23302结构体数组的初始化结构体数组的初始化是对结构体数组元素成3结构体数组的引用结构体数组的引用也是引用结构体数组元素的成员,与普通数组引用类似,其一般形式为:
数组名[下标].成员名
例如,xs[0].number/*引用第一个学生的学号*/xs[1].name/*引用第二个学生的名字*/2022/12/23313结构体数组的引用结构体数组的引用也是引用结构体数组元素的第九章结构体与共用体2022/12/2332intmain(){inti,num=0;floatsum=0;structstudentclass[5]={{10001,"Liping",18,96},{10002,"Zhangping",19,88},{10003,"Hefang",18,79},{10004,"Chengling",17,69},{10005,"Wangming",17,57}};/*定义并初始化结构体数组*/for(i=0;i<5;i++){sum+=class[i].math; /*引用结构体数组成员计算总成绩*/if(class[i].math<90)num++;}printf("sum=%.2f\naverage=%.2f\nnum=%d\n",sum,sum/5,num);return0;}第九章结构体与共用体2022/12/1632intma第九章结构体与共用体2022/12/2333#include<stdio.h>structstudent/*定义结构体类型,描述学生信息*/{longnumber;/*学号*/charname[20];/*姓名*/intage;/*年龄*/floatmath;/*成绩*/};【例9-3】已知5名学生的信息,包含学号、姓名、年龄、数学成绩,要求利用结构体数组计算5个学生的数学平均分,并统计数学小于90分的学生人数。第九章结构体与共用体2022/12/1633#includ2022/12/23349.3.1指向结构体变量的指针9.3.2指向结构体数组的指针9.3指向结构体的指针2022/12/16349.3.1指向结构体变量的指针指向结构体变量的指针结构体指针变量定义一般形式为:struct结构体名*结构体指针变量名;例如:2022/12/23359.3.1指向结构体变量的指针结构体指针变量定义一般形式为第九章结构体与共用体2022/12/23信息与计算机学院计算机基础教学部36structstudent{longnumber;charname[20];charsex;floatmath;floatcomputer;};structstudentstu1;structstudent*p=&stu1;第九章结构体与共用体2022/12/16信息与计算机学院计定义了结构体指针变量后,如何访问该指针变量指向的结构体成员呢?可以使用下面两种运算符:(1)圆点运算符一般形式为:(*结构体指针变量名).成员名。例如,(*p).name,表示指针变量p指向结构体变量stu1的name成员。(2)指向运算符(也称箭头运算符)一般形式为:结构体指针变量名–>成员名。例如,p->name,表示指针变量p指向结构体变量stu1的name成员。2022/12/2337定义了结构体指针变量后,如何访问该指针变量指向的结构体成员呢9.3.2指向结构体数组成员的指针指针变量可以指向普通数组,同样,指针变量也可以指向结构体类型的数组。例如:2022/12/23389.3.2指向结构体数组成员的指针指针变量可以指向普通数组第九章结构体与共用体2022/12/23信息与计算机学院计算机基础教学部39structstudent{longnumber;charname[20];charsex;floatmath;floatcomputer;};structstudentstu[20];structstudent*p=stu;第九章结构体与共用体2022/12/16信息与计算机学院计第九章结构体与共用体2022/12/2340#include<stdio.h>structstudent1
{longnumber;charname[20];charsex;intage;};/*定义结构体变量和结构体数组,并初始化*/structstudent1stu4={10101,"Lixiao",'m',19};structstudent1stu[3]={{10102,“Liping”,‘m’,18},{10103,"Zhangping",'m',20},{10104,"Hefang",'f',22}};【例9-4】熟悉如何用指针访问结构体变量和结构体数组。第九章结构体与共用体2022/12/1640#includ第九章结构体与共用体2022/12/2341intmain(){inti;structstudent1*p,*q;/*定义结构体指针*/p=&stu4; /*p指向结构体变量*/printf("numbernamesexage\n");printf("%5d%-10s%2c%5d\n",(*p).number,p->name,(*p).sex,p->age);q=stu;/*q指向结构体数组*/for(i=0;i<3;i++){printf("%5d%-10s%2c%5d\n",(*q).number,q->name,(*q).sex,q->age); q++;}return0;}第九章结构体与共用体2022/12/1641intma2022/12/23429.4.1结构体作函数参数9.4.2结构体作函数返回值9.4结构体与函数2022/12/16429.4.1结构体作函数参数.1结构体作函数参数结构体作函数参数,既可以把结构体变量作为函数参数,实现值传递,也可以把指向结构体的指针作为函数参数,实现地址传递。2022/12/23439.4.1结构体作函数参数结构体作函数参数,既可以把结构体第九章结构体与共用体2022/12/2344#include<stdio.h>structdate{intnian;intyue;intri;};【例9-5】值传递,结构体变量作函数参数。第九章结构体与共用体2022/12/1644#includ第九章结构体与共用体2022/12/23信息与计算机学院计算机基础教学部45intriqi(structdatea)/*结构体变量作函数参数*/{a.nian=2018;a.yue=5;a.ri=22;return0;}intmain(){structdateb;b.nian=2017;b.yue=4;b.ri=26;printf("调用前:%d%d%d\n",b.nian,b.yue,b.ri);riqi(b);printf("调用后:%d%d%d\n",b.nian,b.yue,b.ri);return0;}第九章结构体与共用体2022/12/16信息与计算机学院计第九章结构体与共用体2022/12/2346#include<stdio.h>structdate{intnian;intyue;intri;};intriqi(structdate*p)/*结构体指针变量作函数参数*/{(*p).nian=2018;(*p).yue=5;(*p).ri=22;return0;}【例9-6】地址传递,结构体指针变量作函数参数。第九章结构体与共用体2022/12/1646#includ第九章结构体与共用体2022/12/2347intmain(){structdateb;b.nian=2017;b.yue=4;b.ri=26;printf("调用前:%d%d%d\n",b.nian,b.yue,b.ri);riqi(&b);printf("调用后:%d%d%d\n",b.nian,b.yue,b.ri);return0;}第九章结构体与共用体2022/12/1647intmai9.4.2结构体作函数返回值函数的返回值除了可以是整型、实型、字符型和指向这些数据类型的指针以外,还可以返回结构体类型的值。2022/12/23489.4.2结构体作函数返回值函数的返回值除了可以是整型、实【例9-7】超市清点现有物品情况,有5种商品,要求从键盘输入每种商品的名称、数量、单价,编写程序能实现以下功能:输出库存清单(包括商品名称、数量、单价、合计),以及所有商品的总金额。程序用一个函数实现“输入库存商品信息”功能,其返回值为结构体类型。2022/12/2349【例9-7】超市清点现有物品情况,有5种商品,要求从键盘输分析:(1)商品信息可用结构体来表示。structStoreLib{charname[12];intnum;/*商品数量*/floatprice;/*商品单价*/floatSumMoney;/*商品小计*/};(2)每次输入的数据都是结构体变量的各成员值,因此可以设计函数:structStoreLibInputInfo();用于将商品信息输入到结构体数组Goods中。(3)使用函数intlist(structStoreLibGoods)输出库存信息。2022/12/2350分析:2022/12/1650第九章结构体与共用体2022/12/2351#include<stdio.h>structStoreLib /*描述商品信息*/{charname[12];intnum;floatprice;floatSumMoney;};structStoreLibGoods;floatTotal=0;intlist(structStoreLibGoods)/*通过商品数量和单价,计算出每种商品的金额*/{Goods.SumMoney=Goods.num*Goods.price;Total=Total+Goods.SumMoney;printf("%-24s%d\t%.2f\t%.2f\n",G,Goods.num,Goods.price,Goods.SumMoney);return0;}第九章结构体与共用体2022/12/1651#includ第九章结构体与共用体2022/12/23信息与计算机学院计算机基础教学部52structStoreLibInputInfo(){scanf("%s",G); /*输入商品名称*/scanf("%d%f",&Goods.num,&Goods.price);/*输入商品数量和商品单价*/returnGoods;}intmain(){structStoreLibiGoods[5];inti;printf("请输入5种库存商品信息:商品名称
数量
单价\n");for(i=0;i<5;i++) iGoods[i]=InputInfo(); /*函数调用,输入商品信息*/printf("\n----------------------------------------------\n");printf("库存清单:\n");printf("商品名称\t\t数量\t单价\t小计\n");for(i=0;i<5;i++) list(iGoods[i]); /*函数调用,输出库存清单*/printf("库存商品金额总计:%.2f\n",Total);return0;}第九章结构体与共用体2022/12/16信息与计算机学院计2022/12/23539.5.1共用体类型及其变量的定义9.5.2共用体变量的引用9.5共用体类型2022/12/16539.5.1共用体类型及其变量的定义9.5.1共用体类型及其变量的定义共用体的定义方法和定义结构体类型相似,其一般形式为:union共用体名
{
成员表列};2022/12/23549.5.1共用体类型及其变量的定义共用体的定义方法和定义结union是关键字,是定义共用体类型必不可少的。一对{}中的内容为共用体成员的类型说明,与结构体类型的成员说明一致。例如:uniondata{doublea;inti;charch;};2022/12/2355union是关键字,是定义共用体类型必不可少的。一对{}中的定义共用体变量的方法与结构体类似,有下面三种方法。1.先定义共用体类型,再定义变量一般形式为:union共用体名
{
成员表列};union共用体名变量表列;2022/12/2356定义共用体变量的方法与结构体类似,有下面三种方法。2022/第九章结构体与共用体2022/12/2357uniondata{doublea;inti;charch;};uniondatanum1,num2;例如:第九章结构体与共用体2022/12/1657union2.定义共用体类型的同时定义共用体变量
一般形式为:union共用体名{
成员表列}变量表列;
2022/12/23582.定义共用体类型的同时定义共用体变量2022/12/165第九章结构体与共用体2022/12/2359uniondata{doublea;inti;charch;}num1,num2;例如:第九章结构体与共用体2022/12/1659union3.不出现共用体名,直接定义共用体变量一般形式为:union{
成员表列}变量表列;
2022/12/23603.不出现共用体名,直接定义共用体变量2022/12/166第九章结构体与共用体2022/12/2361union{doublea;inti;charch;}num1,num2;例如:第九章结构体与共用体2022/12/1661union例9.5.2共用体变量的引用共用体变量必须先定义,才能引用,而且不能整体引用,只能引用共用体变量的成员。其一般形式为:共用体变量名.成员名
如,num1.i(引用共用体变量num1中的整型变量i)。【例9-8】了解共用体变量的引用。2022/12/23629.5.2共用体变量的引用共用体变量必须先定义,才能引用,第九章结构体与共用体2022/12/2363#include<stdio.h>unionstudent{longnumber;charc;intage;};intmain(){unionstudents1,s2;s1.number=10001;s1.c='L';s1.age=65;printf("共用体变量s1成员的值为:\n");printf("s1.number=%d\ns1.c=%c\ns1.age=%d\n",s1.number,s1.c,s1.age);s1.c='W';s2=s1;printf("共用体变量s2的值为:\n");printf("s2is%c\n",s2.c);return0;}第九章结构体与共用体2022/12/1663#includ2022/12/23649.6枚举类型2022/12/16649.6枚举类型定义枚举类型的一般形式为:enum枚举变量名{取值表列};例如,enumresponse{no,yes,none};上面的语句定义了名为response的枚举类型,取值范围为:no、yes、none。可以用该类型来定义变量,如
enumresponseanswer;2022/12/2365定义枚举类型的一般形式为:2022/12/1665也可以同时定义枚举类型和枚举变量,如:enumresponse{no,yes,none}answer;或者不出现枚举名,直接定义枚举变量,如:enum{no,yes,none}answer;2022/12/2366也可以同时定义枚举类型和枚举变量,如:2022/12/166也可以同时定义枚举类型和枚举变量,如:enumresponse{no,yes,none}answer;或者不出现枚举名,直接定义枚举变量,如:enum{no,yes,none}answer;说明:(1)一对{}中的取值称为枚举常量,都是整型常量,用户在定义时不指定其值,系统默认第1个枚举常量的值是0,后面的枚举值依次增加1,如:enumresponse{no,yes,none}answer;,其中no=0,yes=1,none=2。(2)枚举值也可指定,如:enum{no=1,yes=3,none=4}answer;2022/12/2367也可以同时定义枚举类型和枚举变量,如:2022/12/166【例9-9】从键盘输入一个1~12的整数,在屏幕上显示与该整数对应的月份的英文名称。分析:在输出较多的枚举变量时,可以用switch结构语句。
程序如下:2022/12/2368【例9-9】从键盘输入一个1~12的整数,在屏幕上显示与该第九章结构体与共用体2022/12/2369#include<stdio.h>#include<stdio.h>intmain(){enummonth{Jan=1,Feb=2,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec}mon;intk;printf("pleaseinputanumber(1~12):");scanf("%d",&k);mon=(enummonth)k;/*强制类型转换*/switch(mon){caseJan:printf("ThismonthisJanuary.\n");break;caseFeb:printf("ThismonthisFebruary.\n");break;caseMar:printf("ThismonthisMarch.\n");break;caseApr:printf("ThismonthisApril.\n");break;caseMay:printf("ThismonthisMay.\n");break;caseJun:printf("ThismonthisJune.\n");break;caseJul:printf("ThismonthisJuly.\n");break;caseAug:printf("ThismonthisAugust.\n");break;caseSep:printf("ThismonthisSeptember.\n");break;caseOct:printf("ThismonthisOctober.\n");break;caseNov:printf("ThismonthisNovember.\n");break;caseDec:printf("ThismonthisDecember.\n");break;default:printf("Inputiserror!\n"); }return0;}第九章结构体与共用体2022/12/1669#includ2022/12/23709.7typedef类型2022/12/16709.7typedef类型typedef定义的一般形式为:typedef原类型名新类型名;一般情况,新类型名表示为大写字母,只是为了与系统提供的标准类型的标识符相区分。例如:typedefintINTEGER;typedeffloatREAL;2022/12/2371typedef定义的一般形式为:2022/12/1671typedef语句也可以给一些复杂数据类型定义新的名称。例如:typedefstructstudentSTUDENT;等价于typedefstructstudent{longnum;charname[10];intage;}STUDENT;2022/12/2372typedef语句也可以给一些复杂数据类型定义新的名称。202022/12/23739.8程序类型2022/12/16739.8程序类型【例9-10】输入5个同学的姓名、数学成绩、英语成绩和计算机成绩,确定总分最高的同学,并打印其姓名及其3门课程的成绩。分析:(1)使用长度为5的structstudent类型的结构体数组存储所有同学的相关信息。(2)定义structstudent类型指针pmax存储总分最高的同学的地址。(3)定义structstudent类型指针pstu引用结构体数组中的元素及其数组元素成员的值。(4)通过循环语句为每个数组元素成员赋值。(5)利用pmax输出成绩最高的同学的相关信息。2022/12/2374【例9-10】输入5个同学的姓名、数学成绩、英语成绩和计算第九章结构体与共用体2022/12/2375#include<stdio.h>structstudent /*定义结构体类型*/{charname[20];intmath;intenglish;intcomputer;};intmain(){ structstudentstu[5]; /*定义structstudent类型的结构体数组存储所有同学的相关信息*/ structstudent*pmaxstu; /*定义structstudent类型指针存储总分最高的同学的地址*/ structstudent*pstudent; /*定义structstudent类型指针来引用数组*/ intfmaxscore=0,ftotal; /*存储最高分和总分的中间变量*/ intfmath,fenglish,fcomputer; /*存储各科成绩的中间变量*/ charszname[20]; printf("\npleaseinput5studentsandscore:\n"); printf("Name\tMath\tEnglish\tComputer\n"); pmaxstu=stu; /*给pmaxstu指针变量赋初值*/ /*将数组stu的地址赋给pstudent指针变量,通过pstudent为数组stu各元素赋值*/第九章结构体与共用体2022/12/1675#includ第九章结构体与共用体2022/12/2376
for(pstudent=stu;pstudent<stu+5;pstudent++) { /*键盘输入当前同学的相关信息*/ scanf("%s%d%d%d",szname,&fmath,&fenglish,&fcomputer); /*将中间变量的值通过结构体指针引用,赋值到对应数组元素的各个成员中*/ strcpy(pstudent->name,szname); pstudent->math=fmath; pstudent->english=fenglish; pstudent->computer=fcomputer; ftotal=pstudent->math+pstudent->english+pstudent->computer; /*获得当前最高分同学所对应数组元素的地址*/ if(fmaxscore<ftotal) { fmaxscore=ftotal; pmaxstu=pstudent;/*将最高分同学所对应的首地址赋值给最高分指针变量*/ } } printf("themaxis:"); printf("%s,%d,%d,%d\n",pmaxstu->name,pmaxstu->math,pmaxstu->english,pmaxstu->computer);return0;}第九章结构体与共用体2022/12/1676 for(p【例9-11】商品进出库管理,入库商品的数据包括编号、商品名称、数量、状态(入库)、货架号,出库商品的数据包括编号、商品名称、数量、状态(出库)、部门。用同一个表格实现这个管理,如表所示。编写程序输入和输出这些数据。2022/12/2377编号商品名称数量状态货架号或部门101book19I1030102sugar20Ofood-group103cup48I1206104doll46Otoy-group
商品进出库管理信息表【例9-11】商品进出库管理,入库商品的数据包括编号、商品第九章结构体与共用体2022/12/2378#include<stdlib.h> /*包含atol()函数*/#include<stdio.h>structgoods /*商品信息*/{ longnumber; /*编号*/ charname[20]; /*商品名称*/ intquantity; /*数量*/ charstate; /*商品状态*/ union { longpart;/*货架号*/ chargroup[20];/*部门*/ }depa; };intmain(){structgoodsitems[4]; /*保存入库商品数据*/inti;chartmp[20]; /*中间变量,用来存储键盘输入的货架号或部门*/printf("pleaseinputdata:\nnumbernamequantitystatedepartment\n");第九章结构体与共用体2022/12/1678#includ第九章结构体与共用体2022/12/2379for(i=0;i<4;i++) /*将键盘输入数据保存到结构体数组的每个元素中*/{ scanf("%ld%s%d%c%s", &items[i].number,items[i].name,&items[i].quantity,&items[i].state,tmp); if(items[i].state=='I') items[i].depa.part=atol(tmp); elseif(items[i].state=='O') strcpy(items[i].depa.group,tmp);}printf("\n----------------------------------------------\n");printf("outputdata:\n");printf("number\tname\tquantity\tstate\tdepartment\n");for(i=0;i<4;i++) /*输出结构体数组的数据*/{ if(items[i].state=='I') printf("%ld\t%s\t%d\t\t%c\t%d\n",items[i].number,items[i].name,items[i].quantity,items[i].state,items[i].depa.part);elseif(items[i].state=='O')printf("%ld\t%s\t%d\t\t%c\t%s\n",items[i].number,items[i].name,items[i].quantity,items[i].state,items[i].depa.group);elseprintf("进出库状态不合理");}return0;}第九章结构体与共用体2022/12/1679for(i=0【例9-12】编写一个程序实现下述要求。已知一个口袋中有红、白、黄、蓝4种球各若干,每次取3个球,打印输出每次取出3种不同颜色球的所有可能的组合及组合数。分析:球只能是四色之一,可以采用枚举类型变量来处理。判断各个球是否同色,可以设取出的球为i、j、k,分别是4种颜色的球之一,并要求i、j、k各不相同。2022/12/2380【例9-12】编写一个程序实现下述要求。已知一个口袋中有红第九章结构体与共用体2022/12/2381#include<stdio.h>enumclolr{red,white,yellow,blue}i,j,k,p;/*定义枚举变量*/intmain(){intn=0,loop;for(i=red;i<=blue;i++)for(j=red;j<=blue;j++) if(i!=j) for(k=red;k<=blue;k++) if((k!=i)&&(k!=j)) { n++; printf("\n%d",n);第九章结构体与共用体2022/12/1681#includ第九章结构体与共用体2022/12/2382
for(loop=1;loop<=3;loop++){switch(loop){case1:p=i;break;case2:p=j;break;case3:p=k;break;default:;}switch(p){casered:printf("\t%s","red");break;casewhite:printf("\t%s","white");break;caseyellow:printf("\t%s","yellow");break;caseblue:printf("\t%s","blue");break;default:;}}}printf("\ntotal:%5d\n",n);return0;}第九章结构体与共用体2022/12/1682for(2022/12/2383本章主要介绍了结构体和共用体,可以将不同类型的数据放在一起,还有枚举类型和typedef类型,它们都是用户根据实际需要自己定义的类型,使用时要注意这些数据类型的定义和其变量的定义。本章小结2022/12/1683本章主要介绍了结构体和
程序设计技术基础第九章结构体与共用体程序设计技术基础第九章结构体与共用体2022/12/23859.1.1结构体类型的定义9.1.2结构体变量的定义9.1.3结构体变量的初始化和引用9.1结构体类型2022/12/1629.1.1结构体类型的定义.1结构体类型的定义结构体是一种自定义的数据类型,需要先定义才能使用。定义一个结构体类型的一般形式为:struct结构体名{
成员说明表列};2022/12/23869.1.1结构体类型的定义结构体是一种自定义的数据类型,需其中,成员说明表列是组成该结构体类型的所有数据的说明,若有n个成员,则每个成员均需作数据类型说明,可表示为:{
数据类型
成员标识符1;
数据类型
成员标识符2; ……
数据类型
成员标识符n;}2022/12/2387其中,成员说明表列是组成该结构体类型的所有数据的说明,若有n【例9-1】有一个学生成绩表,如表9-1所示,定义一个结构体类型表示此结构。2022/12/2388numbernamesexmathcomputer10001Lifunm788810002Lilinf8789学生成绩表【例9-1】有一个学生成绩表,如表9-1所示,定义一个结构第九章结构体与共用体2022/12/2389structstudent{longnumber;charname[20];charsex;floatmath;floatcomputer;};定义如下:第九章结构体与共用体2022/12/166struct说明:(1)结构体名和结构体成员名遵循C语言标识符的命名规则,建议用具有一定意义的单词来命名。如【例9-1】中的student。(2)结构体成员的类型定义形式与简单变量的定义形式相同。2022/12/2390说明:2022/12/167(3)struct是关键字,不能省略。(4)“structstudent”作为一个整体表示类型名,和普通数据类型一样都可用来定义变量的类型。(5)一对{}外面最后的分号是结构体定义的结束标志,不能省略。2022/12/2391(3)struct是关键字,不能省略。2022/12/169.1.2结构体变量的定义1.先定义结构体类型,再定义其变量
一般形式为:struct结构体名{
成员说明表列};struct结构体名结构体变量列表;2022/12/23929.1.2结构体变量的定义1.先定义结构体类型,再定义其例如,前面已经定义了一个结构体类型structstudent,可以用它来定义具有该类型的结构体变量stu1,如下:structstudentstu1;2022/12/2393例如,前面已经定义了一个结构体类型structstuden2.定义结构体类型的同时定义结构体变量一般形式为:struct结构体名{
成员说明表列}变量名表列;例如,在定义structstudent的同时,定义与它具有相同结构的结构体变量stu2。2022/12/23942.定义结构体类型的同时定义结构体变量2022/12/16第九章结构体与共用体2022/12/2395structstudent{longnumber;charname[20];charsex;floatmath;floatcomputer;}stu2;第九章结构体与共用体2022/12/1612struct3.不出现结构体名,直接定义结构体变量一般形式为:struct{
成员说明表列}变量名表列;例如,2022/12/23963.不出现结构体名,直接定义结构体变量2022/12/16第九章结构体与共用体2022/12/2397structstudent{longnumber;charname[20];charsex;floatmath;floatcomputer;}stu3;第九章结构体与共用体2022/12/1614struct第三种方法只定义了结构体变量stu3,没有出现结构体名,因此,该方法不能再用来定义其他同类型的结构体变量。说明:在一个结构体中也可以包含另一个结构体。如:2022/12/2398第三种方法只定义了结构体变量stu3,没有出现结构体名,因此第九章结构体与共用体2022/12/2399structdate/*定义结构体date*/{intmonth;intday;intyear;};structstudent{longnumber;charname[20];structdatebirthday; /*birthday是structdate类型*/charsex;floatmath;floatcomputer;};第九章结构体与共用体2022/12/1616struct这里定义了一个结构体类型structdate,代表“日期”,包含3个成员:month、day、year。在定义structstudent类型时,成员birthday的类型定义为structdate类型。structstudent的结构如表9-2所示。2022/12/23100numbernamebirthdaysexmathcomputer
structstudent结构这里定义了一个结构体类型structdate,代表“日期9.1.3结构体变量的初始化和引用1.结构体变量的初始化对结构体变量进行初始化,也就是给结构体变量的各个成员赋初值。(1)对已经定义的结构体变量初始化例如,在【例9-1】中已经定义了结构体类型structstudent,再定义一个结构体变量stu1并进行初始化。structstudentstu1={10001,"Lifun",'m',78,88};。2022/12/231019.1.3结构体变量的初始化和引用1.结构体变量的初始化(2)同时完成结构体类型定义、结构体变量定义和初始化structstudent{longnumber;charname[20];charsex;floatmath;floatcomputer;}stu2={10002,"Lilin",'f',87,89};2022/12/23102(2)同时完成结构体类型定义、结构体变量定义和初始化20222.结构体变量的引用(1)引用结构体变量的成员访问结构体变量的成员必须用成员运算符。其一般形式为:结构体变量名.成员名例如,、stu2.math等。2022/12/231032.结构体变量的引用2022/12/1620如果成员本身又是一个结构体类型的变量(结构体嵌套),则在访问该结构体变量的成员时,应采取逐级访问的方法,通过成员运算符逐级找到最底层的成员再引用。如想要得到学生的出生日期,则可以这样引用:stu2.birthday.month、stu2.birthday.day、stu2.birthday.year2022/12/23104如果成员本身又是一个结构体类型的变量(结构体嵌套),则在访问(2)整体引用结构体变量同类型的结构体变量,可以将一个结构体变量整体赋值给另一个结构体变量。例如:structstudentstu1={10001,"Lifun",'m',78,88};structstudentstu3;stu3=stu1;通过赋值,结构体变量stu3中每个成员的值和结构体变量stu1每个成员的值相同。2022/12/23105(2)整体引用结构体变量2022/12/1622第九章结构体与共用体2022/12/23106#include<stdio.h>structsalary/*定义结构体类型,描述工资信息*/{floatbase;/*基础工资*/floatallowances;/*津贴*/floattaxes;/*税金*/};【例9-2】阅读下面程序,了解结构体成员的引用方法。第九章结构体与共用体2022/12/1623#includ第九章结构体与共用体2022/12/23107structworker/*定义结构体类型,描述职工基本信息*/{longnumber;/*工号*/charname[12];/*姓名*/structsalarysal; /*工资*/};第九章结构体与共用体2022/12/1624struct第九章结构体与共用体2022/12/23108intmain(){structworkerwk1={120101,"Liyue",2780.5,1356.5,124.11};structworkerwk2;wk2=wk1;[0]='M';[1]='a';wk2.number=120102;wk2.sal.allowances=2168.5;wk2.sal.taxes=(wk2.sal.base+wk2.sal.allowances)*0.03;printf("工号\t姓名\t基础工资\t津贴\t\t税金\n");printf("%ld\t%s\t%.2f\t\t%.2f\t\t%.2f\n",wk1.number,, wk1.sal.base,wk1.sal.allowances,wk1.sal.taxes);printf("%ld\t%s\t%.2f\t\t%.2f\t\t%.2f\n",wk2.number,, wk2.sal.base,wk2.sal.allowances,wk2.sal.taxes);return0;}第九章结构体与共用体2022/12/1625intma2022/12/231099.2结构体数组2022/12/16269.2结构体数组1结构体数组的定义结构体数组的定义方法如下:structstudentxs[30];它定义了一个有30个元素的结构体数组xs,数组中每个元素都是structstudent类型。也可以直接定义结构体数组,如:2022/12/231101结构体数组的定义结构体数组的定义方法如下:2022/12第九章结构体与共用体2022/12/23111structstudent{longnumber;charname[20];
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 加气站反恐教育培训制度
- 学校经营部审计制度
- 乡镇财税所绩效考核制度
- 审计外包制度
- 内部审计工作保密制度
- 审计错案责任追究制度
- 员工线上绩效考核制度
- 区县审计局内部管理制度
- 业务人员绩效考核制度
- 审计公务招待制度汇编
- Unit15Itsamysterytome!(课件)新概念英语青少版2A
- 【MOOC】市场调查与研究-南京邮电大学 中国大学慕课MOOC答案
- 插画教学课件教学课件
- DB23T 3834-2024 安全生产培训机构管理指南
- 【教材】高二校本课程-趣味化学
- 4.1.1荒漠化的防治以我国西北地区为例(学生)
- 倍择瑞附有答案
- 教练技术第一阶段感恩课催眠话术
- 【部编版】三年级语文下册第5课《守株待兔》精美课件
- 机房、设备卫生清洁记录表
- 成人手术后疼痛评估与护理
评论
0/150
提交评论