版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章内容回顾,字符串与字符数组的区别是字符串的末尾有一个空字符0以标识字符串结束。 用scanf()语句读入字符串时不允许输入中存在空格。 gets() 和 puts() 函数分别用于字符串的输入和输出。 在 string.h 中定义了很多字符串处理函数函数,比较常用的有:strcpy()、strcat()、strcmp() 和 strlen() 。 假如程序里需要一组字符串,一种常用的做法就是用一个字符指针数组表示它们。 字符串可以作为参数,函数传递机制同数组作为参数,为传址方式。,第十章,结构,预习检查,结构体类型与结构体变量的区别 会有指向结构体变量的指针吗?结构体变量可以作函数的参数
2、吗?可不可以作返回值呢?,本章目标,理解为什么使用结构 定义结构 声明结构变量 访问结构成员 掌握结构作为函数参数的用法,从某种程度上来说,会不会用 struct,怎样用struct 是区别一个开发人员是否具备丰富开发经历的标志 !,本章结构,结构简介,结构体,结构数组,使用结构,结构作为函数参数,实现堆栈,10-1 结构简介,存储一个班级中 5 名学员的信息(学号、姓名、性别和成绩),问题:,I. 使用数组,解决方案:,score,num,sex,name,不能建立数组间的关系,II. 使用多维数组,C 语言不允许一个数组包含多种数据类型,III. 使用结构,C 语言引入了称为结构的数据存储
3、方式,“结构” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。,10-2 定义结构,struct structurename datatype variable1; datatype variable2; . ;,结构成员,;,结构名,struct,student,int num;,char name20;,char sex;,定义结构,float score;,C 语言中的有效数据类型,一般形式: struct 结构体名 成员表列 ; “成员表列”形式 类型 成员名; 类型 成员名; . .,10-2 定义结构,struct student int n
4、um; char name20; char sex; float score; ;,num,name,sex,student,score,结构定义并不预留内存 结构定义放置在程序的开始部分,位于头文件声明之后 注意不表示复合语句,其后有分号 结构体类型与其成员可重名 struct test int test; test; 结构体成员和其他变量可以重名 结构体类型名称是struct 结构体名,注意struct关键字不能省略 结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量,10-3 声明结构变量,声明结构变量,struct student int num; char na
5、me20; char sex; float score; ; struct student student1,student2;,I.先定义结构,再声明结构变量,struct student int num; char name20; char sex; float score; student1,student2;,II.在定义结构类型的同时声明结构变量,struct int num; char name20; char sex; float score; student1,student2;,III. 直接声明结构变量,声明一个类型为 student 结构的变量,将会为该变量分配内存,大小
6、是大于或等于其所有成员变量的大小之和。,struct date int month; int day; int year; ;,10-3 嵌套结构,struct int num; char name20; char sex; struct date birthday; float score; student1,student2;,表示结构变量成员的一般形式是:结构变量名.成员名 例如:student1.num、student2.sex、student1.birthday.month,struct student student3=3,Yao Ming ,M,90.5;,10-3 结构变量初始
7、化,3,Yao Ming,M,赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少 (但是不推荐)。,student3.num,,student3.sex,90.5,student3.score,student1.num=1; strcpy(,Zhang); student1.sex=M; printf(请输入成绩:n); scanf(%f,10-3 结构变量赋值,1,Zhang Zi Liang,M,用输入语句或赋值语句来给结构变量的各个成员赋值,78,78,student2 = student1;,1,Zhang
8、 Zi Liang,M,78,说明 结构体类型与结构体变量概念不同 类型:不分配内存; 变量:分配内存 类型:不能赋值、存取、运算; 变量:可以 结构体可嵌套 结构体成员名与程序中变量名可相同,不会混淆,10-3 结构变量与结构体类型,引用规则 结构体变量不能整体引用,只能引用变量成员,可以将一个结构体变量赋值给另一个结构体变量 结构体嵌套时逐级引用,成员(分量)运算符 优先级: 1 结合性:从左向右,引用方式: 结构体变量名.成员名,10-4 结构体变量的引用,形式一:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构体名 结构体变量=初始数据;
9、,例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,10-4 结构体变量的初始化,形式二:,struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 结构体变量=初始数据;,例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19,
10、“200 Beijing Road”;,10-4 结构体变量的初始化,形式三:,struct 类型标识符 成员名; 类型标识符 成员名; . 结构体变量=初始数据;,例 struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,10-4 结构体变量的初始化,问题描述: 根据学员的成绩,输出不及格学员的详细信息。,10-4 使用结构示例,#include struct student int num;/学号 char *name;/姓名 ch
11、ar sex;/性别 float score;/成绩 ; int main() static struct student stu1=1,李亚鹏,M,61; static struct student stu2=2,周晶晶,F,92.5; static struct student stu3=3,姚光明,M,59; printf(不及格学员的名单如下:n); if(stu1.score=60 ,不及格学员的名单如下:,3 姚光明 M 59.00,1,李亚鹏,M,78,2,周晶晶,F,92,3,姚光明,M,59,struct stu stu1; struct stu *pstu = (*pstu
12、).num 或者: pstu-num,10-5 结构指针变量,一个指针当用来指向一个结构时, 称之为结构指针变量。 结构指针变量中的值是所指向的结构变量的首地址。 结构指针变量声明的一般形式为: struct 结构名 *结构指针变量名 通过结构指针可以访问该结构变量的成员,一般形式为: (*结构指针变量).成员名 或者 结构指针变量-成员名,#include struct student int num; char *name; char sex; float score; stu=1,张宾,F,55,*pstu; int main() pstu= ,学号:1 姓名:张宾 性别:F 成绩:55
13、.00 学号:1 姓名:张宾 性别:F 成绩:55.00 学号:1 姓名:张宾 性别:F 成绩:55.00 Press any key to continue,指向结构体变量的指针 定义形式:struct 结构体名 *结构体指针名; 例 struct student *p;,使用结构体指针变量引用成员形式,存放结构体变量在内存的起始地址,指向运算符 优先级: 1 结合方向:从左向右,例 指向结构体的指针变量,main() struct student long int num; char name20; char sex; float score; stu_1,*p; p= ,例 int n;
14、 int *p= n=10,struct student stu1; struct student *p= (*p).num=101,10-5 结构体和指针,指向结构体数组的指针,struct student int num; char name20; char sex; int age; stu3=10101,Li Lin,M,18, 10102,Zhang Fun,M,19, 10104,Wang Min,F,20; main() struct student *p; for(p=stu;pnum,p-name,p-sex,p-age); ,10-5 结构体和指针,struct stude
15、nt int num; char* name; char sex; float score; stu30;,10-6 结构数组,元素为结构类型的数组称为结构数组。 在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。例如一个班的学员档案,一个公司的职工档案等。,定义了一个结构数组stu1,共有30个元素,stu0stu29。每个数组元素都具有struct student的结构形式。,结构体数组的定义 三种形式:,形式一: struct student int num; char name20; char sex; int age; ; struct student stu2;,形式二
16、: struct student int num; char name20; char sex; int age; stu2;,形式三: struct int num; char name20; char sex; int age; stu2;,10-6 结构体数组,例 struct int num; char name20; char sex; int age; stu =,;,顺序初始化: struct student int num; char name20; char sex; int age; ; struct student stu =100,“Wang Lin”,M,20, 10
17、1,“Li Gang”,M,19, 110,“Liu Yan”,F,19;,例 struct student int num; char name20; char sex; int age; stu =,;,结构体数组引用,引用方式: 结构体数组名下标.成员名,10-6 结构体数组初始化,struct person char name20; int count; leader3=“Li”,0,“Zhang”,0,”Wang“,0; main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(%s,leader_name); for(j=
18、0;j3;j+) if(strcmp(leader_name,)=0) leaderj.count+; for(i=0;i3;i+) printf(%5s:%dn,,leaderi.count); ,10-6 结构体数组初始化,例 统计候选人选票,问题描述: 求学员的总成绩和平均成绩,并统计不及格人数。,10-6 结构指针变量,struct student int num; char *name; char sex; float score; stuN= 1,李芳,F,45,2,于红,F,62.5,3,何万山,M,92.5, 4,程亚丽,M,87
19、,5,王明,M,58; int main() int i,count=0; float ave,sum=0; for(i=0;iN;i+) sum+=stui.score; if(stui.score60) count+; printf(总分:%7.2fn,sum); ave=sum/5; printf(平均分:%5.2fn,ave); printf(不及格人数为:%dn,count); ,总分: 345.00 平均分:69.00 不及格人数为:2 Press any key to continue,10-7 结构作为函数参数,可以将结构作为参数传递给函数,也可以定义返回结构值的函数。 结构作
20、为函数参数有三种不同方法: 将结构成员的值传递给函数处理。 将整个结构作为参数值传递给函数。 将结构指针变量做函数的参数。,把结构作为整体来处理,但作用方式和效果不同。,10-7 结构成员作为函数参数,struct film char name25; /电影名 char director25; /导演 int duration; /片长 ; void display (char *, char *, int *); int main() struct film f1; printf(nt 请输入电影的详细信息); printf(nn 请输入影片名:); gets(); fflus
21、h(stdin); printf(n 请输入导演姓名: ); gets(f1.director); fflush(stdin); printf(n 请输入电影片长(分钟): ); scanf(%d, ,演示:示例4,void display(char *n, char *d, int *m) printf(nt 电影的详细信息n); printf(n 片名: %s,n); printf(n 导演: %s,d); printf(n 片长: %dn,*m); ,前两个参数为字符串,所以不使用“/实部 double im;/虚部 ; struct complex add(struct complex
22、,struct complex); int main() struct complex x=6.5,8.9,y=7.1,9.4; struct complex z; z=add(x,y); printf(和为:%5.2lf+i%5.2lfn,z.re,z.im); ,10-7 整个结构作为参数,演示:示例5,struct complex add(struct complex a,struct complex b) struct complex c; c.re=a.re+b.re; c.im=a.im+b.im; return c; ,传递结构时不使用 “ char *name; char se
23、x; float score; stuN=1,李芳,F,45,2,于红,F,62.5, 3,何万山,M,92.5,4,程亚丽,M,87, 5,王明,M,58; void ave(struct student *ps); int main() struct student *ps; ps=stu; ave(ps); ,演示:示例6,void ave(struct student *ps) int i,count=0; float ave,sum=0; for(i=0;iscore; if(ps-score60) count+; printf(总分:%7.2fn,sum); ave=sum/5;
24、printf(平均分:%5.2fn,ave); printf(不及格人数为:%dn,count); ,用指针变量作函数参数进行传送时由实参传向形参的只是结构的地址。,堆栈是一种先进后出的数据结构。 用堆栈实现简单的行编辑功能,问题描述如下: 接受用户从键盘输入的程序或数据,并存入用户的数据区。由于用户在键盘上进行输入时,不能保证不会出错,因此,需要设立一个输入缓冲区,允许用户输入出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键入的一个字符错了时,可以补进一个“#”,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符“”,以表示当前行中的字符均无效。,
25、10-8 实现堆栈,10-8 实现堆栈,W,h,i,e,使用堆栈实现行编辑功能,whiel#lr#e(s#*s),l,l,r,e,(,s,*,s,输出缓冲区(堆栈)中的所有字符,即有效字符:while(*s),o,u,t,c,outchaputchar(*s=#+);,h,a,遇到字符清空缓冲区(堆栈),p,u,t,c,h,a,r,(,*,s,=,+,+,),;,遇到字符#时,栈顶元素出栈,输出缓冲区(堆栈)中的所有字符,即有效字符:putchar(*s+);,10-8 实现堆栈,由此可见,需要实现堆栈的以下几个操作: 入栈 出栈 清空栈 显示从栈底到栈顶所有的元素 判断栈是否为空,#defi
26、ne m 100 struct Mystack char elementm; int top;/栈顶 ;,栈结构,void push(struct Mystack *s,char x) /*将x的值压入栈顶*/ s-elements-top=x; s-top+; ,入栈操作,void pop(struct Mystack *s) /*将栈顶元素删除*/ s-top-; ,出栈操作,int IsEmpty(struct Mystack *s) if(s-top=0) return 1; else return 0; ,判断栈是否为空,10-8 实现堆栈,void Clearstack(struct Mystack *s s-top=0; ,清空栈,void Displaystack(struct Mystack *s) int i; for(i=0;itop;i+) printf(%c,s-elementi); ,显示从栈底到栈顶所有的元素,10-8 实现堆栈 5-5,int main() struct Mystack st; char ch; int i; for(i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省湖州市十一中重点中学2025-2026学年初三下学期第一次调研物理试题试卷含解析
- 山东省临沂市青云中学2026年初三2月联考(线上)英语试题含解析
- 江苏省扬州市邗江实验重点名校2026年高一年级5月学情调研语文试题试卷含解析
- 江苏省淮安市淮安区达标名校2026届学业水平模拟考试语文试题仿真模拟试题B卷含解析
- 山东省青岛市李沧、平度、西海岸、胶州2026届初三下期中试题含解析
- 脱硫石膏合同
- 华为早期(1987-2000年)营销方案
- 2026年大学生职业生涯规划书西餐工艺
- 教案-四上品德社会教案
- 2026年消防电气线路绝缘性能检测报告
- 湖北省专升本2025年软件工程专业数据结构重点题型练习试卷(含答案)
- T/CAPE 10108-2024设备设施报废管理指南
- 医院消毒灭菌与监测课件
- 浮雕画彩塑艺术精讲
- 交警路面执法规范课件
- 舞台技术技师试题及答案
- 塑料复合袋基础知识培训
- 低温热年代学方法解析及其在黔西南卡林型金矿床研究中的应用
- 2025年北森人才测评试题及答案销售
- 2025年五类人员考试题型及答案广西
- 《大学生职业生涯规划与就业指导》高职就业和职业生涯全套教学课件
评论
0/150
提交评论