C语言:二、函数

这篇博客详细介绍了C语言中函数的概念和使用,包括函数的分类、参数与返回值、局部变量和全局变量的区别,以及通过实例展示了函数在实际编程中的应用。
摘要由CSDN通过智能技术生成

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.函数概述二
在这里插入图片描述
为什么要函数调用?

  1. 代码很好看
  2. 容易定位问题
  3. 可复用性强(每一次调用都是复用)
  4. 分工

2.3.函数无返回参数,无返回值带一个参数
本节涉及术语:

  1. 定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。
  2. 在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。
  3. 形式参数:形参是函数被调用时用于接收实参值的变量
  4. 实际参数:实参是在函数调用时传递给函数的参数.

这节是老陈前辈说的一个买米的故事

#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.参数(个数,不同类型)+返回值(不同类型)组合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值