C语言之函数封装技巧
目录
前言
一、函数在源代码中的三种状态
二、函数封装的运用
案例1:实现打印20以内的素数
案例2:存放因子数并返回长度
三、return返回与形参返回
四、<>与“”
五、解耦
总结
前言
在C语言中,函数封装是一种重要的技巧,它可以提高代码的可读性、可维护性和复用性。通过函数封装,我们可以将功能相关的代码逻辑封装到一个函数中,使代码结构更加清晰,同时也可以隐藏细节实现,提高代码的安全性。
一、函数在源代码中的三种状态
在C语言中,函数在源代码中可以有三种状态,分别是:
-
函数声明:在函数定义之前,提前声明函数原型的状态。声明函数包括函数名称、参数列表及返回类型。这种声明告诉编译器关于函数的存在和如何调用函数。
-
函数定义:对函数进行实际的定义,包括函数体内的具体操作以及返回值。函数定义提供了函数的实际实现。
-
函数调用:在程序中其他地方使用函数的状态。通过函数调用,程序可以执行函数体内的操作,并获取返回值。
这三种状态共同构成了C语言中函数在源代码中的存在和使用方式。
完整功能代码:
#include <stdio.h>
//语法:前置声明
//开发:规划设计
//动词作为函数名
/*
得到 最大值的下标
参数:arr 一组数
len 数组长度
返回: 最大下标
*/
int getMaxIndex(double a[], int len);
int main()
{
/* 4.编写一个函数,返回double数组中最大元素的下标 */
double a[]={1,43.3,5.3,55.6,74.8,2.5};
//场景调用 推演函数的结构是否符合需要
int xb = getMaxIndex(a,6);
printf("最大值是:%1f 其下标是%d",a[xb],xb);
return 0;
}
int getMaxIndex(double a[], int len)
{
int maxIndex = 0;
for (int i = 1; i < len; i++)
{
if (a[maxIndex] < a[i])
{
maxIndex = i;
}
}
return maxIndex;
}
二、函数封装的运用
案例1:实现打印20以内的素数
要打印20以内的素数,首先需要编写一个程序来判断一个数字是否为素数。素数是指除了1和本身以外没有其他因数的自然数。在这个例子中,我们只需要判断20以内的数字是否为素数。
#include <stdio.h>
#include<math.h>
//1 规划设计
/*
判断一个数是否是素数
参数:num 一个正整数
返回:0不是 1是
*/
int isOrNot(int num);
int main()
{
/* 编写函数: 判断一个数是否是素数*/
/* 调用素数函数 打印出20以内所有的素数*/
for (int n = 2; n < 20; n++)
{
if (isOrNot(n))
{
printf("%d ", n);
}
}
return 0;
}
int isOrNot(int num)
{
double pfg = sqrt(num);
for (int ys = 2; ys <= pfg; ys++)
{
if (num % ys == 0)
{
return 0;
}
}
return 1;
}
案例2:存放因子数并返回长度
功能是将一个给定的正整数的所有因数存放到一个数组中,并返回因数的个数。因数是能够整除给定正整数的数。程序会返回一个整数,代表因数的个数。
#include <stdio.h>
/*
参数:n : 一个正整数
a: 因数存入到的数组位置
返回值: 存入数组的实际数量
*/
int fun16(int n,int* a);
int main()
{
/* 编写函数:把一个正整数的所有因数存放到一个数组里并返回因数的个数 */
int num=20;
int ys[100];
int count = fun16(num, ys);
for (int i = 0; i < count; i++)
{
printf("%d ", ys[i]);
}
return 0;
}
int fun16(int n, int* a)
{
int count = 0;
for (int i=1;i<=n/2;i++)
{
if (n % i == 0)
{
a[count++] = i;
}
}
a[count++] = n;
return count;
}
三、return返回与形参返回
return语句用于函数的返回值,而形参用于传递参数。在需要修改外部变量的值时,可以使用形参返回值的方式,实现对外部变量的改变。
//形参返回的例子
//1 接收 return 返回的值
time_t sj1 = time(NULL);
printf("%lld\n", sj1);
//2 接收 形参“返回”的值
time_t sj2;
time(&sj2);
printf("%lld\n", sj2);
return 0;
四、<>与“”
在C语言中,使用尖括号<>表示引用标准库头文件,而使用双引号""表示引用用户自定义的头文件。
- 使用<>时,编译器会在标准系统目录下搜索对应的头文件,例如
#include <stdio.h>
。 - 使用""时,编译器会先在当前目录下搜索对应的头文件,如果找不到则在系统目录下搜索,例如
#include "myheader.h"
。
因此,一般来说,对于引用标准库的头文件应该使用<>,而对于引用自定义头文件应该使用""。
五、解耦
高内聚低耦合,在C语言中,解耦指的是将程序中的不同部分或模块之间的依赖关系降低到最低限度,以提高代码的可维护性、可重用性和可扩展性。
六、最终封装效果
体现了函数的复用性、可读性、维护性。
总结
在C语言中,函数封装是通过将相关的代码片段封装到一个函数中来提高代码的可读性和可维护性。在函数封装时,应该遵循单一职责原则,确保每个函数只完成一个特定的任务。另外,合理命名函数和使用适当的参数类型、返回类型也是提高函数封装质量的关键。最后,注释和文档的编写可以帮助他人更好地理解函数的作用和用法。