當前位置:編程學習大全網 - 編程語言 - 編程順序

編程順序

//簡單文本編輯器. cpp:定義控制臺應用程序的入口點。

//

# include & ltiostream.h & gt

# include & ltistream.h & gt

# include & ltfstream.h & gt

# include & ltstring.h & gt

# include & ltstdlib.h & gt

const long maxLen = 80

enum Error_code {success,overflow,underflow,range_error,failed}。

//////////////////////////////////////////////////////////////////////////

模板& lt類Node _ entry & gt

結構節點

{

//數據成員

Node_entry條目;

節點& ltNode _ entry & gt*下壹個;

//構造函數

node();

Node(Node_entry項,Node & ltNode _ entry & gt* link = NULL);

};

模板& lt類Node _ entry & gt

節點& ltNode _ entry & gt*節點()

{

next = NULL

}

模板& lt類Node _ entry & gt

節點& ltNode _ entry & gt* Node(Node _ entry項,Node & ltNode _ entry & gt*鏈接)

{

條目=項目;

下壹個=鏈接;

}

模板& ltclass List _ entry & gt

根據考試成績分等級排列的投考者的名單

{

公共:

~ List();

list();

List(const List & lt;List _ entry & gt& amp復制);

void運算符=(const List & lt;List _ entry & gt& amp復制);

錯誤代碼插入(long position,const List _ entry & ampx);

錯誤代碼清除();

Error_code remove(長位置);

錯誤代碼檢索(長位置,列表條目& amp項);

錯誤代碼替換(列表條目& ampx,多頭);

bool empty()常量;

long size()const;

void write();

受保護:

長計數;

節點& ltList _ entry & gt*頭;

節點& ltList _ entry & gt*set_position(多頭頭寸)const

私人:

};

模板& ltclass List _ entry & gt

列表& ltList _ entry & gt*清單()

{

count = 0;

head = NULL

}

模板& ltclass List _ entry & gt

列表& ltList _ entry & gt* List(const List & lt;List _ entry & gt& amp復制)

{

Node *new_copy,* copy _ node = copy.head

count = copy.count

if(copy _ node = = NULL)head = NULL;

其他

{

head = new _ copy = new Node & ltNode _ entry & gt(復制節點-& gt;詞條);

while(copy _ node-& gt;下壹個!=空)

{

復制節點=復制節點-& gt;接下來;

new _ copy-& gt;next =新節點& ltNode _ entry & gt(復制節點-& gt;詞條);

new _ copy = new _ copy-& gt;接下來;

}

}

}

模板& ltclass List _ entry & gt

列表& ltList _ entry & gt::~List()

{

而(!empty())

刪除(0);

}

模板& ltclass List _ entry & gt

無效列表& ltList _ entry & gt* operator =(const List & lt;List _ entry & gt& amp復制)

{

Node *new_head,*new_copy,* copy _ node = copy.head

count = copy.count

if(copy _ node = = NULL)new _ head = NULL;

其他

{

new_copy = new_head =新節點(copy _ Node-& gt;詞條);

while(copy _ node-& gt;下壹個!=空)

{

復制節點=復制節點-& gt;接下來;

new _ copy-& gt;next =新節點(copy _ Node-& gt;詞條);

new _ copy = new _ copy-& gt;接下來;

}

}

而(!empty())

刪除(0);

head = new _ head

}

模板& ltclass List _ entry & gt

錯誤代碼列表& ltList _ entry & gt*插入(多頭頭寸,常量列表_條目& ampx)

{

if(position & lt;0 ||位置& gt計數)

返回range _ error

節點& ltList _ entry & gt* new_node,*上壹個,*下壹個;

if(position & gt;0)

{

previous = set _ position(position-1);

following = previous->;接下來;

}

其他

以下=頭;

new_node =新節點& ltList _ entry & gt(x,以下);

if(新節點==空)

返回溢出;

if(position == 0)

head =新節點;

其他

上壹個-& gt;next = new _ node

count++;

返回成功;

}

模板& ltclass List _ entry & gt

節點& ltList _ entry & gt*列表& ltList _ entry & gt* set _ position(多頭頭寸)常量

{

節點& ltList _ entry & gt*p =頭;

for(int I = 0;我& lt位置;i ++)

p = p-& gt;接下來;

返回p;

}

模板& ltclass List _ entry & gt

錯誤代碼列表& ltList _ entry & gt*清除()

{

而(!empty())

刪除(0);

返回成功;

}

模板& ltclass List _ entry & gt

錯誤代碼列表& ltList _ entry & gt*移除(多頭頭寸)

{

if(position & lt;0 ||位置& gt=計數)

返回range _ error

節點& ltList _ entry & gt*p,*電流;

if(position == 0)

{

p =頭部;

head = head-& gt;接下來;

}

其他

{

當前= set _ position(position-1);

p =當前-& gt;接下來;

當前->;next = p-& gt;接下來;

}

刪除(p);

count-;

返回成功;

}

