串基本操作的演示_第1頁(yè)
串基本操作的演示_第2頁(yè)
串基本操作的演示_第3頁(yè)
串基本操作的演示_第4頁(yè)
串基本操作的演示_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

串基本操作的演示【問(wèn)題描述】如果語(yǔ)言沒(méi)有把串作為一個(gè)預(yù)先定義好的基本類(lèi)型對(duì)待,又需要用該語(yǔ)言寫(xiě)一個(gè)涉及串操作的軟件系統(tǒng)時(shí),用戶(hù)必須自己實(shí)現(xiàn)串類(lèi)型。試實(shí)現(xiàn)串類(lèi)型,并寫(xiě)一個(gè)串的基本操作的演示系統(tǒng)?!净疽蟆吭诮炭茣?shū)4.2.2節(jié)用堆分配存儲(chǔ)表示實(shí)現(xiàn)HString串類(lèi)型的最小操作子集的基礎(chǔ)上,實(shí)現(xiàn)串抽象數(shù)據(jù)類(lèi)型的其余基本操作(不使用C語(yǔ)言本身提供的串函數(shù))。參數(shù)合法性檢查必須嚴(yán)格。利用基本操作函數(shù)構(gòu)造以下系統(tǒng):它是一個(gè)命令解釋程序,循環(huán)往復(fù)地處理用戶(hù)鍵入的每一條命令,直至終止程序的命令為止。命令定義如下:賦值。格式:A〈串標(biāo)識(shí)〉〈回車(chē)〉用〈串標(biāo)識(shí)〉所表示的串的值建立新串,并顯示新串的內(nèi)部名和串值。例:A‘Hi!’判相等。格式:E〈串標(biāo)識(shí)1>〈串標(biāo)識(shí)2>〈回車(chē)〉若兩串相等,則顯示"EQUAL”,否則顯示"UNEQUAL”。聯(lián)接。格式:C〈串標(biāo)識(shí)1>〈串標(biāo)識(shí)2>〈回車(chē)〉將兩串拼接產(chǎn)生結(jié)果串,它的內(nèi)部名和串值都顯示出來(lái)。求長(zhǎng)度。格式:L〈串標(biāo)識(shí)〉〈回車(chē)〉顯示串的長(zhǎng)度。求子串。格式:S〈串標(biāo)識(shí)〉+〈數(shù)1>+〈數(shù)2><回車(chē)〉如果參數(shù)合法,則顯示子串的內(nèi)部名和串值。<數(shù)>不帶正負(fù)號(hào)。子串定位。格式:I〈串標(biāo)識(shí)1>〈串標(biāo)識(shí)2>〈回車(chē)〉顯示第二個(gè)串在第一個(gè)串中首次出現(xiàn)時(shí)的起始位置。串替換。格式:R〈串標(biāo)識(shí)1>〈串標(biāo)識(shí)2>〈串標(biāo)識(shí)3>〈回車(chē)〉將第一個(gè)串中所有出現(xiàn)的第二個(gè)串用第三個(gè)串替換,顯示結(jié)果串的內(nèi)部名和串值,原串不變。顯示。格式:P〈回車(chē)〉顯示所有在系統(tǒng)中被保持的串的內(nèi)部名和串值的對(duì)照表。刪除。格式:D〈內(nèi)部名〉〈回車(chē)〉刪除該內(nèi)部名對(duì)應(yīng)的串,即賦值的逆操作。退出。格式:Q〈回車(chē)〉結(jié)束程序的運(yùn)行。在上述命令中,如果一個(gè)自變量是串,則應(yīng)首先建立它?;静僮骱瘮?shù)的結(jié)果(即函數(shù)值)如果是一個(gè)串,則應(yīng)在尚未分配的區(qū)域內(nèi)新辟空間存放?!緶y(cè)試數(shù)據(jù)】自定。但要包括以下幾組:E‘’‘’<回車(chē)>,應(yīng)顯示"EQUAL"。E‘a(chǎn)bc’‘a(chǎn)bcd’<回車(chē)>,應(yīng)顯示"UNEQUAL"oC‘‘‘‘<回車(chē)>,應(yīng)顯示”。I‘a(chǎn)’ ‘’〈回車(chē)>,應(yīng)報(bào)告:參數(shù)非法。R‘a(chǎn)aa’‘a(chǎn)a’‘b’〈回車(chē)〉,應(yīng)顯示ba’R‘a(chǎn)aabc’‘a(chǎn)’‘a(chǎn)ab’〈回車(chē)>,應(yīng)顯示’aabaabaabbc’。R‘Faaaaaaaa’‘a(chǎn)aaa’ ‘a(chǎn)b’,<回車(chē)>,應(yīng)顯示’abab’?!緦?shí)現(xiàn)提示】【選作內(nèi)容】串頭表改用單鏈表實(shí)現(xiàn)。對(duì)命令的格式(即語(yǔ)法)作嚴(yán)格檢查,使系統(tǒng)既能處理正確的命令,也能處理錯(cuò)誤的命令。注意,語(yǔ)義檢查(如某內(nèi)部名對(duì)應(yīng)的串已被刪除而無(wú)定義等)和基本操作參數(shù)合法性檢查仍應(yīng)留給基本操作去做。支持串名。將串名(可設(shè)不超過(guò)6個(gè)字符)存于串頭表中。命令⑴⑶⑸要增加命令參數(shù)〈結(jié)果串名>;命令(7)中的<串標(biāo)識(shí)1>改為〈串名>,并用此名作為結(jié)果串名,刪除原被替串標(biāo)識(shí),用〈串名〉代替〈串標(biāo)識(shí)〉定義和命令解釋中的內(nèi)部名。每個(gè)命令執(zhí)行完畢時(shí)立即自動(dòng)刪除無(wú)名串。源程序:#include<iostream>//標(biāo)準(zhǔn)的輸入輸出流文件#include<stdio.h>#include<malloc.h>usingnamespacestd;//標(biāo)識(shí)符的可見(jiàn)范圍typedefstruct{char*ch;//若是非空串,則按串長(zhǎng)分配存儲(chǔ)區(qū),否則ch為NULLintlength;//串長(zhǎng)度}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表識(shí)串未使用”<<endl;elsecout<<"A串的內(nèi)容是:"<<A.ch<<",長(zhǎng)度是"<<A.length<<endl;if(B.ch==NULL)cout<<"B表識(shí)串未使用"<<endl;elsecout<<"B串的內(nèi)容是:"<<B.ch<<",長(zhǎng)度是"<<B.length<<endl;if(C.ch==NULL)cout<<"C表識(shí)串未使用"<<endl;elsecout<<"C串的內(nèi)容是:"<<C.ch<<",長(zhǎng)度是"<<C.length<<endl;if(D.ch==NULL)cout<<"D表識(shí)串未使用"<<endl;elsecout<<"D串的內(nèi)容是:"<<D.ch<<",長(zhǎng)度是"<<D.length<<endl;if(E.ch==NULL)cout<<"E表識(shí)串未使用"<<endl;elsecout<<"E串的內(nèi)容是:"<<E.ch<<",長(zhǎng)度是"<<E.length<<endl;if(F.ch==NULL)cout<<"F表識(shí)串未使用"<<endl;elsecout<<"F串的內(nèi)容是:”<<F.ch<<”,長(zhǎng)度是"<<F.length<<endl;if(G.ch==NULL)cout<<"G表識(shí)串未使用"<<endl;elsecout<<"G串的內(nèi)容是:”<<G.ch<<”,長(zhǎng)度是"<<G.length<<endl;}intmain(){InitString(&A);InitString(&B);InitString(&C);InitString(&D);InitString(&E);InitString(&F);InitString(&G);InitString(&H);洌始化操作voidstrassign();//賦值voidequality();//判斷相等voidconcat();//聯(lián)接voidstrleng();//求串長(zhǎng)voidsubstring();//求子串voidindex();//子串定位/voidreplace();//串替換voidstrdelete();//串刪除voidquit();//退出程序chari,ch;intflag1=1,flag2=1;while(flag2){Show();cout<<”請(qǐng)選擇你要進(jìn)行的操作;\nA賦值,E判相等,C連接,L求長(zhǎng)度,S求子串,I子串定位,R串替換,P顯示,D刪除"<<endl;while(flag1){fflush(stdin);//清空輸入流,避免緩沖區(qū)內(nèi)殘存讀取函數(shù)無(wú)法取走內(nèi)容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<<"輸入錯(cuò)誤,請(qǐng)重新輸入:”;}}flag2=0;cout<<”還要繼續(xù)嗎?(y/n):”;fflush(stdin);//清空輸入流cin>>ch;if(ch=='y'||ch=='Y'){flag1=1;flag2=1;system("cls");//清屏}}return0;}HString*Chuanzhizhen()//把每一次要操作的字符串的地址傳遞給一個(gè)字符指針{HString*s;charch;intflag1=1;while(flagl){fflush(stdin);//清空輸入流cin>>ch;switch(ch)//把小寫(xiě)字母轉(zhuǎn)化成大寫(xiě)字母{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<<”輸入錯(cuò)誤,請(qǐng)重新輸入要給與賦值的串標(biāo)識(shí):}}returns;}voidstrassign()//賦值操作{HString*s;//用一個(gè)指向串的指針來(lái)操作串inti=0;charstr[100],*c;cout<<"請(qǐng)輸入要給與賦值的串標(biāo)識(shí):”;s=Chuanzhizhen();//調(diào)用函數(shù)if(s->ch)//如果本身有值,則刪除free(s->ch);cout<<”請(qǐng)輸入要賦值的字符串的值:”;fflush(stdin);//清空輸入流gets(str);c=str;while(*c)//取值操縱{i++;c++;}//求出輸入字符串的長(zhǎng)if(!i)//如果沒(mé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;//同樣用指向串的指針來(lái)操作串coutvv”請(qǐng)輸入第一個(gè)串標(biāo)識(shí);”;s1=Chuanzhizhen();coutvv"請(qǐng)輸入第二個(gè)串標(biāo)識(shí);”;s2=Chuanzhizhen();if(s1->ch==NULL&&s2->ch==NULL)//兩個(gè)都是空串{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<<”請(qǐng)輸入第一個(gè)串的串標(biāo)識(shí);”;s1=Chuanzhizhen();cout<<”請(qǐng)輸入第二個(gè)串的串標(biāo)識(shí);”;s2=Chuanzhizhen();cout<<”請(qǐng)輸入連接之后要存入串的串標(biāo)識(shí);”;s3=Chuanzhizhen();if(s1->length==0&&s2->length==0)〃兩個(gè)都是空串{if(s3->ch)//如果s3有值的話(huà),把s3清空{(diào)free(s3);s3->ch=NULL;s3->length=0;}}else//至少有一個(gè)不是空串{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()//求串長(zhǎng){HString*s;cout<<"請(qǐng)輸入串標(biāo)識(shí);”;s=Chuanzhizhen();cout<<"串的長(zhǎng)度為:"<<s->length<<endl;}voidsubstring()//求子串{HString*s;inti1=0,i2=0,flag1=1,m=0;//用m來(lái)標(biāo)識(shí)字串的長(zhǎng)度cout<<"請(qǐng)輸入串標(biāo)識(shí);”;s=Chuanzhizhen();while(flag1){cout<<”請(qǐng)輸入起始位置(從1開(kāi)始):”;cin>>i1;cout<<”請(qǐng)輸入結(jié)束位置:";cin>>i2;if(i1<0||i1>i2||i1>s->length){cout<<"輸入的參數(shù)不合法,請(qǐng)重新輸入"<<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];//因?yàn)閿?shù)組ch要從0號(hào)位置開(kāi)始賦值,所以用ch[i-i1+1]m++;}ch1[m]='\0';cout<<"字符串為:”<<ch1<<”長(zhǎng)度為:"<<i2-i1+1<<endl;}}}voidindex()//■子串定位{HString*s;intm=0,i=0,j=0,n,k=0;//m用來(lái)標(biāo)記輸入子串的長(zhǎng)度,n能用來(lái)標(biāo)記子串在主串中的第一個(gè)位置boolfind=true;//用來(lái)標(biāo)識(shí)是否在主串中找到第一個(gè)和子串中相等的字母,true表示沒(méi)找到charch[100],*c;cout<<"請(qǐng)輸入主串標(biāo)識(shí);”;s=Chuanzhizhen();cout<<”請(qǐng)輸入要查找的子串:”;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)遍歷)并記下這個(gè)初始位置{n=j+1;find=false;k++;//k用來(lái)標(biāo)識(shí)是否進(jìn)行了這個(gè)循環(huán)體}else//否則,就從頭開(kāi)始遍歷子串,從下一位置遍歷主串{i=0;if(k!=0){j=n-k;//如果子串和主串的前面一部分相等,后一部分不相等,則讓主串從第一個(gè)相等的字符后的一個(gè)字符開(kāi)始遍歷k=0;//^J如主串a(chǎn)abbaabbaca,子串bbac,當(dāng)遍歷到第三個(gè)位置的時(shí)候,發(fā)現(xiàn)第一個(gè)和子串不相等的字符,但遍歷到第六個(gè)位置時(shí),不相等了,此時(shí)從主串的第四個(gè)位置開(kāi)始遍歷}}}}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用來(lái)記錄數(shù)組ch3中有多少個(gè)字符,f用來(lái)記錄下一次開(kāi)始遍歷主串的起始位置boolfind=true;boolxiangdeng=false,jinru=false;charch1[100],ch2[100],ch3[200],*c,*c1;cout<<"請(qǐng)輸入串的串標(biāo)識(shí)”;s=Chuanzhizhen();cout<<”請(qǐng)輸入主串中的子串(被替換掉的);”;fflush(stdin);//清空輸入流gets(ch1);c=ch1;while(*c){m++;c++;}//求子串的長(zhǎng)度cout<<”請(qǐng)輸入主串中的子串要被替換掉成的串;”;fflush(stdin);//清空輸入流gets(ch2);c1=ch2;while(*c1){ch2length++;c1++;}//求ch2字符串的長(zhǎng)度f(wàn)or(i=0;i<s->length;i++)//主串作為外層循環(huán)遍歷,和子串的定位查找不一樣{find=true;for(j;j<m&&find;j++){if(s->ch[i]=

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論