C语言-函数
2.1.函数概述一
拿约会步骤举例:出门前准备——在路上——见面——回家
#include <stdio.h>
#include <stdlib.h>
int prepare(){ //没有形式参数
printf("精致打扮\n"); //printf是系统做好的函数,可直接调用
return 0; //int的返回值0
}
int ontheroad(){
printf("饭店等她\n");
return 0;
}
int dating(){
printf("你好漂亮\n");
return 0;
}
int gobackhome(){
int mark = 0 ;
printf("我能送你回家吗?");
if(mark==0){
printf("不可以");
}
else printf("可以!");
return 0;
}
//将要做的事全部打包进各个行程
int main()
{
prepare();
ontheroad();
dating();
gobackhome();
//该做什么事就把技能包拿出来
return 0;
}
2.2.函数概述二
为什么要函数调用?
- 代码很好看
- 容易定位问题
- 可复用性强(每一次调用都是复用)
- 分工
2.3.函数无返回参数,无返回值带一个参数
本节涉及术语:
- 定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。
- 在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。
- 形式参数:形参是函数被调用时用于接收实参值的变量。
- 实际参数:实参是在函数调用时传递给函数的参数.
这节是老陈前辈说的一个买米的故事
#include <stdio.h>
#include <stdlib.h>
int all; //全局变量:作用范围在整份代码
//你爸让你去买米,不关心你买多少斤(参数),也不关心你买回来没(返回值)
void buyrice1() //void代表无返回值,不需要return
//void代表返回值的类型是无类型,return可以写,不过后面不加变量
{
printf("去买米");
}
//你爸让你去买米,告诉你买多少斤(参数),但也关心你买回来没(返回值)
//经验:如果错误提示中包含\243 \254的错误,说明你输入了中文符号
void buyrice2(int jinshu) //jinshu是形式参数变量的定义,所以写法也类似:如int a
{
printf("去买%d斤米",jinshu);
}
void printfwelcome()
{
printf("欢迎!\n");
printf("欢迎!\n");
printf("欢迎!\n");
}
int main()
{
int a=6;
int b=8;
printfwelcome();
buyrice1(a);//这两句a和b都是实际参数
buyrice2(b);
return 0;
}
下面的延时函数也是如此
#include <stdio.h>
#include <stdlib.h>
//调用延时函数也是一样的,
void delay1(int a) //括号里的a是形式参数
{
int i;
for(i=0;i<a;i++);
}
/*void delay2()
{
int i; //局部变量:只作用在本函数语句块
for(i=0;i<5000;i++);
}*/
int main()
{
int b;
scanf("%d",&b);
while(1){
printf("我是最棒的!");
delay1(b);//这里b是实参
}
return 0;
}
2.4.函数形式参数作用域及生存期
1.形参的作用域:仅作用于该函数
2.形参的生存期:何时出生,何时死亡
#include <stdio.h>
#include <stdlib.h>
//1.形式参数的作用域:仅作用于该函数
//2.形式参数的生存期:形式参数也是一个变量(局部变量),有自己的内存空间
/* 出生:何时申请了该空间:当函数被调用的时候,才申请了该内存空间
这个空间内的数据被赋值成实际参数的值,函数调用把实际参数的值拷贝一份给形式参数。
“去世”:何时释放了该空间:函数执行结束后,该空间由内存管理单元自动回收(释放)。
*/
void buyrice2(int a){
printf("去买%d斤米...\n",a);
printf("buy:a的地址是%p\n",&a);
a++;
printf("jinshu=%d\n",a);
}
int main()
{
int a=30;
buyrice2(a);
printf("main:a=%d\n",a);
printf("main:a的地址是%p\n",&a);
system("pause");
return 0;
}
2.5.函数形式参数和局部变量的异同点
#include <stdio.h>
#include <stdlib.h>
//1.形参是局部变量
//2.形参和局变的不同点在于,形参的大小可以取决于传进来的数
void test1(){
int data = 100 ;
printf("test1的data的大小是:%d\n",data);
}
void test2(int data){
printf("test1的data的大小是:%d\n",data);
}
int main(){
test1();
test2(200);
test2(300);
return 0;
}
2.6.有一个参数有返回值的函数
#include <stdio.h>
#include <stdlib.h>
int f(int x){
int y;
y=x*2+1;
printf("f:y=%d\n",y);
return y;//return的作用是把返回值返回给调用者(return后面的东西代表函数执行的结果)
}
int main(){
int x=100,y=0;
y=f(x); //先执行f函数,再将返回值给到y
printf("main:y=%d",y);
return 0;
}
}```
**2.7.有两个参数的函数,实现加法运算**
```c
#include <stdio.h>
#include <stdlib.h>
int add(int x,int y){
int z;
z=x+y;
return z;
}
int main(){
int a,b,c;
while(1){
printf("请输入第一个数:",a);
scanf("%d",&a);
printf("请输入第二个数:",b);
scanf("%d",&b);
c=add(a,b);
printf("结果是:%d+%d=%d\n",a,b,c);
}
system("pause");
return 0;
}
2.8.实现两数据加减乘除
#include <stdio.h>
#include <stdlib.h>
int jia(int x,int y){
int z;
z=x+y;
return z;
}
int jian(int x,int y){
int z;
z=x-y;
return z;
}
int cheng(int x,int y){
int z;
z=x*y;
return z;
}
float chu(int x,int y){
float z;
z=(float)x/y;//不同类型数据运算时,比如两个整数相除,必须将除数或被除数强制转换成小数,否则小数点后面的数会被忽略
return z;
}
int main(){
int a,b,c;
float d;
while(1){
printf("请输入第一个数:",a);
scanf("%d",&a);
printf("请输入第二个数:",b);
scanf("%d",&b);
c=jia(a,b);
printf("相加结果是:%d+%d=%d\n",a,b,c);
c=jian(a,b);
printf("相减结果是:%d-%d=%d\n",a,b,c);
c=cheng(a,b);
printf("相乘结果是:%d*%d=%d\n",a,b,c);
d=chu(a,b);
printf("相除结果是:%d/%d=%f\n",a,b,d);
}
system("pause");
return 0;
}
2.9.两数加减乘除,可选算法
#include <stdio.h>
#include <stdlib.h>
int jia(int x,int y){
int z;
z=x+y;
return z;
}
int jian(int x,int y){
int z;
z=x-y;
return z;
}
int cheng(int x,int y){
int z;
z=x*y;
return z;
}
float chu(int x,int y){
float z;
z=(float)x/y;//不同类型数据运算时,比如两个整数相除,必须将除数或被除数强制转换成小数,否则小数点后面的数会被忽略
return z;
}
void welcome(){
printf("******************************\n");
printf("********欢迎使用计算器********\n");
printf("********请选择一种算法********\n");
printf("******************************\n");
}
int main(){
int a,b,c;
float d;
char j;
int diyici =0;//第一次不吸收
while(1){
welcome();
if(diyici!=0)
getchar();//吸收下面scanf的回车
scanf("%c",&j);
getchar();//吸收回车键
switch(j){
case'+':
printf("你选择了加法\n");
printf("请输入第一个数:",a);
scanf("%d",&a);
printf("请输入第二个数:",b);
scanf("%d",&b);
c=jia(a,b);
printf("相加结果是:%d+%d=%d\n",a,b,c);
break;
case'-':
printf("你选择了减法\n");
printf("请输入第一个数:",a);
scanf("%d",&a);
printf("请输入第二个数:",b);
scanf("%d",&b);
c=jian(a,b);
printf("相减结果是:%d-%d=%d\n",a,b,c);
break;
case'*':
printf("你选择了乘法\n");
printf("请输入第一个数:",a);
scanf("%d",&a);
printf("请输入第二个数:",b);
scanf("%d",&b);
c=cheng(a,b);
printf("相乘结果是:%d*%d=%d\n",a,b,c);
break;
case'/':
printf("你选择了除法\n");
printf("请输入第一个数:",a);
scanf("%d",&a);
printf("请输入第二个数:",b);
scanf("%d",&b);
d=chu(a,b);
printf("相除结果是:%d/%d=%f\n",a,b,d);
break;
default:
printf("请重新输入");
break;
}
}
return 0;
}
2.10.前面的大综合,小计算器
#include <stdio.h>
#include <stdlib.h>
int jia(int x,int y){
int z;
z=x+y;
return z;
}
int jian(int x,int y){
int z;
z=x-y;
return z;
}
int cheng(int x,int y){
int z;
z=x*y;
return z;
}
float chu(int x,int y){
float z;
z=(float)x/y;//不同类型数据运算时,比如两个整数相除,必须将除数或被除数强制转换成小数,否则小数点后面的数会被忽略
return z;
}
void welcome(){
printf("******************************\n");
printf("********欢迎使用计算器********\n");
printf("********请选择一种算法********\n");
printf("******************************\n");
}
void calculate(char j){
int a,b,c;
float d;
switch(j){
case'+':
printf("你选择了加法\n");
printf("请输入第一个数:",a);
scanf("%d",&a);
printf("请输入第二个数:",b);
scanf("%d",&b);
c=jia(a,b);
printf("相加结果是:%d+%d=%d\n",a,b,c);
break;
case'-':
printf("你选择了减法\n");
printf("请输入第一个数:",a);
scanf("%d",&a);
printf("请输入第二个数:",b);
scanf("%d",&b);
c=jian(a,b);
printf("相减结果是:%d-%d=%d\n",a,b,c);
break;
case'*':
printf("你选择了乘法\n");
printf("请输入第一个数:",a);
scanf("%d",&a);
printf("请输入第二个数:",b);
scanf("%d",&b);
c=cheng(a,b);
printf("相乘结果是:%d*%d=%d\n",a,b,c);
break;
case'/':
printf("你选择了除法\n");
printf("请输入第一个数:",a);
scanf("%d",&a);
printf("请输入第二个数:",b);
scanf("%d",&b);
d=chu(a,b);
printf("相除结果是:%d/%d=%f\n",a,b,d);
break;
default:
printf("请重新输入");
break;
}
}
int main(){
char j;
int diyici =0;
while(1){
welcome();
if(diyici!=0)
getchar();//吸收下面scanf的回车
scanf("%c",&j);
getchar();//吸收回车键
calculate(j);
}
return 0;
}
2.11.函数总结
1.无返回值无参数
2.无返回值有参数
3.有返回值有参数y=f(x)
4.有返回值有多个参数,参数类型不同z=f(x,y)
5.参数(个数,不同类型)+返回值(不同类型)组合