第五章 函数
首先恭喜你已经学到了函数这一部分,,革命尚未成功,同志仍需努力。我真心的希望你能戒骄戒躁,稳扎稳打,去突破如今的桎梏,找到自己一生所热爱的事物,加油加油橘猫
文章目录
1.为什么要用函数
- 避免代码冗长
- 模块化的设计思路
- 按功能划分,每个函数代表一个功能,而函数的名字要体现函数的功能含义,类似变量标识符
y=f(x)
2.函数要先定义再使用,和变量一个道理
定义:抓住三要素!牢牢记住!!!!!!!!!
- 函数名————-体现功能
- 参数列表——-比如y=f(x),,,x就是参数 比如z=f(x,y),,x,y就是参数(参数的个数根据需求自行定义)
- 返回值——还比如y=f(x),,,y是函数根据x的值和f的功能执行后的结果
函数体————执行什么样的功能,涉及的处理代码叫做函数体
3.函数的定义与调用
1.定义无参数的函数
#include <stdio.h>
void printfwelcome(){
printf("====================\n");
printf("欢迎来到我的程序\n");
printf("====================\n");
}
//1.函数调用时,要注意是怎么调用的,,函数名要一致,数据类型不要写(定义的时候才用)
int main(){
printfwelcome();//在运行到这个函数的时候会跳回上面定义的函数
return 0;
}
2.定义有参数有返回值的函数
-
如y=f(x),,一个返回值,一个参数
#include <stdio.h> /******一个参数,带着一个返回值,这个返回值是个整型,所以用int*************/ int getDataFormX(int x) //形式参数,需要包含变量名(),变量类型 { //x变量名是可以随意随意起的 int data; data = x-1; return data; /*还有一种写法,直接就是一个返回值*/ // return x-1; } /*********在这整个过程中我们关心的只有值和数据的传递*********/ int main(){ int x; int y; puts("请输入一个数:"); scanf("%d",&x); //首先你输入的x的值 y = getDataFormX(x);//然后这个里面的x的值,会传给上面定义的函数里面的变量,,他们是值的传递,地址空间不一样 //在定义的函数里面一顿操作之后,会返回一个数,这个数在传回来给到现在的 y; printf("x =%d,y =%d",x,y); return 0; }
-
一个返回值,两个参数
#include <stdio.h>
/*****自己定义的函数*****/
int add(int a,int b)//两个数据,,2参数,
{
int c;
c = a+b;
return c;
}
/*******主函数********/
int main(){
int x,y,z;
puts("请输入一个数:");
scanf("%d",&x);
puts("请再输入一个数:");
scanf("%d",&y);
//x,y两个数据值传给上面定义的函数,,在定义函数里面定义两个数据类型来承接过来的数据,,返回一个值回来,给到z
z =add(x,y);//--------要注意x,y是用来传递数值的变量,,上面已经定义过,所以不要加数据类型,易错点
printf("%d+%d=%d",x,y,z);
return 0;
}
- 一个返回值,三个参数,多个参数可以以此类推
#include <stdio.h>
/*****自己定义的函数*****/
//三要素:返回值,参数列表,功能
int add(int a,int b,int z) //函数原型
{
int c;
c = a+b+z;
return c;
}
/*******主函数********/
int main(){
int x,y,z,ret;
puts("请输入一个数:");
scanf("%d",x);
puts("请再输入一个数:");
scanf("%d",y);
puts("请再输入一个数:");
scanf("%d",z);
ret =add(x,y,z);
printf("%d+%d+%d=%d",x,y,z,ret);
return 0;
}
3.定义空函数
程序设计,模块设计的时候,占坑
就是先捋清思路流程,,然后再开始向里面写代码,,不至于直接报错
4.函数调用
新手经常犯的错误
- int add(2,3) 带了返回值类型
- add(int a, int b) 形参带类型了
一些见怪不怪的操作
函数可以当做表达式
函数调用当做其他函数调用的参数
4.形式参数和实际参数
传递参数,传递的是值,,形参和实参值相同,但是地址空间不同
#include <stdio.h>
//数据和值
int test(int x) //形式参数,需要包含变量类型,变量名(),,,,
/*生命周期:栈空间
*被调用的时候才为形式参数申请内存,调用结束,内存有被系统释放
*局部变量的有效作用空间(作用域)要记得*/
{
int y=5;
printf("test的x内存地址是%p,数值是%d\n",&x,x);
return (x-y);
}
//变量的四个要素:名 类型 值 地址
int main()
{
int x,y;
puts("请输入一个数:");
scanf("%d",&x);
printf("main的内存地址是%p,数值是%d\n",&x,x);
y = test(x);//实际参数,,会把这个函数的返回值给到y
printf("x=%d,y=%d",x,y);
return 0;
}
/****我在单片机看见有一种操作
void delay(unsigned int j)
{
while(j--);
}
void main()
{
delay(1000); 他们用的是此方法来进行延迟,延迟函数的数值可改,所以延迟时间也可以改,是不是很具有参考意义??
}
*/
1.全局变量与局部变量
如果放到这些函数的外面,,就是全局变量,对所有函数都生效,。
编程案例
1.输入两个整数,要求输出最大值,用函数实现
#include <stdio.h>
int get_bigger_fordata(int x,int y)
{
/*方法1
* int z;
* if(x>y){
* z = x;
* }else{
* z = y;
* }
* return z;*/
/*方法2
* int z;
* z =x>y?x:y
* return z;*/
/*方法3
return x>y?x:y;*/
}
int main(