函数与模块化程序设计学习总结

时间:2021-04-15 22:25:01

本周学习了函数的声明定义和调用

函数的嵌套调用

全局变量和局部变量

在函数内部的调试

变量的存储类别

C语言的库函数

静态函数与外部函数

外部全局变量与静态全局变量。

 

 

函数的声明定义和调用学习总结:

自定义函数先声明,后调用

若先调用后定义:调用前声明

 

函数的嵌套调用:函数内调用函数

函数与模块化程序设计学习总结函数与模块化程序设计学习总结

函数与模块化程序设计学习总结

 求方程f(x)=x3-5x2+16x-80=0的根的程序  #include<stdio.h>
#include<math.h>
double f(double);
double xpoint(double,double);
double root(double,double);
int main()
{
double x1,x2,f1,f2,x;
do
{
printf("inputx1,x2:");
scanf("%lf%lf",&x1,&x2);
f1=f(x1);
f2=f(x2);
}
while(f1*f2>=0);
x=root(x1,x2);
printf("Arootis%.5f\n",x);
return0;
}
double root(double x1,double x2)
{
double x,y,y1;
y1=f(x1);
do
{
x=xpoint(x1,x2);
y=f(x);
if(y*y1>0)
{
y1=y;
x1=x;
}
else
x2=x;
}
while(fabs(y)>=0.00001);
return x;
}
double xpoint(doublex1,doublex2)
{
doublex;
x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return x;
}
doublef(doublex)
{
doubley;
y=x*x*x-5*x*x+16*x-80;
return y;
}

函数                                                              功能
intmain()                                                      主控,输入输出
doubleroot(doublex1,doublex2)                   求(x1,x2)区间方程的实根
doublexpoint(doublex1,doublex2)                求(x1,f(x1))和(x2,f(x2))的连线与x轴的交点x
doublef(doublex)                                          求函数f(x)=x3-5x2+16x-80的值

 

 

全局变量和局部变量总结

每一个变量都有其有效作用的范围,称为变量的作用域。
变量分类(按作用域):
局部变量(localvariable)
             在一个函数内部定义的变量只在本函数范围内有效
             在复合语句中定义的变量只在本复合语句范围内有效。
全局变量(globalvariable,也称全程变量)
              在函数之外定义的变量是外部变量,其有效范围为从定义变量的位置开始到
              本源文件结束
 

不同的函数及作用域中可以使用相同名字的局部变量,它们在内存中分属不同的存储区间,互不干扰。

全局变量作用范围:定义始至文件尾;全局变量与局部变量同名,则在局部变量的作用范围内,全局变量被屏蔽。

全局变量能增加函数间数据联系的渠道

全局变量会降低程序可读性

限制使用全局变量!

 

 

在函数内部的调试

 断点(breakpoint)
单步执行
                 每执行一步断一下,看到每一步到底干了些什么
                 方式:NextLine/StepInto/StepOut等
运行到光标
                  光标所在位置,实际就是一个“断点”
                  方式:RuntoCursor
设置断点
                    任意指定到哪儿断开,想在哪儿停下来,就在哪儿停
                    相比:单步太烦,运行到光标只能指定一个地方
    变量的存储类别 函数与模块化程序设计学习总结

四种存储类别
      自动的(auto)
      寄存器的(register)
      外部的(extern)
      静态的(static)

 

自动变量(autovariable)

int f(inta)
{
auto int b,c=3;//b和c为整型的自动变量
……

auto是局部变量默认的存储类别,例
①auto int b,c=3;
②int b,c=3;//两种写法效果相同
自动变量在定义时自动分配存储空间,在作用域结束时自动释放空间。

 

用register声明寄存器变量
int fac (intn)
{
//下面声明i和f是寄存器变量
registerinti,f=1;
for(i=1;i<=n;i++)f=f*i;
returnf;
}
在程序中定义寄存器变量对编译系统只是
建议性(而不是强制性)的。
优化编译系统能够识别使用频繁的变量,
自动地将这些变量放在寄存器中。

函数与模块化程序设计学习总结

 

用extern声明外部变量:一个文件内的全局变量
#include<stdio.h>
int max(int,int);
int main()
{
extern inta,b;//对全局变量a,b作提前引用声明
printf("%d\n",max(a,b));
return 0;
}
int a=15,b=-7;//定义全局变量a,b
int max(intx,inty)
{
int z;
z=x>y?x:y;
return z;
}

 

 

用static声明静态局部变量(staticlocalvariable)
int f(int a)
{
static intc=3;
……
}


性质:
          局部特性:作用范围仅限于本函数
          静态特性:存储在静态区,函数调用结束后不消失而保留原值,在下一次调用时,保留上一次调用结束时的值。

 

静态函数与外部函数

外部函数

max.c                                                             

 

extern int max(intx,inty)
{
intz;
z=x>y?x:y;
returnz;
}

外部函数
在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件调用。如果在定义函数时省略extern,则默认
为外部函数。

main.c

 

#include<stdio.h>
extern int max(int,int);
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",max(a,b));
return0;
}

在需要调用此函数的文件中,用extern

声明所用的函数是外部函数。

 

 

 

 

模块化程序设计中的“单独编译”
多文件的项目中,每个文件可以单独编译,形成各自独立的目标文件(.o或.obj)。
在编译中,遇到调用外部函数,编译器会假定这个函数的定义存在,只不过不在当前
文件中,产生目标文件。所以,若语法正确,编译器不对此函数产生标识符未定义的
错误。
在连接时,检查编译器得到的若干目标文件中的函数,以及包括的库文件内提供的函
数,如果命名唯一,产生可执行的目标文件(.exe);否则,连接失败。

函数与模块化程序设计学习总结

静态函数

max.c

 

static int max(int x,int y)
{
int z;
z=x>y?x:y;
return z;
}

如果一个函数只能被本文件中其他函数所调用,它称为内部函数,又称静态(static)函数。如果在不同的文件中有同名的内部函数,互不干扰。



main.c

 

#include<stdio.h>
int max(int,int);
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",max(a,b));
return0;
}

通常把只允许在同一文件中使用的函数和全局变量前面都冠以static使之局部化,从而其他文件都不能引用

外部全局变量和静态全局变量

 

 用extern拓展一个文件内的全局变量的作用范围
#include<stdio.h>
int max(int,int);
int main()
{
extern int a,b;//对全局变量a,b作提前引用声明
printf("%d\n",max(a,b));
return 0;
}
int a=15,b=-7;//定义全局变量a,b
int max(int x,int y)
{
int z;
z=x>y?x:y;
return z;
}
函数与模块化程序设计学习总结