安顺上课教案

上传人:m**** 文档编号:568792803 上传时间:2024-07-26 格式:PPT 页数:101 大小:732.50KB
返回 下载 相关 举报
安顺上课教案_第1页
第1页 / 共101页
安顺上课教案_第2页
第2页 / 共101页
安顺上课教案_第3页
第3页 / 共101页
安顺上课教案_第4页
第4页 / 共101页
安顺上课教案_第5页
第5页 / 共101页
点击查看更多>>
资源描述

《安顺上课教案》由会员分享,可在线阅读,更多相关《安顺上课教案(101页珍藏版)》请在金锄头文库上搜索。

1、第八章 函数8.1 概述模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块,特点:各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性提高元件的可靠性缩短开发周期避免程序开发的重复劳动易于维护和功能扩充开发方法: 自上向下,逐步分解,分而治之C是模块化程序设计语言C程序结构&C是函数式语言&必须有且只能有一个名为main的主函数&C程序的执行总是从main函数开始,在main中结束&函数不能嵌套定义,可以嵌套调用函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数从函数形式无参函数有参函数使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类

2、型3、函数返回值意义和类型4、需要使用的包含文件8.2 函数的定义一般格式合法标识符函数返回值类型缺省int型无返回值void函数体函数类型 函数名(形参类型说明表)说明部分语句部分现代风格:例 有参函数(现代风格) int max(int x,int y) int z; z=xy?x:y; return(z); 例 有参函数(现代风格) int max(int x, y) int z; z=xy?x:y; return(z); 例 空函数 dummy( ) 函数体为空例 无参函数 printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n

3、”); 函数类型 函数名(形参表)形参类型说明说明部分语句部分传统风格:例 有参函数(传统风格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 8.3 函数的返回值返回语句形式: return(表达式); 或 return 表达式; 或 return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数说明:函数中可有多个return语句若无return语句,遇时,自动返回调用函数若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换void型函数例 无返回值函数 void swap(int

4、x,int y ) int temp; temp=x; x=y; y=temp; 例 函数返回值类型转换main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);8.4 函数的调用调用形式 函数名(实参表);说明:实参与形参个数相等,类型一致,按顺序一一对应实参表求值顺序,因系统而定(Turbo C 自右向左)main() int i=2,p; p=f(i,+i); printf(%d,p);in

5、t f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);例 参数求值顺序main() int i=2,p; p=f(i, i+); printf(%d,p);int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);运行结果:0运行结果:1调用方式函数语句: 例 printstar(); printf(“Hello,World!n”);函数表达式: 例 m=max(a,b)*2;函数参数: 例 prin

