




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
串基本操作的演示【問題描述】如果語言沒有把串作為一個預先定義好的基本類型對待,又需要用該語言寫一個涉及串操作的軟件系統(tǒng)時,用戶必須自己實現串類型。試實現串類型,并寫一個串的基本操作的演示系統(tǒng)?!净疽蟆吭诮炭茣?.2.2節(jié)用堆分配存儲表示實現HString串類型的最小操作子集的基礎上,實現串抽象數據類型的其余基本操作(不使用C語言本身提供的串函數)。參數合法性檢查必須嚴格。利用基本操作函數構造以下系統(tǒng):它是一個命令解釋程序,循環(huán)往復地處理用戶鍵入的每一條命令,直至終止程序的命令為止。命令定義如下:賦值。格式:A〈串標識〉〈回車〉用〈串標識〉所表示的串的值建立新串,并顯示新串的內部名和串值。例:A‘Hi!’判相等。格式:E〈串標識1>〈串標識2>〈回車〉若兩串相等,則顯示"EQUAL”,否則顯示"UNEQUAL”。聯接。格式:C〈串標識1>〈串標識2>〈回車〉將兩串拼接產生結果串,它的內部名和串值都顯示出來。求長度。格式:L〈串標識〉〈回車〉顯示串的長度。求子串。格式:S〈串標識〉+〈數1>+〈數2><回車〉如果參數合法,則顯示子串的內部名和串值。<數>不帶正負號。子串定位。格式:I〈串標識1>〈串標識2>〈回車〉顯示第二個串在第一個串中首次出現時的起始位置。串替換。格式:R〈串標識1>〈串標識2>〈串標識3>〈回車〉將第一個串中所有出現的第二個串用第三個串替換,顯示結果串的內部名和串值,原串不變。顯示。格式:P〈回車〉顯示所有在系統(tǒng)中被保持的串的內部名和串值的對照表。刪除。格式:D〈內部名〉〈回車〉刪除該內部名對應的串,即賦值的逆操作。退出。格式:Q〈回車〉結束程序的運行。在上述命令中,如果一個自變量是串,則應首先建立它?;静僮骱瘮档慕Y果(即函數值)如果是一個串,則應在尚未分配的區(qū)域內新辟空間存放?!緶y試數據】自定。但要包括以下幾組:E‘’‘’<回車>,應顯示"EQUAL"。E‘abc’‘abcd’<回車>,應顯示"UNEQUAL"oC‘‘‘‘<回車>,應顯示”。I‘a’ ‘’〈回車>,應報告:參數非法。R‘aaa’‘aa’‘b’〈回車〉,應顯示ba’R‘aaabc’‘a’‘aab’〈回車>,應顯示’aabaabaabbc’。R‘Faaaaaaaa’‘aaaa’ ‘ab’,<回車>,應顯示’abab’?!緦崿F提示】【選作內容】串頭表改用單鏈表實現。對命令的格式(即語法)作嚴格檢查,使系統(tǒng)既能處理正確的命令,也能處理錯誤的命令。注意,語義檢查(如某內部名對應的串已被刪除而無定義等)和基本操作參數合法性檢查仍應留給基本操作去做。支持串名。將串名(可設不超過6個字符)存于串頭表中。命令⑴⑶⑸要增加命令參數〈結果串名>;命令(7)中的<串標識1>改為〈串名>,并用此名作為結果串名,刪除原被替串標識,用〈串名〉代替〈串標識〉定義和命令解釋中的內部名。每個命令執(zhí)行完畢時立即自動刪除無名串。源程序:#include<iostream>//標準的輸入輸出流文件#include<stdio.h>#include<malloc.h>usingnamespacestd;//標識符的可見范圍typedefstruct{char*ch;//若是非空串,則按串長分配存儲區(qū),否則ch為NULLintlength;//串長度}HString;HStringA,B,C,D,E,F,G,H;voidInitString(HString*S)//初始化串{S->ch=NULL;S->length=0;}voidShow()//顯示串的基本情況{cout<<"串的使用情況:"<<endl;if(A.ch==NULL)cout<<"A表識串未使用”<<endl;elsecout<<"A串的內容是:"<<A.ch<<",長度是"<<A.length<<endl;if(B.ch==NULL)cout<<"B表識串未使用"<<endl;elsecout<<"B串的內容是:"<<B.ch<<",長度是"<<B.length<<endl;if(C.ch==NULL)cout<<"C表識串未使用"<<endl;elsecout<<"C串的內容是:"<<C.ch<<",長度是"<<C.length<<endl;if(D.ch==NULL)cout<<"D表識串未使用"<<endl;elsecout<<"D串的內容是:"<<D.ch<<",長度是"<<D.length<<endl;if(E.ch==NULL)cout<<"E表識串未使用"<<endl;elsecout<<"E串的內容是:"<<E.ch<<",長度是"<<E.length<<endl;if(F.ch==NULL)cout<<"F表識串未使用"<<endl;elsecout<<"F串的內容是:”<<F.ch<<”,長度是"<<F.length<<endl;if(G.ch==NULL)cout<<"G表識串未使用"<<endl;elsecout<<"G串的內容是:”<<G.ch<<”,長度是"<<G.length<<endl;}intmain(){InitString(&A);InitString(&B);InitString(&C);InitString(&D);InitString(&E);InitString(&F);InitString(&G);InitString(&H);洌始化操作voidstrassign();//賦值voidequality();//判斷相等voidconcat();//聯接voidstrleng();//求串長voidsubstring();//求子串voidindex();//子串定位/voidreplace();//串替換voidstrdelete();//串刪除voidquit();//退出程序chari,ch;intflag1=1,flag2=1;while(flag2){Show();cout<<”請選擇你要進行的操作;\nA賦值,E判相等,C連接,L求長度,S求子串,I子串定位,R串替換,P顯示,D刪除"<<endl;while(flag1){fflush(stdin);//清空輸入流,避免緩沖區(qū)內殘存讀取函數無法取走內容cin>>i;switch(i){case'A':case'a':strassign();flag1=0;break;case'E':case'e':equality();flag1=0;break;case'C':case'c':concat();flag1=0;break;case'L':case'l':strleng();flag1=0;break;case'S':case's':substring();flag1=0;break;case'I':case'i':index();flag1=0;break;case'R':case'r':replace();flag1=0;break;case'P':case'p':Show();flag1=0;break;case'D':case'd':strdelete();flag1=0;break;case'Q':case'q':quit();flag1=0;break;default:cout<<"輸入錯誤,請重新輸入:”;}}flag2=0;cout<<”還要繼續(xù)嗎?(y/n):”;fflush(stdin);//清空輸入流cin>>ch;if(ch=='y'||ch=='Y'){flag1=1;flag2=1;system("cls");//清屏}}return0;}HString*Chuanzhizhen()//把每一次要操作的字符串的地址傳遞給一個字符指針{HString*s;charch;intflag1=1;while(flagl){fflush(stdin);//清空輸入流cin>>ch;switch(ch)//把小寫字母轉化成大寫字母{case'A':case'a':s=&A;flag1=0;break;case'B':case'b':s=&B;flag1=0;break;case'C':case'c':s=&C;flag1=0;break;case'D':case'd':s=&D;flag1=0;break;case'E':case'e':s=&E;flag1=0;break;case'F':case'f:s=&F;flag1=0;break;case'G':case'g':s=&G;flag1=0;break;case'H':case'h':s=&H;flag1=0;break;default:cout<<”輸入錯誤,請重新輸入要給與賦值的串標識:}}returns;}voidstrassign()//賦值操作{HString*s;//用一個指向串的指針來操作串inti=0;charstr[100],*c;cout<<"請輸入要給與賦值的串標識:”;s=Chuanzhizhen();//調用函數if(s->ch)//如果本身有值,則刪除free(s->ch);cout<<”請輸入要賦值的字符串的值:”;fflush(stdin);//清空輸入流gets(str);c=str;while(*c)//取值操縱{i++;c++;}//求出輸入字符串的長if(!i)//如果沒有輸入{s->ch=NULL;s->length=0;}else{s->ch=(char*)malloc(sizeof(char)*i+1);for(intj=0;j<i;j++){s->ch[j]=str[j];}s->ch[i]='\0';s->length=i;}}voidequality()//判相等操作{HString*s1,*s2;//同樣用指向串的指針來操作串coutvv”請輸入第一個串標識;”;s1=Chuanzhizhen();coutvv"請輸入第二個串標識;”;s2=Chuanzhizhen();if(s1->ch==NULL&&s2->ch==NULL)//兩個都是空串{coutvv"EQUAL(相等),字符串都是空串"vvendl;}elseif(s1->ch&&s2->ch)//字符串都不是空串{if(s1->length!=s2->length){coutvv"UNEQUAL(不相等)"vvendl;}else{for(inti=0;ivs1->length;i++)if(s1->ch[i]=s2->ch[i]){cout<<"UNEQUAL(不相等)"<<endl;return;}}cout<<"EQUAL(相等)"<<endl;}}else{cout<<"UNEQUAL(不相等)"<<endl;}}voidconcat()//串連接操作{HString*s1,*s2,*s3;cout<<”請輸入第一個串的串標識;”;s1=Chuanzhizhen();cout<<”請輸入第二個串的串標識;”;s2=Chuanzhizhen();cout<<”請輸入連接之后要存入串的串標識;”;s3=Chuanzhizhen();if(s1->length==0&&s2->length==0)〃兩個都是空串{if(s3->ch)//如果s3有值的話,把s3清空{free(s3);s3->ch=NULL;s3->length=0;}}else//至少有一個不是空串{inti=0;if(s3->ch)free(s3);s3->ch=(char*)malloc(sizeof(char)*(s1->length+s2->length)+1);for(i=0;i<s1->length;i++){s3->ch[i]=s1->ch[i];}for(intj=0;j<s2->length;j++){s3->ch[i++]=s2->ch[j];s3->ch[i]='\0';}s3->length=s1->length+s2->length;}}voidstrleng()//求串長{HString*s;cout<<"請輸入串標識;”;s=Chuanzhizhen();cout<<"串的長度為:"<<s->length<<endl;}voidsubstring()//求子串{HString*s;inti1=0,i2=0,flag1=1,m=0;//用m來標識字串的長度cout<<"請輸入串標識;”;s=Chuanzhizhen();while(flag1){cout<<”請輸入起始位置(從1開始):”;cin>>i1;cout<<”請輸入結束位置:";cin>>i2;if(i1<0||i1>i2||i1>s->length){cout<<"輸入的參數不合法,請重新輸入"<<endl;}else{flag1=0;charch1[100];if(i2>s->length){i2=s->length;}for(inti=i1-1;i<i2;i++)ch1[i-i1+1]=s->ch[i];//因為數組ch要從0號位置開始賦值,所以用ch[i-i1+1]m++;}ch1[m]='\0';cout<<"字符串為:”<<ch1<<”長度為:"<<i2-i1+1<<endl;}}}voidindex()//■子串定位{HString*s;intm=0,i=0,j=0,n,k=0;//m用來標記輸入子串的長度,n能用來標記子串在主串中的第一個位置boolfind=true;//用來標識是否在主串中找到第一個和子串中相等的字母,true表示沒找到charch[100],*c;cout<<"請輸入主串標識;”;s=Chuanzhizhen();cout<<”請輸入要查找的子串:”;fflush(stdin);//清空輸入流gets(ch);c=ch;while(*c){m++;c++;}for(i=0;i<m;i++)//子串的循環(huán)遍歷{find=true;for(j;j<s->length&&find;j++)//主串的循環(huán)遍歷{if(s->ch[j]==ch[i])//如果相等就跳出循環(huán)(主串的循環(huán)遍歷)并記下這個初始位置{n=j+1;find=false;k++;//k用來標識是否進行了這個循環(huán)體}else//否則,就從頭開始遍歷子串,從下一位置遍歷主串{i=0;if(k!=0){j=n-k;//如果子串和主串的前面一部分相等,后一部分不相等,則讓主串從第一個相等的字符后的一個字符開始遍歷k=0;//^J如主串aabbaabbaca,子串bbac,當遍歷到第三個位置的時候,發(fā)現第一個和子串不相等的字符,但遍歷到第六個位置時,不相等了,此時從主串的第四個位置開始遍歷}}}}if(i==m&&find==false)cout<<"子串在主串中的位置:"<<n-k+1<<endl;elsecout<<"不存在該子串。"<<endl;}voidreplace()//串替換{HString*s;intm=0,i=0,j=0,n=0,k=0,p=0,ch2length=0,d=0,f=0;//p用來記錄數組ch3中有多少個字符,f用來記錄下一次開始遍歷主串的起始位置boolfind=true;boolxiangdeng=false,jinru=false;charch1[100],ch2[100],ch3[200],*c,*c1;cout<<"請輸入串的串標識”;s=Chuanzhizhen();cout<<”請輸入主串中的子串(被替換掉的);”;fflush(stdin);//清空輸入流gets(ch1);c=ch1;while(*c){m++;c++;}//求子串的長度cout<<”請輸入主串中的子串要被替換掉成的串;”;fflush(stdin);//清空輸入流gets(ch2);c1=ch2;while(*c1){ch2length++;c1++;}//求ch2字符串的長度for(i=0;i<s->length;i++)//主串作為外層循環(huán)遍歷,和子串的定位查找不一樣{find=true;for(j;j<m&&find;j++){if(s->ch[i]=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 28807.3-2025軌道交通機車車輛和列車檢測系統(tǒng)的兼容性第3部分:與計軸器的兼容性
- 個人購銷農機合同范本
- 辦證合同范本模板
- 2025年黑龍江貨運從業(yè)資格證模擬考試題目
- 2025年固原貨運從業(yè)資格證考試試題
- 農業(yè)招標合同范本
- 供水項目施工合同范本
- 分級銷售合同范本
- 做布料生意合同范本
- 辦公花卉采購合同范本
- 2025人教版一年級下冊數學教學進度表
- DeepSeek教案寫作指令
- 土力學與地基基礎(課件)
- 施耐德公司品牌戰(zhàn)略
- 三方聯測測量記錄表
- 啦啦操社團教學計劃(共3頁)
- 塑膠原料檢驗規(guī)范
- 汪小蘭有機化學課件(第四版)6
- 建筑公司內部管理流程-課件PPT
- 學習美術新課標的心得體會
- 建筑施工企業(yè)行政管理存在的問題與對策研究
評論
0/150
提交評論