【C语言】用函数实现模块化程序设计

函数的介绍

为什么要用函数

通过前面几章的学习,大家已经可以编写一些简单的C语言程序了,但是如果程序的功能比较多,规模比较大,或者程序多次调用某个功能,把所有的程序代码都写在一个主函数(main函数)中,就会使得主函数变得头绪不清,阅读和维护程序也变得很困难。
所以,应该采用模块化程序设计的思路。一个C语言程序可由一个主函数(必须有)和若干个其他函数(可以无)构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。

样例程序1

输出以下结果:
在这里插入图片描述
无函数版本:

#include <stdio.h>

int main()
{
	printf("*****************\n");
	printf("  Hello world!\n");
	printf("*****************\n");
	return 0;
}

函数版本:

#include <stdio.h>

void print_star()
{
	printf("*****************\n");
}

void print_message()
{
	printf("  Hello world!\n");
}

int main()
{
	print_star();
	print_message();
	print_star();
	return 0;
}

函数的定义

函数是一个大型程序中的某部分代码,由一个或多个语句块组成,负责完成某项特定功能,而且相较于其他代码,具备相对的独立性
一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。

函数的分类

C语言中函数分为 库函数自定义函数

  1. 库函数:
    由系统提供,用户不必自己定义,可直接使用。例如:我们常用的 printf()函数 就是 stdio 库中的一个函数。所以调用库函数的时候需要包含该函数所在的库的头文件

     常用库函数即头文件
    #include <stdio.h>	//IO(输入输出)函数 
    #include <string.h>	// 字符或字符串操作函数 
    #include <math.h> //数学函数 
    #include <time.h> //时间、日期函数 
    #include <stdlib.h> //内存操作函数  
    
  2. 自定义函数
    程序员根据不同的功能需求,自己编写的函数。

自定义函数的使用

函数的组成

  • 函数名,最好与函数的功能有关,方便以后按函数名调用函数
  • 参数名字即类型,以便在调用函数的时候向他们传入数据。对无参函数不需要此项
  • 函数体,也就是这个函数是做什么的,函数的功能。这是函数最核心的部分。
  • 函数类型,即函数返回值的类型。如果没有要返回的数据,那么就是 void;如果有返回值,则需要在函数体最后加上:return 返回值变量名
// 返回值类型  函数名  (参数类型 参数名,参数类型 参数名,...)
ret_type fun_name (type para1,type para2,...) // 形参
{
   statement; // 函数体
}

定义函数的方法

  1. 定义无参函数
    无参函数,就是函数名后面的括号里面是空的,没有任何参数。例如样例1中的 print_star() 函数和 print_message() 函数。
    定义无参函数的一般形式:

    类型名 函数名()
    {
    	函数体
    }
    
  2. 定义有参函数
    有参函数,即函数名后面的括号里面不为空。例如:

    int Max(int a,int b)
    {
    	int c;
    	c=a>b?a:b;
    	return c;
    }
    

    函数功能:求出两个数的较大值;
    函数名:Max
    参数:两个 int 类型的形式参数 a,b ,即需要比较的两个数
    返回值:c,即两个传入参数的较大值,因为 c 的类型是 int ,所以函数的返回类型是 int

    定义有参函数的一般形式:

    类型名 函数名(形式参数表列)
    {
    	函数体
    }
    

调用函数

定义函数就是为了要调用函数,所以我们来说说怎么调用已经定义好的函数
注意:调用函数前,一定要先声明定义函数!

调用函数的一般形式:

函数名(实参表列)

例如:

print_star();
c=max(a,b);

是不是很简单!
如果是调用无参函数,则“实参表列”可以没有,但是括号不可以省
如果实参表列包含多个参数,则各参数之间用逗号隔开

样例程序2

输入两个整数,要求输出其中较大者的值,如下图:
在这里插入图片描述
代码:

#include <stdio.h>
int Max(int a,int b)//自定义函数 
{
	int c;
	c=a>b?a:b;//函数体 
	return c;//返回值 
}

int main()
{
	int a,b;	//变量声明 
	printf("请输入两个整数:(以空格隔开)\n");	//提示输入 
	scanf("%d %d",&a,&b);	//输入数据 
	int c=Max(a,b);	//调用Max函数,传入两个实参a,b,将返回值赋值给变量c 
	printf("%d 和 %d 中较大者是 %d\n",a,b,c);	//输出 
	//上面两行也可以简化为下面的一行 
	//printf("%d 和 %d 中较大者是 %d\n",a,b,Max(a,b));	//输出 
	return 0;
}

函数递归

  • 递归的定义:
    如果没明白递归是什么意思,参见“递归”
  • 实际上,递归的意思就是,一个函数在执行时再次调用函数“本身”。
  • 解决递归问题三步走:
    1:确定递归函数功能
    2:找出递归结束的条件,很重要!!!
    3:找出函数的等价关系式

在这里插入图片描述

例子

有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁;问第4个学生多少岁,他说比第3个学生大2岁;问第3个学生多少岁,他说比第2个学生大2岁;问第2个学生多少岁,他说比第1个学生大2岁。最后问第1个学生,他说是10岁。请问第五个学生多少岁?

解题思路

假设第 i 个学生的岁数为 age(i)
由题意:
a g e ( 5 ) = a g e ( 4 ) + 2 age(5) = age(4) + 2 age(5)=age(4)+2
a g e ( 4 ) = a g e ( 3 ) + 2 age(4) = age(3) + 2 age(4)=age(3)+2
a g e ( 3 ) = a g e ( 2 ) + 2 age(3) = age(2) + 2 age(3)=age(2)+2
a g e ( 2 ) = a g e ( 1 ) + 2 age(2) = age(1) + 2 age(2)=age(1)+2
a g e ( 1 ) = 10 age(1) = 10 age(1)=10
由数学表达式表述如下:
a g e ( n ) = 10 ( n = 1 ) age(n) = 10 \quad (n=1) age(n)=10(n=1)
a g e ( n ) = a g e ( n − 1 ) + 2 ( n > 1 ) age(n) = age(n-1) +2 \quad(n>1) age(n)=age(n1)+2(n>1)

代码
#include <stdio.h>

int age(int n)
{
	if(n==1)//递归结束条件
		return 10;
	else
		return age(n-1)+2;//递归等价关系式
}

int main()
{
	int ans=age(5);
	printf("%d\n",ans);	//输出 
	return 0;
}
函数调用过程

在这里插入图片描述

递归经典问题

汉诺塔,斐波那契数列…有兴趣的同学可以自己了解

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值