《C语言程序设计d》课件-第七讲 结构体_第1页
《C语言程序设计d》课件-第七讲 结构体_第2页
《C语言程序设计d》课件-第七讲 结构体_第3页
《C语言程序设计d》课件-第七讲 结构体_第4页
《C语言程序设计d》课件-第七讲 结构体_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1引言2复杂数据的表示假设一个学生信息包括姓名、学号、成绩,将n个学生的信息,按成绩排序后输出解决方法1:用三个数组分别存放姓名,学号,成绩,对成绩排序,排序中需要交换两个成绩时要同时交换对应的姓名和学号解决方法2:将每个学生的三个信息作为一个整体,然后根据成绩排序,交换时将学生信息作为整体交换使用结构体将多个信息组合为一个整体3结构体多个信息组合成的一个逻辑整体每个信息称为结构体的一个成员每个成员都有类型和名称类型可以是基本类型也可以是数组类型、结构体类型或指针类型,甚至指向当前结构体类型structstudent{charid[10];charname[20];doublescore;};structcomplex{doublereal;doubleimage;};structnode{intvalue;

structnode*next;};4主要内容7.1结构体定义与使用7.2结构体与函数5结构体类型的概念结构体是由不同类型的数据所组成的集合体。结构体类型的的定义:注意类型定义后面的分号

struct结构体名

{

数据类型成员名1; 数据类型成员名2;

数据类型成员名n;

};结构体类型定义6示例一:

structStudent//学生信息结构体

{ charnum[10];//学号

charname[10];//姓名

charsex;//性别

intage;//年龄

charaddr[30];//住址

};结构体类型示例7结构体类型示例示例二:

struct__Date//日期结构体

{ intyear;

intmonth;

intday;

};示例三: structComplex//复数结构体

