Logo

郎哥编程

第38讲:函数与代码的可复用性

2026-04-10 21

前面我们写的C程序代码使用了C语言自身提供的printf、scanf等函数,也使用了一些其它函数。这些函数的共同性质就是它们都能完成一些特定的功能,printf函数用于输出功能,scanf函数用于输入功能。

在前面使用函数时,我们把函数看成黑盒,把输入扔进黑盒,黑盒会对输入进行处理,最后输出结果。本节我们要打开函数的盒子,看一看函数的内部是什么样子?

一、语句重复的代码

案例1:不使用循环结构,计算自然数10以内的累加和。

//声明变量sum,并初始化为0
int sum = 0;
//求10以内的累加和
sum += 1;
sum += 2;
sum += 3;
sum += 4;
sum += 5;
sum += 6;
sum += 7;
sum += 8;
sum += 9;
//输出sum
printf("10以内数字的累加和为:%d",sum);

代码创建了变量sum并初始化为零,然后连续9条语句求自然数1至自然数9的累加和,最后输出sum变量。上面的程序代码和程序的执行结果都没有问题,但这不是最好的编程方式。因为上面代码的重复语句太多,代码看上去也不够简洁,需要使用更好的方法改变代码结构,避免编写大量的重复语句。

二、功能重复的代码

可以使用for循环结构来避免编写重复的代码。

for(i=0;i<10;i++)
    sum += i

使用for循环结构求自然数10以内的累加和,程序代码看上去简洁多了,也没有了重复语句。for循环改变了代码的结构,提高了代码的复用性。

案例2:求自然数10以内和20以内的累加和。

for(i=0;i<10;i++)
    sum += i;
sum = 0;
for(i=0;i<20;i++)
    sum += i;

上面的程序代码完成两个功能:一个功能是求自然数10以内的累加和并输出;第二个功能是求自然数20以内的累加和并输出。这两个功能相同,代码也几乎完全相同,只是循环次数不同,这种情况就属于功能性重复,循环可以解决代码重复的问题,但解决不了功能性重复的问题。

三、使用函数解决代码重复的问题

我们可以设想一下,在上面的程序代码中,如果我们把求自然数累加和的代码单独编写为一个代码块,自然数作为代码块的一个参数传入进去,该代码块对传入的自然数求累加和,并把求和结果返回给调用这个代码块的语句,这样就解决了程序中功能性重复的问题。

在C语言中,C提供了函数用来解决类似上面功能性重复的问题,其实函数的作用不仅用于解决功能性重复的问题,更重要的是用于对程序逻辑进行结构化或过程化的一种编程方法。

它可以将能够完成独立功能的代码块封装成易于管理的函数,这些函数可以被程序中的其它语句调用,而调用者可以把函数看成黑盒,不用考虑函数的内部结构和特性,只需传入参数和接收返回值就可以了。

四、函数的定义

在C语言中,函数分为三部分:第一部分是函数首部,函数首部占一行语句;第二部分是函数体,函数体可以占多行语句,函数体内包括函数注释和代码;第三部分是返回语句,如果函数没有返回值可以省略返回语句。

函数的定义一般包括下面的内容:

在C函数结构中,“datatype”是函数返回的数据类型,若函数无返回值,可以使用关键字“void”表示该函数无返回值。“functionname”表示函数的名称,函数名称的命名需要符合标识符命名规则。“parameters”表示传入函数的形参表,多个参数之间使用英文逗号分隔。 “函数_文档字符串”是函数的注释文档,主要给出函数的功能、参数说明等信息(注释文档可以省略),“function_suite”是函数的代码。return是返回语句,如果函数没有返回值,返回语句可以省略。“expression”是返回的表达式、变量或数值常量。

形参表是传入函数的参数变量,可以传入多个参数变量,每个参数变量之间用英文逗号分隔,形参表的语法如下:

datatype para1,……,datatype paran

其中datatype是参数变量的数据类型,para1是参数变量的名称,参数变量可以在函数体内使用,但不能在函数体外使用。关于函数参数变量的使用范围在后面的课程还会详细讲述。

我们了解了函数结构后,就可以使用函数来解决上面程序中求自然数累加和功能重复的问题。

例【1】定义一个函数

程序清单 sample.c

#include<stdio.h>
void main()
{
	int number;
	printf("请输入一个自然数:");
	scanf("%d",&number);
	printf("\n1至自然数%d累加和为:%d\n",n,fun_sum(number));
}
// 自定义函数fun_sum
int fun_sum(int n)
{
	// 变量sum存储自然数n的累加和
	int i,sum = 0;
	// 计算自然数n的累加和
	for( i = 0; i<n; i++ )
		sum+=i;
	// 返回sum
	return sum;
}

例1演示了如何定义和调用自定义函数。

int fun_sum(int n)是自定义函数的首部,int是函数返回的数据类型,若函数不返回值,可以使用void关键字,fun_sum是自定义函数名称,(int n)是函数传入的参数变量,参数变量被封闭在一对小括号内,int n是参数变量,int是数据类型,n是参数变量名称。

函数体和返回语句被封闭在一对大括号内,参数变量n仅限制在函数体内使用,使用方法和变量的使用方法相同,return是C语言的返回语句,sum是返回的值,该函数返回变量sum的值给调用函数的语句。若函数无返回值,不要使用return语句。

fun_sum()函数定义完成后,就可以被函数外的代码调用,函数的调用方法为:

functionname(parameters)

其中functionname是函数的名称,parameters是实参表,实参表对应函数定义的形参表,形参表声明了几个参数变量,实参表就需要传入几个参数变量,传入参数变量的数据类型要和形参表声明的参数变量的数据类型相同。

例1调用fun_sum()函数的语句为:

printf("\n1至自然数%d累加和为:%d\n",n,fun_sum(number));

在printf()函数的参数列表内调用fun_sum()函数,并传入number实参,函数返回自然数number的累加和。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论