6、tf(“%d”,max(a,b); m=max(a,max(b,c);函数说明对被调用函数要求:必须是已存在的函数库函数: #include 用户自定义函数: 函数类型说明函数说明一般形式: 函数类型 函数名(形参类型 形参名,. ); 或 函数类型 函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数说明不同函数说明位置:程序的数据说明部分(函数内或外)下列情况下,可不作函数说明若函数返值是char或int型,系统自动按int型处理被调用函数定义出现在主调函数之前有些系统(如Borland C+)要求函数说明指出函数返值类型和形参类型,并且对void 和 int 型

7、函数也要进行函数说明例 函数说明举例main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);int型函数可不作函数说明(Borland C+不行)/*ch7_5.c*/float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(su

8、m is %f,c);被调函数出现在主调函数之前,不必函数说明/*ch7_5.c*/main() float add(float,float); /*function declaration*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);float add();8.5 函数参数及其传递方式形参与实参形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式c=max(a,

9、b);(main 函数)(max 函数)max(int x, int y) int z; z=xy?x:y; return(z); 例 比较两个数并输出大者main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);max(int x, int y) int z; z=xy?x:y; return(z);形参实参说明:实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放8.5 函数

10、参数及其传递方式形参与实参形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式例 计算x的立方#include float cube(float x) return(x*x*x);main() float a, product; printf(Please input value of a:); scanf(%f,&a); product=cube(a); printf(”Cube of %.4f is %.4fn,a,product);xaproduct1.21.21.728参数传递方式值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;

11、调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递711x:y:调用前:调用结束:711x:y:例 交换两个数/*ch7_2.c*/#include main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;调用:711a:b:711x:y:swap:711x:y:117a:b:temp地址传递方式:函数调用时,将数据

12、的存储地址作为参数传递给形参特点:形参与实参占用同样的存储单元“双向”传递实参和形参必须是地址常量或变量/*ch9_3.c*/swap(p1,p2)int *p1,*p2; int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; scanf(%d,%d,&a,&b); printf(“a=%d,b=%dn”,a,b); printf(“swapped:n”); swap(&a,&b); printf(”a=%d,b=%dn,a,b);例 交换两个数a59b调前:a59b调swap:p1&a&bp2a95b交换:p1&a&bp2a95b返回:8.6 函数的嵌套与

13、递归调用嵌套调用C规定:函数定义不可嵌套,但可以嵌套调用函数main( )调用函数a结束a函数b函数调用函数b#include long sum(int a, int b); long factorial(int n);main() int n1,n2; long a; scanf(%d,%d,&n1,&n2); a=sum(n1,n2); printf(a=%1d,a); long sum(int a,int b) long c1,c2; c1=factorial(a); c2=factorial(b); return(c1+c2); long factorial(int n) long r

14、tn=1; int i; for(i=1;i=n;i+) rtn*=i; return(rtn); long sum(int a, int b);long factorial(int n);文件包含编译预处理命令函数类型说明函数定义函数调用函数调用函数返回值形参实参例 求三个数中最大数和最小数的差值#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b

15、,c); printf(Max-Min=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(rb?a:b; return(c);main() int a=8; printf(max=%d,max(a,b);例 外部变量与局部变量运行结果:max=8动态变量与静态变量存储方式静态存储:程序运行期间分配

16、固定存储空间动态存储:程序运行期间根据需要动态分配存储空间程序区静态存储区动态存储区全局变量、局部静态变量形参变量局部动态变量(auto register)函数调用现场保护和返回地址等生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束变量存储类型静态动态存储方式程序整个运行期间函数调用开始至结束生存期编译时赋初值,只赋一次每次函数调用时赋初值自动赋初值0或空字符不确定未赋初值静态存储区动态区存储区寄存器局部变量外部变量作用域定义变量的函数或复合语句内本文件其它文件u局部变量默认为auto型uregister型变量个数受限,且不能为long, doub

17、le, float型u局部static变量具有全局寿命和局部可见性u局部static变量具有可继承性uextern不是变量定义,可扩展外部变量作用域register局部staticauto外部static外部存储类别第九章 编译预处理作用:对源程序编译之前做一些处理,生成扩展C源程序种类宏定义 #define文件包含 #include条件编译 #if-#else-#endif等格式:“#”开头占单独书写行语句尾不加分号如 if(x=YES) printf(“correct!n”); else if (x=NO) printf(“error!n”);展开后: if(x=1) printf(“co

18、rrect!n”); else if (x=0) printf(“error!n”);9.1 宏定义不带参数宏定义一般形式: #define 宏名 宏体功能:用指定标识符(宏名)代替字符序列(宏体)宏展开:预编译时,用宏体替换宏名-不作语法检查如 #define YES 1 #define NO 0 #define PI 3.1415926 #define OUT printf(“Hello,World”);宏体可缺省,表示宏名定义过或取消宏体定义位置:任意(一般在函数外面)作用域:从定义命令到文件结束#undef可终止宏名作用域 格式: #undef 宏名例 #define YES 1 ma

19、in() . #undef YES #define YES 0 max() . YES原作用域YES新作用域( )( )9.2 文件包含功能:一个源文件可将另一个源文件的内容全部包含进来一般形式: #include “文件名” 或 #include #include “file2.c”file1.cfile2.cfile1.cfile2.cABA处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译 直接按标准目录搜索“” 先在当前目录搜索,再搜索标准目录可指定路径被包含文件内容源文件(*.c)头文件(*.h)宏定义数据结构定义函数说明等文件包含可嵌套#i

20、nclude “file2.c”file1.cAfile3.cC#include “file3.c”file2.c Bfile1.cAfile3.cfile2.c第十一章 结构体与共用体11.1 概述结构体 (structure) 不同类型的数据组合成一个有机的整体定义结构体类型 一般形式: struct 结构体名 成员表列 ; 其中: struct 为关键字,表示是一个 “结构体类型 ” 结构体名: 同标识符规则一样。 成员表列: 组成结构体的各成员项。例:例: struct student int num; char name20; char sex; int age; float sco

21、re; char addr30; ; numnamesexage scoreaddr 10010Li Fun M 18 87.5 Beijing 11.2 定义结构体类型变量的方法定义结构体类型变量的方法一一一一. . 先定义结构体类型再定义变量名先定义结构体类型再定义变量名先定义结构体类型再定义变量名先定义结构体类型再定义变量名 structstruct student student1,student2; student student1,student2; 表示表示表示表示: student1,student2: student1,student2为为为为structstruct stu

22、dent student类型变量类型变量类型变量类型变量。 注意:注意:注意:注意:定义结构体变量之前必须先定义结构体类型定义结构体变量之前必须先定义结构体类型定义结构体变量之前必须先定义结构体类型定义结构体变量之前必须先定义结构体类型。二二二二. . 在定义类型的同时定义变量在定义类型的同时定义变量在定义类型的同时定义变量在定义类型的同时定义变量例如例如例如例如: : structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; floa

23、t score; float score; char addr30; char addr30; student1,student2; student1,student2;三三三三. . 直接定义结构类型变量直接定义结构类型变量直接定义结构类型变量直接定义结构类型变量 structstruct 成员表列成员表列成员表列成员表列 变量名表列变量名表列变量名表列变量名表列; ; 例例例例: : structstruct intint num; num; char name20; char name20; char sex; char sex; intint age; age; float score

24、; float score; char addr30; char addr30; student1,student2; student1,student2;几点说明几点说明几点说明几点说明: : 1. 1. 只能对只能对只能对只能对结构体类型变量结构体类型变量结构体类型变量结构体类型变量赋值,存取,运算等。赋值,存取,运算等。赋值,存取,运算等。赋值,存取,运算等。而不能对而不能对而不能对而不能对结构体类型结构体类型结构体类型结构体类型赋值,存取,运算等;赋值,存取,运算等;赋值,存取,运算等;赋值,存取,运算等; 2. 2. 结构体中的结构体中的结构体中的结构体中的成员成员成员成员如同普通变

25、量一样,可以单独如同普通变量一样,可以单独如同普通变量一样,可以单独如同普通变量一样,可以单独使用;使用;使用;使用; 3. 3. 结构体类型中的结构体类型中的结构体类型中的结构体类型中的成员名可以与普通变量名相同成员名可以与普通变量名相同成员名可以与普通变量名相同成员名可以与普通变量名相同。但二者是彼此独立的但二者是彼此独立的但二者是彼此独立的但二者是彼此独立的, ,互不干扰互不干扰互不干扰互不干扰;4. 4. 结构体的成员可以又是一个结构体变量结构体的成员可以又是一个结构体变量结构体的成员可以又是一个结构体变量结构体的成员可以又是一个结构体变量 例如例如例如例如: : structstru

26、ct date date intint month; month; intint day; day; intint year; year; ; ; structstruct student student intint num; num; char name20; char name20; char sex; char sex; intint age; age; structstruct date birthday; date birthday; char addr30; char addr30; student1,student2; student1,student2;birthdaymon

27、th day year11.3 结构体类型变量的引用结构体类型变量的引用 先定义后使用先定义后使用先定义后使用先定义后使用 规则如下规则如下规则如下规则如下: : 1. 1. 引用方式引用方式引用方式引用方式: : 结构体变量名结构体变量名结构体变量名结构体变量名 . . 成员名成员名成员名成员名 “ “ . . ” ” :成员:成员:成员:成员 ( ( 分量分量分量分量 ) ) 运算符,优先级为运算符,优先级为运算符,优先级为运算符,优先级为1 1 例例例例: : student1.num, student1.addrstudent1.num, student1.addr注意注意注意注意:

28、: (1)(1) 不能将一个不能将一个不能将一个不能将一个结构体变量结构体变量结构体变量结构体变量作为一个作为一个作为一个作为一个整体整体整体整体进行输进行输进行输进行输入,输出等。而只能对入,输出等。而只能对入,输出等。而只能对入,输出等。而只能对结构体变量成员分别结构体变量成员分别结构体变量成员分别结构体变量成员分别进行输入进行输入进行输入进行输入, , 输出,赋值等输出,赋值等输出,赋值等输出,赋值等. . printfprintf (“%d,%s,%c,%d,%f,%sn”,student1); (“%d,%s,%c,%d,%f,%sn”,student1); 不合法不合法不合法不合法

29、 printfprintf (“%sn”, student1.name); (“%sn”, student1.name); 合法合法合法合法 student1 . num = 10010;student1 . num = 10010; 合法合法合法合法 (2)(2) 新标准新标准新标准新标准C C中中中中, ,可以将一个结构体变量直接赋可以将一个结构体变量直接赋可以将一个结构体变量直接赋可以将一个结构体变量直接赋给另一个具有给另一个具有给另一个具有给另一个具有相同结构的相同结构的相同结构的相同结构的结构体变量结构体变量结构体变量结构体变量. . 如如如如: : student1=student

30、2;student1=student2;2. 2. 如成员本身又属一个结构体类型。则只能对如成员本身又属一个结构体类型。则只能对如成员本身又属一个结构体类型。则只能对如成员本身又属一个结构体类型。则只能对最低最低最低最低级成员级成员级成员级成员进行赋值进行赋值进行赋值进行赋值, , 存取和运算等。存取和运算等。存取和运算等。存取和运算等。 例例例例: : student1.birthday.monthstudent1.birthday.month 不能用不能用不能用不能用student1.birthdaystudent1.birthday来访问来访问来访问来访问student1 student

31、1 中中中中的成的成的成的成员员员员birthdaybirthday。3. 3. 对结构体变量中的成员可以象普通变量一样进行各对结构体变量中的成员可以象普通变量一样进行各对结构体变量中的成员可以象普通变量一样进行各对结构体变量中的成员可以象普通变量一样进行各种运算。种运算。种运算。种运算。 例例例例: : student2.score=student1.score;student2.score=student1.score; student1.age+; student1.age+;4. 4. 允许使用成员和结构体变量的地址。允许使用成员和结构体变量的地址。允许使用成员和结构体变量的地址。允许

32、使用成员和结构体变量的地址。 例:例:例:例:scanf(“%d”,&student1.num);scanf(“%d”,&student1.num); 11.6 指向结构体类型数据的指针指向结构体类型数据的指针一一一一. . 指向结构体变量的指针指向结构体变量的指针指向结构体变量的指针指向结构体变量的指针 结构体变量的指针就是结构体变量的指针就是结构体变量的指针就是结构体变量的指针就是结构体变量所占内存段的结构体变量所占内存段的结构体变量所占内存段的结构体变量所占内存段的起始地址起始地址起始地址起始地址。存放该地址的变量叫做指向结构体变量。存放该地址的变量叫做指向结构体变量。存放该地址的变量叫

33、做指向结构体变量。存放该地址的变量叫做指向结构体变量的指针变量,简称指向结构体变量的指针。的指针变量,简称指向结构体变量的指针。的指针变量,简称指向结构体变量的指针。的指针变量,简称指向结构体变量的指针。例例例例 11.311.3 main ( )main ( ) structstruct student student long long intint num; num; char name20; char name20; char sex; char sex; float score; float score; ; ; structstruct student stu1; student

34、stu1; structstruct student student * *p;p; p=&stu1;p=&stu1; stu1.num=89101; stu1.num=89101; strcpy(stu1.name,“Li Lin”); strcpy(stu1.name,“Li Lin”); stu1.sex=M; stu1.sex=M; stu1.score=89.5 ; stu1.score=89.5 ; printf(“No.:%ldnprintf(“No.:%ldn name:%sn sex:%cn score:%fn”, name:%sn sex:%cn score:%fn”, s

35、tu1.num,stu1.name,stu1.sex,stu1.score); stu1.num,stu1.name,stu1.sex,stu1.score); printf(“nprintf(“n No.:%ldn name:%sn No.:%ldn name:%sn sex:%cnscore:%fnsex:%cnscore:%fn”, ”, ( (* *p).nump).num, ,( (* *p).namep).name, ,( (* *p).sexp).sex, ,( (* *p).scorep).score); ); 89101“ Li Lin ” M 89.5 p stu_1运行结

36、果运行结果运行结果运行结果: :No.: 89101No.: 89101name : Li Lin name : Li Lin sex : M sex : M score : 89.500000score : 89.500000说明说明说明说明: : 1. 1. 程序中程序中程序中程序中*p p表示表示表示表示 p p 指向的结构体变量。指向的结构体变量。指向的结构体变量。指向的结构体变量。( (*p).nump).num 表示表示表示表示p p指向的结构体变量中的成员指向的结构体变量中的成员指向的结构体变量中的成员指向的结构体变量中的成员numnum。 2. 2. ( (*p).nump).

37、num等效于等效于等效于等效于pnumpnum。 表示指向结构体表示指向结构体表示指向结构体表示指向结构体成员运算符。成员运算符。成员运算符。成员运算符。 3. 3. 结构体变量中成员的引用有三种形式结构体变量中成员的引用有三种形式结构体变量中成员的引用有三种形式结构体变量中成员的引用有三种形式: : (1) (1) 结构体变量结构体变量结构体变量结构体变量. .成员名成员名成员名成员名; ; (2) (2) ( (*p).p).成员名成员名成员名成员名; ; (3) (3) pp成员名成员名成员名成员名; ;注意注意注意注意: : pnpn 表示表示表示表示p p指向的结构体变量中的指向的结

38、构体变量中的指向的结构体变量中的指向的结构体变量中的成员成员成员成员n n的的的的 值值值值。 pn+pn+ 表示表示表示表示p p指向的结构体变量中的指向的结构体变量中的指向的结构体变量中的指向的结构体变量中的成员成员成员成员n n的的的的 值值值值。用完该值后使其加。用完该值后使其加。用完该值后使其加。用完该值后使其加 1 1。 +pn+pn 表示使表示使表示使表示使p p指向的结构体变量中的指向的结构体变量中的指向的结构体变量中的指向的结构体变量中的成员成员成员成员 n n的值加的值加的值加的值加1 1。( ( 先加先加先加先加 ) ) 二二二二. . 指向结构体数组的指针指向结构体数组

39、的指针指向结构体数组的指针指向结构体数组的指针例例例例 11.4 11.4 structstruct student student intint num; num; char name20 ; char name20 ; char sex ; char sex ; intint age ; age ; ; ; structstruct student stu3=10101,“Li Lin”,M,18,10102,“Zhang Fun”, student stu3=10101,“Li Lin”,M,18,10102,“Zhang Fun”, M,19,10104,“Wang Min”,F,20

40、; M,19,10104,“Wang Min”,F,20; main( ) main( ) structstruct student student * *p ;p ; printfprintf(“ No Name sex age n ” ) ;(“ No Name sex age n ” ) ; for(p= for(p=stu;pstu;pstu+3;p+)num,pname,psex,page);num,pname,psex,page); 运行结果运行结果运行结果运行结果: : No Name sex age No Name sex age 10101 Li Lin M 18 10101

41、 Li Lin M 18 10102 Zhang Fun M 19 10102 Zhang Fun M 19 10104 Wang Min F 20 10104 Wang Min F 20stu0stu0stu1stu1stu2stu2 4 4项项项项 4 4项项项项 4 4项项项项p pp+1p+1p+2p+2 注意注意注意注意: : 指向结构体数组的指针指向结构体数组的指针指向结构体数组的指针指向结构体数组的指针p p加加加加1 1的含义的含义的含义的含义。例。例。例。例: : (+(+p)nump)num 和和和和 (p+)num(p+)num例例例例 1 11 1.5 .5 #defi

42、ne FORMAT “%dn%sn%fn%fn%f n” struct student int num; char name20; float score3; ; main( ) void print( ); struct student stu; stu.num=12345; strcpy(stu.name,“ Li Li”); stu.score0=67.5; stu.score1=89; stu.score2=78.6; print(&stu); void print(p) struct student *p; printf(FORMAT,pnum,pname,pscore0,pscor

43、e1,pscore2); printf(“n”); 说明说明说明说明: : 1. 1. 程序中各成员的赋值可用程序中各成员的赋值可用程序中各成员的赋值可用程序中各成员的赋值可用scanfscanf函数。函数。函数。函数。 scanf(“%d%s%f%f%f”,&stu.num,scanf(“%d%s%f%f%f”,&stu.num,stu.namestu.name,&stu.score0,&stu.score0, &stu.score1,&stu.score2); &stu.score1,&stu.score2);11.7 链表 采用链式存储结构的链表是用一组任意的存储单元来存放线性表的数据元

44、素,这组存储单元既可以是连续的,也可以是不连续的,甚至可以是零散分布在内存中的任何位置上。1、单向链表 单向链表是链式存储结构中最简单和最基本的结构. 在链表中数据元素的逻辑次序与物理存储次序不一定相同,为了能正确表示数据元素间的逻辑关系,在存储每个元素值的同时,还必须存储其直接后继(或直接前趋)的存储位置,这一部分称为链。因此,单向链表的每个数据元素由两部分组成:存储元素的数据域(DATE)和存储直接后继元素存储地址的指针域(NEXT)。其结构如下:datanext一个线形表a1,a2,.,an 对应的单链表可用下图表示。 h链表的头指针:用以确定线形表中第一个元素对应的存储位置,单链表可以

45、用头指针的名字来命名。 链表的终点元素无直接后继,故其指针域为空NIL,在图中用表示 。a1ha2a3an 带头结点的单链表为空时。其逻辑示意如下图所示.显然,带头结点的单链表把空表和非空表的处理统一起来了,对单链表初始化,就是建立一个空的单链表.h 为为为为了了了了算算算算法法法法实实实实现现现现上上上上的的的的方方方方便便便便, , , ,通通通通常常常常在在在在单单单单链链链链表表表表的的的的第第第第一一一一元元元元素之前附加一个称为素之前附加一个称为素之前附加一个称为素之前附加一个称为头结点头结点头结点头结点的元素。的元素。的元素。的元素。 头头头头结结结结点点点点的的的的数数数数据据

46、据据域域域域可可可可以以以以不不不不存存存存任任任任何何何何数数数数据据据据, , , ,也也也也可可可可以以以以存存存存放放放放象象象象线线线线形形形形表表表表的的的的表表表表长长长长的的的的数数数数据据据据信信信信息息息息。如如如如图图图图所所所所示示示示, , , ,单单单单链链链链表表表表的的的的头头头头指针指向头的结点。指针指向头的结点。指针指向头的结点。指针指向头的结点。ha1a2an(1)链表的访问【算法3】访问单链表的算法elemtype access (node *h,int i) node *p;int j;p=h;j=0;WHILE(p-next!=NULL&jnext;

47、j+;if(p!=NULL&j=i)return(p-data);elsereturn(NIL);(2)单链表的插入运算 设有线性表a1,a2,an,用带头结点的单链表存储,现要求在数据元素ai的结点之前插入一个数据元素为x的结点。首先应找到数据元素ai-1结点 ,以便打开ai-1与ai的两数据元素之间的链:然后申请一个新的结点空间,放上数据值x 。最后,重新建立ai-1与x 、 x与ai两两数据元素之间的链,构成新的链表。算法示意图如图所示: hai-1anaix【算法3】单链表的插入算法void insertsl(node *h,int i) node *p,*t; int j; p=h;

48、j=0; while(p!=NULL&jnext; j+; if(j!=i-1) printf(“i is invalid”); return; t=(node *)malloc(sizeof(node); t-data=x; t-next=p-next; p-next=t;ai-1aix(3)单链表的删除运算 删除操作和插入操作一样,首先要搜索单链表以找到指定删除结点的前趋结点(假设为P),然后将待删除结点的指针域内容赋予P结点的指针域,最后释放删除结点所占的存储空间。hai-1anai+1aihai-1anai+1aipps【算法5】单链表的删除算法void deletesl(node *

49、h,int i) node *p,*s; int j; p=h;j=0; while(p-next!=NULL&jnext; j+; if(j!=i-1) printf(“ i is invalid”); return; s=p-next; p-next=s-next; free(s);(4)单链表的建立 为建立链表,首先要为每个数据元素动态申请一个结点空间,然后通过指针将这些结点依次相连。链表是一种动态存储结构,每个结点所需的存储空间是在程序执行时动态申请的。利用前面已介绍过的链表插入新的结点的算法,不难得到创新链表的算法:首先建立一个空链表,然后不断向链表中插入新的数据元素,形成各结点。

50、根据插入新结点的位置不同,可以形成两种创建新链表的方法:一是每插入的新结点作为链表的第一结点,此时,建立链表是从表的最后一个元素开始,从后向前依次插入结点的:二是每插入的结点是当前链表的做末结点,此时,建立链表是从表的第一个元素开始,从前向后依次插入结点的 。 11.8 共用体共用体一一一一. . 共用体的概念共用体的概念共用体的概念共用体的概念 “ “共用体共用体共用体共用体” ”类型结构类型结构类型结构类型结构:几个不同的变量共占同一段内存的结构几个不同的变量共占同一段内存的结构几个不同的变量共占同一段内存的结构几个不同的变量共占同一段内存的结构 “ “共用体共用体共用体共用体” ”类型变

51、量的定义类型变量的定义类型变量的定义类型变量的定义 union union 共用体名共用体名共用体名共用体名 成员表列成员表列成员表列成员表列 变量表列变量表列变量表列变量表列; ; 例如例如例如例如: : union data union data intint i; i; char char chch; ; float f; float f; a,b,c; a,b,c;整整整整型型型型变变变变量量量量 i i实实实实型型型型变变变变量量量量f f起起起起始始始始地地地地址址址址字字字字符符符符型型型型变变变变量量量量chch 也可也可也可也可: : union data union dat

52、a intint i; i; char char chch; ; float f; float f; ; ; union data a,b,c; union data a,b,c; union union intint i; i; char char chch ; ; float f; float f; a,b,c; a,b,c;结构体变量结构体变量结构体变量结构体变量所占内存的长度是所占内存的长度是所占内存的长度是所占内存的长度是各成员占的内存长度之各成员占的内存长度之各成员占的内存长度之各成员占的内存长度之和和和和,且每个成员分别占有其自己的内存单元。,且每个成员分别占有其自己的内存单元。

53、,且每个成员分别占有其自己的内存单元。,且每个成员分别占有其自己的内存单元。共用体变量共用体变量共用体变量共用体变量所占的内存长度等于所占的内存长度等于所占的内存长度等于所占的内存长度等于最长的成员的长度最长的成员的长度最长的成员的长度最长的成员的长度。二二二二. . 共用体变量的引用方式共用体变量的引用方式共用体变量的引用方式共用体变量的引用方式 规则规则规则规则: : 先定义,后使用,先定义,后使用,先定义,后使用,先定义,后使用,且只能引用共用体变量中且只能引用共用体变量中且只能引用共用体变量中且只能引用共用体变量中的成员的成员的成员的成员。 如如如如: a.i : a.i ,a.cha

54、.ch ,a.f a.f 等等等等等等等等. . 而而而而: : printfprintf (“%d”,a); (“%d”,a); ( ( 不合法不合法不合法不合法 ) )三三三三. . 共用体类型数据的特点共用体类型数据的特点共用体类型数据的特点共用体类型数据的特点 1. 1. 并非所有成员都同时存在和起作用并非所有成员都同时存在和起作用并非所有成员都同时存在和起作用并非所有成员都同时存在和起作用. .即即即即: :每一瞬时只有每一瞬时只有每一瞬时只有每一瞬时只有 一个成员起作用一个成员起作用一个成员起作用一个成员起作用。 2. 2. 共用体变量中起作用的成员是共用体变量中起作用的成员是共用

55、体变量中起作用的成员是共用体变量中起作用的成员是最后一次存放的成员最后一次存放的成员最后一次存放的成员最后一次存放的成员。 例如例如例如例如: : union dataunion data intint i; i; char char chch; ; float f; float f; a; a; a.i=1;a.ch=a;a.f=1.5; a.i=1;a.ch=a;a.f=1.5; 则只有则只有则只有则只有a.fa.f 有效,而此时有效,而此时有效,而此时有效,而此时a.ia.i和和和和a.cha.ch已无意义。已无意义。已无意义。已无意义。 但若存在相同数据类型的成员但若存在相同数据类型的

56、成员但若存在相同数据类型的成员但若存在相同数据类型的成员, ,则该成员就有意义则该成员就有意义则该成员就有意义则该成员就有意义. . 如如如如: :main ( ) main ( ) union data union data intint i; i; char char chch; ; float f; float f; float x; float x; a; a; a.i=1;a.ch=a; a.i=1;a.ch=a;a.f=1.5a.f=1.5; ; printf(“%f,%fprintf(“%f,%f n”,a.f, n”,a.f,a.xa.x); ); 输出为输出为输出为输出为:

57、1.5 , 1.5: 1.5 , 1.5 a.cha.cha.ia.ia.f a.x3. 3. 共用体变量的地址和它的各成员的地址都是同一地共用体变量的地址和它的各成员的地址都是同一地共用体变量的地址和它的各成员的地址都是同一地共用体变量的地址和它的各成员的地址都是同一地址址址址. .4. 4. 不能对共用体变量名赋值不能对共用体变量名赋值不能对共用体变量名赋值不能对共用体变量名赋值, ,也不能在定义是对其初也不能在定义是对其初也不能在定义是对其初也不能在定义是对其初始化始化始化始化。 union dataunion data intint i; i; char char chch; ; fl

58、oat f; float f; a= 1, a, 1.5 ;a= 1, a, 1.5 ; ( ( 不合法不合法不合法不合法 ) )5. 5. 共用体变量共用体变量共用体变量共用体变量不能不能不能不能作函数参数,但指向共用体变量的作函数参数,但指向共用体变量的作函数参数,但指向共用体变量的作函数参数,但指向共用体变量的指针则指针则指针则指针则可以可以可以可以。union data union data structstruct st st intint a; a; intint b; b; x; x; intint y; y; intint z; z; maxmax; ;structstruct

59、 st st union data union data intint a; a; char b; char b; x; x; intint y; y; float z; float z; minmin; ;6. 6. 结构体类型和共用体类型可以相互嵌套结构体类型和共用体类型可以相互嵌套结构体类型和共用体类型可以相互嵌套结构体类型和共用体类型可以相互嵌套。 如如如如: :补充例题补充例题补充例题补充例题: : 以下程序的输出为以下程序的输出为以下程序的输出为以下程序的输出为: : # include “stdio.h” main ( ) union data struct st int x;

60、int y; m; int a ; int b ; e; e.a=1; e.b=2; e.m.x=e.a*e.b; e.m.y=e.a+e.b; printf(“n%d,%d”,e.m.x,e.m.y); printf(“n%d,%d”,e.a,e.b); e.m.xe.m.y起始地址起始地址起始地址起始地址4 , 84 , 84 , 44 , 4e.ae.b第10章 文件操作目 录文件概述文件类型指针文件的打开和关闭文件的读写文件的定位文件 (File)C语言中的文件C语言把文件看作一个字节的序列C语言对文件的存取是以字节为单位的文本文件(ASCII文件)按数据的ASCII形式存储二进制文件

61、按数据在内存中的二进制形式存储文本文件和二进制文件缓冲文件系统文件类型指针FILE类型保存被使用的文件的有关信息所有的文件操作都需要FILE类型的指针FILE是库文件中定义的结构体的别名注意不要写成struct FILE举例FILE *fp;FILE类型typedef struct short level; /*缓冲区满空程度*/ unsigned flags; /*文件状态标志*/ char fd; /*文件描述符*/ unsigned char hold; /*无缓冲则不读取字符*/ short bsize; /*缓冲区大小*/ unsigned char *buffer; /*数据缓冲区

62、*/ unsigned char *curp; /*当前位置指针*/ unsigned istemp; /*临时文件指示器*/ short token; /*用于有效性检查*/ FILE;文件的打开 (fopen函数)函数原型FILE *fopen(char *filename, char *mode);参数说明filename:要打开的文件路径mode :打开模式返回值若成功,返回指向被打开文件的指针若出错,返回空指针NULL(0)文件的打开模式打开模式描 述r只读,打开已有文件,不能写w只写,创建或打开,覆盖已有文件a追加,创建或打开,在已有文件末尾追加r+读写,打开已有文件w+读写,创建

63、或打开,覆盖已有文件a+读写,创建或打开,在已有文件末尾追加t按文本方式打开 (缺省)b按二进制方式打开文件的打开举例FILE *fp1, *fp2, *fp3;char filename=file3.dat;/* 以文本只读方式打开file1 */if (!(fp1=fopen(file1, r) printf(Cannot Open This File!n); exit(0); /* 退出程序 */ /* 以二进制读写方式打开FILE2.TXT */fp2=fopen(C:HOMEFILE2.TXT, rb+);/* 以二进制读写方式打开file3.dat */fp3=fopen(file

64、name, a+b);文件的关闭 (fclose函数)函数原型int fclose(FILE *fp);参数说明fp:要关闭的文件指针返回值若成功,返回0若出错,返回EOF(-1)不用的文件应关闭,防止数据破坏丢失文件的关闭举例FILE *fp;char file=D:USERSTUDENTS.DAT;if (!(fp=fopen(file, rb+) printf(Open file %s error!n, file); exit(0); . .fclose(fp);文件的读写函数功能函数功能fputc输出字符fprintf格式化输出fgetc输入字符fscanf格式化输入putc输出字符p

65、utw输出一个字getc输入字符getw输入一个字fwrite输出数据块fputs输出字符串fread输入数据块fgets输入字符串feof函数函数原型int feof(FILE *fp);参数fp:文件指针返回值若文件结束,返回非零值若文件尚未结束,返回0fputc/putc函数函数原型int fputc(int c, FILE *fp);int putc(int c, FILE *fp);参数c :要输出到文件的字符fp:文件指针返回值若成功,返回输出的字符若失败,返回EOFfgetc/getc函数函数原型int fgetc(FILE *fp);int getc(FILE *fp);参数f

66、p:文件指针返回值若成功,返回输入的字符若失败或文件结束,返回EOFfputc和fgetc函数举例FILE *fp1, *fp2;char c;fp1 = fopen(file.in, r);fp2 = fopen(file.out, w);while(!feof(fp1) c = fgetc(fp1); fputc(c, fp2); fclose(fp1);fclose(fp2);fwrite和fread函数 (1)函数原型size_t fwrite(void *buffer, size_t size, size_t count, FILE *fp);size_t fread (void *

67、buffer, size_t size, size_t count, FILE *fp);fwrite和fread函数 (2)参数buffer:要读/写的数据块地址size :要读/写的每个数据项的字节数count :要读/写的数据项数量fp :文件指针返回值若成功,返回实际读/写的数据项数量若失败,一般返回0fwrite和fread函数举例FILE *fp;int i;struct stud sNUM;fp=fopen(students.dat,rb+);for (i=0; iNUM; i+) fwrite(s+i,sizeof(struct stud),1,fp);for (i=0; iN

68、UM; i+) fread(s+i,sizeof(struct stud),1,fp);fclose(fp);fprintf和fscanf函数函数原型int fscanf(FILE *fp, char *format,address,.);int fprintf(FILE *fp, char *format,argument,.);说明与printf和scanf函数类似从文件输入或输出到文件putw函数函数原型int putw(int w, FILE *fp);参数w :要输出到文件的整数(字)fp:文件指针返回值若成功,返回输出的整数(字)若失败,返回EOFgetw函数函数原型int get

69、w(FILE *fp);参数fp:文件指针返回值若成功,返回输入的整数(字)若失败,返回EOFfputs函数函数原型int fputs(char *s, FILE *fp);返回值若成功,返回输出字符个数(或最后的字符)若失败,返回EOF说明字符串的结束标志0不会输出到文件也不会在字符串末尾自动添加换行符fgets函数函数原型char *fgets(char *s, int n, FILE *fp);返回值若成功,返回s首地址;若失败,返回NULL说明从fp输入字符串到s中输入n-1个字符,或遇到换行符或EOF为止读完后自动在字符串末尾添加0文件的定位文件位置指针位置指针指向当前读写的位置每次

70、读写文件,位置指针都会相应移动可以通过相关函数强制修改位置指针相关函数rewind函数fseek函数ftell函数rewind函数函数原型void rewind(FILE *fp);参数fp:文件指针功能使文件位置指针重新返回文件开头fseek函数 (1)函数原型int fseek(FILE *fp, long offset, int whence);参数fp :文件指针offset:偏移量whence:起始位置功能随机改变文件的位置指针fseek函数 (2)起始位置SEEK_SET(0):文件开始SEEK_CUR(1):文件当前位置SEEK_END(2):文件末尾举例fseek(fp, 100L, SEEK_SET);fseek(fp, -10L, SEEK_CUR);fseek(fp, -20L, SEEK_END);ftell函数函数原型long ftell(FILE *fp);参数fp:文件指针返回值若成功,返回当前文件指针位置若出错,返回-1L结束The End

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号