1樓:晨曦月殤
一個模組有兩部分組成:介面和實現。介面指明模組要做什麼,它宣告瞭使用該模組的**可用的識別符號、型別和例程,實現指明模組是如何完成其介面宣告的目標的,一個給定的模組通常只有一個介面,但是可能會有許多種實現能夠提供介面所指定的功能。
每個實現可能使用不同的演算法和資料結構,但是它們都必須符合介面所給出的使用說明。客戶呼叫程式是使用某個模組的一段**,客戶呼叫程式匯入介面,而實現匯出介面。由於多個客戶呼叫程式是共享介面和實現的,因此使用實現的目標**避免了不必要的**重複,同時也有助於避免錯誤,因為介面和實現只需一次編寫和除錯就可多次使用
實現一個實現匯出一個介面,它定義了必要的變數和函式以提供介面所規定的功能,在c語言中,一個實現是由一個或多個.c檔案提供的,一個實現必須提供其匯出的介面所指定的功能。實現應包含介面的.
h檔案,以保證它的定義和介面的宣告時一致的。
arith_min和arith_max返回其整型引數中的最小值和最大值:
int arith_max(int x, int y)
int arith_min(int x, int y)
arith_div返回y除以x得到的商,arith_mod返回相應的餘數。當x與y同號的時候,arith_div(x,y)等價於x/y,arith_mod(x,y)等價於x%y
當x與y的符號不同的時候,c的內嵌操作的返回值就取決於具體的實現:
eg.如果-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的最大整數
完整實現**如下:
arith.c
抽象資料型別
抽象資料型別(abstract data type,adt)是一個定義了資料型別以及基於該型別值提供的各種操作的介面
一個高階型別是抽象的,因為介面隱藏了它的表示細節,以免客戶呼叫程式依賴這些細節。下面是一個抽象資料型別(adt)的規範化例子--堆疊,它定義了該型別以及五種操作:
stack.h
實現包含相關標頭檔案:
#include
#include "assert.h"
#include "mem.h"
#include "stack.h"
#define t stack_t
stack_t的內部是一個結構,該結構有個欄位指向一個棧內指標的連結串列以及一個這些指標的計數:
struct t *head;
};stack_new分配並初始化一個新的t:
t stack_new(void)
其中new是一個另一個介面中的一個分配巨集指令。new(p)將分配該結構的一個例項,並將其指標賦給p,因此stack_new中使用它就可以分配一個新的stack_t
當count=0時,stack_empty返回1,否則返回0:
int stack_empty(t stk)
assert(stk)實現了可檢查的執行期錯誤,它禁止空指標傳給stack中的任何函式。
stack_push和stack_pop從stk->head所指向的連結串列的頭部新增或移出元素:
void stack_push(t stk, void *x)
void *stack_pop(t stk)
free是另一個介面中定義的釋放巨集指令,它釋放指標引數所指向的空間,然後將引數設為空指標
void stack_free(t *stk)
free(*stk);
}完整實現**如下:
#include
#include "assert.h"
#include "mem.h"
#include "stack.h"
#define t stack_t
struct t *head;
};t stack_new(void)
int stack_empty(t stk)
void stack_push(t stk, void *x)
void *stack_pop(t stk)
void stack_free(t *stk)
free(*stk);}
2樓:
沒問題,這是結果:
rtgsts6[rtgs110]% makerm -rf main.o sort.o sortecho 'this is makeobject'
this is makeobject
xlc -c main.c
xlc -c sort.c
echo 'this is 'sort
this is sort
xlc -o sort main.o sort.orm -rf main.o sort.o
rtgsts6[rtgs111]% ./sort0 1 22 22 33 44 111 234 678 989
0.000000
倒是你得main()少了個int main(),這不會是你得錯吧++++++++++++++++++++++++++++++++++++++++
都給你結果了,還問有問題!我都跑出來了,沒問題,老大!
c語言中的介面是什麼?它和抽象類有什麼區別? 5
3樓:匿名使用者
把stdio.h庫比喻成bai一個黑箱子
,duprintf就是它的其中zhi一個介面。通過介面你可以使dao用箱子裡的某內個功能(在這裡容是輸出字元)而不用去關心printf的實現,死鑽stdio.h裡的亂七八糟的原理。
類(不是說抽象類)是c++的東西,比如車類,由自身屬性(顏色,重量什麼的)和行為(前進,左轉等)所構成,有點擬人的感覺。你只能讓車做行為而改變自己屬性(前進撞牆了等)而不能直接改變它的屬性(自動改變顏色?)還有其他什麼繼承就不羅嗦了。
抽象類是類的其中一種特殊的類。
4樓:匿名使用者
c語言中說的介面就是一個函式。供別人呼叫。c語言是程序導向的,沒有類的感念,所有的函式只要可見就能被呼叫。
5樓:匿名使用者
1、在c語言中,bai
C語言程式設計中陣列的定義,c語言陣列的定義
這種題目一般不希望設計記憶體管理。所以一般都是進可能給一個比較大的陣列。例如a 10 表示位數不會超過十,你輸入的時候需要個索引記錄a陣列有效的位數。使用的時候,只使用有效位數。肯定會有一段記憶體不用的。或多或少。這就是陣列儲存動態資料特點。如果記憶體管理的話,你設計個增量比如5.一旦索引告訴你10...
C語言關於定義函式實現兩個數交換
要用bai函式實現兩個數du的交換,則函式zhi引數必須定義為指標形式,dao否則函式專 中對數值的修改將不會影響屬主調函式,這是c語言的規則。所以,以整型為例,自定義函式書寫如下 void swap int int a,int b c語言用函式如何實現兩個數交換?include stdio.h i...
c語言與易語言什麼區別,C語言與易語言什麼區別
簡單說 易語言是中文 好學 c是英文 不會英語的人很難學 希望採納!什麼是易語言?它和vb c語言 c 等有什麼區別和相同點?答 易語言是中國人自己開發的一種程式語言,是一款全中文程式 的程式語言,和vb c語言 c c 等都屬於同一性質,都是用來開發程式和編寫軟體用的。易語言的核心由c 編寫而成,...