1,函数的基础
函数的别称:方法,接口,子例程,程序
函数的分类:有参函数。无参函数,库函数,自定义函数
1.1创建函数
//创建函数的语法
/*函数返回值类型 函数名(参数列表)
{
函数体;
} */
int main()//无参函数
{
return 0;
}
1.2函数的调用
void printf()//void 无返回值函数
{
printf("yo~bro\n");
printf("yo~bro\n");
printf("yo~bro\n");
}
int main()
{
printf();//调用函数:函数名(函数参数);
return 0;
}
1.3设计函数的基本思想
一个函数一个功能,尽量别把多种内容糅合到一起
1.4函数的返回值
-
函数返回值只要和return 后面表达式类型一致就OK了
int F1()
{
return 1984;//返回整数类型
}
bool F2())
{
return true; //返回bool类型
}
-
函数返回值一般具有特定的含义(返回值代表什么含义由自己决定)
-
代表操作成功与否
int main() { return 0;//0返回值一般默认程序正常执行 } int get_divided() { int a,b; scanf_s("%d%d",&a,&b); if(b==0) { return -1;//当b=0的时候返回的值为-1 } return a/b;//当b不等于0的时候返回a/b的值 }
-
做加工数据的处理→函数调用的表达式就代表了函数返回值
int sum() { return 1+2;//返回值给sum,sum的值就是3 } int main() { sun();//调用表达式 int a = sum(); sum()=123;//这样的代码是错误的 printf("%d",a);//打印的值就是3 return 0;//函数遇到return就结束了 }
-
return 可以结束函数
void printf() { puts("A"); puts("B"); return;//void类型返回函数值 也存在return puts("c");//这行代码永远都不会实现 } //应用过程中想要提早结束函数,通常结合if语句使用 int main() { printf(); return; }
-
scanf 和printf 函数的返回值
int a,b,c; int result=scanf_s("%d%d%d",&a,&b,&c); printf("scanf_s的返回值:%d\n",result);//返回值是scanf函数输入数据的个数 //scansf函数的一种特殊写法 int num = 0 ; while(!scanf_s("%d",&num))//数据输入失败,scanf返回0(失败),!0 变成 1 { while(getchar()!='\n')//清空缓冲区 } printf("%d\n",num); //printf返回值是打印字符的个数 result = printf("%d\n",num); printf("%d\n",result);//打印的字符的个数 return 0;
-
2, 函数的参数
2.1无参,无返回值→无返回值,一般做效果类的函数
//封装函数
//一个函数一个功能
//函数的模块化
void UI(void)//与void printf()功能相同
{
puts("------------------------");//菜单功能
puts("\t0.退出");
puts("\t1.立刻关机");
puts("\t2.定时关机");
puts("------------------------");
}
void keydown()//按键交互
{
int key = 0;
scanf_s("%d",&key);
switch(key)
{
case 1 :
break;
case 2:
break;
case 3
break;
case 4:
break;
case 5:
break;
}
}
int main()
{
while(true)
{
UI(void);
keydown();
system("pause");
system("cls");
}
return 0;
}
2.2加工数据→传参
(自己在设计函数的时候,解释不了参数的意思,就不要写参数)
double sum (double a , double b )
{
return a + b ;
}
//实现函数的时候参数叫做形参(形式参数)
int main()
{
sum(1,2);//调用的时候参数叫做实参
return 0;
}
传参规则
-
形参实参类型必须一致
-
允许转换的情况下,会强制转换
-
传参本质就是赋值的操作
-
传参的时候要注意作用域
-
拷贝本
#include<stdio.h> void modify() { int num = 999 ; } int main() { int number = 0; modify(number);//number把自己的值拷贝到modify函数中,使得函数中num的值由999变成了0 printf("number=%d",number);//打印结果仍是0; return 0; }
2.3数组传参
数字类的必须传入数组长度
#include<stdio.h>
void print_array(int array[] ,int arraynum)//int arraynum是数组长度
{
for(int i = 0; i<arraynum ; i++)
{
printf("%d\t",array[i]);//这个函数的功能是打印数组
}
printf("\n");
}
int main()
{
int array[] = {1,2,3,4,5};
int len = sizeof(array)/sizeof(int);
print_array(array,len);
return 0;
}
字符串不需要传入数组长度-->因为字符串有一个字符串结束标记
#include<stdio.h>
int str_len(char array[])
{
int count = 0;
while (array[count] != '\0')
{
count++;
}
return count;
}
int main()
{
char arr[] = "I love you";
printf("arr's len:%d\n", str_len(arr));
return 0;
}
3,函数调用
程序是从上往下编译,函数在主函数下面的时候,调用函数可能会出现错误,可以用声明语法来避免
3.1函数调用的嵌套
#include <stdio.h>
//声明语法--->有作用域
//声明语法写在一起
int max(int a, int b);
//声明的时候形参的可以不写
int sum(int, int)
int main()
{
//调用函数也可以进行嵌套操作
//以自身的调用当作函数参数
max(1,2);
max(max(1,2),3);
max(max(max(1,2),3);,4);
//建议用中间变量解析
return 0;
}
int max(int a, int b)
{
return a > b ? a : b;
}
int sum(int a, int b)
{
return a + b;
}
3.2递归
-
以斐波那契数列为例,前6项是 1 1 2 3 5 8
-
退出性条件:f1=1 f2=1
-
推导公式:f(n)=f(n-1)+f(n-2)
int F(int n) { if(n==1||n==2) return 1; //通常写递归,参数都会往结束条件靠拢 return F(n-1)+F(n-2); }