菜鸟和高手都会基本,那菜鸟为什么是菜鸟,高手为什么是高手呢?很大的区别在于,高手写的程序【结构性】更好,更容易维护。而函数就是C语言结构化的一种手段。

函数可以将大的计算任务划分为多个较小的任务(解耦合),一个设计得当的函数可以将不必要的细节给隐藏起来使程序的整个结构更加清晰,也降低了维护代码的难度
我们其实已经多次使用(调用)函数:printf、scanf都是C标准库的函数,从之前的使用经历,也能体会到上一句话的意义。

我们以下再看一个具体例子的修改过程。

1.实现判断数字的奇偶性

#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;
}

2.通过函数封装判断算法:对奇偶判断函数进行封装

#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;
}

3.没有函数封装,利用while循环减2后余数判断算法进行奇偶判断

#include <stdio.h>

int main(int argc, char* argv[])
{
    int nValue = 0;
    printf("请输入需要判断的数字");
    scanf("%d", &nValue);

//利用值不断减去2,根据最终的计算的值是0还是1判断奇偶
    while (nValue != 0 && nValue != 1)
    {
        nValue -= 2;
    }

    if (nValue == 0)
    {
        printf("偶数\r\n");
    }
    else
    {
        printf("奇数\r\n");
    }
    return 0;
}

4.对新算法进行封装


以上的算法修改,导致程序的结构与之前的版本有较大不同。
但是,如果将新算法封装在判断奇偶性的函数中,则与原有结构看起来非常一致。

//封装while循环
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;
}

5.对数据输入函数进行封装

#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;
}

6.总结


面向过程编程: 函数使得程序模块化
使用函数封装细节,使得程序员只要面向函数的接口编程(参数与返回值),而不用关心函数内部细节

这有利于分清职责,也提高了合作的灵活性。
类似于手机充电线,只要接口能够适配,那么并不关心USB线的另一端是怎样的供电设备。

7.学习视频地址:为什么使用函数?

更多推荐

C语言基础入门48篇_20_函数入门:为什么使用函数?(函数使得程序模块化 使用函数封装细节,使得程序员只要面向函数的接口编程(参数与返回值),而不用关心函数内