《高级语言程序设计教学》第9章_第1页
《高级语言程序设计教学》第9章_第2页
《高级语言程序设计教学》第9章_第3页
《高级语言程序设计教学》第9章_第4页
《高级语言程序设计教学》第9章_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

第九章结构体1编辑ppt学习目标结构体的概念结构体类型和结构体变量的差别运算符“.”和“->”结构体数组、结构体指针2编辑ppt9.1结构体问题:我们要处理一个学生的信息,包括:

学号、姓名、性别、年龄、成绩、地址按照以往定义变量的方式,我们可以这样定义:structstudent{ intnum; charname[20]; charsex; intage; floatscore; charaddr[50];};这些变量相互独立,很难反映出它们的内在联系结构体3编辑ppt结构类型【例】平面上点(x,y)的表示structpoint{floatx;floaty;};

(4,3)(0,0)平面上的点关键字结构体名结构体成员4编辑ppt定义一个结构体的一般形式为:注意:1.结构体类型不分配空间,是一种数据类型;2.结构体成员的类型可以不同struct

结构名{

数据类型成员1;……

数据类型成员n;};5编辑pptnamenumsexagescoreaddr4字节4字节20字节1字节4字节50字节………structstudent{ intnum; charname[20]; charsex; intage; floatscore; charaddr[50];};结构体类型定义描述结构的组织形式,不分配内存6编辑ppt【例】定义点结构变量并保存平面点(4,3)structpoint{floatx;floaty;};structpoint

point1;point1.x=4;point1.y=3;7编辑ppt定义结构体变量的三种形式形式1:先定义类型,再定义变量struct结构名{

数据类型成员1;

……

数据类型成员n;};struct结构名结构变量1,结构变量2;structpoint{floatx;floaty;};structpointpoint1,point2;8编辑ppt形式2:在定义类型时,定义变量struct结构名{

数据类型成员1;

……

数据类型成员n;}结构变量1,结构变量2;structpoint{floatx;floaty;}point1,point2;9编辑ppt形式3:无类型名的变量定义注意第三种定义形式省略了结构名,在此定义语句后面无法再定义这个类型的其它结构变量struct{

数据类型成员1;

……

数据类型成员n;}结构变量1,结构变量2;struct{floatx;floaty;}point1,point2;结构名10编辑ppt说明结构体类型与结构体变量概念不同类型:不分配内存 变量:分配内存类型:不能赋值、存取、运算 变量:可以结构体可嵌套结构体成员名与程序中变量名可同,不会混淆例

structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];structdatebirthday;}stu;numnamebirthdaymonthdayyear例

structstudent{intnum;charname[20];

structdate{intmonth;intday;intyear;}birthday;}stu;例

main()

{structstudent{intnum;charname[20];}stu;intnum;num=0;

stu.num=1;……}11编辑ppt【例9-1】结构变量初始化#include<stdio.h>main(){structstudent{longintnum;charname[20];charaddr[20];}a={89031,"LiLin","123BeijingRoad"};

printf("No.:%ld\nname:%s\naddress:%s\n",a.num,,a.addr);}初值表12编辑ppt初始化的一般形式在定义结构变量的时候对其进行初始化;初始化表由{}括起;逗号隔开的数据对应赋值给结构变量的每个成员13编辑ppt结构体变量的引用引用规则结构体变量不能整体进行输入、输出、赋值、运算引用方式:结构体变量名.成员名可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用structstudent{intnum;charname[20];structdate{

intmonth;intday;intyear;}birthday;}stu1,stu2;stu1.birthday.month=12;14编辑ppt【例】成员变量引用structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};printf(“%d,%s,%c,%d,%f,%s\n”,stu1);if(stu1==stu2){………}=“WangLin”;stu1.num=101;strcpy(,“WangLin”);stu1.sex=‘M’;Stu1.age=19;stu1.score=87.5;strcpy(stu1.addr,“DaLian”};stu2=stu1;15编辑ppt【例】分别定义表示直线和矩形的结构体structpoint{floatx;floaty;};structline{structpointstartp;structpointendp;};structrect{structpointpt1;structpointpt2;structpointpt3;structpointpt4;};(0,0)平面上的矩形pt3pt1pt2pt416编辑ppt常见编程错误错例1structstu{intno;charname[10];floatscore;}={1,“wangbin”,98};