模板& ltclass List _ entry & gt

錯誤代碼列表& ltList _ entry & gt*替換(List _ entry & ampx,多頭)

{

節點& ltList _ entry & gt* current = NULL

if(position & lt;0 ||位置& gt=計數)

返回range _ error

current = set_position(位置);

當前->;entry = x;

返回成功;

}

模板& ltclass List _ entry & gt

錯誤代碼列表& ltList _ entry & gt*檢索(多頭頭寸,列表條目& amp項目)

{

節點& ltList _ entry & gt* current = NULL

if(position & lt;0 ||位置& gt=計數)

返回range _ error

current = set_position(位置);

item =當前-& gt;詞條;

返回成功;

}

模板& ltclass List _ entry & gt

長列表& ltList _ entry & gt*大小()常量

{

返回計數;

}

模板& ltclass List _ entry & gt

布爾列表& ltList _ entry & gt* empty()常量

{

return(count = = 0);

}

模板& ltclass List _ entry & gt

無效列表& ltList _ entry & gt*寫()

{

節點& ltList _ entry & gt*水流=水頭;

龍n;

for(n = 0;n & lt數數;n ++)

{

cout & lt& lt當前->;詞條;

電流=電流-& gt;接下來;

}

}

//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////

類別字符串

{

公共:

string();

~ String();

字符串(常量字符串& amp復制);

string(const char * copy);

字符串(列表& ltchar & gt& amp復制);

弦與弦。運算符=(常量字符串& amp復制);

const char * c _ str()const;

布爾運算符==(常量字符串& amp項);

布爾運算符& gt(常量字符串& amp項);

布爾運算符& lt(常量字符串& amp項);

布爾運算符& gt=(常量字符串& amp項);

布爾運算符& lt=(常量字符串& amp項);

布爾運算符!=(常量字符串& amp項);

牡蠣之友& amp操作員& lt& lt(ostream & ampstream,String obj);

受保護:

char *條目;

int長度;

私人:

};

void strcat(String & amp;add_to,const String & ampadd _ on);

字符串讀入(istream & ampiuput);

字符串讀入(istream & amp國際輸入輸出公司。終結者);

void strcpy(String & amp;復制,常量字符串和。原創);

void strncpy(字符串& amp復制,常量字符串和。original,int n);

長字符串(常量字符串& amp文本、常量字符串和。目標);

無效寫入(字符串& amps);

//////////////////////////////////////////////////////////////////////////

字符串::~字符串()

{

刪除[]個條目;

}

String::String()

{

entries = new char[maxLen+1];

如果(!條目)

{

cerr & lt& lt”分配錯誤\ n”;

退出(1);

}

長度= 0;

條目[0]= ' \ 0 ';

}

String::String(常量String & amp復制)

{

length = copy.length

條目=新字符[長度+1];

如果(!條目)

{

cerr & lt& lt”分配錯誤\ n”;

退出(1);

}

strcpy(entries,copy . entries);

}

String::String(const char *copy)

{

length = strlen(copy);

條目=新字符[長度+1];

strcpy(條目,副本);

}

String::String(List & lt;char & gt& ampin_list)

{

length = in _ list . size();

條目=新字符[長度+1];

for(int I = 0;我& lt長度;i ++)

in_list.retrieve(i,entries[I]);

條目[長度]= ' \ 0 ';

}

const char *String::c_str()常量

{

return (const char *)條目;

}

弦與弦。String::operator =(const String & amp;復制)

{

如果(& amp收到。=這個)

{

length = copy.length

刪除[]個條目;

條目=新字符[長度+1];

如果(!條目)

{

cerr & lt& lt”分配錯誤\ n”;

退出(1);

}

strcpy(entries,copy . entries);

}

其他

cout & lt& lt"試圖將字符串賦值給它自己!\ n ";

返回* this

}

bool String::operator==(常量字符串& amp項目)

{

return strcmp(c_str()、item . c _ str())= = 0;

}

bool String::運算符& lt(常量字符串& amp項目)

{

return strcmp(c_str()、item . c _ str())& lt;0;

}

bool String::operator & gt;(常量字符串& amp項目)

{

return strcmp(c_str()、item . c _ str())& gt;0;

}

bool String::operator & gt;=(常量字符串& amp項目)

{

return strcmp(c_str()、item . c _ str())& gt;= 0;

}

bool String::運算符& lt=(常量字符串& amp項目)

{

return strcmp(c_str()、item . c _ str())& lt;= 0;

}

bool String::運算符!=(常量字符串& amp項目)

{

返回strcmp(c_str(),item.c_str())!= 0;

}

牡蠣&;操作員& lt& lt(ostream & amp流,字符串對象)

