6_1 函数的概述
函数是具有一定功能的一段程序,一个函数用来实现一个功能。
函数是程序的基本组成单元。
【例6-1】 函数调用的简单例子
#include
int main()
{
void printf_star();
void printf_message ();
printf_star();
printf_message ();
printf_star();
return 0;
}
void printf_star()
{
printf("**************************\n\n");
}
void printf_message ()
{
printf(" Hello world!\n\n");
}
(1)主函数main
(2)库函数
(3)用户自定义函数
①从用户使用角度看,函数可分为库函数(又称标准函数)和用户自定义函数两种。
②函数又分为有返回值和无反回值函数两种。
③从主调函数和被调函数之间数据传送的角度来看,又可分为有参函数和无参函数
6_2 函数定义的一般形式
_2.1 无参函数的定义
形式:类型名 函数名
{
函数体
} 如:
void hello()
{
printf (“Hello world!\n”)
}
_2.2 有参函数的定义
形式:类型名 函数名(形式参数表列)
{
函数体
}
int max (int a,int b)
{
if (a>b) return a;
else return b;
}
_2.3 空函数
形式:类型名 函数名()
6_3 函数的参数与函数的值
_3.1 形式参数和实际参数
【例6-2】从键盘输入两个整数,要求用函数求出较大者,然后输出。
#include
int main()
{
int max(int a,int b);
int x,y,z;
printf("Please input two numbers:");
scanf("%d,%d",&x,&y);
z=max(x,y);
printf("maxnum=%d\n",z);
return 0;
}
int max(int a,int b)
{
int c;
c=a>b?a:b;
return (c);
}
_3.2 函数的返回值
说明:(1)在函数中允许有多个return语句,但每次调用只能有一个return语句被执行,因此只能返回一个函数值
(2)函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数定义中函数的类型为,自动进行类型转换。
(3)对于不带返回值的函数,应当定义函数为void类型(或称"空类型");如果retun语句中没有指定的表达式(即return;),则此时返回一个不确定的值。
6_4 函数的调用
_4.1 函数调用的一般形式:
函数名 (实参表列)
_4.2 函数调用的方式:
(1)作为函数表达式的一部分
(2)作为一个函数语句
(3)作为函数的实参
_4.3 被调用函数的声明和函数原型
例:对max函数的声明:int max(int a,int b)
_4.4 函数的嵌套调用
【例6-4】输入4个数,找出其中最大值。
#include
int main()
{
int max4(int a,int b,int c,int d);
int a,b,c,d,max;
printf("Please input 4 numbers(用逗号分隔):");
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
max=max4(a,b,c,d);
printf("max=%d\n",max);
return (0);
}
int max4(int a,int b,int c,int d)
{
int max2(int a,int b);
int m;
m=max2(a,b);
m=max2(m,c);
m=max2(m,d);
return (m);
}
int max2(int a,int b)
{
if (a>=b)
return a;
else
return b;
}
_4.5 函数的递归调用
【例6-5】递归计算n!
#include
long fac(int n)
{
long f;
if(n<0) printf("n<0,input error!");
else
if (n==0||n==1) f=1;
else f=fac(n-1)*n;
return (f);
}
int main()
{
int n;
long y;
printf("\nPlease input a inteager number:");
scanf("%d",&n);
y=fac(n);
printf("%d!=%ld\n",n,y);
return 0;
}
【例6-6】汉诺塔问题。
#include
void move (int n,int x,int y,int z)
{
if (n==1)
printf("%c-->%c\n",x,z);
else
{
move (n-1,x,z,y);
printf("%c-->%c\n",x,z);
move (n-1,y,x,z);
}
}
int main()
{
int h;
printf("\ninput number:\n");
scanf("%d",&h);
printf("the step to moving %2d diskes:\n",h);
move(h,'a','b','c');
return 0;
}
6_5 函数与数组
_5.1 数组函数作函数实参
【例6-7】判断一整型数组各元素的值,若大于0则输出该值,若小于等于0则输出0值。
#include
void pd (int v)
{
if (v>0)
printf("%5d",v);
else
printf("%5d",0);
}
int main()
{
int a[5],i;
printf("Please input 5 numbers:");
for (i=0;i<5;i++)
{
scanf("%d",&a[i]);
pd (a[i]);
}
printf("\n");
return 0;
}
_5.2 数组名作函数实参
6_6 变量的作用域与生存期
_6.1 局部变量与全局变量
定义在花括号里的局部变量的作用域仅限于花括号内
而花括号外的变量为全局变量,作用域为整体
_6.2 变量的存储方式和生存期
(1)动态存储方式和静态存储方式
变量:①动态的(auto);②静态的(static);③寄存器的(register);④外部的(extern)。
(2)auto变量
(3)用static声明局部变量
(4)register变量
(5)用extern声明全局变量