自定义函数
简述:
C语言程序中,软件模块用函数实现
用于实现模块化程序设计:
1.将一个大的程序划分成若干程序模块,每个模块实现一定的功能么,以方便分工,或降低开发难度。
2.程序进行调试时,分别对每一模块进行调试,在较小的范围内查错并改正。
核心思想:
自顶向下,逐步求精。
优势:
降低程序的复杂度,使程序设计、维护、阅读、调试等操作简单化
函数三要素:
函数名、函数返回值、函数参数。
如:float f1(float x);
其中f1是函数名,f1前的float是函数返回值类型,float x是函数参数。
示例代码1:
#include <stdio.h> #include <stdlib.h> #include <math.h> /* 求f1(x)=3*x^3+2*x^2-1 */ float f1(float x) { float y; y=3*x*x*x+2*x*x-1; return y; } int main() { float x,y; scanf("%f",&x); y=f1(x);//这个公式十分亲切 printf("x=%.3f,y=%.3f\n",x,y); return 0; }结果:
如上代码将通过x求y的过程封装入f1()这个函数,在需要使用这段代码时,只需要使用y=f(x);这种中学数学中使用了无数次的表示形式即可。
分类:
自定义函数类别:
按函数返回值分类:
无返回值函数:
返回值为void类型,只完成某些操作。
有返回值函数:
返回值为函数定义(声明)时的数据类型
执行完毕返回return后的值。
return语句:
意义:
用于函数的返回,
形式:
return (表达式);
return 表达式;
return;
注:当有多个return语句时,执行到哪个,哪个起作用(直接返回)。
函数的返回:
包括:
1.执行流程的返回:由被调用函数返回到主调函数。
2.执行结果的返回:将被调用函数执行得到的结果带回主调函数。
要点:
1.无返回值的函数return语句可以省略,而有返回值的函数必须写return语句。
2.旧的C语言标准中允许main函数无返回值(void),但最新的标准规定main函数必须要有一个整型的返回值(int) 并且在正常结束时,返回一个0(return 0; 这里返回不同的值代表不同的状态,但这里不深入研究)
这是因为Linux之类的系统中要求程序必须给操作系统返回值,以方面识别程序的运行状态。为了提高代码的兼容性,最新的标准做出了这样的规定。
3.当返回的类型和定义的返回类型不匹配时,如:
long f1(float x) { float y; y=3*x; return y; }系统会自动对返回值进行数据类型的转换,转换的规则和赋值时自动数据类型转换的规则相同。
进阶使用与要点
代码示例1:
#include <stdio.h> #include <stdlib.h> /* 这个程序用于输出指定符号组成的三角图形 */ void printchs(int,char);//这里在定义之前声明了这个函数的返回值类型、名字、参数类型和个数 int main() { int i,n; char ch1,ch2; printf("请输入金字塔层数:"); scanf("%d",&n); getchar(); printf("请输入金字塔的组成字符:"); ch1=getchar(); getchar(); printf("请输入空白处的填充字符:"); ch2=getchar(); getchar(); for(i=0;i<n;i++) { printchs((n-i-1),ch2); printchs((2*i+1),ch1); printf("\n"); } return 0; } void printchs(int m,char ch) { int j; for(j=0;j<m;j++) { printf("%c",ch); } }
解析:
注意!这里如果要用固定的字符,不能使用printchs((n-i-1),">");之类的!因为ch2的位置要求一个字符型的参数,而用双引号的话,就变成了字符串型的参数了!
代码示例2:
#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试自定义函数的使用
*/
//先声明函数的返回值,名称,形式参数,使得后面的方法能够直接调用这些函数。这可以说是java中接口的雏形
void printstars(void);//括号内的形式参数使用void表示无传入参数
void printmessage();//void类型表示无返回值
int max(int a,int b);//声明带参数的函数
int min(int,int);//声明的时候,形式参数的名字可以不写
int sum(int c,int d);//声明的时候的形式参数名可以和定义时的形式参数名不同,只要数据类型相同即可
int main()
{
printstars();//因为上方已经声明过这个函数的使用方式(名称、参数、返回值)
printmessage();//所以这里直接调用并不会出错
printstars();//即使函数还未定义
int a=5,b=8;
printf("max:%d\n",max(a,b));
printf("min:%d\n",min(a,b));
printf("sum:%d\n",sum(a,b));
return 0;
}
//这里才定义函数内部的方法,因为前面已经声明过这个函数,所以即使把定义放在这里,程序也不会出错
void printstars()
{
printf("********************\n");
}
void printmessage()
{
printf("Hello , World!\n");
}
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)//这个函数声明时并没有给形式参数命名
{
return a<b?a:b;
}
int sum(int a,int b)//这个函数定义时的形式参数命名和声明时的形式参数命名不同
{
return a+b;
}
结果:
解析:
1.自定义函数在main函数外部声明,可以参考全局变量的声明。都是通过这种方式使得其有效性覆盖整个程序执行过程。
按函数返回值分类:
无返回值函数:
返回值为void类型,只完成某些操作。
有返回值函数:
返回值为函数定义(声明)时的数据类型
执行完毕返回return后的值。
return语句:
return (表达式);
return 表达式;
return;
当有多个return语句时,执行到哪个,哪个起作用(直接返回)。
函数的返回:
执行流程的返回:由被调用函数返回到主调函数。
执行结果的返回:将被调用函数执行得到的结果带回主调函数。
注:无返回值的函数return语句可以省略,而有返回值的函数必须写return语句。
注:旧的C语言标准中允许main函数无返回值(void),但最新的标准规定main函数必须要有一个整型的返回值(int) 并且在正常结束时,返回一个0(return 0; 这里返回不同的值代表不同的状态,但这里不深入研究)
这是因为Linux之类的系统中要求程序必须给操作系统返回值,以方面识别程序的运行状态。为了提高代码的兼容性,最新的标准做出了这样的规定。
注:当返回的类型和定义的返回类型不匹配时,如:
long f1(float x) { float y; y=3*x; return y; }系统会自动对y进行数据类型的转换,转换的规则和赋值时自动数据类型转换的规则相同。