C语言第四版课件第11章-结构体与位运算_第1页
C语言第四版课件第11章-结构体与位运算_第2页
C语言第四版课件第11章-结构体与位运算_第3页
C语言第四版课件第11章-结构体与位运算_第4页
C语言第四版课件第11章-结构体与位运算_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

第11章结构体与位运算结构体C的数据类型结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体〔自定义数据类型〕结构体类型和结构体变量定义、使用struct[结构体名]{类型标识符成员名;类型标识符成员名;…………….};成员类型可以是根本型或构造型struct是关键字,不能省略合法标识符可省:无名结构体例struct

student{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};namenumsexagescoreaddr2字节2字节20字节1字节4字节30字节……..结构体类型定义描述结构的组织形式,不分配内存例子图解先定义结构体类型,再定义结构体变量一般形式:struct结构体名{类型标识符成员名;类型标识符成员名;…………….};struct结构体名变量名表列;结构体变量的定义一般形式:struct结构体名{

类型标识符成员名;类型标识符成员名;

…………….}变量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;定义结构体类型的同时定义结构体变量一般形式:struct{

类型标识符成员名;类型标识符成员名;

…………….}变量名表列;例struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;用无名结构体直接定义变量只能一次直接定义结构体变量结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体可嵌套不能递归定义结构体成员名与程序中变量名可相同,不会混淆说明:形式一:struct结构体名{

类型标识符成员名;类型标识符成员名;

…………….};struct结构体名结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};结构体变量的初始化化形式二:struct结构体名{

类型标识符成员名;类型标识符成员名;

…………….}结构体变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};结构体变量的初始化struct{

类型标识符成员名;类型标识符成员名;

…………….}结构体变量={初始数据};例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};形式三:结构体变量的初始化引用规那么结构体变量出赋值外不能整体引用,只能引用变量成员可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用成员(分量)运算符优先级:1结合性:从左向右引用方式:结构体变量名.成员名结构体变量的引用

[例]输入某班32名学生的学号和考试成绩,求成绩最好的学生的学号和成绩及平均成绩。析:定义结构体,包含两个成员:学号和成绩。程序Ex11-1.cmain(){structstruct_name

{intnum;floatscore;}student,max;inti;floatsum;max.score=0;sum=0;变量定义结构体变量max用来存放成绩最好的那个学生的信息。定义结构体类型struct_namei用来控制循环sum用来存放总成绩变量初始化

for(i=1;i<=32;i++){scanf(“%d,%f”,&student.num,&student.score);if(student.score>max.score)max=student;sum=sum+student.score;}printf(“\n%d%f%f”,max.num,max.score,sum);}相当于max.num=student.num;max.score=student.score;结构体数组的定义三种形式:形式一: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结构体数组

例struct{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};结构体数组引用引用方式:结构体数组名[下标].成员名structstudent{intnum;charname[20];charsex;intage;}str[3];stu[1].age++;strcpy(stu[0].name,”ZhaoDa”);结构体数组初始化

结构体数组的应用举例[例]设李红、王建和赵明三个同学某学年考了8门课,现在要求分别统计出这三名同学该学年的总成绩,并按8门课总成绩的上下排序输出。main(){structstr_name/*定义结构体类型*/{charname[8];/*姓名*/floatscore;/*8门课总成绩*/}temp,stu[]={{“lihong”,0},{“wang”,0},{“zhao”,0}};inti,j;floatx;

变量定义定义结构体数组变量temp,std并为std赋初值

for(i=1;i<=8;i++){printf(“\n输入第%d门课的成绩:\n”,i);

for(j=0;j<3;j++){printf(“姓名:%s成绩为:”,std[j].name); scanf(“%f”,&x); std[j].score=std[j].score+x;}

}

循环为3名同学处理成绩循环处理8门课

for(i=0;i<2;i++)

for(j=i+1;j<3;j++)if(std[i].score<std[j].score){temp=std[j]; std[j]=std[i]; std[i]=temp;

}排序 /*输出结果*/for(i=0;i<3;i++)printf(“\n姓名:%s总成绩:%6.1f”,std[i].name,std[i].score);}结构体数组的应用举例指向结构体变量的指针定义形式: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结构体和指针[例11.3]将例11.2统计三名同学成绩并排序的程序,修改为用指针来完成。程序

