对函数的进一步讨论资料讲解

上传人:yuzo****123 文档编号:140374596 上传时间:2020-07-29 格式:PPT 页数:38 大小:183.50KB
返回 下载 相关 举报
对函数的进一步讨论资料讲解_第1页
第1页 / 共38页
对函数的进一步讨论资料讲解_第2页
第2页 / 共38页
对函数的进一步讨论资料讲解_第3页
第3页 / 共38页
对函数的进一步讨论资料讲解_第4页
第4页 / 共38页
对函数的进一步讨论资料讲解_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《对函数的进一步讨论资料讲解》由会员分享,可在线阅读,更多相关《对函数的进一步讨论资料讲解(38页珍藏版)》请在金锄头文库上搜索。

1、第九章 对函数的进一步讨论,8.1 局部变量与全局变量,局部变量: 在函数的头部、内部声明的变量。局部变量具有私有性,其可访问区域在函数内部,其他函数不能访问它们。私有性使得不同函数可以使用相同名称,而不会引起冲突。 全局变量: 在函数外部声明的变量。全局变量具有公共性。它们可被程序中其后定义的函数访问。公共性使得不同函数可以共享同一个变量中的数据,从而达到数据传递的目的。 两种变量规定了变量名称的可访问区域,也称为变量的作用域。,#include #include #define EPSILON 1e-6 float disc,x1,x2,realpart,imagpart; void ro

2、ot1(double a,double b); void root2(double a,double b); void root3(double a,double b); void main() float a,b,c; scanf(%f%f%f, ,8.2 变量的存储属性,变量的作用域规定了变量名称的可访问区域。 变量的存储类别规定了在何时何处为变量分配存储空间,当变量初始化后,生存期是多长,哪些函数可以使用它。 C中有4种存储类别: 自动存储 寄存器存储 静态存储 外部存储,auto类别是使用内存最高效的方式,因此是局部变量的默认类型。 static存储属性的变量在程序开始执行时一次性分配

3、和初始化,其存在于整个程序运行期间。将一个局部变量声明为static 的目的用来记忆函数的信息和一次性初始化大量数据。 在由多个源文件组成的程序中,有些函数、全局变量需要限制在一个源文件中使用(内部函数、内部全局变量),有些函数、全局变量需要被其他源文件引用(外部函数、外部全局变量) ,可以通过static或extern关键字对这些函数和数据对象进行声明成内部的或外部的。,/* file1.*/ #include int A; int power(int); void main() int b3,c,d,m; scanf(%d, %d,i=;i+)y*A; return ; ,8.3 函数的存

4、储属性,函数的存储类别默认为extern。在调用其他源文件中定义的函数时,只需在调用文件中对函数进行声明。 例如,File2.c中定义了函数enter_string,#include void enter_string(char str) gets(str); ,单独编译,void delete_string(char str,char ch) int i,j; for(i=j=0;stri!=0;i+) if(stri!=ch) strj+=stri; stri=0; ,File3.c中定义了函数delete_string,#include void print_string(char st

5、r) puts(str); ,File4.c中定义了函数print_string,void enter_string(char str); void detele_string(char str,char ch); void print_string(char str); void main() char c; char str80; enter_string(str); detele_string(str,c); print_string(str); ,在File1.c中引用3个外部函数,只需对它们进行声明,单独编译,static void f(int n);/函数名f限制在本文件 void

6、 main ( ) f(m); void f(int n) ,file1.c,如果要将函数名的作用域限制在本文件,可以在函数声明的前面加static关键字,这种函数称为“内部函数”,static int A;/全局变量名A限制在本文件 void main ( ) ,file1.c,如果要将全局变量的作用域限制在本文件,可以在声明语句前加一个static关键字,这种全局变量称为“内部全局变量”,什么是编译预处理? 源程序在编译前由编译预处理器执行的命令,主要完成程序的文本处理以提高程序开发效率。#define、#include都是编译预处理命令。,8.4 编译预处理,8.4.1 宏定义命令#de

7、fine,语法:#define 宏标识符 字符串 例:#define PI 3.1415926 预处理程序将源程序中的宏标识符替换成字符串。,1 不带参数的宏定义,#define PI 3.1415926 void main() float r,area; scanf(f, ,main() printf(“L=%fnS=%fn”,2*3.1415926*3.0,3.1415926*3.0*3.0); ,预处理,编译,注意: 双引号内与宏名相同的字符串不进行置换,源程序,中间源程序,2 带参数的宏定义,一般形式: define 标识符(参数) 字符串 例如:#define POWER(X) X*

