番外——C语言函数

函数

概述

模块化程序设计

基本思想

将一个大的程序块功能分割成一些小模块

特点
  1. 各模块相对独立、功能单一、结构清晰、接口简单
  2. 控制了程序设计的复杂性
  3. 提高元件的可靠性
  4. 缩短开发周期
  5. 避免程序开发的重复劳动
  6. 易于维护和功能扩充
开发方法

自上而下,逐步分解,分而治之

C是模块化设计语言

C程序结构
C程序
源程序文件1
源程序文件i
源程序文件n
预编译命令
函数1
函数n
说明部分
执行部分
  1. C是函数式语言
  2. 必须有且只能有一个名为main的主函数
  3. C程序的执行总是从main函数开始,在main中结束
  4. 函数不能嵌套定义,可以嵌套调用

函数分类

从用户角度
  1. 标准函数(库函数)由系统提供
  2. 用户自定义函数
从函数形式
  1. 无参函数
  2. 有参函数

使用库函数时应注意

  1. 函数功能
  2. 函数参数的数目和顺序,及各参数意义和类型
  3. 函数返回值意义和类型
  4. 需要使用的包含文件(头文件)

函数的定义

一般格式

函数类型 函数名(形参类型说明表)
{
	说明部分
	语句部分
}
函数类型
  1. 函数返回值类型:int,double,float,char…
  2. 缺省int型
  3. 无返回值 void
例 无参函数
printstar()
{ printf("************\n");}printstar(void)
{ printf("************\n");}
例 有参函数
int max(int x,int y)
{ 
	int z;
	z = x>y?x:y;
	return z;	
}
空函数
dummy()
{}

函数的调用与返回值

返回语句

return (表达式);return 表达式;return;

功能:是程序控制从被调用函数返回到调用函数中,同时把返回带给调用函数
说明

  1. 函数可有多个return语句
  2. 若无return语句,遇}时,自动返回调用函数
  3. 若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换——函数调用转换
例 函数返回值变量类型的变换
max(float x, float y)
{
	float z;
	Z=X>y2x:y;
	return(z);
}

main()
{
	float a,b;int c;
	c=max(a,b);
	printf("Max is %odln..c);
}

此例中虽然变量C定义为整型,但函数max()的返回值Z为浮点数,所以C的变量类型也转化为浮点数

函数的调用形式

函数名(实参表)

说明:

  1. 实参与形参个数相等,类型一致,按顺序一一对应。
  2. 实参表求值顺序,因编译系统而定,(Turbo C自右向左)
函数类型说明举例

在这里插入图片描述

函数参数及其传递方式

形参与实参

  1. 形式参数:定义函数时函数名后面括号中的变量名
  2. 实际参数:调用函数时函数名后面括号中的表达式

说明

  1. 实参必须有确定的值形参必须指定类型
  2. 形参与实参类型一致,个数相同
  3. 若形参与实参类型不一致,自动按形参类型转换—函数调用转换
  4. 形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放

参数传递方式

值传递方式

方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值
特点:

  1. 形参与实参占用不同的内存单元
  2. 单向传递
地址传递

方式:函数调用时,将数据的存储地址作为参数传递给形参
特点:

  1. 形参与实参占用同样的存储单元
  2. “双向”传递
  3. 实参和形参必须是地址常量或变量

函数的嵌套和递归调用

嵌套调用

C规定:函数的定义不可嵌套,函数调用可以调用
在这里插入图片描述

例求函数最大数和最小数的差值
#include<stdio.h>
int dif(int x,int y,int z);
int max(int x,int x,int z);
int min(int x,int y,int z);

void main()
{
	int a,b,e,d;
	scanf("%d%d%d".&a,&b,&c);
	d=dif(a,b,c);
	printf("Max-Min=%d\n",d);
}

int dif(int x,int y,int z)
{return max(x,y,z)-min(x,y,z); }

int max(int x int y.int z)
{ 
	int r;
	r=x>y?x:y;
	return(r>z?r:z);
}

int min (int x int y.int z)
{
	int r;
	r=x<y ?x:y;
	return(r<z?r:z);
}

此案例我们主函数里只调用了dif()这个函数,而在dif()函数中,我们调用了min()max(),简单来说,在调用的函数中调用其他函数就是函数的嵌套调用,类似于循环中嵌套循环

函数的递归

定义

函数直接或间接调用自身叫函数的递归调用

/*阶乘函数 */
long fac(int n)
{
	if(n<0) printf("input error");
	else if(n<=1) return 1;
	else return n*fac(n-1);
}

特点

递归算法的出发点不放在初始条件上,放在求解的目标上,从所求的未知项出发逐次调用本身的求解过程,直到递归的边界(即初始条件)。读者会认为递归算法可能是多余的,费力而不讨好。但许多实际问题不可能或不容易找到显而易见的递推关系,这时递归算法就表现出了明显的优越性。下面我们将会看到,递归算法比较符合人的思维方式,逻辑性强,可将问题描述得简单扼要,具有良好的可读性,易于理解.许多看来相当复杂,或难以下手的问题,如果能够使用递归算法就会使问题变得易于处理。

递归算法可以实现的问题有很多,辗转相除法找最大公因子,斐波那契数列,包括汉诺塔,有时间会在后续的博客中更新。

写在最后

此篇博客首先要感谢江西师范大学计算机学院杨印根教授的资料支持。同时,本人最近遇到了些事情,C语言系列笔记这个版块暂时停更一段时间,在此还是希望初学C语言的同学能够通过我给出的案例和语句用法以及问题的分析,能够增强自己的逻辑思维能力和编码能力,感谢大家对我的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值