视频地址: https://www.bilibili.com/video/av73223995
函数可以将大的计算任务划分为多个较小的任务,一个设计得当的函数可以将不必要的细节给隐藏起来使程序的整个结构更加清晰,也降低了维护代码的难度。
我们其实已经多次使用(调用)函数:printf、scanf都是C标准库的函数,从之前的使用经历,也能体会到上一句话的意义。
我们以下再看一个具体例子的修改过程。
今天的视频涉及的函数语法知识,在之后的视频中都会一一介绍。
判断数字的奇偶性
#include <stdio.h>
int main(int argc, char* argv[])
{
int nValue = 0;
printf("请输入需要判断的数字");
scanf("%d", &nValue);
if (nValue % 2 == 0)
{
printf("偶数\r\n");
}
else
{
printf("奇数\r\n");
}
return 0;
}
通过函数封装判断算法
#include <stdio.h>
int IsEvenNumber(int nNumber)
{
if (nNumber % 2 == 0)
return 1;
else
return 0;
}
int main(int argc, char* argv[])
{
int nValue = 0;
printf("请输入需要判断的数字");
scanf("%d", &nValue);
if (IsEvenNumber(nValue))
{
printf("偶数\r\n");
}
else
{
printf("奇数\r\n");
}
return 0;
}
如果没有函数封装,修改了判断算法
#include <stdio.h>
int main(int argc, char* argv[])
{
int nValue = 0;
printf("请输入需要判断的数字");
scanf("%d", &nValue);
while (nValue != 0 && nValue != 1)
{
nValue -= 2;
}
if (nValue == 0)
{
printf("偶数\r\n");
}
else
{
printf("奇数\r\n");
}
return 0;
}
以上的算法修改,导致程序的结构与之前的版本有较大不同。
但是,如果将新算法封装在判断奇偶性的函数中,则与原有结构看起来非常一致。
int IsEvenNumber(int nNumber)
{
while (nNumber != 0 && nNumber != 1)
{
nNumber -= 2;
}
if (nNumber == 0)
return 1;
else
return 0;
}
int main(int argc, char* argv[])
{
int nValue = 0;
printf("请输入需要判断的数字");
scanf("%d", &nValue);
if (IsEvenNumber(nValue))
{
printf("偶数\r\n");
}
else
{
printf("奇数\r\n");
}
return 0;
}
进一步封装
#include <stdio.h>
int IsEvenNumber(int nNumber)
{
while (nNumber != 0 && nNumber != 1)
{
nNumber -= 2;
}
if (nNumber == 0)
return 1;
else
return 0;
}
int GetUserNumber()
{
int nValue = 0;
printf("请输入需要判断的数字");
scanf("%d", &nValue);
return nValue;
}
int main(int argc, char* argv[])
{
int nNumber = GetUserNumber();
if (IsEvenNumber(nNumber))
{
printf("偶数\r\n");
}
else
{
printf("奇数\r\n");
}
return 0;
}
面向过程编程:函数使得程序模块化
使用函数封装细节,使得程序员只要面向函数的接口编程(参数与返回值),而不用关心函数内部细节。
这有利于分清职责,也提高了合作的灵活性。
类似于手机充电线,只要接口能够适配,那么并不关心USB线的另一端是怎样的供电设备。