函数
c语言中的函数可以帮助我们编写大型应用程序,同时c中的函数也是oc语言函数(方法)的基础
任何一个应用程序都包含的功能模块:
<1>联网模块
<2>数据下载
<3>界面搭建
<4>数据解析/数据显示
[前言] 在大型应用程序开发过程中,对于某个代码片段需要反复的使用,我们(程序员)可以将这个需要反复使用的代码片段[封装] 成一个[函数],给这个函数起个名字,当需要使用这个代码片段时,只需要通过名字去[调用]这个函数就可以了
首先,函数必须先定义,然后才能使用[调用]
一.[函数的定义]
//函数声明 (声明,是给编译器看的) 返回值类型 函数名(参数列表); //函数定义(实现) (实现,是给链接器看的) 返回值类型 函数名(参数列表) { //函数体 }
返回值类型,可以是int,char,double 等等这些基本数据类型,也可以是复合数据类型
函数名,必须符合标识符的命名规则
参数列表,这里是多个变量的定义列表
函数体,所有在main函数中可以写的代码,在函数体中都可以书写
二.[函数的分类]
[系统函数/库函数]
库函数,指的是由官方或者第三方编写的函数,这些函数不需要程序员再进行开发,只需要在需要使用对应功能的函数时,通过函数名调用就可以了,同时需要包含对应的头文件
printf scanf fflush sleep abs pow
#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>明确函数的功能,根据函数的功能确定函数的原型(声明)
<2>找出递归函数退出的临界条件(特殊情况)
<3>大胆假设整个函数的功能已经写好,直接调用自己(本函数)就可以完成想要的功能
[结论] 凡是用循环可以实现的,用递归都可以实现
六、练习
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; }