《C 程式設計思想》中的CStash第乙個程式的欣賞

2021-06-26 18:04:08 字數 3778 閱讀 7228

看著《c++程式設計思想》, 有點意思

#include #include #include using namespace std;

// element: 儲存元素

// cell : 儲存空間(除了element之外, 可能還有沒有利用、但是已經存在的cell空間)

const int increment = 100; // 定義每次膨脹的cell的個數

typedef struct cstashtag

cstash;

void initiallize(cstash* s, int size);

void cleanup(cstash* s);

int add(cstash* s, const void* element);

void* fetch(cstash* s, int index);

int count(cstash* s);

void inflate(cstash* s, int increase);

// 初始化後, 就知道每個cell的大小了, 若element為int, 則乙個cell的大小為4

void initialize(cstash* s, int sz)

int add(cstash* s, const void* element)

// 增加乙個element, 需要這個element中的值拷貝到下乙個cell空間

int startbytes = s->next * s->size;

unsigned char* e = (unsigned char*)element;

for(int i = 0; i < s->size; i++) //逐個位元組拷貝

s->next++; // element數目自增

return(s->next - 1); //最後乙個element的下標

}void* fetch(cstash* s,int index)

// 返回index所對應的位址

return &(s->storage[index * s->size]);

}int count(cstash* s)

void inflate(cstash* s, int increase)

delete (s->storage);//刪除舊的儲存空間

s->storage = b; //指向新的堆空間

s->quantity = newquantity; // 膨脹後的cell的總數

} void cleanup(cstash* s)

}int main()

// 列印cell空間中的element

for(i = 0; i < count(&intstash); i++)

// 如下**功能類似上面, 所以我就不注釋了

ifstream in;

string line;

const int bufsize = 80;

in.open("main.cpp");

initialize(&stringstash, sizeof(char) * bufsize);

while(getline(in, line))

i = 0;

char* cp = null;

while(null != (cp = (char*)fetch(&stringstash, i++)))

cleanup(&intstash);

cleanup(&stringstash);

return 0;

}

程式的結果為:01

2345

6789

#include

#include

#include

using namespace std;

// element: 儲存元素

// cell   : 儲存空間(除了element之外, 可能還有沒有利用、但是已經存在的cell空間

const int increment = 100; // 定義每次膨脹的cell的個數

typedef struct cstashtag

cstash;

void initiallize(cstash* s, int size);

void cleanup(cstash* s);

int add(cstash* s, const void* element);

void* fetch(cstash* s, int index);

int count(cstash* s);

void inflate(cstash* s, int increase);

// 初始化後, 就知道每個cell的大小了, 若element為int, 則乙個cell的大小為4

void initialize(cstash* s, int sz)

int add(cstash* s, const void* element)

// 增加乙個element, 需要這個element中的值拷貝到下乙個cell空間

int startbytes = s->next * s->size;

unsigned char* e = (unsigned char*)element;

for(int i = 0; i < s->size; i++) //逐個位元組拷貝

s->next++; // element數目自增

return(s->next - 1); //最後乙個element的下標

}void* fetch(cstash* s,int index)

// 返回index所對應的位址

return &(s->storage[index * s->size]);

}int count(cstash* s)

void inflate(cstash* s, int increase)

delete (s->storage);//刪除舊的儲存空間

s->storage = b; //指向新的堆空間

s->quantity = newquantity; // 膨脹後的cell的總數

}void cleanup(cstash* s)

}int main()

// 列印cell空間中的element

for(i = 0; i < count(&intstash); i++)

// 如下**功能類似上面, 所以我就不注釋了

ifstream in;

string line;

const int bufsize = 80;

in.open("main.cpp");

initialize(&stringstash, sizeof(char) * bufsize);

while(getline(in, line))

i = 0;

char* cp = null;

while(null != (cp = (char*)fetch(&stringstash, i++)))

cleanup(&intstash);

cleanup(&stringstash);

return 0;

}freeing storage

freeing storage

其實, 從上面可以看到, cstash結構體顯得有點多餘, 直接用size, quantity, storage, next也是可以的。 之所以還要用結構體, 完全是為了整體性, 讓有點關係的size, quantity, storage, next成為乙個有機體, 便於理解, 便於程式設計, 便於維護, 這就是結構體的最大作用吧

c 程式設計思想 第一章

第一章 物件導言。7 19 在這一章討論了物件導向程式設計 opp 的思想和如何用這一思想解決軟體危機的問題。物件 我們可以設定乙個物件,並對他發出請求 發出乙個訊息 使它能夠為我們完成某種功能,可以向物件發出的請求是由他的介面 inte ce 定義的,而介面由型別確定。對於物件導向程式設計的三個特...

c 程式設計中的除錯技巧 C 程式設計思想

1.除錯標記 適用預處理 define定義乙個或多個除錯標記,在 中把除錯部分使用 ifdef 和 endif 進行管理。當程式最終除錯完成後,只需要使用 undef標記,除錯 就會消失。常用的除錯標記為debug,語句序列 define debug ifdef debug 除錯 endif 2.執...

C 程式設計的一些思想

看完c primer後,了解了c 的語法,但我想往思想,設計方面深究,所以我選擇了看c 程式設計思想。以下是第一章中我記下的筆記。oop 物件導向的程式設計 重用乙個類最簡單的方法就是直接使用這個類的物件,並且還可以講這個類的物件放到乙個新類的裡面。可以用任何數量和型別的其他物件組成新類,通過組合得...