main(){structstruct_name{charname[8];floatscore;}std[]={{“lihong”,0},{“wang”,0},{“zhao”,0}};structstruct_nametemp,*p,*p1;

/*temp为排序时用到的临时变量*//*p和p1是指向结构体类型的指针变量*/inti,j;floatx;for(i=1;i<=8;i++){printf(“\n输入第%d门课的成绩:\n”,i);p=std;for(j=0;j<3;j++) {printf(“姓名:%s成绩:”,p->name); scanf(“%f”,&x); p->score=p->score+x; p++;}}/*求3名同学8门课成绩之和*/p1=std;for(i=0;i<2;i++){p=p1;for(j=i+1;j<3;j++){if(p1->score<p->score){temp=*p;*p=*p1;*p1=temp;}p++;}p1++;}/*排序*//*输出排序结果*/p=std;for(i=0;i<3;i++){printf(“\n姓名:%s总成绩:%6.1f”, p->name,p->score);p++;}}用结构体变量的成员作参数----值传递用指向结构体变量或数组的指针作参数----地址传递用结构体变量作参数----多值传递,效率低用指向结构体的指针作函数参数structdata{inta,b,c;};main(){voidfunc(structdata);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");

func(arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdataparm){printf("parm.a=%dparm.b=%dparm.c=%d\n",parm.a,parm.b,parm.c);printf("Process...\n");parm.a=18;parm.b=5;parm.c=parm.a*parm.b;printf("parm.a=%dparm.b=%dparm.c=%d\n",parm.a,parm.b,parm.c);printf("Return...\n");}arga:27b:3c:30(main)(func)parma:27b:3c:30copyarga:27b:3c:30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)arga:27b:3c:30(main)例用结构体变量作函数参数〔1〕structdata{inta,b,c;};main(){voidfunc(structdata*parm);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");

func(&arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdata*parm){printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Process...\n");parm->a=18;parm->b=5;parm->c=parm->a*parm->b;printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Return...\n");}arga:18b:5c:90(main)arga:27b:3c:30(main)arga:27b:3c:30(main)(func)parm****arga:18b:5c:90(main)(func)parm****例用结构体指针变量作函数参数〔2〕功能:用自定义名字为已有数据类型命名类型定义简单形式:typedeftype

name;例typedefintINTEGER;类型定义语句关键字已有数据类型名用户定义的类型名例typedeffloatREAL;类型定义后,与已有类型一样使用例INTEGERa,b,c;REALf1,f2;inta,b,c;floatf1,f2;说明:1.typedef没有创造新数据类型2.typedef是定义类型,不能定义变量3.typedef与#define不同

define

typedef预编译时处理

编译时处理简单字符置换

为已有类型命名用typedef定义类型最前面加typedef

如typedef

int

INTEGER;用新类型名定义变量如INTEGERi,j;typedef定义类型步骤例定义指针类型char*str;char*STRING;typedefchar*STRING;STRINGp,s[10];

char*p;char*s[10];例定义结构体类型和变量structdate{intmonth;intday;intyear;}DATE;例定义结构体类型structdate{intmonth;intday;intyear;};例定义结构体类型typedefstructdate{intmonth;intday;intyear;}DATE;例定义结构体类型DATEbirthday,*p;

structdate{intmonth;intday;intyear;}birthday,*p;例typedefstructclub{charname[20];intsize;intyear;}GROUP;typedefGROUP*PG;PGpclub;

GROUP*pclub;

structclub*pclub;GROUP为结构体类型PG为指向GROUP的指针类型位运算把操作数右移指定的位数右移>>把操作数左移指定的位数左移<<把操作数各位0变1,1变0取反~两个相应位相同为0,其余为1位异或∧两个相应位全0为0,其余为1位或|两个相应位全1为1,其余为0位与&运算规则名称运算符按位与&参与运算的量,如果相对应的两位都为1,那么该位的结果值为1,否那么为0,即:0&0==00&1==01&0==01&1==1如:a的值为0x1234,b的值为0x00FF,a&b运算的结果c应为:a0001001000110100&b0000000011111111c0000000000110100按位与常用于将某个运算量的某些位清0或提取某些位的值,如本例中,将变量的高8位清0,同时保存或提

温馨提示

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

最新文档

评论

0/150

提交评论