C语言接口与实现:创建可重用软件的技术 PDF 超清版

  • 更新时间:
  • 7168人关注
  • 点击下载

给大家带来的一篇关于C语言相关的电子书资源,介绍了关于C语言、C语言接口与实现、软件技术方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小70.34MB,戴维 R.汉森(David R. Han编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:8.1分

资源详情相关推荐
C语言接口与实现:创建可重用软件的技术
  • 出版社:人民邮电出版社
  • 作者:戴维、R.汉森(David、R.、Han
  • 大小:70.34MB
  • 类别:C语言
  • 热度:649
  • 脑动力:C语言函数速查效率手册
  • 嵌入式Linux C语言应用开发教程
  • 写给大家看的C语言书(第二版)
  • C语言基础知识学习及总结
  • C语言程序设计
  • 由汉森编著的《C语言接口与实现:创建可重用软件的技术》概念清晰、实例详尽,是一本有关设计、实现和有效使用C语言库函数,掌握创建可重用C语言软件模块技术的参考指南。书中提供了大量实例,重在阐述如何用一种与语言无关的方法将接口设计实现独立出来,从而用一种基于接口的设计途径创建可重用的API。

    《C语言接口与实现:创建可重用软件的技术》是所有C语言程序员不可多得的好书,也是所有希望掌握可重用软件模块技术的人员的理想参考书,适合各层次的面向对象软件开发人员、系统分析员阅读。

    目录

    • 第1章 引言
    • 1.1 文学程序
    • 1.2 程序设计风格
    • 1.3 效率
    • 1.4 扩展阅读
    • 1.5 习题
    • 第2章 接口与实现
    • 2.1 接口
    • 2.2 实现
    • 2.3 抽象数据类型
    • 2.4 客户程序的职责
    • 2.5 效率
    • 2.6 扩展阅读
    • 2.7 习题
    • 第3章 原子
    • 3.1 接口
    • 3.2 实现
    • 3.3 扩展阅读
    • 3.4 习题
    • 第4章 异常与断言
    • 4.1 接口
    • 4.2 实现
    • 4.3 断言
    • 4.4 扩展阅读
    • 4.5 习题
    • 第5章 内存管理
    • 5.1 接口
    • 5.2 产品实现
    • 5.3 稽核实现
    • 5.4 扩展阅读
    • 5.5 习题
    • 第6章 再谈内存管理
    • 6.1 接口
    • 6.2 实现
    • 6.3 扩展阅读
    • 6.4 习题
    • 第7章 链表
    • 7.1 接口
    • 7.2 实现
    • 7.3 扩展阅读
    • 7.4 习题
    • 第8章 表
    • 8.1 接口
    • 8.2 例子:词频
    • 8.3 实现
    • 8.4 扩展阅读
    • 8.5 习题
    • 第9章 集合
    • 9.1 接口
    • 9.2 例子:交叉引用列表
    • 9.3 实现
    • 9.3.1 成员操作
    • 9.3.2 集合操作
    • 9.4 扩展阅读
    • 9.5 习题
    • 第10章 动态数组
    • 10.1 接口
    • 10.2 实现
    • 10.3 扩展阅读
    • 10.4 习题
    • 第11章 序列
    • 11.1 接口
    • 11.2 实现
    • 11.3 扩展阅读
    • 11.4 习题
    • 第12章 环
    • 12.1 接口
    • 12.2 实现
    • 12.3 扩展阅读
    • 12.4 习题
    • 第13章 位向量
    • 13.1 接口
    • 13.2 实现
    • 13.2.1 成员操作
    • 13.2.2 比较
    • 13.2.3 集合操作
    • 13.3 扩展阅读
    • 13.4 习题
    • 第14章 格式化
    • 14.1 接口
    • 14.1.1 格式化函数
    • 14.1.2 转换函数
    • 14.2 实现
    • 14.2.1 格式化函数
    • 14.2.2 转换函数
    • 14.3 扩展阅读
    • 14.4 习题
    • 第15章 低级字符串
    • 15.1 接口
    • 15.2 例子:输出标识符
    • 15.3 实现
    • 15.3.1 字符串操作
    • 15.3.2 分析字符串
    • 15.3.3 转换函数
    • 15.4 扩展阅读
    • 15.5 习题
    • 第16章 高级字符串
    • 16.1 接口
    • 16.2 实现
    • 16.2.1 字符串操作
    • 16.2.2 内存管理
    • 16.2.3 分析字符串
    • 16.2.4 转换函数
    • 16.3 扩展阅读
    • 16.4 习题
    • 第17章 扩展精度算术
    • 17.1 接口
    • 17.2 实现
    • 17.2.1 加减法
    • 17.2.2 乘法
    • 17.2.3 除法和比较
    • 17.2.4 移位
    • 17.2.5 字符串转换
    • 17.3 扩展阅读
    • 17.4 习题
    • 第18章 任意精度算术
    • 18.1 接口
    • 18.2 例子:计算器
    • 18.3 实现
    • 18.3.1 取反和乘法
    • 18.3.2 加减法
    • 18.3.3 除法
    • 18.3.4 取幂
    • 18.3.5 比较
    • 18.3.6 便捷函数
    • 18.3.7 移位
    • 18.3.8 与字符串和整数的转换
    • 18.4 扩展阅读
    • 18.5 习题
    • 第19章 多精度算术
    • 19.1 接口
    • 19.2 例子:另一个计算器
    • 19.3 实现
    • 19.3.1 转换
    • 19.3.2 无符号算术
    • 19.3.3 有符号算术
    • 19.3.4 便捷函数
    • 19.3.5 比较和逻辑操作
    • 19.3.6 字符串转换
    • 19.4 扩展阅读
    • 19.5 习题
    • 第20章 线程
    • 20.1 接口
    • 20.1.1 线程
    • 20.1.2 一般信号量
    • 20.1.3 同步通信通道
    • 20.2 例子
    • 20.2.1 并发排序
    • 20.2.2 临界区
    • 20.2.3 生成素数
    • 20.3 实现
    • 20.3.1 同步通信通道
    • 20.3.2 线程
    • 20.3.3 线程创建和上下文切换
    • 20.3.4 抢占
    • 20.3.5 一般信号量
    • 20.3.6 MIPS和ALPHA上的上下文切换
    • 20.4 扩展阅读
    • 20.5 习题
    • 附录A 接口摘要
    • 参考书目
       
    展开阅读
    精选笔记:C语言接口与实现方法实例详解

    24小时7分钟前回答

    本文以实例形式详细讲述了C语言接口与实现方法,对于深入掌握C语言程序设计有一定的借鉴价值。分享给大家供大家参考。具体分析如下:

    一般来说,一个模块有两部分组成:接口和实现。接口指明模块要做什么,它声明了使用该模块的代码可用的标识符、类型和例程,实现指明模块是如何完成其接口声明的目标的,一个给定的模块通常只有一个接口,但是可能会有许多种实现能够提供接口所指定的功能。每个实现可能使用不同的算法和数据结构,但是它们都必须符合接口所给出的使用说明。客户调用程序是使用某个模块的一段代码,客户调用程序导入接口,而实现导出接口。由于多个客户调用程序是共享接口和实现的,因此使用实现的目标代码避免了不必要的代码重复,同时也有助于避免错误,因为接口和实现只需一次编写和调试就可多次使用。

    接口

    接口只需要指明客户调用程序可能使用的标识符即可,应尽可能地隐藏一些无关的表示细节和算法,这样客户调用程序可以不必依赖于特定的实现细节。这种客户调用程序和实现之间的依赖--耦合----可能会在实现改变时引起错误,当这种依赖性埋藏在一些关于实现隐藏的或是不明确的假设中时,这些错误可能很难修复,因此一个设计良好且描述精确的接口应该尽量减少耦合

    C语言对接口和实现的分离只提供最基本的支持,但是简单的约定能给接口/实现方法论带来巨大的好处。在C中,接口在头文件声明,头文件声明了客户调用程序可以使用的宏、类型、数据结构、变量以及例程。用户使用C语言的预处理指令#include导入接口

    下面的例子说明了本篇文章的接口中所使用的一些约定、接口:

    extern int Arith_max(int x, int y);
    extern int Arith_min(int x, int y);
    extern int Arith_div(int x, int y);
    extern int Arith_mod(int x, int y);
    extern int Arith_ceiling(int x, int y);
    extern int Arith_floor (int x, int y);
    

    该接口的名字为Arith,接口头文件也相应地命名为arith.h,接口的名字以前缀的形式出现在接口的每个标识符中。模块名不仅提供了合适的前缀,而且还有助于整理客户调用程序代码。

    Arith接口还提供了一些标准C函数库中没有但是很有用的函数,并为出发和取模提供了良好的定义,而标准C中并没有给出这些操作的定义和只提供基于实现的定义。

    实现

    一个实现导出一个接口,它定义了必要的变量和函数以提供接口所规定的功能,在C语言中,一个实现是由一个或多个.c文件提供的,一个实现必须提供其导出的接口所指定的功能。实现应包含接口的.h文件,以保证它的定义和接口的声明时一致的。

    Arith_min和Arith_max返回其整型参数中的最小值和最大值:

    int Arith_max(int x, int y) {
      return x > y ? x : y;
    }
    int Arith_min(int x, int y) {
      return x > y ? y : x;
    }
    
    

    Arith_div返回y除以x得到的商,Arith_mod返回相应的余数。当x与y同号的时候,Arith_div(x,y)等价于x/y,Arith_mod(x,y)等价于x%y

    当x与y的符号不同的时候,C的内嵌操作的返回值就取决于具体的实现:

    如果-13/5=2,-13%5=-3,如果-13/5=-3,-13%5=2

    标准库函数总是向零取整,因此div(-13,2)=-2,Arith_div和Arith_mod的语义同样定义好了:它们总是趋近数轴的左侧取整,因此Arith_div(-13,5)=-3,Arith_div(x,y)是不超过实数z的最大整数,其中z满足z*y=x。

    Arith_mod(x,y)被定义为x-y*Arith_div(x,y)。因此Arith_mod(-13,5)=-13-5*(-3)=2

    函数Arith_ceiling和Arith_floor遵循类似的约定,Arith_ceiling(x,y)返回不小于实数商x/y的最小整数

    Arith_floor(x,y)返回不超过实数商x/y的最大整数

    完整实现代码如下:

    #include "arith.h"
    int Arith_max(int x, int y) {
      return x > y ? x : y;
    }
    int Arith_min(int x, int y) {
      return x > y ? y : x;
    }
    int Arith_div(int x, int y) {
      if (-13/5 == -2
      &&  (x < 0) != (y < 0) && x%y != 0)
        return x/y - 1;
      else
        return x/y;
    }
    int Arith_mod(int x, int y) {
      if (-13/5 == -2
      &&  (x < 0) != (y < 0) && x%y != 0)
        return x%y + y;
      else
        return x%y;
    }
    int Arith_floor(int x, int y) {
      return Arith_div(x, y);
    }
    int Arith_ceiling(int x, int y) {
      return Arith_div(x, y) + (x%y != 0);
    }
    

    抽象数据类型

    抽象数据类型(abstract data type,ADT)是一个定义了数据类型以及基于该类型值提供的各种操作的接口

    一个高级类型是抽象的,因为接口隐藏了它的表示细节,以免客户调用程序依赖这些细节。下面是一个抽象数据类型(ADT)的规范化例子--堆栈,它定义了该类型以及五种操作:

    #ifndef STACK_INCLUDED
    #define STACK_INCLUDED
    #define T Stack_T
    typedef struct T *T;
    extern T   Stack_new (void);
    extern int  Stack_empty(T stk);
    extern void Stack_push (T stk, void *x);
    extern void *Stack_pop (T stk);
    extern void Stack_free (T *stk);
    #undef T
    #endif
    

    实现

    包含相关头文件:

    #include <stddef.h>
    #include "assert.h"
    #include "mem.h"
    #include "stack.h"
    #define T Stack_T
    

    Stack_T的内部是一个结构,该结构有个字段指向一个栈内指针的链表以及一个这些指针的计数:

    struct T {
      int count;
      struct elem {
        void *x;
        struct elem *link;
      } *head;
    };
    

    Stack_new分配并初始化一个新的T:

    T Stack_new(void) {
      T stk;
      NEW(stk);
      stk->count = 0;
      stk->head = NULL;
      return stk;
    }
    

    其中NEW是一个另一个接口中的一个分配宏指令。NEW(p)将分配该结构的一个实例,并将其指针赋给p,因此Stack_new中使用它就可以分配一个新的Stack_T

    当count=0时,Stack_empty返回1,否则返回0:

    int Stack_empty(T stk) {
      assert(stk);
      return stk->count == 0;
    }
    

    assert(stk)实现了可检查的运行期错误,它禁止空指针传给Stack中的任何函数。

    Stack_push和Stack_pop从stk->head所指向的链表的头部添加或移出元素:

    void Stack_push(T stk, void *x) {
      struct elem *t;
      assert(stk);
      NEW(t);
      t->x = x;
      t->link = stk->head;
      stk->head = t;
      stk->count++;
    }
    void *Stack_pop(T stk) {
      void *x;
      struct elem *t;
      assert(stk);
      assert(stk->count > 0);
      t = stk->head;
      stk->head = t->link;
      stk->count--;
      x = t->x;
      FREE(t);
      return x;
    }
    

    FREE是另一个接口中定义的释放宏指令,它释放指针参数所指向的空间,然后将参数设为空指针

    void Stack_free(T *stk) {
      struct elem *t, *u;
      assert(stk && *stk);
      for (t = (*stk)->head; t; t = u) {
        u = t->link;
        FREE(t);
      }
      FREE(*stk);
    }
    

    完整实现代码如下:

    #include <stddef.h>
    #include "assert.h"
    #include "mem.h"
    #include "stack.h"
    #define T Stack_T
    struct T {
      int count;
      struct elem {
        void *x;
        struct elem *link;
      } *head;
    };
    T Stack_new(void) {
      T stk;
      NEW(stk);
      stk->count = 0;
      stk->head = NULL;
      return stk;
    }
    int Stack_empty(T stk) {
      assert(stk);
      return stk->count == 0;
    }
    void Stack_push(T stk, void *x) {
      struct elem *t;
      assert(stk);
      NEW(t);
      t->x = x;
      t->link = stk->head;
      stk->head = t;
      stk->count++;
    }
    void *Stack_pop(T stk) {
      void *x;
      struct elem *t;
      assert(stk);
      assert(stk->count > 0);
      t = stk->head;
      stk->head = t->link;
      stk->count--;
      x = t->x;
      FREE(t);
      return x;
    }
    void Stack_free(T *stk) {
      struct elem *t, *u;
      assert(stk && *stk);
      for (t = (*stk)->head; t; t = u) {
        u = t->link;
        FREE(t);
      }
      FREE(*stk);
    }
    

    相信本文所述对大家的C程序设计有一定的借鉴价值。

    展开阅读

    资源下载

    相关资源

    • C语言提高学习及总结

      大小:1.8 MBC语言

      立即下载
    • C语言程序设计(第二版)

      C语言程序设计(第二版)

      本书的内容包括程序设计语言概念(包括C和C )、程序设计概念、算法概念、C语言的词法、C语言的数据表示和运算、三种基本控制结构、函数的定义和调用、数组、结构体、指针等复杂数据类型的应用、文件操作、C 面向对象的程序设计机制等。每章都配有练习题。 本书的特点:①重点介绍C语言基本的、常用的语法,忽略不常用内容;②注重程序设计语言的共性,使读者学习C语言之后具有自学其他程序设计语言的能力;③以介绍C语言的语法为线索,

      大小:210 KBC语言

      立即下载
    • 自制编程语言:基于C语言

      自制编程语言:基于C语言

      前百度网高级技术工程师、专业书《电脑操作系统实情复原》的创作者的另一大作业内权威专家联名鞋强烈推荐滴滴打车系统部技术性高级主管于晓声阿里巴巴网蚂蚁金服技术性权威专家肖金

      大小:259.8 MBC语言编程

      立即下载
    • 数据结构:C语言版

      数据结构:C语言版

      《数据结构》(C语言版)是为数据结构课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参数教材。 本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。其内容和章节编排1992年4月出版的《数据结构》(第二版)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构和算法的描述语言。 本书概念表述严谨,逻辑推理严

      大小:694 KB数据结构

      立即下载
    • 《C语言从入门到精通》教学视频,素材,PPT,文件

      《C语言从入门到精通》教学视频,素材,PPT,文件

      编辑推荐 *零基础、入门级的讲解n 无论读者是否从事计算机相关行业,是否接触过C语言,是否使用C语言开发过项目,都能从本书中获益。n *超多、实用、专业的范例和项目n 本书结合实际工作中的范例,逐一讲解C语言的各种知识和技术。之后以实际开发项目来总结本书所学内容,帮助读者在实战中掌握知识,轻松拥有项目经验。n *随时检测自己的学习成果n 每章首页给出了本章要点,以便读者明确学习方向,读者可以随时自我检测,巩固所学知识。n

      大小:1.4 GBC语言

      立即下载

    学习笔记

    22小时34分钟前回答

    MySQL的C语言API接口

    1、首先当然是连接数据库,函数原型如下: MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned long clientflag); 第一个参数 MYSQL是 C api中一个非常重要的变量,里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。mysql_real_connect函数中各参数,基本都是顾名思意。 2、连接数据库成功之后就可以执行sql语句了使用mysql_query int STDCALL mysql_query(MYSQL *mysql, const char *q); 第一个参数上面已经……