{

write(obj);

回流;

}

void strcat(String & amp;add_to,const String & ampadd_on)

{

const char * c first = add _ to . c _ str();

const char * cs second = add _ on . c _ str();

char * copy = new char[strlen(cf first)+strlen(cs second)+1];

strcpy(copy,cf first);

strcat(copy,cs second);

add _ to = copy

刪除[]副本;

}

字符串讀入(istream & amp輸入)

{

列表& ltchar & gt溫度;

int size = 0;

char c;

while((c = input.peek())!EOF & amp& amp(c = input.get())!= '\n ')

temp . insert(size ++ c);

字符串答案(temp);

返回答案;

}

字符串讀入(istream & amp輸入,int & amp終結者)

{

列表& ltchar & gt溫度;

int size = 0;

char c;

while((c = input.peek())!EOF & amp& amp(c = input.get())!= '\n ')

temp . insert(size ++ c);

終結符= c;

字符串答案(temp);

返回答案;

}

void strcpy(String & amp;復制,常量字符串和。原文)

{

副本=原件;

}

void strncpy(字符串& amp復制,常量字符串和。原始,整數)

{

int I;

const char *ori = original.c_str()。

char * temp = new char[n+1];

for(I = 0;我& ltn;i ++)

{

temp[I]= ori[I];

}

temp[n]= ' \ 0 ';

string nori ginal(temp);

copy = noriginal

刪除[]temp;

}

void fail(long f[],const String & amp目標)

{

龍I,j;

const char * t = target . c _ str();

f[0]=-1;

for(j = 1;j & lt(長)strlen(t);j ++)

{

I = f[j-1];

while(*(t + j)!= *(t+I+1)& amp;& amp我& gt= 0)

I = f[I];

if(*(t + j) == *(t + i+1))

f[j]= I+1;

其他

f[j]=-1;

}

}

長字符串(常量字符串& amp文本、常量字符串和。目標)

{

const char * T = text . c _ str();

const char * P = target . c _ str();

long lenT = strlen(T),lenP = strlen(P),posT = 0,posP = 0;

if(lenP == 0 || lenT == 0)

{

cout & lt& lt"空目標或文本!"& lt& ltendl

return-1;

}

其他

{

long * f = new long[lenP];

失敗(f,目標);

while(posP & lt;倫普& amp& ampposT & lt四旬齋)

{

if(P[posP] == T[posT])

{

posp++;

posT ++的;

}

else if(posP == 0)

posT ++的;

else posP = f[posP-1]+1;

}

if(posP & lt;lenP)

{

刪除[]f;

return-1;

}

其他

{

刪除[]f;

借閱後歸還;

}

}

}

無效寫入(字符串& amps)

{

const char * display = s . c _ str();

if(顯示[0]!= '\0')

cout & lt& lt顯示& lt& ltendl

其他

cout & lt& lt“空弦!”& lt& ltendl

}

//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////

類編輯器:公共列表& lt字符串& gt

{

公共:

editor();

bool get _ command();

void run _ command();

受保護:

私人:

char user _ command

節點& lt字符串& gt*當前;

長線;

錯誤代碼next _ line();

錯誤代碼previous _ line();

錯誤代碼goto _ line();

錯誤代碼insert _ line();

Error_code change_line()。

void read _ file();

void write _ file();

void find _ string();

};

編輯器::編輯器()

{

current = NULL

line =-1;

}

錯誤代碼編輯器::next_line()

{

錯誤代碼結果=成功;

if(line & lt;計數- 1)

{

line++;

current = set _ position(line);

}

其他

結果=範圍_誤差;

返回結果;

}

錯誤代碼編輯器::previous_line()

{

錯誤代碼結果=成功;

if(line & gt;0)

{

行-;

current = set _ position(line);

}

其他

結果=範圍_誤差;

返回結果;

}

Error_code Editor::goto_line()

{

錯誤代碼結果=成功;

長偏移;

cout & lt& lt“妳想走哪條線?”& lt& lt同花順;

CIN & gt;& gt偏移;

if(offset & gt;= 0 & amp& ampoffset & lt計數)

{

line = offset

current = set _ position(line);

}

其他

結果=範圍_誤差;

返回結果;

}

void編輯器::find_string()

{

長指數;

cout & lt& lt輸入要搜索的字符串:“& lt& lt同花順;

string search _ string = read _ in(CIN);

while((index = strstrstr(current-& gt;entry,search_string)) == -1)

if(next_line()!=成功)突破;

if(index = =-1)cout & lt;& lt"找不到字符串。";

其他

{

cout & lt& lt(當前->;條目)。c _ str()& lt;& ltendl

for(long I = 0;我& lt指數;i ++)

cout & lt& lt" ";

for(無符號長整型j = 0;j & ltstrlen(search _ string . c _ str());j ++)

cout & lt& lt"^";

}

cout & lt& ltendl

}

