




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
构造数据类型第1页,共31页,2023年,2月20日,星期五在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中:为更好地解决此类问题,C语言采用构造数据类型,通过构造数据类型可以很好地将一些不同类型的数据作为一个整体进行处理。
姓名:字符型;学号:整型或字符型;年龄:整型;性别:字符型;成绩:整型或实型。因为一个数组中只能存放同一种数据类型的数据,故不能用一个数组来存放这一组数据;如单独定义为互相独立的简单变量,难以反映它们之间的内在联系。第2页,共31页,2023年,2月20日,星期五9.1结构体“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型,或者又是一个构造类型。结构体类型的定义结构体变量的说明结构体变量的引用结构体先定义,后使用第3页,共31页,2023年,2月20日,星期五9.1结构体
9.1.1结构类型定义和结构变量说明
struct[结构体名]{
类型标识符成员名;类型标识符成员名;
…………….};成员类型可以是基本数据类型或构造数据类型struct是关键字,不能省略合法标识符可省:无名结构体一、结构体的定义
第4页,共31页,2023年,2月20日,星期五例
struct
student{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};namenumsexagescoreaddr4字节4字节20字节1字节4字节30字节……..结构体类型定义描述结构的组织形式,不分配内存结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。结构定义之后,即可进行变量说明。括号后的分号不可省第5页,共31页,2023年,2月20日,星期五二、结构体变量说明
(1)先定义结构体类型,再定义结构体变量一般形式:struct结构体名{类型标识符成员名;类型标识符成员名;…………….};struct结构体名变量名表列;例#defineSTUDENTstructstudentSTUDENT{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};
STUDENTstu1,stu2;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};structstudentstu1,stu2;第6页,共31页,2023年,2月20日,星期五(2)定义结构体类型的同时定义结构体变量一般形式:struct结构体名{类型标识符成员名;类型标识符成员名;…………….}变量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;第7页,共31页,2023年,2月20日,星期五(3)直接定义结构体变量一般形式:struct{
类型标识符成员名;类型标识符成员名;
…………….}变量名表列;例struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;用无名结构体直接定义变量只能一次第8页,共31页,2023年,2月20日,星期五说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体成员名与程序中变量名可相同,不会混结构体可嵌套例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];
structdatebirthday;}stu;numnamebirthdaymonthdayyear例structstudent{intnum;charname[20];
structdate{intmonth;intday;intyear;}birthday;}stu;numnamebirthdaymonthdayyear第9页,共31页,2023年,2月20日,星期五9.1.2
结构体变量的引用引用规则结构体变量不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用引用方式:结构体变量名.成员名例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);()stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};()例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu2=stu1;()例structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;if(stu1==stu2)……..()成员(分量)运算符优先级:1结合性:从左向右第10页,共31页,2023年,2月20日,星期五练习1.设有以下语句:structS{charch;
inta[4]}T;则下面叙述中正确的是()
S是struct类型的变量
T是structS类型的结构体变量可以用S定义结构体变量可以用T定义结构体变量第11页,共31页,2023年,2月20日,星期五练习2.设有如下定义:
structsk{inta;
floatsex;
}data;
int*p;若要使p指向data中的a域,正确的赋值语句是()A.p=&a;B.p=data.a;C.p=&data.a;D.*p=data.a第12页,共31页,2023年,2月20日,星期五struct结构体名{类型标识符成员名;类型标识符成员名;…………….};struct结构体名
结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudent
stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};二、结构体变量的初始化形式一:第13页,共31页,2023年,2月20日,星期五形式二:struct结构体名{
类型标识符成员名;类型标识符成员名;…………….}结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};
第14页,共31页,2023年,2月20日,星期五形式三:struct{
类型标识符成员名;类型标识符成员名;…………….}结构体变量={初始数据};例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};第15页,共31页,2023年,2月20日,星期五注:结构体变量是全局变量或静态变量,才可对它进行初始化赋值,局部或自动结构体变量,不能进行初始化赋值。结构体变量的初始化第16页,共31页,2023年,2月20日,星期五9.1.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]25B第17页,共31页,2023年,2月20日,星期五结构体数组初始化例struct{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};顺序初始化: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[]={{……},{……},{……}};分行初始化: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;}str[3];stu[1].age++;strcpy(stu[0].name,”ZhangSan”);第18页,共31页,2023年,2月20日,星期五练习1.设有如下定义:main(){structcomplex{intx;
inty;
}num[2]={1,3,2,7};
printf(“%d\n”,num[0].y/num[0].x*num[1].x);}程序运行结果是()A.0B.1C.3D.6第19页,共31页,2023年,2月20日,星期五练习2.设有如下说明:
structSTD{intn;charc;doublex;}
;以下选项中,能正确定义结构体数组并赋初值的语句是()A.structSTDtt[2]={{1,'A',62},{2,'B',75}};B.structSTDtt[2]={1,"A",62,2,"B",75};C.structtt[2]={{1,'A'},{2,'B'}};D.structtt[2]={{1,"A",62.5},{2,"B",75.0}};第20页,共31页,2023年,2月20日,星期五9.1.4结构体和指针指向结构体变量的指针定义形式:struct结构体名*结构体指针名;例structstudent*p;使用结构体指针变量引用成员形式存放结构体变量在内存的起始地址numnamesexagestupstructstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;(*结构体指针名).成员名结构体指针名->成员名结构体变量名.成员名指向运算符优先级:1结合方向:从左向右例指向结构体的指针变量例intn;int*p=&n;
*p=10;n=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;(*p).num=101
pnum=101第21页,共31页,2023年,2月20日,星期五main(){structstudent{longintnum; charname[20]; charsex; floatscore;}stu_1,*p;p=&stu_1;stu_1.num=101;strcpy(stu_1.name,"LiLin");
p->sex='M';p->score=89.5;printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n",
(*p).num,p->name,stu_1.sex,p->score);}No:101Name:LiLinSex:MScore:89.500000第22页,共31页,2023年,2月20日,星期五指向结构体数组的指针例指向结构体数组的指针structstudent{intnum;charname[20];charsex;intage;}stu[3]={{10101,"LiLin",'M',18},{10102,"ZhangFun",'M',19}, {10104,"WangMin",'F',20}};main(){structstudent*p;for(p=stu;p<stu+3;p++)printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);}numnamesexagestu[0]pstu[1]stu[2]p+110101LiLinM1810102ZhangFunM1910104WangMinF20第23页,共31页,2023年,2月20日,星期五在上例中,可使用的是(*p).num这样的形式。(*p)表示p指向结构体变量,(*p).num是p指向的结构体变量中的成员num。注意:*p两侧的括弧不可省。请分析以下几种运算:p->n
得到p指向的结构体变量中的成员n的值。p->n++++p->n得到p指向的结构体变量中的成员n的值,用完该值后使它加1。得到p指向的结构体变量中的成员n的值使之加1(先加)。第24页,共31页,2023年,2月20日,星期五1.有以下程序:#include<stdio.h>structSTU
{intnum;floatTotalScore;};voidf(structSTUp){structSTUs[2]={{20044,550},{20045,537}};
p.num=s[1].num;
p.TotalScore=s[1].TotalScore;}main(){structSTUs[2]={{20041,703},{20042,580}};
f(s[0]);printf("%d%3.0f\n",s[0].num,s[0].TotalScore);}程序运行后的输出结果是()A.20045537B.20044550C.20042580D.20041703练习
值传递第25页,共31页,2023年,2月20日,星期五2.以下程序运行后输出结果是()。#include<stdio.h>#include<string.h>structSTU{charname[10];intnum;};voidf(char*name,intnum){structSTUs[2]={{"SunDan",20044},{"Penghua",20045}};num=s[0].num;strcpy(name,s[0].name);}main(){structSTUs[2]={{"YangSan",20041},{"LiSi",20042}},*p;p=&s[1];f(p->name,p->num);printf("%s%d\n",p->name,p->num);}A)SunDan,20042B)SunDan,20044C)LiSi,20042D)YangSan,20041地址传递值传递第26页,共31页,2023年,2月20日,星期五3.有以下程序:structS{intn;inta[20];};voidf(structS*p){inti,j,t;
for(i=0;i<p->n-1;i++)for(j=i+1;j<p->n;j++)if(p->a[i]>p->a[j]){t=p->a[i];p->a[i]=p->a[j];p->a[j]=t;}}main(){inti;structSs={10,{2,3,1,6,8,7,5,4,10,9}};
f(&s);
for(i=0;i<s.n;i++)printf("%d,",s.a[i]);}程序运行后的输出结果是()A.1,2,3,4,5,6,7,8,9,10B.10,9,8,7,6,5,4,3,2,1C.2,3,1,6,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 讲安全第一课
- 2024年咨询工程师考试题库及答案(基础+提升)
- 2024年咨询工程师(经济政策)考试题库含答案(轻巧夺冠)
- 2024年咨询工程师(经济政策)考试题库(培优)
- 旗杆模型制作课件
- 2025高考语文考场满分作文9篇
- 陈时见比较教育学
- 企业环境管理的内容
- 生态旅游别墅度假
- 2020年辽宁省鞍山市中考历史试卷(空白卷)
- 身份证籍贯自动对照自动生成
- GB/T 28022-2021玩具适用年龄判定指南
- GB/T 17755-2010船用额定电压为6 kV(Um=7.2 kV)至30 kV(Um=36 kV)的单芯及三芯挤包实心绝缘电力电缆
- 三角函数的图像与性质优秀课件
- LittleBusters!EX澄空汉化版最速中文攻略
- 吊车施工专项施工方案
- 思想道德与法治 第三章
- 采购与供应链管理培训教材
- 2021年江苏今世缘酒业股份有限公司校园招聘笔试试题及答案解析
- 项目施工计划调度管理流程及工作标准
- 个体工商户年度报告表(样表)
评论
0/150
提交评论