讀書筆記--C語言介面與實現--介面與實現
阿新 • • 發佈:2019-01-04
介面實現
重點內容在本書中的第二章中,介紹了介面的封裝例子。
1. 介面定義
C語言中可將介面封裝好,讓後以.h檔案作文擴充套件,簡單例子:
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.h中宣告。
以上6個函式都是對兩個數的操作,求最大值,求最小值,除法,向上去整,向下取整。個人覺得對於定義介面的話,主要是找對最佳的函式引數,返回值,這一步比較簡單。
2. 具體實現
這幾個函式的實現比較簡單,不過,作為一個介面封裝的例子,比較好地詮釋了一個過程。
int Arith_max(int x, int y)
{
int max = 0;
if(x >= y)
max = x;
else
max = y;
return 0;
}
int Arith_min(int x, int y)
{
int min = 0;
if(x >= y)
min = y;
else
min = x;
return 0;
}
對於除法來說,其中會涉及到內建的操作符;也可通過除法來做取餘操作,不過,通過負數除正數,單純地以內建除法來做,結果會向零舍入,比如:-13/5 = -2 結果如果以Int來算話。書中原話介紹。
The built-in operators are thus useful only for positive operands. The standard library functions div and ldiv take two integers or long integers and return the quotient and remainder in the quot and rem fields of a structure. Their semantics are well defined: they always truncatetoward zero, so div(-13, 5).quot is always equal to −2.
int Arith_div(int x,int y)
{
if((-13/5)&&
((x<0)!=(y<0))&&
(x%y != 0))
return x/y - 1;
else
return x/y;
}
/*上面的條件(-13/5)得到判斷內建除法 結果會得到-2,可以試試,但是用windows計算器計算-13/5會得到-3,這就是經過處理了。*/
int Arith_mod(int x, int y) {
return x - y*Arith_div(x, y);
}
3. 抽象型別
在這個小節中,用C語言的抽象方式,來對一個棧進行定義與實現。根據自己的理解,對書中的程式碼有些許改動,更好地理解。
stack.h
#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 "stack.h"
#define T Stack_T
struct T {
int count;
struct elem {
void *x;
struct elem *link;
} *head;
};
T Stack_new(void) {
T stk;
stk = malloc(sizeof(stk));
stk->count = 0;
stk->head = NULL;
return stk;
}
void Stack_push(T stk, void *x) {
struct elem *t;
assert(stk);
t = malloc(sizeof(struct elem));
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);
}
int Stack_empty(const struct T *stk) {
assert(stk);
return stk->count == 0;
}
main.c
#include"stack.h"
int main()
{
Stack_T s;
s = Stack_new();
char x[] = "123";
Stack_push(s,x);
printf("%s\n", (char*)Stack_pop(s));
Stack_push(s, x);
if (Stack_empty(s) != 0)
Stack_free(s);
return 0;
}