92-93.利用函数实现模块化程序设计

利用函数实现模块化程序设计:

1.封装:何为函数的封装,就是把代码封装进去,对调用者来说都话就是因此我们的实现功能。

(1)调用者(外界)对函数的影响--仅限于入口函数。

(2)函数对调用者(外界)的影响--仅限于我们函数的返回值,指针形参。

2.就是检查函数的入口参数的有效合法,检查函数是否调用成功。

3.函数的规模要小。//<80

4.函数的规模要单一。

5.函数结课的定义要清晰。

函数设计的要求:

        可复用性:任何一个提供服务的模块都有可能在其他程序中复用。例如我们的print_ar模块就是可复用的,由于通常很难预测模块的未来使用,因此最好将模块设计成可复用的。

        可维护性:模块化后,程序中的错误通常只影响一个模块实现,也更容易找到并修正错误,在修正了错误之后,重建程序秩序重新编译,该模块实现。然后重新连接整个程序即可,更广泛的说,为了提高性能或将程序移植到另一个平台上,我们甚至可以替换整个模块的实现。

        上面这些好处都很重要,但其中可无可维护性是最重要的,现实中大多数程序会使用很多年,在使用过程中会发现问题。并做一些改进和修改,以适应需求的变化,将程序按摩快进行设计,会使维护更容易。维护一个程序就像维护一辆汽车一样,修理轮胎应该不需要同时检查引擎。

        可读性:就是要让其他开发者比较容易理解你写程序的思路与用意。

可读性差原因如下:
1、程序只有开发此程序的程序员自己看的懂,其他人需要费很大劲,也就是程序的逻辑跟常人不一样。
2、程序中使用一些莫名其妙的函数名或变量名之类的,其他人读程序时完全摸不着头脑,因此,一些函数名
和变量名应简单明了,最好与它在程序中的作用有关。
增加程序的可读性的方法:
命名:为了代码更容易理解,最简单的方法之一就是给你的函数,变量命名描述性很强的名字,避免使用奇怪
名字。
方法:方法的参数不要过多,如果参数过多,原因是参数太多都不知道这些参数都做什么。
注释:注释要写详细。
健壮性
如何增强函数的健壮性呢?
第一,在函数的入口处。检查输入参数的合法性。输入值的合法性。

第二,检查函数的返回值

内聚性与偶合性好的模块接口并不是声明的,所以设计良好的程序中,模块应具有下面两个性质。

高内聚性。模块中的元素应该逼次紧密相关。我们可以认为它们是为了同一目标而相互合作的。高内聚性会使模块更易于使用,同时使程序更容易理解。

低耦合性。模块之间应该尽可能相互独立。低耦合性可以使程序更便于修改,并方便以后复用模块。

C语言的函数接口:

        函数的调用者和其实现者之间存在一个协议,在调用函数之前,调用者要为是闲着提供某些条件,在函数返回时,实现者实现调用者需要的功能。

        函数接口通过函数名参数和返回值能描述这个协议,只要函数名和参数名和命名合理。参数的返回值的类型定义的准确,应用者仅仅通过函数接口就能知道函数的用法。

代码:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define ARSIZE 100
void init_ar(int *br,int n)
{
    int val=0;
    for(int i=0;i<n;++i)
    {
        val=rand()%100 +1;
        br[i]=val;
    }
}
void print_ar(int *br,int n)
{
    for(int i=0;i<n;++i)
    {
        printf("%4d",br[i]);
        if((i+1)%10==0)
        {
            printf("\n");
        }
    }
    printf("\n");
}
void swap(int*a,int*b)
{
    int tmp=*a;
    *a=*b;
    *b=tmp;
}
void bubblesort_ar(int *br,int n)
{
    //冒泡排序 从小到大
    assert(br!=nullptr);
    for(int i=0;i<n;++i)
    {
        bool tag=true;
        for(int j=0;j<n-i;++j)       
        if(br[j]>br[j+1])
        {
            swap(&br[j],&br[j+1]);
            tag=false;
        }
        if(tag)
        {
            break;//如果此次循环没有发生交换,则退出
        }
    }
}
int main()
{
    int ar[ARSIZE]={0};
    init_ar(ar,ARSIZE);
    print_ar(ar,ARSIZE);
    bubblesort_ar(ar,ARSIZE);
    print_ar(ar,ARSIZE);
    return 0;
}

结果:

  42  68  35   1  70  25  79  59  63  65
   6  46  82  28  62  92  96  43  28  37
  92   5   3  54  93  83  22  17  19  96
  48  27  72  39  70  13  68 100  36  95
   4  12  23  34  74  65  42  12  54  69
  48  45  63  58  38  60  24  42  30  79
  17  36  91  43  89   7  41  43  65  49
  47   6  91  30  71  51   7   2  94  49
  30  24  85  55  57  41  67  77  32   9
  45  40  27  24  38  39  19  83  30  42

   1   2   3   4   5   6   6   7   7   9
  12  12  13  17  17  19  19  22  23  24
  24  24  25  27  27  28  28  30  30  30
  30  32  34  35  36  36  37  38  38  39
  39  40  41  41  42  42  42  42  43  43
  43  45  45  46  47  48  48  49  49  51
  54  54  55  57  58  59  60  62  63  63
  65  65  65  67  68  68  69  70  70  71
  72  74  77  79  79  82  83  83  85  89
  91  91  92  92  93  94  95  96  96 100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值