C语言提供了大量的库函数
自定义函数的一般形式:
[数据类型]函数名称([参数])
{
执行代码块;
return(表达式);
}
注意:
[]包含的内容可以省略,数据类型说明省略,默认的是int类型函数;参数省略表示该数是无参数的函数,参数不省略表示该函数是有参函数;
2、函数名称遵循标识符命名规范
3、自定义函数尽量放在main()函数之前,如果要放在main()函数后面的话,需要在main()函数之前先声明自定义函数,声明格式为:[数据类型说明]函数名称([参数]);
#include
int sayhello()
{
printf("%s\n","慕课网的小伙伴,大家好");
return 0;
}
int main()
{
return 0;
}
函数的调用
在C语言中,函数调用的一般形式:
函数名([参数])
注意:
1、对无参数的调用的时候可以将[]包含的省略
2、[]中可以是常数,变量或其他构造类型数据及表达式,各个参数之间用逗号分开。
#include
//自定义函数,sayhello()
int sayhello()
{
printf("%s\n","慕课网的小伙伴们,大家好");
return 0;
}
//主函数
int main()
{
sayhello();
return 0;
}
有参与无参数
在函数中不需要函数参数的称之为无参数函数
在函数中需要参数的称之为有参函数
有参函数的一般形式
[数据类型]函数名称(参数列表)
{
执行代码块;
return 表达式;
}
[数据类型]函数名称()
{
执行代码块;
return 0;
}
有参函数与无参函数的唯一的区别是:函数()中多了一个参数列表。
无参数函数
#include
int Matrix()
{
int i, j;
for (i = 1; i <= 3; i++)
{
for (j = 1; j <= 3; j++)
{
printf(" * ");
}
printf("\n");
}
return 0;
}
int main()
{
Matrix();
return 0;
}
#include
int Matrix(int n)
{
int i, j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
printf("* ");
}
printf("\n");
}
return 0;
}
int main()
{
Matrix(5);
return 0;
}
对比两个例子,不难发现有参函数更为灵活,输出的图形可以随着n 的改变而随意改变,只要在main()函数中传递一个参数就可以了;而在无参函数中输出的相对就比较固定,当需要改动的时候还需要到自定义的方法内改变循环变量的值。
形参与实参
函数的参数分为形参和实参两种。
形参是在
定义函数名的时候使用的参数。目的是用来接收调用该函数时传入的参数。
实参是在调用时传递该函数的参数。
(一)函数的形参和实参具有以下的特点:
形参
只有在被调用时分配
内存单元,在调用结束时,即刻释放所分配的内存单元。
因此形参只有在函数的内部有效。函数调用结束返回
主调用函数名后则不能再使用该形参变量 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 在参数传递时,实参和行参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配的错位
#include
int MultiDouble(int x)//这里的x是形参
{
return x * 2;
}
int main()
{
int x = 10;
//下面的x是实参,他其实就是main()函数中定义的变量x
printf("%d\n",MultiDouble(x));
return 0;
}
求三角形的周长
#include
int getGirth(int a, int b, int c)
{
if ((a + b) <= c || (a + c) <= b || ((b + c) <= a))
{
printf("不构成三角形\n");
return 0;
}
else
{
int cirf = a + b + c;
return cirf;
}
}
int main()
{
int a, b, c;
a = 3;
b = 4;
c = 5;
printf("三角形的周长是:%d\n",getGirth(a,b,c));
}
函数的返回值
函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。
1、函数的值只能通过return语句返回主调函数。return语句的一般形式为:
return 表达式 return (表达式);
2、函数值的类型和函数定中函数的类型应保持一致。如果两者不一致,则以函数返回类型为准,自动进行类型转换。
int number()
{
return 100;
}
void noResult()
{
}
注意:
void函数中可以有执行代码块,但是不能有返回值,令void函数中如果有return语句,该语句只能有起到结束函数运行的功能。
其格式为: return ;
没有答案的
#include
/* Jone算出结果应该怎么写函数? */
? joneResult(int x, int y, int z)
{
int sum = x+y+z;
? //这里是不是应该将sum返回呢?
}
/* Jack没有算出结果只说了一句话是不是应该用无返回值函数? */
? jackResult(int x, int y, int z)
{
printf("我算不出来\n");
}
int main()
{
int a, b, c;
a = 10;
b = 20;
c = 30;
//Jone的返回值类型是什么?
jR = joneResult(a, b, c);
printf("Jone运算结果是:%d\n", jR);
printf("Jack运算结果是:");
//Jack没有算出结果只说了句话,是不是直接调用函数就可以了?
?
return 0;
}
递归
#include
/* Jone算出结果应该怎么写函数? */
? joneResult(int x, int y, int z)
{
int sum = x+y+z;
? //这里是不是应该将sum返回呢?
}
/* Jack没有算出结果只说了一句话是不是应该用无返回值函数? */
? jackResult(int x, int y, int z)
{
printf("我算不出来\n");
}
int main()
{
int a, b, c;
a = 10;
b = 20;
c = 30;
//Jone的返回值类型是什么?
jR = joneResult(a, b, c);
printf("Jone运算结果是:%d\n", jR);
printf("Jack运算结果是:");
//Jack没有算出结果只说了句话,是不是直接调用函数就可以了?
?
return 0;
}
计算n的阶乘可以使用以下代码
#include
int factorial(int n)
{
int result;
if (n < 0)
{
printf("输入错误!\n");
return 0;
}
else if (n == 0 || n == 1)
{
result = 1;
}
else
{
result = factorial(n - 1)*n;
}
return result;
}
int main()
{
int n = 5;
printf("%d的阶乘=%d",n,factorial(n));
return 0;
}
递归就是一个函数在它的函数体内调用它自身
#include
int getwordNumber(int n)
{
if (n == 1)
{
return 1;
}
else
{
return getwordNumber (n - 1) + n;
}
}
int main()
{
int num = getwordNumber(10);
printf("小明第10天记了:%d个单词。",num);
}
递归函数的特点:
每一级函数调用都有自己的变量,但是函数代码并不会得到复制, 每次调用都会有一次返回 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序, 递归函数中,位于递归调用钱的语句和各级被调用函数具有相同的执行顺序; 递归函数中,位于递归调用的后的语句的执行顺序和各