C语言学习笔记(8)函数
函数
函数主要是用于将解决复杂的编程问题分解为数个可以分开进行解决的小问题,通过函数分装,最后在拼连在一起。有利于多人协作开发。
函数同样需要先声明后调用,声明符号为 void,且函数后一般带有()
在原程序中需要使用相应语句就只需要直接调用函数即可。
例:
#include <stdio.h>
void main()
{
void printstar();
void print_message();
printstar();
print_message();
printstar();
}
void printstar()
{
printf("**************************************************************\n");
}
void print_message()
{
printf("不成熟的人为了自己的尊严壮烈地死去,成熟的人为了伟大的事业卑微的活着\n"); // 致《隐形守护者》及《潜伏*赤途》
}
输出结果:
**************************************************************
不成熟的人为了自己的尊严壮烈地死去,成熟的人为了伟大的事业卑微的活着
**************************************************************
Press any key to continue
一个C程序由一个或多个程序模块组成,每个程序模块作为一个源程序文件。对于较大的程序一般分开放在若干个源文件中,由其组成一个C程序。利于程序员了解程序并提高工作效率。
函数不能嵌套定义,所有的函数都是平行了。
函数定义形式
无参函数:
类型标识符 函数名()
{
声明部分
语句部分
}
类型标识符 函数名(形式参数表列)
{
声明部分
语句部分
}
通常函数中会有return语句,表示return语句中的表达式数据与声明函数的数据类型一致,没有return语句则表明该函数没有返回值,则函数的返回值需要定义为void。如果数据类型省略则默认为int类型。
函数的使用:比较两个数的大小。
#include <stdio.h>
void main()
{
int max(int x ,int y);
int a, b, c;
scanf("%d%d",&a, &b);
c= max (a , b);
printf("Max is %d\n", c);
}
int max(int x ,int y)
{
int z;
if(x > y)
z= x;
else
z = y;
return (z);
}
在上面的例子中int x ,int y及为形式参数,a , b为实际参数
一般会将实参赋给形参
形参和实参数据类型要相同,或形参的数据类型包含实参的数据类型,否则可能引起精度损失
return函数的作用是将函数计算的值返回到改函数上,及赋予函数计算的结果,而如果函数不需要输出值,那么可用void来调用函数。
函数的声明
在函数的使用中跟变量的使用有相似之处,即需要先声明后调用,相当于告诉系统存在这个函数,以防止系统报错。
void main()
{
int max(int x ,int y);
int a, b, c;
scanf("%d%d",&a, &b);
c= max (a , b);
printf("Max is %d\n", c);
/*int max(int x ,int y);即为对子函数max的声明*/
}
如果在调用函数之前定义了函数即子函数在主函数之前,那么可以不用在主函数前声明函数,即系统已经在前面了解了子函数,在后面调用的时候就可以直接调用了。
#include <stdio.h>
int max(int x ,int y)
{
int z;
if(x > y)
z= x;
else
z = y;
return (z);
}
void main()
{
int a, b, c;
scanf("%d%d",&a, &b);
c= max (a , b);
printf("Max is %d\n", c);
}
函数的调用
函数的调用可以分为自左向右调用和自右向左调用
在vc++中为自右向左调用
#include <stdio.h>
void main()
{
int f(int a,int b); /*函数声明*/
int i = 2,p;
p = f(i,++i); /*函数调用*/
printf("%d\n",p);
}
int f(int a,int b)
{
int c ;
if(a > b)c = 1;
else if(a == b)c = 0;
else c = -1;
return(c);
}
可发现若从左向右调用函数则有a = 2,b = 3,输出应为1
而若从右向左调用函数则a = 3,b = 3,输出为0
该程序的输出值为0
证明函数是从右向左调用函数的。
函数的嵌套使用
在函数的使用中可以进行多个函数的嵌套使用
流程为:
1.先执行主函数的语句
2.在遇到第一个子函数时转移到子函数所在位置对子函数的语句进行读取
3.在遇到子函数的子函数时再转移到相应位置进行读取
4.执行完子函数的子函数的语句后转回子函数的未读取的语句进行读取
5.读取完子函数的剩余语句后继续读取主函数的语句,完成读取
#include <stdio.h>
void main()
{
int max4(int x,int y,int z,int n);
int a,b,c,d,max;
printf("please input 4 numbers\n");
scanf("%2d %2d %2d %2d",&a,&b,&c,&d);
max = max4(a,b,c,d);
printf("The max is %d\n",max);
}
int max4(int x, int y, int z, int n)
{
int m;
int max2(int a,int b);
m = max2(x,y);
m = max2(m,z);
m = max2(m,n);
return (m);
}
int max2(int a ,int b)
{
int m;
if (a > b)
m = a;
else
m = b;
return (m);
}
数组作为函数参数
全局变量和局部变量
全局变量是在函数外部声明的,因此对于所有函数都可以调用,同样可以在任何地方输出
但是,局部变量是仅仅定义在相应的函数内部的,只在函数内部中可以进行调用和输出
这样做的优势是可以在不同的函数内定义同样的变量名,使得在较多的函数中需要定义过多的变量。
函数的递归调用
在函数中直接或间接的调用函数本身,称为函数的递归调用。
以我个人的理解,函数的递归调用相当于一个递减后递增的过程。
类似于循环结构,设置语句运算,但是运算是在上一级的结果上进行的。
因此,如果计算第n步,函数就会逐级退回第1步,在第1步运算完成,逐渐累积运算知道第n步
例:
#include<stdio.h>
int main()
{
int age(int n);
printf("No.5,age:%d\n",age(5)); //输出第5个学生的年龄
return 0;
}
int age(int n) //定义递归函数
{
int c; //如果n = 1
if(n == 1) //年龄为10
c = 10; //如果n 不等于1
else //年龄为前一个学生的年龄加2(如第四个学生为第三个学生的年龄加2)
c = age(n - 1) + 2; //返回年龄
return(c);
}