{ doublereal;//实部

doubleimag;//虚部 };8定义结构体变量方法1:定义结构体时声明变量//定义两个结构体变量structstudent_t{charnum[10];charname[20];doublescore;}st1,st2;变量只能在定义结构体时定义,使用不便9定义结构体变量方法2:在程序其他地方声明变量structstudent_t{charnum[10];charname[20];doublescore;};//定义两个结构体变量structstudentst1,st2;定义结构体变量时必须加上struct关键字10定义结构体变量方法3:先用typedef将结构体定义为一个简单名称,然后用该名称来定义变量typedefstruct{charid[10];charname[20];doublescore;}Student;//定义两个结构体变量Studentst1,st2;typedefunsignedintUINT;//定义两个无符号整数变量UINTn1,n2;11使用typedef重新命名结构体类型名后,结构体变量的定义格式与普通变量相同:示例一:Datedate;示例二:Studentzhang_san;示例三:Studentstudents[8];//学生结构体数组

定义结构体变量12定义结构体变量的同时可以直接设置初值。typedefstruct{intyear,month,day;}Date;typedefstruct//学生信息结构体

{ charnum[10];//学号

charname[10];//姓名

charsex;//性别

intage;//年龄

Datebirthday;//出生年月

}Student;Studentmonitor={“03131101”,”张明”,‘M’,19};Studentmonitor={“03131101”,”张明”,‘M’,19,{1994,1,10}};结构体变量的初始化13与数组不同,结构体变量可直接赋值,拷贝过程为逐成员一一复制如果成员是基本类型,按值复制如果成员是数组,数组内容会被复制如果成员是指针,复制指针值(地址),导致两个结构体变量的成员指向同一块内存示例: Datedate={2019,12,10}; Datetoday=date;结构体变量的赋值14结构体变量成员的访问使用点号操作符“.”访问结构体变量的某个特定成员示例一:Datedate;date.year=2014;date.month=12;date.day=26;嵌套结构体成员的访问可以连续使用点号逐层访问示例二: Studentmonitor; monitor.birthday.year=2000;复杂结构体成员的访问严格按照语法规范进行示例三: Studentstudents[10]; students[0].birthday.year=2000;结构体变量成员的访问15结构体指针变量定义结构体类型的指针变量格式:结构体类型*指针变量名typedefstruct{intx;inty;}point;pointpt1={10,10};point*pt2=&pt1;16结构体指针变量引用结构体类型指针变量的成员方法1:先用间接运算符(*)取得结构体,再用成员运算符(.)访问成员方法2:直接用专用运算符->取得结构体类型指针变量的成员(*pt2).x=20;pt2->x=20;此处必须有括号,因为一元运算符是右结合17示例1:编写程序,接受用户输入的两个复数,按照a+bi格式打印它们之和,精度精确到小数点后二位#include<stdio.h>typedefstruct{doublereal,imag;}Complex;intmain(){Complexa,b,result;printf("请输入第一个复数:.\n");scanf("%lf%lf",&a.real,&a.imag);printf(“请输入第二个复数:.\n");scanf("%lf%lf",&b.real,&b.imag);result.real=a.real+b.real;result.imag=a.imag+b.imag;printf("复数之和为:%.2lf+%.2lfi.\n",result.real,result.imag);return0;}187.2结构体与函数19结构体类型作为函数返回值可以返回一个逻辑整体(相当于返回多个值)结构体类型返回值可以整体赋值给其他结构体变量typedefstruct{intx;inty;}point_t;point_trandom_point(){point_tpt;

pt.x=rand()%100;pt.y=rand()%100;

returnpt;}intmain(){point_tpt;

pt=random_point();printf("pt:(%d,%d)\n",pt.x,pt.y);return0;}21结构体类型作为函数形式参数非指针形式的结构体类型参数传递时按值传递,即将实参结构体整体赋值给形参,在函数体内对结构体成员的修改不会保留指针形式的结构体类型参数传递时,实参和形参指向同一结构体,在函数体内对结构体成员的修改可以保留22结构体类型作为函数形式参数intmain(){point_tpt1={10,10};printf("pt1:(%d,%d)\n",pt1.x,pt1.y);move1(pt1,5,5);printf("pt1:(%d,%d)\n",pt1.x,pt1.y);move2(&pt1,5,5);printf("pt1:(%d,%d)\n",pt1.x,pt1.y);return0;}pt1:(10,10)pt1:(10,10)pt1:(15,15)voidmove2(point_t*pt,intdx,intdy){pt->x+=dx;pt->y+=dy;}voidmove1(point_tpt,intdx,intdy){pt.x+=dx;pt.y+=dy;}23示例假设一个学生信息包括姓名、学号、成绩,原始文件中按学号依次存放了n个学生的信息,要求按成绩排序后输出学生信息step1:输入学生信息step2:按成绩排序step3:输出学生信息typedefstruct{charid[10];//学号charname[20];//姓名doublescore;//成绩}student_t;24#include<stdio.h>typedefstruct{ charid[10]; charname[20]; intscore;}Student;voidsort(Studentsts[],intn){inti,j;for(i=0;i<n-1;i++){for(j=i+1;j<n;j++) {if(sts[j].score>sts[i].score) { Studentst=sts[i]; sts[i]=sts[j]; sts[j]=st; }}}}25intmain(){ intn; Studentstus[100]; scanf("%d",&n); inti; for(i=0;i<n;i++) { scanf("%s%s%d",&stus[i].id,&stus[i].name,&stus[i].score); }

sort(stus,n);

for(i=0;i<n;i++) { printf("%s%s%d\n",stus[i].id,stus[i].name,stus[i].score); } return0;}26示例:编写一函数,使用结构体类型存储日期,并返回该日在该年的第几天信息,具体天数从1开始计数,例如2007年1月20日返回20,2月1日返回32。

#include<stdio.h>typedefstruct{intyear,month,day;}Date;intGetDaysNum(Datedate);intIsLeapYear(intyear);intmain(){ Datetoday={2015,12,31}; intdaysNum=GetDaysNum(today); printf("今天是2014年的第%d天。\n",daysNum); return0;}27intGetDaysNum(Datedate){ staticintmonthDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; inti,result=0; for(i=0;i<date.month;i++) result+=monthDays[i]; result+=date.day; if(date.month>2&&IsLeapYear(date.year)) r

温馨提示

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

评论

0/150

提交评论