C语言教程-第十二章-结构_第1页
C语言教程-第十二章-结构_第2页
C语言教程-第十二章-结构_第3页
C语言教程-第十二章-结构_第4页
C语言教程-第十二章-结构_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

第十二章结构2回顾字符串与字符数组的区别是字符串的末尾有一个空字符'\0'以标识字符串结束。用scanf()语句读入字符串时不允许输入中存在空格。gets()和puts()函数分别用于字符串的输入和输出。在string.h中定义了很多字符串处理函数函数,比较常用的有:strcpy()、strcat()、strcmp()和strlen()。假如程序里需要一组字符串,一种常用的做法就是用一个字符指针数组表示它们。字符串可以作为参数,函数传递机制同数组作为参数,为传址方式。

3目标理解为什么使用结构定义结构声明结构变量访问结构成员掌握结构作为函数参数的用法4结构简介存储一个班级中5名学员的信息(学号、姓名、性别和成绩)问题:I.使用数组MaryJohnPeterRoseKateFMFMF01020304058978.56797.564解决方案:scorenumsexname不能建立数组间的关系II.使用多维数组MaryJohnPeterRoseKateFMFMF01020304058978.56797.564C语言不允许一个数组包含多种数据类型III.使用结构numnamesexscoreC语言引入了称为结构的数据存储方式“结构”是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。5

定义结构2-1structstructurename{ datatypevariable1; datatypevariable2; ...};结构成员{};结构名structstudentintnum;charname[20];charsex;定义结构floatscore;C语言中的有效数据类型6定义结构2-2structstudent{intnum;charname[20];charsex;floatscore;};numnamesexstudent结构定义并不预留内存结构定义放置在程序的开始部分,位于头文件声明之后score结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。7声明结构变量声明结构变量structstudent{intnum;charname[20];charsex;floatscore;};structstudentstudent1,student2;I.先定义结构,再声明结构变量structstudent{intnum;charname[20];charsex;floatscore;}student1,student2;II.在定义结构类型的同时声明结构变量struct{intnum;charname[20];charsex;floatscore;}student1,student2;III.直接声明结构变量声明一个类型为student结构的变量,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。

8structdate{intmonth;intday;intyear;};嵌套结构struct{intnum;charname[20];charsex;

structdatebirthday;floatscore;}student1,student2;表示结构变量成员的一般形式是:结构变量名.成员名例如:student1.num、student2.sex、student1.birthday.month9内存student3structstudentstudent3={3,"YaoMing",'M',90.5};

结构变量初始化3YaoMingM赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少。student3.sex90.5student3.score10student1student1.num=1;="ZhangZiLiang";student1.sex=’M’;printf("请输入成绩:\n");scanf("%f",&student1.score);结构变量赋值1ZhangZiLiangM用输入语句或赋值语句来给结构变量的各个成员赋值7878student2=student1;student21ZhangZiLiangM7811问题描述:根据学员的成绩,输出不及格学员的详细信息。

使用结构示例#include<stdio.h>structstudent{ intnum;//学号 char*name;//姓名 charsex;//性别 floatscore;//成绩};voidmain(){staticstructstudentstu1={1,"李亚鹏",'M',61};staticstructstudentstu2={2,"周晶晶",'F',92.5};staticstructstudentstu3={3,"姚光明",'M',59};printf("不及格学员的名单如下:\n");if(stu1.score<60)printf("%d\t%s\t%c\t%5.2f\n",stu1.num,,stu1.sex,stu1.score);if(stu2.score<60)printf("%d\t%s\t%c\t%5.2f\n",stu2.num,,stu2.sex,stu2.score);if(stu3.score<60)printf("%d\t%s\t%c\t%5.2f\n",stu3.num,,stu3.sex,stu3.score);if(stu1.score>=60&&stu2.score>=60&&stu3.score>=60)printf("没有不及格的学员。\n");}不及格学员的名单如下:3姚光明M59.00stu11李亚鹏M78stu22周晶晶F92stu33姚光明M5912structstu*pstu;(*pstu).num或者:pstu->num结构指针变量一个指针当用来指向一个结构时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。结构指针变量声明的一般形式为:

struct结构名*结构指针变量名通过结构指针可以访问该结构变量的成员,一般形式为:

(*结构指针变量).成员名或者结构指针变量->成员名

#include<stdio.h>structstudent{ intnum; char*name; charsex; floatscore;}stu={1,"张宾",'F',55},*pstu;voidmain(){