错误分析:structstu是结构类型,不占内存空间,不能对其赋值。17编辑ppt错例2structstu{intno;charname[10];floatscore;}stus;

错误分析:1)结构体类型定义之后“}”后必须加“;”2)结构体类型名为structstu,不是stu;申明变量应为:structstus;18编辑ppt错例3structstu{intno;charname[10];floatscore;};structstus;scanf(“%d%s%f”,s);错误分析:不能整体读入结构体变量值,应为

scanf(“%d%s%f”,&s.no,,&s.score);19编辑ppt错例4structstu{intno;charname[10];floatscore;};structstus,*p;scanf(“%d%s%f”,&p.no,&,&p.score);错误分析:1)p是结构指针变量,使用之前应赋初值;

2)p访问成员的方式应为p->no,p->name,p->score;

3)p->name为数组名,读入一个字符串时,前面不能加“&”。20编辑ppt9.2结构变量作为函数参数【例9-2】

平面上两点之间的距离(x1,y1)(x2,y2)21编辑ppt#include<stdio.h>#include<math.h>structpoint{floatx;floaty;};floatGetDis(structpoint,structpoint);22编辑pptmain(){structpointpt1,pt2;

printf("Pleaseinputpt1:");scanf("%f%f",&pt1.x,&pt1.y);printf("Pleaseinputpt2:");scanf("%f%f",&pt2.x,&pt2.y); printf("pt1:(%.1f,%.1f)",pt1.x,pt1.y);printf("\npt2:(%.1f,%.1f)",pt2.x,pt2.y);printf("\npt1-pt2is%f\n",GetDis(pt1,pt2));}23编辑ppt定义计算两点之间距离的函数floatGetDis(structpointp1,structpointp2){returnsqrt((p2.x-p1.x)*(p2.x-p1.x)

+(p2.y-p1.y)*(p2.y-p1.y));}24编辑ppt【例9-3】判断点是否在矩形内应包含以下功能:构造一个点;构造一个矩形;判断一个点是否在矩形内。每一个功能都用函数来实现25编辑ppt#include<stdio.h>#include<math.h>structpoint{floatx;floaty;};structrect{structpointpt1;structpointpt2;structpointpt3;structpointpt4;};structpoint

makepoint(floatx,floaty);voidMakeRect(structpointpt1,structpointpt2,structpointpt3,structpointpt4,

structrect*screen);intPtInRect(structpointp,structrectr);26编辑pptmain(){structpointpt1=MakePoint(0,0);structpointpt2=MakePoint(50,0);structpointpt3=MakePoint(50,10);structpointpt4=MakePoint(0,10);structrectscreen;MakeRect(pt1,pt2,pt3,pt4,&screen);structpointmiddle=MakePoint((screen.pt1.x+screen.pt2.x)/2,(screen.pt1.y+screen.pt4.y)/2);printf("\ncenter(%.1f,%.1f)\n",middle.x,middle.y);if(PtInRect(middle,screen)) printf("\nThemiddlepointisinscreen!\n");else printf("\nThemiddlepointisnotinscreen!\n");}运行结果Themiddlepointofthescreenis(25.0,5.0)Themiddlepointisinscreen!Pressanykeytocontinue27编辑pptstructpointMakePoint(floatx,floaty){structpointtemp;temp.x=x;temp.y=y;returntemp;}voidMakeRect(structpointpt1,structpointpt2,structpointpt3,structpointpt4,structrect*screen){(*screen).pt1=pt1;(*screen).pt2=pt2;(*screen).pt3=pt3;(*screen).pt4=pt4;}28编辑pptintPtInRect(structpointp,structrectr){ returnp.x>=r.pt1.x&&p.x<r.pt2.x&&p.y>=r.pt1.y&&p.y<r.pt3.y;}29编辑ppt9.3结构体数组结构体数组的定义三种形式:形式一:

structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];形式二:structstudent{intnum;charname[20];charsex;intage;}stu[2];形式三:struct{intnum;charname[20];charsex;intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]29B30编辑ppt结构体数组初始化顺序初始化分行初始化结构体数组引用引用方式:结构体数组名[下标].成员名顺序初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[3]={100,“WangLin”,‘M’,20,101,“LiGang”,‘M’,19,110,“LiuYan”,‘F’,19};分行初始化:structstudent{intnum;charname[20];charsex;intage;};structstudentstu[]={{100,“WangLin”,‘M’,20},{101,“LiGang”,‘M’,19},{110,“LiuYan”,‘F’,19}};全部初始化时维数可省structstudent{intnum;charname[20];charsex;intage;}stu[3];stu[1].age++;strcpy(stu[0].name,”ZhaoDa”);31编辑ppt【例9-7】计算学生的平均成绩和不及格的人数#include<stdio.h>#include<math.h>structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Liping",'M',45},{102,"Zhangping",'M',62.5},{103,"Hefang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58},};32编辑pptmain(){inti,c=0;//循环控制变量、不及格人数

floatave,s=0;//平均成绩、总成绩

for(i=0;i<5;i++){s+=boy[i].score;if(boy[i].score<60)c+=1;}printf("s=%f\n",s);ave=s/5;printf("average=%f\ncount=%d\n",ave,c);}运行结果:s=345.0average=69.0count=2Pressanykeytocontinue33编辑ppt【例9-5】

编写候选人得票统计程序。设有3个候选人,10张选票,每次输入一个得票的候选人名字,统计每个候选人票数并输出#include<stdio.h>#include<string.h>structperson{charname[20];intcount;}leader[3]={"Li",0,"Zhang",0,"Wang",0};namecountLiZhangWang00034编辑pptmain(){charname[20];printf("input10names:\n");for(inti=1;i<=10;i++){

scanf("%s",name);for(intj=0;j<3;j++)if(strcmp(name,leader[j].name)==0)leader[j].count++;}printf("result:\n");for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}运行结果:input10names:LiLiLiZhangZhangZhangWangLiLiLiresult:Li:6Zhang:3Wang:1Pressanykeytocontinue35编辑ppt9.4结构体和指针指向结构体变量的指针定义形式:struct结构体名*

结构体指针名;例:structstudent*p;使用结构体指针变量引用成员形式结构指针使用前必须初始化存放结构体变量在内存的起始地址(*结构体指针名).成员名结构体指针名->成员名结构体变量名.成员名structstudentstu1;structstudent*p=&stu1;stu1.num=101;

(*p).num=101;p->num=101;numnamesexagestupstructstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;36编辑ppt【例9-6】设图书信息包括:书号、书名、售空标志、价格。写程序,输出某本图书信息。

#include<stdio.h>#include<string.h>structbook{ longnum;//书号

charname[20];//书名

charmarking;//售空标志

floatprice;//价格}37编辑pptmain(){structbookboo_1,*p;p=&boo_1;

boo_1.num=89101;strcpy(boo_1.name,"math");boo_1.marking='T';boo_1.price=30;printf("书号:%ld\n书名:%s\n售空:%c\n书价:%f\n",

boo_1.num,boo_1.name,boo_1.marking,boo_1.price);printf("书号:%ld\n书名:%s\n售空:%c\n书价:%f\n",

(*p).num,(*p).name,(*p).marking,(*p).price);printf("书号:%ld\n书名:%s\n售空:%c\n书价:%f\n",

p->num,p->name,p->marking,p->price);}运行结果:书号:89101书名:math售空:T书价:30.000000书号:89101书名:math售空:T书价:30.000000书号:89101书名:math售

温馨提示

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

评论

0/150

提交评论