05函数
C语言中的函数可以帮助我们编写大型应用程序,同时c中的函数也是oc语言函数(方法)的基础
任何一个应用程序都包含的功能模块:
-
联网模块
-
数据下载
-
界面搭建
-
数据解析/数据显示
[前言] 在大型应用程序开发过程中,对于某个代码片段需要反复的使用,我们(程序员)可以将这个需要反复使用的代码片段[封装] 成一个[函数],给这个函数起个名字,当需要使用这个代码片段时,只需要通过名字去[调用]这个函数就可以了
首先,函数必须先定义,然后才能使用[调用]
一丶函数的定义
//函数声明 (声明,是给编译器看的)
返回值类型 函数名(参数列表);
//函数定义(实现) (实现,是给链接器看的)
返回值类型 函数名(参数列表)
{
//函数体
}
返回值类型,可以是int,char,double 等等这些基本数据类型,也可以是复合数据类型
函数名,必须符合标识符的命名规则
参数列表,这里是多个变量的定义列表
函数体,所有在main函数中可以写的代码,在函数体中都可以书写
二丶函数的分类
系统函数/库函数
库函数,指的是由官方或者第三方编写的函数,这些函数不需要程序员再进行开发,只需要在需要使用对应功能的函数时,通过函数名调用就可以了,同时需要包含对应的头文件
#include<stdio.h>
//printf scanf
#include<unistd.h>
//sleep
#include<stdlib.h>
//abs
#include<math.h>
//pow sqrt sin cos
自定义函数
指的是,函数的名字,函数的功能(函数体),都需要程序员自己自定义
1.main函数,main函数的函数名是固定的,但是功能是自定义的
2.完全自定义函数,函数名,函数的功能,都需要程序员自定义
三丶自定义函数
1.最简单的自定义函数
//所有的函数 都必须单独定义(不能嵌套定义)
//函数声明,声明语句必须以分号结束
//函数声明是给编译器看的
void func(void);
//函数定义(实现)
//函数定义是给链接器看的
void func(void)
{
printf("🐰\n");
}
//左侧void,表示没有返回值
//右侧void,表示没有参数
2.带参数,带返回值的自定义函数
带参函数
void func1(int a);
void func2(int a,char b);
func1(10);//10 是实际参数,简称“实参”
//调用带参函数时,会发生参数的传递,称为“传参”
//传参,将 实参 传递给 形参
//传参,就是赋值
func2(100, '+');
带返回值函数
//函数定义(实现)
int fun(void)
{
printf("返回之前\n");
return 0;//当程序执行到return语句时,当前函数立即结束
}
return的使用
(1)在返回值类型为void的函数中使用return,不能带有返回值
void foo(int a,int b)
{
int sum=a+b;
printf("%d\n",sum);
return;//结束当前函数
}
(2)在返回值类型不为void的函数中使用return,可以带有返回值
int fun(int a,int b)
{
int c;
c=a*a*a+b*b*b;
return c;
}
(3)特殊函数
void fun(void);
//参数为void,表示一个参数也不能传
void fun();
//参数为空,表示可以传入任意多个、任意类型的参数,但是所传参数无法保存
四丶函数的栈空间 和 函数调用
[注] 函数调用发生时,会立即在内存的栈内存区开辟一个属于这个函数自己的[栈空间],这个[栈空间]用来存储函数内部的局部 变量(普通变量,数组等等),这个[栈空间]的大小取决于这些变量所要占的内存大小
函数调用结束时,[栈空间]被释放
五丶递归函数
递归函数的书写步骤:
-
明确函数的功能,根据函数的功能确定函数的原型(声明)
-
找出递归函数退出的临界条件(特殊情况)
-
大胆假设整个函数的功能已经写好,直接调用自己(本函数)就可以完成想要的功能
[结论] 凡是用循环可以实现的,用递归都可以实现
六、练习
1.编写函数,判断一个字符是否是表示数字的字符,如果是返回1,不是,返回0
#include <stdio.h>
int func(int n);
int func(int n)
{
if (n>=48&&n<=57)
{
return 1;
}
else
{
return 0;
}
}
int main(int argc, const char * argv[])
{
char a;
scanf("%c",&a);
printf("%d\n",func(a));
return 0;
}
2.编写函数,判断一个字符,是否是表示16进制数字的字符
‘0’ — ‘9’+ ‘a’ — ‘f’
#include <stdio.h>
int func(int n);
int func(int n)
{
if ((n>=48&&n<=57)||(n>=97&&n<=102))
{
return 1;
}
else
{
return 0;
}
}
int main(int argc, const char * argv[])
{
char a;
scanf("%c",&a);
printf("%d\n",func(a));
return 0;
}
3.编写函数,求4个数的平均值。
int avg(int a, int b, int c, int d);
#include <stdio.h>
int func(int a,int b,int c,int d);
int func(int a,int b,int c,int d)
{
int sum=(a+b+c+d)/4;
return sum;
}
int main(int argc, const char * argv[])
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
printf("%d\n",func(a, b, c, d));
return 0;
}
4.编写函数,传入n,打印以n为底的倒三角型
传入:5
输出:
*****
***
*
#include <stdio.h>
void func(int n);
void func(int n)
{
for (int i=1; i<=(n+1)/2; i++)
{
for (int j=1; j<=i-1; j++)
{
printf(" ");
}
for (int k=n;k>=2*i-1 ; k--)
{
printf("*");
}
printf("\n");
}
}
int main(int argc, const char * argv[])
{
int n;
scanf("%d",&n);
func(n);
return 0;
}
5.编写函数,传入n,打印以n为底的正三角形
#include <stdio.h>
void func(int n);
void func(int n)
{
for (int i=1; i<=(n+1)/2; i++)
{
for (int j=1; j<=(n+1)/2-i; j++)
{
printf(" ");
}
for (int k=1;k<=2*i-1 ; k++)
{
printf("*");
}
printf("\n");
}
}
int main(int argc, const char * argv[])
{
int n;
scanf("%d",&n);
func(n);
return 0;
}
6.编写函数,求两个数的最小公倍数,用返回值返回。
#include <stdio.h>
int func(int a,int b);
int func(int a,int b)
{
int sum=(a>b?a:b);
for (int i=(a>b?a:b); ; i++)
{
if (i%a==0&&i%b==0)
{
sum=i;
break;
}
}
return sum;
}
int main(int argc, const char * argv[])
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",func(a, b));
return 0;
}