pstu=&stu;printf("学号:%d姓名:%s\n",stu.num,);printf("性别:%c成绩:%5.2f\n\n",stu.sex,stu.score);printf("学号:%d姓名:%s\n",(*pstu).num,(*pstu).name);printf("性别:%c成绩:%5.2f\n\n",(*pstu).sex,(*pstu).score);printf("学号:%d姓名:%s\n",pstu->num,pstu->name);printf(“性别:%c成绩:%5.2f\n\n",pstu->sex,pstu->score);}学号:1姓名:张宾性别:F成绩:55.00学号:1姓名:张宾性别:F成绩:55.00学号:1姓名:张宾性别:F成绩:55.00Pressanykeytocontinue13structstudent{intnum;char*name;charsex;floatscore;}stu[30];结构数组元素为结构类型的数组称为结构数组。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。例如一个班的学员档案,一个公司的职工档案等。定义了一个结构数组stu1,共有30个元素,stu[0]~stu[29]。每个数组元素都具有structstudent的结构形式。14问题描述:求学员的总成绩和平均成绩,并统计不及格人数。结构指针变量structstudent{ intnum; char*name; charsex; floatscore;}stu[N]={{1,"李芳",'F',45},{2,"于红",'F',62.5},{3,"何万山",'M',92.5},{4,"程亚丽",'M',87},{5,"王明",'M',58}};voidmain(){ inti,count=0;floatave,sum=0; for(i=0;i<N;i++) {

sum+=stu[i].score; if(stu[i].score<60) count++; } printf("总分:%7.2f\n",sum); ave=sum/5; printf("平均分:%5.2f\n",ave); printf("不及格人数为:%d\n",count);}总分:345.00平均分:69.00不及格人数为:2Pressanykeytocontinue15结构作为函数参数可以将结构作为参数传递给函数,也可以定义返回结构值的函数。结构作为函数参数有三种不同方法:将结构成员的值传递给函数处理。将整个结构作为参数值传递给函数。将结构指针变量做函数的参数。把结构作为整体来处理,但作用方式和效果不同。16结构成员作为函数参数structfilm{charname[25];//电影名

chardirector[25];//导演

intduration;//片长};voiddisplay(char*,char*,int*);voidmain(){

structfilmf1;printf("\n\t请输入电影的详细信息");printf("\n\n请输入影片名:");gets();fflush(stdin);printf("\n请输入导演姓名:");gets(f1.director);fflush(stdin);printf("\n请输入电影片长(分钟):");scanf("%d",&f1.duration);

display(,f1.director,&f1.duration);}演示:示例4voiddisplay(char*n,char*d,int*m){ printf("\n\t电影的详细信息\n"); printf("\n片名:%s",n); printf("\n导演:%s",d); printf("\n片长:%d\n",*m);}前两个参数为字符串,所以不使用“&”17问题描述:求已知两个复数的和。分析:两个复数a+ib和c+id的和为:

x+iy其中:x=a+cy=b+d#include<stdio.h>structcomplex{doublere;//实部

doubleim;//虚部};structcomplexadd(structcomplex,structcomplex);voidmain(){structcomplexx={6.5,8.9},y={7.1,9.4};structcomplexz;

z=add(x,y);printf("和为:%5.2lf+i%5.2lf\n",z.re,z.im);}整个结构作为参数

演示:示例5structcomplexadd(structcomplexa,structcomplexb){ structcomplexc; c.re=a.re+b.re; c.im=a.im+b.im; returnc;}传递结构时不使用“&”,所以实际上是传值调用,即,将结构变量的每个成员值逐个传送。18结构指针做为参数

问题描述:求已知两个复数的和。分析:两个复数a+ib和c+id的和为:

x+iy其中:x=a+cy=b+dstructstudent{intnum;char*name;charsex;floatscore;}stu[N]={{1,"李芳",'F',45},{2,"于红",'F',62.5}, {3,"何万山",'M',92.5},{4,"程亚丽",'M',87}, {5,"王明",'M',58}};voidave(structstudent*ps);voidmain(){structstudent*ps;ps=stu;

ave(ps);}演示:示例6voidave(structstudent*ps){inti,count=0;floatave,sum=0;for(i=0;i<N;i++,ps++){sum=sum+ps->score;if(ps->score<60) count++;}printf("总分:%7.2f\n",sum);ave=sum/5;printf("平均分:%5.2f\n",ave);printf("不及格人数为:%d\n",count);}用指针变量作函数参数进行传送时由实参传向形参的只是结构的地址。19堆栈是一种先进后出的数据结构。用堆栈实现简单的行编辑功能,问题描述如下:接受用户从键盘输入的程序或数据,并存入用户的数据区。由于用户在键盘上进行输入时,不能保证不会出错,因此,需要设立一个输入缓冲区,允许用户输入出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键入的一个字符错了时,可以补进一个“#”,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符“@”,以表示当前行中的字符均无效。实现堆栈5-120实现堆栈

5-2Whie使用堆栈实现行编辑功能whiel##lr#e(s#*s)llre(s*s输出缓冲区(堆栈)中的所有字符,即有效字符:while(*s)outcoutcha@putchar(*s=#++);ha遇到字符@清空缓冲区(堆栈)putchar(*s=++);遇到字符#时,栈顶元素出栈输出缓冲区(堆栈)中的所有字符,即有效字符:putchar(*s++);21实现堆栈

5-3由此可见,需要实现堆栈的以下几个操作:入栈出栈清空栈显示从栈底到栈顶所有的元素

判断栈是否为空#definem100structMystack{charelement[m];inttop;//栈顶};栈结构voidpush(structMystack*s,charx)/*将x的值压入栈顶*/{s->element[s->top]=x;s->top++;}入栈操作voidpop(structMystack*s)/*将栈顶元素删除*/{ s->top--; }出栈操作intIsEmpty(structMystack*s){ if(s->top==0) return1; else return0;}判断栈是否为空22实现堆栈

5-4voidClearstack(structMystack*s{ s->top=0;}清空栈voidDisplaystack(structMystack*s){ inti; for(i=0;i<s->top;i++) printf("%c",s->element[i]);}显示从

温馨提示

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

评论

0/150

提交评论