(中职)C语言程序设计模块九电子课件.pptx
《(中职)C语言程序设计模块九电子课件.pptx》由会员分享,可在线阅读,更多相关《(中职)C语言程序设计模块九电子课件.pptx(62页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、YCF正版可修改PPT(中职)C语言程序设计模块九ppt电子课件LOGO结构体与联合体模块99.1结构体(变量)的定义与说明9.1.1结构体的定义结构体使用struct关键字进行定义。struct 结构体名数据类型 成员名1;数据类型 成员名2;数据类型 成员名n;/*注意别丢了分号*/例如,定义一个名为student的结构体:struct studentchar name8;char sex;char nation10;int age;float score;9.1结构体(变量)的定义与说明9.1.2结构体变量的定义与赋值(1)先定义结构,后定义变量。struct studentchar n
2、ame8;char sex;char nation10;int age;float score;struct student x,y;/*这里定义了x,y两个结构体变量*/(2)结构体和结构体变量同时定义。struct studentchar name8;char sex;char nation10;int age;float score;x,y;/*这里同时定义了x,y两个结构体变量*/1.结构体变量的定义方法9.1结构体(变量)的定义与说明9.1.2结构体变量的定义与赋值定义时可以省略结构体名。struct char name8;char sex;char nation10;int age
3、;float score;x,y;/*这里同时定义了x,y两个结构体变量*/不建议省略结构体名。一个明晰的结构体名可以帮我们直观地了解到本结构体是针对哪个方面的数据构造类型。9.1结构体(变量)的定义与说明9.1.2结构体变量的定义与赋值(3)结构体的嵌套定义。所谓结构体的嵌套定义指的是一个结构体的变量做另一个结构体的成员。例如:struct dateint year;int month;int day;struct studentchar name20;char sex;char nation10;int age;struct date birthday;/*这里就是date结构体变量bir
4、thday做student的成员*/x;9.1结构体(变量)的定义与说明9.1.2结构体变量的定义与赋值2.结构体变量的赋值给结构体变量赋值,实质是给各个成员进行赋值,见表9-1。例如:struct studentchar name20;char sex;char nation10;int age;float score;x=Lixiaomei,f,dongze,18,456;表9-1给结构体变量赋值给结构体变量赋值时,要以成员顺序为依据按序赋值,用 括起来。9.1结构体(变量)的定义与说明9.1.3结构体变量的使用结构体变量的使用实质是结构体成员的引用,即其单个成员的运算操作(如赋值、输入/
5、输出等)。结构体成员的引用方法是:结构体变量名.成员名其中,“.”为成员运算符。成员运算符“.”、成员指向运算符“-”、变址符“”和括号“()”运算符在C语言中具有最高的运算级别。9.1结构体(变量)的定义与说明9.1.3结构体变量的使用【例9-1】对结构体变量进行动态赋值。#include#include struct dateint year;int month;int day;struct studentchar name20;char sex;char nation10;int age;float score;struct date birthday;y=zhangjie,m,don,
6、18,340;/*注意birthday没有赋值*/int main();struct student x,z;/*下面对结构体变量x各成员进行赋值*/strcpy(x.name,Lily);/*不能写成x.name=Lily,因为name数组名是地址常量*/x.sex=f;strcpy(x.nation,dongzi);x.age=18;x.score=428;9.1结构体(变量)的定义与说明9.1.3结构体变量的使用x.birthday.year=1999;/*嵌套定义时须用成员运算符一级一级地找到最底层一级成员*/x.birthday.month=5;x.birthday.day=23;/
7、*具有相同结构的结构体变量可以进行相互赋值*/y=x;/*变量x的各成员值赋给了变量y的各成员*/*也可进行结构体变量单个成员的相互赋值*/z.nation=x.nation;z.sex=y.sex;printf(%s,%c,%s,%d,%.1f,x.name,x.sex,x.nation,x.age,x.score);printf(%d-%d-%d,x.birthday.year,x.birthday.month,x.birthday.day);9.1结构体(变量)的定义与说明9.1.4结构体变量的内存长度计算结构体是一种构造数据类型,定义时系统并不分配内存空间,但结构体变量则是会分配内存空
8、间的。那么,系统是如何给结构体变量分配内存空间的呢?在程序运行中,结构体变量各成员是同时存在于内存中的,因而结构体变量的内存长度是各成员的长度之和。例如:char nation10;int age;float score;struct date birthday;x;struct dateint year;int month;int day;struct studentchar name20;char sex;9.1结构体(变量)的定义与说明9.1.4结构体变量的内存长度计算结构体变量x的内存长度计算如下:(1)成员char name20,长度为20 B;(2)成员char sex,长度为1
9、B;(3)成员char nation10,长度为10 B;(4)成员age,长度为2 B;(5)成员score,长度为4 B;(6)成员birthday,长度为2 B(year)+2 B(month)+2 B(day)=6 B。故x的内存长度为20 B+1 B+10 B+2 B+4 B+6 B=43 B。9.2结构体数组9.2.1结构体数组的定义与赋值示例:struct studentchar name20;char sex;char nation10;int age;float score;stu15=Tangwei,m,hang,18,524,wuyan,f,dong,19,543;str
10、uct student stu25;(1)示例中定义了两个结构体数组,其中数组stu1初始化了两个元素。(2)要注意给结构体数组初始化或给元素赋值时,因为每个元素又是结构体类型的变量,因此各元素的初值列表也要用 括起来。9.2结构体数组9.2.2结构体数组长度的计算示例:struct studentchar name20;char sex;char nation10;int age;float score;stu15;结构体数组长度的计算方法是:(1)每个数组元素的长度是:20+1+10+2+437 B。(2)共有5个元素,故该数组长度为:537=185 B。9.2结构体数组9.2.3结构体数
11、组元素的引用结构体数组元素的引用同样必须用成员运算符带成员名的格式:结构体数组名下标.成员名【例9-2】定义一个名为student的结构体,该结构体包含姓名和成绩两个成员。定义一个含5个元素的结构体数组stu,输出5个同学的姓名和成绩。输入完毕自动计算出每位同学的总分和平均分。#include struct studentchar name20;int score3;stu5;int main()int i,j;int sum;printf(Please input the other students infomation:n);for(i=0;i5;i+)9.2结构体数组9.2.3结构体数
12、组元素的引用printf(Input name:);scanf(%s,stui.name);/*数组元素的引用:输入姓名*/printf(Input%ss 3 score:,stui.name);for(j=0;j3;j+)scanf(%d,&stui.scorej);/*数组元素的引用:输入每个同学的3科成绩*/for(i=0;i5;i+)sum=0;for(j=0;j3;j+)sum+=stui.scorej;/*数组元素的引用:统计出每个同学的3科总分*/printf(%ss total score is:%d,Average is%dn,stui.name,sum,sum/3);9.2
13、结构体数组9.2.3结构体数组元素的引用要注意的是:(1)成员中若有float/double型成员,有的编译环境(如TC)没有关于浮点数的运算,在链接时不会链接上浮点链接库,因而会出现编译成功但无法使用的情况。一个简单的解决方法是:调用数学头文件“math.h”,并在主函数main()的第1行加一个关于浮点数运算的表达式,最好带一个库函数,如sqrt()。这样,编译时就可链接上浮点链接库了。(2)在for循环输入中,若成员中有char 字符变量成员,不要以单字符格式“%c”输入,因为无结尾符0,循环输入时编译环境会忽视其操作。应以“%s”进行输入,因为字符串系统会自动加0。9.2结构体数组9.
14、2.3结构体数组元素的引用#include#include struct studentchar name20;int class;char sex6;float score3;/*3科成绩,浮点型*/stu2;int main()float x=sqrt(1);/*浮点数运算表达式,目的是链接上浮点链接库*/int i,j;float sum;printf(Please input the other students information:n);for(i=0;i2;i+)printf(Input name:);scanf(%s,stui.name);9.2结构体数组9.2.3结构体数组
15、元素的引用printf(Input class:);scanf(%d,&stui.class);printf(Input sex:);scanf(%s,stui.sex);printf(Input%ss 3 score:,stui.name);for(j=0;j3;j+)scanf(%f,&stui.scorej);putchar(n);for(i=0;i2;i+)sum=0;for(j=0;j3;j+)sum+=stui.scorej;printf(Name:%s Class:%d Sex:%s Total:%.1f Average:%.1fn,stui.name,stui.class,st
16、ui.sex,sum,sum/3);9.2结构体数组9.2.3结构体数组元素的引用【例9-3】投票统计。某班进行班长投票选举,班长一职将在李阳、赵明和吴莉3位同学中产生。该班共45位同学,李、赵、吴3位同学不能参加投票。下面利用结构体数据类型进行投票,共投42次,输出每个人的票数。注意,只能在这3位同学中产生,投票错误无效,必须重新投票(为方便查看效果,程序模拟仅投10次)。9.2结构体数组9.2.3结构体数组元素的引用#include struct leaderchar name20;int num;int main()struct leader xx3=Liyang,0,Zhaoming,
17、0,Wuli,0;int i,j;char xm20;printf(Begin to cast:n);for(i=0;i10;i+)printf(Please cast NO.%d vote:,i+1);scanf(%s,xm);if(strcmp(Liyang,xm)!=0&strcmp(Zhaoming,xm)!=0&strcmp(Wuli,xm)!=0)9.2结构体数组9.2.3结构体数组元素的引用while(1)printf(Error!Please cast again:);scanf(%s,xm);if(strcmp(Liyang,xm)=0|strcmp(Zhaoming,xm)
18、=0|strcmp(Wuli,xm)=0)break;for(j=0;j3;j+)if(strcmp(xxj.name,xm)=0)xxj.num+;break;for(i=0;iname”,故“strcpy(x.name,Wujie);”等价于“strcpy(*p).name,Wujie);”和“strcpy(p-name,Wujie);”。下面同理:(2)“x.sex=m”等价于“(*p).sex=m”和“p-sex=m”。(3)“x.age=15”等价于“(*p).age=15”和“p-age=15”。(4)“x.score=623”等价于“(*p).score=623”和“p-scor
19、e=623”。9.3结构体指针9.3.2结构体指针的运用同样以模块9.3.1中定义的结构体数组stu和结构体数组指针p1为例。我们知道,数组名为首元素(0号元素)首地址,因为“struct student*p1=stu;”,故结构体数组指针p1也指向该结构体数组首元素首地址(注意不是结构体成员地址)。而p1+则指向下一元素(1号元素)的首地址,以此类推。(1)“stu0.name”等价于“(*p1).name”和“p1-name”,故“strcpy(stu0.name,Jack);”等价于“strcpy(*p1).name,Jack);”和“strcpy(p1-name,Jack)”。2.结构
20、体数组指针在元素引用时的使用9.3结构体指针9.3.2结构体指针的运用下面同理:(2)“stu1.age=16”等价于“*(p1+1).age=16”和“(p1+1)-age=16”。(3)“stu2.score=598”等价于“*(p1+2).score=598”和“(p1+2)-score=598”。因此,若要输出9.3.1中结构体数组各元素的成员值,可以使用for循环语句:for(p1=stu,p1name,p1-sex,p1-age,p1-score);结构体数组指针指向各元素首地址如图9-1所示,要清楚这个首地址并非元素成员的地址。图9-1结构体数组指针指向各元素首地址9.3结构体指
21、针9.3.2结构体指针的运用【例9-4】三种模式输出示例。#include struct studentchar name8;char sex;int age;float score;struct student x=Wujie,m,15,623;struct student stu3=Jack,m,17,612,Tom,m,16,645,Lucy,f,18,598;struct student*p=&x;struct student*p1=stu;int main()9.3结构体指针9.3.2结构体指针的运用printf(%s-%s-%sn,(*p).name,p-name,x.name);
22、printf(%s-%s-%sn,(*p1).name,p1-name,stu0.name);printf(%d-%d-%dn,(*(p1+1).age,(p1+1)-age,stu1.age);printf(%.0f-%.0f-%.0fn,(*(p1+2).score,(p1+2)-score,stu2.score);printf(%sn,strcpy(p-name,Jack);printf(%.0f-%.0f-%.0fn,(*p1).score,(p1+1)-score,(p1+2)-score);for(p1=stu;p1name,p1-sex,p1-age,p1-score);9.4结
23、构体与函数9.4.1以结构体成员做实参进行值传递结构体多个成员做实参进行值传递。以下程序功能是:输入3个学生的姓名和其4科成绩,计算其总分。#include struct studentchar name8;int score4;int total;stu3,*p=stu;int add(int a,int b,int c,int d);int main()int i,j;for(i=0;i3;i+)printf(Input NO.%d students names and 4 score:n,i+1);9.4结构体与函数9.4.1以结构体成员做实参进行值传递scanf(%s,stui.nam
24、e);for(j=0;j4;j+)scanf(%d,&stui.scorej);printf(Output 3 students score:n);for(i=0;i3;i+)/*下面是结构体成员做实参进行值传递*/stui.total=add(stui.score0,stui.score1,stui.score2,stui.score3);printf(Name:%ss total=%dn,stui.name,stui.total);int add(int a,int b,int c,int d)return a+b+c+d;很明显,多个实参进行值传递,系统必须开辟多个存储单元,效率是低下的
25、。在函数调用中提高工作效率的参数传递方式莫过于地址传递,形实参指向同一个存储单元,可想而知,相对于值传递来说,效率是翻倍的。9.4结构体与函数9.4.2以结构体指针做实参进行地址传递结构体指针做实参传递,大大提高运算效率。以下程序的功能是输入3个学生的姓名和其4科成绩,计算并输出每个学生的总分和平均分。同时,判断成绩,总分大于等于320,输出“Excellent”,小于320大于等于240,输出“pass”,其他输出“Fail”,最后对总分用冒泡法进行降序排序。#include#include struct studentchar name8;float score4;/*每个学生有4科成绩*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 模块 电子 课件
限制150内