a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > C > 正文

C語(yǔ)言接口與實(shí)現(xiàn)方法實(shí)例詳解

2020-01-26 15:20:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文以實(shí)例形式詳細(xì)講述了C語(yǔ)言接口與實(shí)現(xiàn)方法,對(duì)于深入掌握C語(yǔ)言程序設(shè)計(jì)有一定的借鑒價(jià)值。分享給大家供大家參考。具體分析如下:

一般來(lái)說(shuō),一個(gè)模塊有兩部分組成:接口和實(shí)現(xiàn)。接口指明模塊要做什么,它聲明了使用該模塊的代碼可用的標(biāo)識(shí)符、類型和例程,實(shí)現(xiàn)指明模塊是如何完成其接口聲明的目標(biāo)的,一個(gè)給定的模塊通常只有一個(gè)接口,但是可能會(huì)有許多種實(shí)現(xiàn)能夠提供接口所指定的功能。每個(gè)實(shí)現(xiàn)可能使用不同的算法和數(shù)據(jù)結(jié)構(gòu),但是它們都必須符合接口所給出的使用說(shuō)明。客戶調(diào)用程序是使用某個(gè)模塊的一段代碼,客戶調(diào)用程序?qū)虢涌冢鴮?shí)現(xiàn)導(dǎo)出接口。由于多個(gè)客戶調(diào)用程序是共享接口和實(shí)現(xiàn)的,因此使用實(shí)現(xiàn)的目標(biāo)代碼避免了不必要的代碼重復(fù),同時(shí)也有助于避免錯(cuò)誤,因?yàn)榻涌诤蛯?shí)現(xiàn)只需一次編寫和調(diào)試就可多次使用。

接口

接口只需要指明客戶調(diào)用程序可能使用的標(biāo)識(shí)符即可,應(yīng)盡可能地隱藏一些無(wú)關(guān)的表示細(xì)節(jié)和算法,這樣客戶調(diào)用程序可以不必依賴于特定的實(shí)現(xiàn)細(xì)節(jié)。這種客戶調(diào)用程序和實(shí)現(xiàn)之間的依賴--耦合----可能會(huì)在實(shí)現(xiàn)改變時(shí)引起錯(cuò)誤,當(dāng)這種依賴性埋藏在一些關(guān)于實(shí)現(xiàn)隱藏的或是不明確的假設(shè)中時(shí),這些錯(cuò)誤可能很難修復(fù),因此一個(gè)設(shè)計(jì)良好且描述精確的接口應(yīng)該盡量減少耦合

C語(yǔ)言對(duì)接口和實(shí)現(xiàn)的分離只提供最基本的支持,但是簡(jiǎn)單的約定能給接口/實(shí)現(xiàn)方法論帶來(lái)巨大的好處。在C中,接口在頭文件聲明,頭文件聲明了客戶調(diào)用程序可以使用的宏、類型、數(shù)據(jù)結(jié)構(gòu)、變量以及例程。用戶使用C語(yǔ)言的預(yù)處理指令#include導(dǎo)入接口

下面的例子說(shuō)明了本篇文章的接口中所使用的一些約定、接口:

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,接口頭文件也相應(yīng)地命名為arith.h,接口的名字以前綴的形式出現(xiàn)在接口的每個(gè)標(biāo)識(shí)符中。模塊名不僅提供了合適的前綴,而且還有助于整理客戶調(diào)用程序代碼。

Arith接口還提供了一些標(biāo)準(zhǔn)C函數(shù)庫(kù)中沒有但是很有用的函數(shù),并為出發(fā)和取模提供了良好的定義,而標(biāo)準(zhǔn)C中并沒有給出這些操作的定義和只提供基于實(shí)現(xiàn)的定義。

實(shí)現(xiàn)

一個(gè)實(shí)現(xiàn)導(dǎo)出一個(gè)接口,它定義了必要的變量和函數(shù)以提供接口所規(guī)定的功能,在C語(yǔ)言中,一個(gè)實(shí)現(xiàn)是由一個(gè)或多個(gè).c文件提供的,一個(gè)實(shí)現(xiàn)必須提供其導(dǎo)出的接口所指定的功能。實(shí)現(xiàn)應(yīng)包含接口的.h文件,以保證它的定義和接口的聲明時(shí)一致的。