錯誤代碼編輯器::change_line()

{

Error_code結果=成功;

cout & lt& lt"您想替換哪個文本段?"& lt& lt同花順;

string old _ text = read _ in(CIN);

cout & lt& lt"您想添加什麽新的文本段?"& lt& lt同花順;

string new _ text = read _ in(CIN);

long index = strstrstr(current-& gt;詞條,老_文);

if(index == -1)結果=失敗;

否則{

String new _ line

strncpy(new_line,current-& gt;詞條,索引);

strcat(new_line,new _ text);

const char * old _ line =(current-& gt;條目)。c _ str();

strcat(new_line,(String)(old _ line+index+strlen(old _ text . c _ str())));

當前->;entry = new _ line

}

返回結果;

}

錯誤代碼編輯器::insert_line()

{

錯誤代碼結果;

長line _ number

cout & lt& lt“插入什麽行號?”& lt& lt同花順;

CIN & gt;& gt行號;

while(cin.get()!= '\n ')

cout & lt& lt"要插入的新行是什麽?"& lt& lt同花順;

string to _ insert = read _ in(CIN);

outcome = insert(line_number,to _ insert);

line = line _ number

current = set _ position(line);

返回結果;

}

bool user_says_yes()

{

字符順序;

CIN & gt;& gt訂單;

return(order = = ' Y ' | | order = = ' Y ');

}

bool Editor::get_command()

{

如果(當前!=空)

cout & lt& ltline & lt& lt":"

& lt& lt當前->;entry . c _ str()& lt;& lt" \ n " & lt& lt同花順;

其他

cout & lt& lt“文件是空的。\ n " & lt& lt同花順;

CIN & gt;& gtuser _ command

user_command = tolower(用戶_命令);

while(cin.get()!= '\n ')

if(user_command == 'q ')

返回false

其他

返回true

}

void編輯器::run_command()

{

字符串temp _ string

開關(用戶命令)

{

案例“b”:

if(empty())

cout & lt& lt"警告:緩沖區為空" & lt& ltendl

其他

while(previous_line() ==成功)

打破;

案例“c”:

if(empty())

cout & lt& lt"警告:緩沖區為空" & lt& ltendl

else if(change_line()!=成功)

cout & lt& lt“錯誤:替換失敗”& lt& ltendl

打破;

案例“d”:

if(移除(count - 1)!=成功)

cout & lt& lt“錯誤:刪除失敗”& lt& ltendl

打破;

案例“e”:

if(empty())

cout & lt& lt"警告:緩沖區為空" & lt& ltendl

其他

while(next_line() ==成功)

打破;

案例“f”:

if(empty())

cout & lt& lt"警告:文件為空" & lt& ltendl

其他

find _ string();

打破;

案例“g”:

if(goto_line()!=成功)

cout & lt& lt"警告:沒有此行" & lt& ltendl

打破;

案子嗎?:

案例“h”:

cout & lt& lt"有效的命令是:b(egin)c(hange)d(El)e(nd)f(ind)g(o)h(elp)" & lt;& lt恩德爾

& lt& lt" I(nsert)l(ength)n(ext)p(rior)q(uit)w(rite)" & lt;& ltendl

打破;

案例“I”:

if(insert_line()!=成功)

cout & lt& lt“錯誤:插入失敗”& lt& ltendl

打破;

案例“l”:

cout & lt& lt“有”& lt& ltsize()& lt;& lt"文件中的行。"& lt& ltendl

如果(!empty())

cout & lt& lt"當前線路長度是"

& lt& ltstrlen((set _ position(count-1)-& gt;條目)。c _ str())& lt;& ltendl

打破;

案例“n”:

if(next_line()!=成功)

cout & lt& lt"警告:在緩沖區的末尾" & lt& ltendl

打破;

案例“p”:

if(previous_line()!=成功)

cout & lt& lt"警告:在緩沖區的開頭" & lt& ltendl

打破;

案例“w”:

if(empty())

cout & lt& lt"警告:文件為空" & lt& ltendl

其他

write();

打破;

默認值:

cout & lt& lt“按h還是?獲取幫助或輸入有效的命令:";

}

}

int main()

{

編輯器緩沖區;

cout & lt& lt"有效的命令是:b(egin)c(hange)d(El)e(nd)f(ind)g(o)h(elp)" & lt;& lt恩德爾

& lt& lt" I(nsert)l(ength)n(ext)p(rior)q(uit)w(rite)" & lt;& ltendl

while(buffer.get_command())

buffer . run _ command();

返回0;

}

我做的數據結構作業沒有文件功能。換壹個就好。

  • 上一篇:美團外賣滿減神器功能體驗
  • 下一篇:怎樣用遙控器修改中9PID碼?我的機子是V5的。謝謝
  • copyright 2024編程學習大全網