亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言接口與實現方法實例詳解

2020-01-26 15:20:35
字體:
來源:轉載
供稿:網友

本文以實例形式詳細講述了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_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

實現

包含相關頭文件:

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

相信本文所述對大家的C程序設計有一定的借鑒價值。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本人成精品视频在线| 81精品国产乱码久久久久久| 欧美性猛交xxxx乱大交| 久久伊人色综合| 亚洲japanese制服美女| 成人久久久久久| 亚洲va欧美va国产综合剧情| 国产成人福利视频| 日韩av快播网址| 亚洲电影免费在线观看| 日本亚洲欧洲色α| 亚洲精品小视频| 国产精品视频99| 亚洲a∨日韩av高清在线观看| 国内精品久久久久久久| 国产欧美精品日韩| 亚洲欧美日韩天堂| 欧美激情在线有限公司| 伊人激情综合网| 日韩av电影国产| 欧美性xxxx18| 色一情一乱一区二区| 日韩小视频在线观看| 国产女人18毛片水18精品| 成人黄色午夜影院| 国产亚洲精品高潮| 国产日本欧美视频| 色av吧综合网| 国产做受高潮69| 91久久精品国产91久久| 国产精品黄视频| 亚洲国产欧美自拍| 欧美wwwxxxx| 亚洲美女在线观看| 亚洲精品电影网| 狠狠躁夜夜躁人人躁婷婷91| 国产欧美亚洲精品| 久久香蕉国产线看观看网| 97免费视频在线播放| 亚洲理论在线a中文字幕| 国产精品最新在线观看| 国产精品久久久久久久久| 操人视频在线观看欧美| 欧美高跟鞋交xxxxxhd| 爽爽爽爽爽爽爽成人免费观看| 亚洲精品99久久久久中文字幕| 日韩美女av在线| 92看片淫黄大片欧美看国产片| 欧美成人午夜影院| 欧美精品在线播放| 日韩视频在线免费| 91欧美精品午夜性色福利在线| 国产精品成人免费电影| 欧日韩在线观看| 亚洲毛茸茸少妇高潮呻吟| 国产精品视频在线观看| 国产精品草莓在线免费观看| 国产一区二区三区欧美| 欧美大成色www永久网站婷| 欧美激情免费观看| 欧美精品激情在线观看| 亚洲xxxx视频| 91精品视频免费观看| 久久综合久久八八| 亚洲综合第一页| 亚洲男人的天堂在线| 国产精品免费视频久久久| 国产精品成人va在线观看| 国产欧美一区二区三区四区| 韩剧1988在线观看免费完整版| 欧美日韩国产成人在线观看| 日韩动漫免费观看电视剧高清| 国产91色在线|免| 精品国产乱码久久久久久天美| 91九色国产视频| 亚洲qvod图片区电影| 国产在线精品一区免费香蕉| 久久精品99久久久香蕉| 国产精品久久久久久久av大片| 在线观看国产成人av片| 久久网福利资源网站| 亚洲最大福利视频网站| 国产不卡av在线| 日产日韩在线亚洲欧美| 欧美午夜片欧美片在线观看| 亚洲人成啪啪网站| 中文字幕亚洲综合久久筱田步美| 日韩福利在线播放| 91久久中文字幕| 国产精品日韩在线观看| 色系列之999| 欧美激情亚洲自拍| 亚洲一区国产精品| 久久中文久久字幕| 国产z一区二区三区| 亚洲精品久久久久久久久| 国产精品十八以下禁看| 国产精品69av| 亚洲第一中文字幕在线观看| 亚洲一区二区三区xxx视频| 国产精品久久久久91| 欧美尺度大的性做爰视频| 亚洲欧洲日产国码av系列天堂| 中文字幕在线精品| 国产精品第8页| 亚洲精品成人av| 欧美日韩国产中文字幕| 久久久国产视频91| 日韩精品丝袜在线| 精品欧美一区二区三区| 91丨九色丨国产在线| 亚洲欧美日韩精品久久| 国产亚洲精品成人av久久ww| 亚洲精品视频免费在线观看| 亚洲色在线视频| 欧美精品video| www国产亚洲精品久久网站| 日韩高清av在线| 日韩精品免费观看| 91九色综合久久| 一区二区三区在线播放欧美| 久久久久国产一区二区三区| 亚洲精品中文字幕av| 久久久精品国产一区二区| 在线免费观看羞羞视频一区二区| 日韩欧美亚洲一二三区| 亚洲成人激情视频| 亚洲黄色www| 亚洲深夜福利视频| 日韩一区视频在线| 热久久99这里有精品| 欧美精品www在线观看| 精品香蕉在线观看视频一| 国产区精品在线观看| 丁香五六月婷婷久久激情| 午夜精品99久久免费| 亚洲精品一区二区网址| 亚洲毛片在线看| 亚洲精品www久久久久久广东| 国产欧美久久一区二区| 欧美精品一本久久男人的天堂| 欧美性少妇18aaaa视频| 国产精品日韩在线播放| 精品高清美女精品国产区| 2019av中文字幕| 亚洲大尺度美女在线| 久久69精品久久久久久国产越南| 日韩精品在线影院| 亚洲欧美成人精品| 欧美激情a∨在线视频播放| 亚洲色图日韩av| 国产久一一精品| 奇米四色中文综合久久| 国产成人黄色av| 国产美女扒开尿口久久久| 国产精品免费网站| 久久久av免费| 久久精品国产亚洲精品2020| 中文字幕自拍vr一区二区三区| 国产精品久久久久久久久久尿| 国产成人黄色av| 欧美性一区二区三区| 毛片精品免费在线观看| 欧美猛交ⅹxxx乱大交视频|