Arith_min和Arith_max返回其整型參數(shù)中的最小值和最大值:

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返回相應(yīng)的余數(shù)。當(dāng)x與y同號(hào)的時(shí)候,Arith_div(x,y)等價(jià)于x/y,Arith_mod(x,y)等價(jià)于x%y

當(dāng)x與y的符號(hào)不同的時(shí)候,C的內(nèi)嵌操作的返回值就取決于具體的實(shí)現(xiàn):

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

標(biāo)準(zhǔn)庫(kù)函數(shù)總是向零取整,因此div(-13,2)=-2,Arith_div和Arith_mod的語(yǔ)義同樣定義好了:它們總是趨近數(shù)軸的左側(cè)取整,因此Arith_div(-13,5)=-3,Arith_div(x,y)是不超過(guò)實(shí)數(shù)z的最大整數(shù),其中z滿足z*y=x。

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

函數(shù)Arith_ceiling和Arith_floor遵循類似的約定,Arith_ceiling(x,y)返回不小于實(shí)數(shù)商x/y的最小整數(shù)

Arith_floor(x,y)返回不超過(guò)實(shí)數(shù)商x/y的最大整數(shù)

完整實(shí)現(xiàn)代碼如下:

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

抽象數(shù)據(jù)類型

抽象數(shù)據(jù)類型(abstract data type,ADT)是一個(gè)定義了數(shù)據(jù)類型以及基于該類型值提供的各種操作的接口

一個(gè)高級(jí)類型是抽象的,因?yàn)榻涌陔[藏了它的表示細(xì)節(jié),以免客戶調(diào)用程序依賴這些細(xì)節(jié)。下面是一個(gè)抽象數(shù)據(jù)類型(ADT)的規(guī)范化例子--堆棧,它定義了該類型以及五種操作:

#ifndef STACK_INCLUDED#define STACK_INCLUDED#define T Stack_Ttypedef 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

實(shí)現(xiàn)

包含相關(guān)頭文件:

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

Stack_T的內(nèi)部是一個(gè)結(jié)構(gòu),該結(jié)構(gòu)有個(gè)字段指向一個(gè)棧內(nèi)指針的鏈表以及一個(gè)這些指針的計(jì)數(shù):

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

Stack_new分配并初始化一個(gè)新的T:

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

其中NEW是一個(gè)另一個(gè)接口中的一個(gè)分配宏指令。NEW(p)將分配該結(jié)構(gòu)的一個(gè)實(shí)例,并將其指針賦給p,因此Stack_new中使用它就可以分配一個(gè)新的Stack_T

當(dāng)count=0時(shí),Stack_empty返回1,否則返回0:

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

assert(stk)實(shí)現(xiàn)了可檢查的運(yùn)行期錯(cuò)誤,它禁止空指針傳給Stack中的任何函數(shù)。

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是另一個(gè)接口中定義的釋放宏指令,它釋放指針參數(shù)所指向的空間,然后將參數(shù)設(shè)為空指針

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

完整實(shí)現(xiàn)代碼如下:

#include <stddef.h>#include "assert.h"#include "mem.h"#include "stack.h"#define T Stack_Tstruct 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);}

相信本文所述對(duì)大家的C程序設(shè)計(jì)有一定的借鑒價(jià)值。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 国产成人在线视频 | 黄色小视频在线观看 | 插插射啊爱视频日a级 | 精品成人一区 | 成 人 免 费 网 站 | 国产成人jvid在线播放 | 国产一级电影网 | 99精品久久久久 | 奇米av | 久久久久久久久久久网站 | 国产小视频一区二区 | 欧美高清a | 亚洲影视一区二区 | av四虎| 桃花久久| 欧美激情综合色综合啪啪五月 | 一级毛片aaaaaa免费看 | 99久久婷婷国产综合精品 | 国产特级毛片 | 日韩成人一区 | 欧美午夜精品一区二区三区电影 | 亚洲精品一区二区三区蜜桃久 | 中文成人在线 | 伊人午夜 | 欧美成人一区二区 | 亚洲精品一区二三区不卡 | 亚洲区一 | 亚洲444kkkk在线观看最新 | 久久精品黄 | 国产综合一区二区 | 日韩精品专区 | 黄色操视频 | 亚洲爱婷婷色婷婷五月 | 中文字幕国产 | 日日摸日日爽 | 色婷婷中文| 成人一二三区 | 欧美高清在线观看 | 国产传媒在线视频 | 日本视频黄| 免费日韩成人 |