C语言讲课PPT精华(西电科大高佳琪).ppt_第1页
C语言讲课PPT精华(西电科大高佳琪).ppt_第2页
C语言讲课PPT精华(西电科大高佳琪).ppt_第3页
C语言讲课PPT精华(西电科大高佳琪).ppt_第4页
C语言讲课PPT精华(西电科大高佳琪).ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

第九章 结构体与共用体 l提出问题 一个学生有学号、姓名、性别、年龄、地址等属性。 l int num;char name20; char sex; lint age;int char addr30; l如果将这些属性分别定义为互相独立的简单变量,则难以反映 它们之间的内在联系(同一个学生的属性)。 l结构的定义 l结构是逻辑上相互联系的一组分量的集合。 l结构中的分量可以是不同类型的数据,结构中的分量称为结构 的成员。 l在使用结构之前,首先要对结构的组成进行描述,称为结构的 定义。结构定义说明了该结构的组成成员,以及每个成员的类型。 9.1 结构体 char name20; char sex; int age; float score; char addr30; ; name num sex age score addr 2字节 2字节 20字节 1字节 4字节 30字节 结构体类型定义描述结构 的组织形式,不分配内存 结构体类型定义的作用域 例 struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu1,stu2; 9.2 结构体变量的定义 先定义结构体类型,再定义结构体变量 v一般形式: struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构体名 变量名表列; 例 #define STUDENT struct student STUDENT int num; char name20; char sex; int age; float score; char addr30; ; STUDENT stu1,stu2; 定义结构体类型的同时定义结构体变量 一般形式: struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 变量名表列; 例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 直接定义结构体变量 一般形式: struct 类型标识符 成员名; 类型标识符 成员名; . 变量名表列; 例 struct int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; 用无名结构体直接定义 变量只能一次 说明 v结构体类型与结构体变量概念不同 l类型:不分配内存; 变量:分配内存 l类型:不能赋值、存取、运算; 变量:可以 v结构体变量所占内存空间是各成员变量所占内存单元 的总和,一般占一片连续的存储单元 v结构体可嵌套 v结构体成员名与程序中变量名可相同,不会混淆 例 struct date int month; int day; int year; ; struct student int num; char name20; struct date birthday; stu; numname birthday monthdayyear 例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu; numname birthday monthdayyear 9.3 结构体变量的引用 引用规则 v 结构体变量不能整体引用,只能引用变量成员 v可以将一个结构体变量赋值给另一个结构体变量 v结构体嵌套时逐级引用 成员(分量)运算符 优先级: 1 结合性:从左向右 引用方式: 结构体变量名.成员名 例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu1.num=10; stu1.score=85.5; stu1.score+=stu2.score; stu1.age+; 例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; printf(“%d,%s,%c,%d,%f,%sn”,stu1); () stu1=101,“Wan Lin”,M,19,87.5,“DaLian”; () 例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; stu2=stu1; ( ) 例 struct student int num; char name20; struct date int month; int day; int year; birthday; stu1,stu2; numname birthday monthdayyear stu1.birthday.month=12; 例 struct student int num; char name20; char sex; int age; float score; char addr30; stu1,stu2; if(stu1=stu2) () 9.4 结构体变量的初始化 形式一: struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . ; struct 结构体名 结构体变量=初始数据; 例 struct student int num; char name20; char sex; int age; char addr30; ; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 形式二: struct 结构体名 类型标识符 成员名; 类型标识符 成员名; . 结构体变量=初始数据; 例 struct student int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; 形式三: struct 类型标识符 成员名; 类型标识符 成员名; . 结构体变量=初始数据; 例 struct int num; char name20; char sex; int age; char addr30; stu1=112,“Wang Lin”,M,19, “200 Beijing Road”; #include void main() struct stuscore char name20; float score20; float average; ; struct stuscore x=“Wang_Wei”,90.5,85,70,90,98.5; int i; float sum=0; for(i=0;i #include void main() struct stuscore char name20; float score5; float average; x; int i; float sum; char rep; while(1) printf(“nDo you want to continue?(Y/N)”); rep=getche(); if (rep=N|rep=n) break; sum=0; printf scanf(“%s”,); for (i=0;i #include void main() struct staff char name20; char department20; int salary; int cost; worler3=,; int i; char xname20; printf(“nInput the workers name:”); scanf(“%s”,xname); for(i=0;i成员名结构体变量名.成员名 指向运算符 优先级: 1 结合方向:从左向右 例 指向结构体的指针变量 main() struct student long int num; char name20; char sex; float score; stu_1,*p; p= stu_1.num=89101; strcpy(stu_1.name,“Li Lin“); p-sex=M; p-score=89.5; printf(“nNo:%ldnname:%snsex:%cnscore:%fn“, (*p).num,p-name,stu_1.sex,p-score); 例 int n; int *p= *p=10; n=10 struct student stu1; struct student *p= stu1.num=101; (*p).num=101 用结构名访问结构成员时用“.”比较方便,用指针访问结构成员时用“-” 比较方便。 假设已说明: struct student stu1,*sp= 注意以下表达式的含义: sp-num:得到sp指向的结构体型变量中的成员num的值,假设其值为990120 sp-num+:等价于(sp-num)+),得到sp指向的结构体型变量中的成员num 的值,用完该值后对它加1 +sp-num:等价于+(sp-num),得到sp指向的结构体型变量中的成员num的 值,使之先加1,再使用。 连着执行下列三条语句: printf(“%dn”, sp-num); 输出990120 printf(“%dn”, sp-num+); 输出990120 printf(“%dn”, +sp-num); 输出990122 指向结构体数组的指针 例 指向结构体数组的指针 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); num name sex age stu0 p stu1 stu2 p+1 显示工资表。 #include struct satff char name20; int salary; void main() struct staff *p; struct staff worker3= “Wang_Li”,600,“Li_Ping”,700, “Liu_Yuan”,800; for (p=worker;pname,p-salary); 运行结果: Wang_Lis salary is 600 yuan Li_Pings salary is 700 yuan Liu_Yuans salary is 800 yuan 对于指向数组的指针,用得更多的是指针值本身的加1移动。 (+p)-salary:先使p自加1,指向下一元素,得到worker1.salary的值,即700 p+-salary:先得到worker0.salary的值,即600,然后使p加1指向worker1 (p+)-salary:完全同上。括号不改变+操作符以后的操作性质 设上例的worker数组初始化,且p=worker之后,连续执行以下四条语句,输出 结果为: printf(“%dn”, p-salary); printf(“%dn”, (+p)-salary); printf(“%dn”, p+-salary); printf(“%dn”, (p+)-salary); 600 700 700 800 9.7 结构体与函数 结构体与函数之间的关系: 结构体作为函数参数。结构体型变量、结构体型变 量的成员和结构体指针都可以作为函数的参数进行传递。 结构体作为函数的返回值。 v用结构体变量的成员作参数-值传递 v用结构体变量作参数-多值传递,效率低 v用指向结构体变量或数组的指针作参数-地址传递 计算实发工资。 #include struct staff char name20; char department20; int salary; int cost; int realsum; worker3=,; int getreal(int salary, int cost); void main() struct staff *p; int realsum; for (p=worker;psalary,p-cost); printf(“”,p-name,p-department,realsum); int getreal(int salary,int cost) return salary-cost; 计算实发工资。 #include struct staff char name20; char department20; int salary; int cost; int realsum; worker3=,; int getreal(struct staff); void main() struct staff *p; int realsum; for (p=worker;pname,p-department,realsum); int getreal(struct staff ss) return ss.salary-ss.cost; 计算实发工资。 #include #define NUM 3 struct staff char name20; char department20; int salary; int cost; int realsum; worker3=,; int getreal(struct staff *); void main() struct staff *p; int realsum; for (p=worker;pname,p-department,realsum, p-realsum); int getreal(struct staff * ps) ps-realsum=ps-salary-ps-cost; 结构体作为函数的返回值 返回结构体所有成员的值 #include struct time int hour, minute,second; struct time new_time(struct time,int); void main() struct time t1,t2=21,58,32; int secs=97; t1=new_time(t2,secs); printf(“new time.”,t1.hour,t1.minute, t1.second); struct time new_time(struct time tt, int elapsed_secs) int new_hour,new_min,new_sec; new_sec=tt.second+elapsed_secs; tt.second=new_sec%60; new_min=tt.minute+new_sec/60; tt.minute=new_min%60; new_hour=tt.hour+new_min/60; tt.hour=new_hour%24; return(tt); struct data int a, b, c; ; main() void func(struct data); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(“arg.a=%d arg.b=%d arg.c=%dn“,arg.a,arg.b,arg.c); printf(“Call Func()n“); func(arg); printf(“arg.a=%d arg.b=%d arg.c=%dn“,arg.a,arg.b,arg.c); void func(struct data parm) printf(“parm.a=%d parm.b=%d parm.c=%dn“,parm.a,parm.b,parm.c); printf(“Process.n“); parm.a=18; parm.b=5; parm.c=parm.a*parm.b; printf(“parm.a=%d parm.b=%d parm.c=%dn“,parm.a,parm.b,parm.c); printf(“Return.n“); arg a :27 b: 3 c :30 (main) (func) parm a :27 b: 3 c :30 copy arg a :27 b: 3 c :30 (main) (func) parm a :18 b: 5 c :90 arg a :27 b: 3 c :30 (main) arg a :27 b: 3 c :30 (main) 例 用结构体变量作函数参数 struct data int a, b, c; ; main() void func(struct data *parm); struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf(“arg.a=%d arg.b=%d arg.c=%dn“,arg.a,arg.b,arg.c); printf(“Call Func()n“); func( printf(“arg.a=%d arg.b=%d arg.c=%dn“,arg.a,arg.b,arg.c); void func(struct data *parm) printf(“parm-a=%d parm-b=%d parm-c=%dn“,parm-a,parm-b,parm-c); printf(“Process.n“); parm-a=18; parm-b=5; parm-c=parm-a*parm-b; printf(“parm-a=%d parm-b=%d parm-c=%dn“,parm-a,parm-b,parm-c); printf(“Return.n“); arg a :18 b: 5 c :90 (main) arg a :27 b: 3 c :30 (main) 例 用结构体指针变量作函数参数 arg a :27 b: 3 c :30 (main) (func) parm * arg a :18 b: 5 c :90 (main) (func) parm * 9.8内存的动态分配 为了实现内存的动态分配,C语言提供了一些程序执行后才开辟和释放某 些内存区的函数。 1)malloc( )函数 void *malloc(unsigned size); 功能:在内存的动态存储区中分配长度为size个字节的连续空间。 返回值:分配空间的起始地址(分配成功) 空指针NULL (分配失败,一般是没有空间) 2)free(p)函数 功能:释放由p指向的内存区,使这部分内存可以分配给其它变量 分配一个能放置双精度数的空间。 #include #include main() double *p; p=(double *)malloc(sizeof(double); if(p=0) printf(“malloc errorn“); exit(0); *p=79.786; printf(“*p=%fn“,*p); malloc( )函数的返回值为void * 型,现在是对双精度型分配空 间,所以要将其返回值强行转 换成double *型 在使用后释放动态分配的空间。 #include #include main() double *p,*q; p=(double *)malloc(sizeof(double); if(p=0) printf(“malloc errorn“); exit(0); printf(“p=ox%x *p=%4.1fn“,p,*p=100); free(p); q=(double *)malloc(sizeof(double); if(q=0) printf(“malloc errorn“); exit(0); *q=10.; printf(“q=ox%x *q=%4.1f p=ox%x *p=%4.1fn“,q,*q,p,*p); 9.9 共用体 共用体类型是几个不同类型的变量共占同 一段内存的结构,或者说对同一段内存单 元的数据按不同类型来处理。 char ch; float f; ;f ch i 类型定义不分配内存 形式一: union data int i; char ch; float f; a,b; 形式二: union data int i; char ch; float f; ; union data a,b,c,*p,d3; 形式三: union int i; char ch; float f; a,b,c; 共用体变量的定义 f ch i f ch i ab 共用体变量定义分配内存, 长度=最长成员所占字节数 共用体变量任何时刻 只有一个成员存在 共用体变量引用 v引用方式: 例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); (编译通过,运行结果不对) v引用规则 l不能引用共用体变量,只能引用其成员 共用体指针名-成员名共用体变量名.成员名(*共用体指针名).成员名 union data int i; char ch; float f; ; union data a,b,c,*p,d3; a.i a.ch a.f p-i p-ch p-f (*p).i (*p).ch (*p).f d0.i d0.ch d0.f l共用体变量中起作用的成员是最后一次存放的成员 例 union int i; char ch; float f; a; a=1; () l不能在定义共用体变量时初始化 例 union int i; char ch; float f; a=1,a,1.5; () l可以用一个共用体变量为另一个变量赋值 例 float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; () x=a.f; () l共用体变量的地址和它的各成员的地址都是同一地址 l共用体类型的变量既不能做函数实参进行传递,也不能作函数 的返回值。但使用指向共用体变量的指针可以作函数实参进行 传递,也可以作函数的返回值。 例 将一个整数按字节输出 01100001 01000001 低字节高字节 01000001 01100001 ch0 ch1 运行结果: i=60501 ch0=101,ch1=141 ch0=A,ch1=a main() union int_char int i; char ch2; x; x.i=24897; printf(“i=%on“,x.i); printf(“ch0=%o,ch1=%on ch0=%c,ch1=%cn“, x.ch0,x.ch1,x.ch0,x.ch1); 结构体与共用体 v区别: 存储方式不同 struct node char ch2; int k; a; union node char ch2; int k; b; a ch k bch k 变量的各成员同时存在 任一时刻只有一个成员存在 v联系: 两者可相互嵌套 #include main( ) struct union int i; char ch; float f; double d; data; char type_flag; num; printf(); num.type_flag=getche( ); printf(“Input the number:n”); switch(num.type_flag) case i:scanf(“%d”,break; case c:scanf(“%c”,break; case f: scanf(“%f”,break; case d: scanf(“%lf”, switch(num.type_flag) case i:printf(“%d”,num.data.i);break; case c:printf(“%c”,num.data.ch);break; case f:printf(“%f”,num.data.f);break; case d:printf(“%lf”,num.data.d); 9.10用typedef定义类型 功能:用自定义名字为已有数据类型命名 类型定义简单形式: typedef type name; 例 typedef int INTEGER; 类型定义语句关键字已有数据类型名 用户定义的类型名 例 typedef float REAL; 类型定义后,与已有类型一样使用 例 INTEGER a,b,c; REAL f1,f2; int a,b,c; float f1,f2; 说明: 1.typedef 没有创造新数据类型 2.typedef 是定义类型,不能定义变量 3.typedef 与 define 不同 define typedef 预编译时处理 编译时处理 简单字符置换 为已有类型命名 typedef定义类型步骤 按定义变量方法先写出定义体 如 int i; 将变量名换成新类型名 如 int INTEGER; 最前面加typedef 如 typedef int INTEGER; 用新类型名定义变量 如 INTEGER i,j; 例 定义数组类型 int a100; int ARRAY100; typedef int ARRAY100; ARRAY a,b,c; int a100,b100,c100; 例 定义指针类型 char *str; char *STRING; typedef char *STRING; STRING p,s10; char *p; char *s10; 例 定义函数指针类型 int (*p)(); int (*POWER)(); typedef int (*POWER)(); POWER p1,p2; int (*p1)(),(*p2)(); 例 定义结构体类型 struct date int month; int day; int year; d; 例 定义结构体类型 struct date int month; int day; int year; DATE; 例 定义结构体类型 typedef struct date int month; int day; int year; DATE; 例 定义结构体类型 DATE birthday, *p; struct date int month; int day; int year; birthday, *p; 类型定义可嵌套 例 typedef struct club char name20; int size; int year; GROUP; typedef GROUP *PG; PG pclub; GROUP *pclub; struct club *pclub; GROUP为结构体类型 PG为指向GROUP的指针类型 #include void main() char a25=“abc”,”defg”; char *p=a0,*s=a1; while (*p)p+; while (*s)*p+=*s+; printf(“%s%sn”,a0,a1); 第一章 熟练掌握各种数制的表示形式和转换方式; 了解程序开发方法和过程; 知道C语言的发展简史,掌握C语言的各种特点; 掌握算法的基本概念、特点、表示方法及算法细化; 第二章 熟练掌握C语言中最基本的要素: 标识符、关键字、常量、变量、运算符和表达式; 以及它们的分类、定义和使用。 第三章 掌握结构化程序设计思想、设计方法和结构化程序的标准。 任何功能的程序都可通过顺序结构、分支结构和循环结构所 组合的程序模块来实现。 重点掌握顺序结构的程序设计,赋值语句和输入输出函数调 用语句。 第四章 重点掌握分支结构中的表达式,if语句的简单形式,if-else 结构和 elseif结构。 能借助于流程图理顺思路,正确进行多分支结构的编程。 能灵活运用条件运算符,掌握switch的用法。 第五章 重点掌握循环结构的while语句,do-while语句和for语句, 它们是C程序设计的重要基础。 重点掌握循环的嵌套,以及与循环语句配合使用的break和 continue语句,了解用goto语句和if语句也可构成循环结构 。 第六章 数组是一种非常重要的数据类型,它将一组同类型的数据按 顺序关系组织起来,并用一个名字命名,保存在内存的一片 连续空间中。 数组按维数可分为一维、二维及多维数组。 按数组的类型可分为整型、实型、字符数组等。 熟练掌握字符数组处理字符串。 对每种类型的数组,要求掌握其定义、初始化和引用等,应 能灵活地应用数组来处理大量的同类型数据,并能熟练编程 。 第七章 重点掌握函数的定义、声明和调用,其中函数参数的传递方 式既是重点又是难点。 熟练掌握动态存储的概念以及局部变量和全局变量的存储方

温馨提示

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

评论

0/150

提交评论