8、X*X #define AREA(r) PI*r*r 含义: POWER(X)=X*X*X AREA(r)=PI*r*r,宏替换的方法:先替换参数,然后再把宏展开 #define POWER(X) X*X*X POWER(3) 3*3*3,#define POWER(X) X*X*X main() printf(%dn, POWER(3); ,main() printf(“%dn”, 3*3*3); ,源程序,中间源程序,预处理,编译,宏定义:#define POWER(X) X*X*X 将POWER(i+1)替换成 i+1*i+1*i+1 宏定义:#define POWER(X)(X)*(X

9、)*(X) 将POWER(i+1)替换成 (i+1)*(i+1)*(i+1) 结论: 在定义带参数的宏时,常常需要将字符串中的参数加括号。,编程题(2)定义一个带参数的宏,实现求余数操作。 #define MOD(a,b) (a)%(b) void main() int a=2,b=3; printf(dn, MOD(11, 5) ); printf(dn, MOD(a, b) ); printf(dn, MOD(11+5, a+b) ); ,预处理,编译,#define MOD(a,b) (a)%(b) void main() int a=2,b=3; printf(dn,MOD(11,5)

10、 ); printf(dn,MOD(a,b) ); printf(dn,MOD(11+5,a+b) ); ,void main() int a=2,b=3; printf(dn,(11)%(5) ); printf(dn,(a)%(b) ); printf(dn,(11+5)%(a+b) ); ,源程序,中间源程序,编程题(1)定义带参数的宏,求两个数中较大数,#define MAX(x,y) (x)(y)?(x):(y) void main() int a,b,c; printf(“enter 3 number“); scanf(“%d%d%d”, printf(“enter 3 numbe

11、r“); scanf(“%d%d%d”, printf(“enter 3 number“); scanf(“%d%d%d”, ,8.4.2 文件包含命令#include,1、包含系统头文件,对所调用的库函数进行声明。 一般形式: #include “文件名” 或 #include “文件名”先在当前目录查找,若没有,再到系统指定的目录查找。 仅在系统指定的目录查找。,2、包含自己的头文件。头文件通常包含了模块之间的接口,即外部函数、全局常量的导入性指令。,/ scroe. #include “a.h”/自己的头文件 void aver_stu(float scoreN, float avest

12、u); void aver_cor(float scoreN, float avecor); void print_tab(float scoreN, float avestu, float avecor); void main() float scoreMN=91,79,83,81,52,62,71,83,92,98, ; float avestuM; float avecorM; aver_stu(score, avestu); aver_cor(score, avecor); print_tab(score, avestu, avecor); ,scroe.,a.h,scroe.,a.h

13、,源程序,中间源程序,预处理,编译,【综合练习】运行多文件的程序 已知10个学生5门课成绩,分别用函数实现下列功能: 计算每个学生5门课平均分aver_stu(); 计算每门课程10个学生平均分aver_cor(); 输出结果print_tab();,学号/课程12345平均 191.0079.0083.0081.0052.0077.2 262.0071.0083.0092.0098.0081.20 390.0070.0050.0060.0040.0062.00 478.0098.0087.0083.0067.0082.60 566.0077.0088.0055.0067.0070.60 69

14、1.0079.0083.0081.0052.0077.20 762.0071.0083.0092.0096.0081.20 890.0070.0050.0060.0040.0062.00 978.0098.0087.0083.0067.0082.60 1066.0077.0088.0055.0067.0070.60 平均 77.4079.0078.2074.2064.80,scoreMN数组,avestuM数组,avecorN,#include “a.h”/自己的头文件 void aver_stu(void); void aver_cor(void); void print_tab(void)

15、; float scoreMN=91,79,83,81,52,;/全局数组 float avestuM; /全局数组 float avecorN;/全局数组 void main() aver_stu(); aver_cor(); print_tab(void); ,方法1、利用全局数组传递数据:,#include “a.h” /自己的头文件 void aver_stu(float scoreN, float avestu); void aver_cor(float scoreN, float avecor); void print_tab(float scoreN, float avestu,

16、 float avecor); void main() float scoreMN=91,79,83,81,52,62,71,83,92,98, ; float avestuM; float avecorN; aver_stu(score, avestu); aver_cor(score, avecor); print_tab(score, avestu, avecor); ,方法2、利用数组参数传递数据:,创建源程序文件a.c,#include “a.h” void aver_stu(float scoreN, float avestu); void aver_cor(float scoreN, float avecor); void print_tab(float scoreN, float avestu, float avecor); void main() float s

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

最新文档


当前位置:首页 > 中学教育 > 教学课件 > 高中课件

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