版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、11題 目 串基本操作的演示學(xué)院計算機學(xué)院專業(yè)網(wǎng)絡(luò)工程一 .、課程設(shè)計任務(wù)要求在教科書4.2.2 節(jié)用堆分配存儲表示實現(xiàn)HString 串的最小操作子集的基礎(chǔ)上,實現(xiàn)串抽象數(shù)據(jù)類型的其余基本操作(不使用C 語言本身提供的串函數(shù))。參數(shù)合法性檢查必須嚴格。說明: (在格式中, 表示 0 個、 1 個或多個空格所組成的串。串標識表示一個內(nèi)部名或一個串文字。前者是一個串的唯一標識,是一種內(nèi)部形式的(而不是字符形式的)標識符。后者是兩端由單引號括起來的僅可打印字符組成的序列。串內(nèi)每兩個連續(xù)的單引號表示一個單引號符。)利用上述基本操作函數(shù)構(gòu)造以下系統(tǒng):它是一個命令解釋程序,循環(huán)往復(fù)地處理用戶鍵入的每一條
2、命令,直至終止程序的命令為止。命令定義如下:( 1) 值。格式:A 串標識 回車用串標識所表示的值建立新串,并顯示新串的內(nèi)部名和串值。如:A Hi!( 2) 判相等。格式: E 串標識1 串標識2 回車若兩串相等,則顯示“EQUAL ”,否則顯示“UNEQUAL ”。( 3) 聯(lián)接。 格式:C 串標識1 串標識2 回車將兩串聯(lián)接產(chǎn)生結(jié)果串,它的內(nèi)部名和串值都顯示出來。( 4) 求長度 格式: L 串標識 回車顯示串的長度。( 5) 求子串 格式:S 串標識+數(shù)1 +數(shù)2 回車如果參數(shù)合法,則顯示子串的內(nèi)部名和串值。數(shù)不帶正負號。( 6) 串定位。格式: I 串標識1 串標識2 回車顯示第二個串
3、在第一個串中首次出現(xiàn)時的位置。( 7) 替換格式:R 串標識1 串標識2 串標識2 回車將第一個串中出現(xiàn)所有出現(xiàn)的第二個串用第三個串替換,顯示結(jié)果串的內(nèi)部名和串值,原串不變。( 8) 示。格式P 回車顯示所有在系統(tǒng)中被保持的串的內(nèi)部名和串值的對照表( 9) 除。格式D 內(nèi)部名 回車刪除該內(nèi)部名對應(yīng)的串,即賦值的逆操作。( 10) 格式:Q 回車結(jié)束程序的運行。二、已完成的項目及完成程度( 11) 賦值。StrAssign( SqString &s,char cstr)( 12) 判相等。StrEqual(SqString s,SqString t)( 13) 聯(lián)接。Concat(SqS
4、tring s,SqString t)( 14) 求長度。 StrLength(SqString s)( 15) 求子串。 SubStr(SqString s,int i,int j)( 6)子串定位。Index(linkstring *s,linkstring *t)( 7)串替換。 Replace(linkstring *&s,linkstring *t,linkstring *r)( 8)顯示。Dispstr(linkstring *s)( 9)刪除。DelStr(SqString s,int i,int j)( 0)退出。 Quit()完成了項目要求的大部分所有操作。三、理論依
5、據(jù)、用到的數(shù)據(jù)結(jié)構(gòu),及舉例定義串的基本主結(jié)構(gòu)ADT String數(shù)據(jù)對象:D=ai| ai charcaterset,i=1,2, ,n,n>=0數(shù)據(jù)關(guān)系:R1=<ai-1,ai>|ai-1,ai D, i=1,2, ,n基本操作:StrCompare(HString S,HString T)初始條件:S 和 T 是已存在的Hstring 類型。操作結(jié)果:比較其值,顯示結(jié)果“UNEQUA” L 或“EQUA”L 。StrLength(HString S)初始條件:S 是已存在的Hstring 類型。操作結(jié)果:返回該串的長度。Concat(HString S1,HString
6、S2)初始條件:S1 和 S2是已存在的Hstring 類型。操作結(jié)果:由S1 和 S2聯(lián)接成新串。Index(HString S,HString t)初始條件:S 和 T 是已存在的Hstring 類型。操作結(jié)果:顯示第二個串在第一個串中首次出現(xiàn)的起始位置。Replace(HString M, HString t, HString v)初始條件:M 、 t 和 v 是已存在的Hstring 類型。操作結(jié)果:將第一個串中所有出現(xiàn)的第二個串用第三個串替換,顯示結(jié)果串的內(nèi)部名和串值,原串不變。SubString(HString S,int pos,int len)初始條件:S 是已存在的Hstri
7、ng 類型。操作結(jié)果:如果參數(shù)合法,則顯示子串的內(nèi)部名和串值。Strprint(HString S)初始條件:S 是已存在的Hstring 類型。操作結(jié)果:顯示串S 的內(nèi)部名和串值。getin(int n)初始條件:處理命令串S1,操作結(jié)果:把串值存入串頭表中Insert(int n)初始條件:要給指定的串賦值,n 為指定的串的內(nèi)部名操作結(jié)果:為指定內(nèi)部名的串賦值show()初始條件:要求查看輸入格式操作結(jié)果:輸出各種命令的輸入格式ADT Stringtypedef structchar *ch;/若是非空串,則按串長分配存儲區(qū),否則ch 為 NULLint length;/串長度HStrin
8、g;四、主要算法流程圖五、主要代碼引用的頭文件:#include <stdio.h>#include <stdlib.h>#include <string.h>使用的結(jié)構(gòu)體:typedef struct char dataMaxSize;/存放串字符int len;/串長SqString;關(guān)鍵函數(shù)功能實現(xiàn):void Scanf(char cstrr) / 輸入字符串cstrr100;printf("Enter a string:n");/ 提示用戶輸入字符串 int j=0;while(cstrrj=getchar()!='n
9、39;) j+;cstrrj='0'/串賦值void StrAssign(SqString &s,char cstr)Scanf(cstr);int i;for(i=0;cstri!='0'i+) s.datai=cstri;s.len=i;/判斷串是否相等int StrEqual(SqString s,SqString t)int same=1,i;if (s.len!=t.len)/長度不相等時返回same=0; elsefor (i=0;i<s.len;i+)if (s.datai!=t.datai) /有一個對應(yīng)字符不相同時返回 same=
10、0;return same;/將串t 復(fù)制給串svoid StrCopy(SqString &s,SqString t)int i;for(i=0;i<t.len;i+) s.datai=t.datai;s.len=t.len;/求串長int StrLength(SqString s)return s.len;/求子串SqString SubStr(SqString s,int i,int j)SqString str;int k;str.len=0;if(i<=0|i>s.len|j<0|i+j-1>s.len)return str;/參數(shù)不正確時返回空
11、串for(k=i-1;k<i+j-1;k+)/將s.datai.i+j復(fù)制到strstr.datak-i+1=s.datak;str.len=j;return str;/串的連接:返回由兩個串連接在一起的新串SqString Concat(SqString s,SqString t)SqString str;int i;str.len=s.len+t.len;for(i=0;i<s.len;i+)/將s復(fù)制到strstr.datai=s.datai;for(i=0;i<t.len;i+)/將t復(fù)制到strstr.datas.len+i=t.datai;return str;/
12、串的替換SqString RepStr(SqString s,int i,int j,SqString t)int k;SqString str;str.len=0;/參數(shù)不正確時返回空串/將s.data0.i-2復(fù)制到str/將t 復(fù)制到 str/將 s.datai+j-1.s.len-1復(fù)制到strif(i<=0|i>s.len|i+j-1>s.len) return str;for(k=0;k<i-1;k+) str.datak=s.datak;for(k=0;k<t.len;k+)str.datai+k-1=t.datak;for(k=i+j-1;k<
13、;s.len;k+)str.datat.len+k-j=s.datak;str.len=s.len-j+t.len;return str;/串的刪除SqString DelStr(SqString s,int i,int j) int k;SqString str;str.len=0;if (i<=0 | i>s.len| i+j>s.len+1) /參數(shù)不正確時返回空串printf(" 參數(shù)不正確n");return str;for (k=0;k<i-1;k+)/將s.data0 s.datai-2復(fù)制到strstr.datak=s.datak;f
14、or (k=i+j-1;k<s.len;k+)/將s.datai+j-1 datas.length-1復(fù)制到strstr.datak-j=s.datak;str.len=s.len-j;return str;/串比較int Strcmp(SqString s,SqString t) int i,comlen;/求s和 t 的共同長度if(s.len<t.len)comlen=s.len;elsecomlen=t.len;for(i=0;i<comlen;i+)/在共同長度內(nèi)逐個字符比較if(s.datai<t.datai)return -1;else if(s.data
15、i>t.datai) return 1;if(s.len=t.len)return 0;else if(s.len<t.len)return -1;elsereturn 1;/s=t/s<t/s>t/輸出串void DispStr(SqString str) int i;if (str.len>0)for (i=0;i<str.len;i+)printf("%c",str.datai);printf("n");/菜單函數(shù)void menus()int i,j,m,x,y;char n;printf("*n&q
16、uot;);printf("*A 賦值E 判斷相等C 聯(lián)接 *n");printf("*L 求長度S 求子串I 子串定位*n");printf("*R 串替換P 顯示D 刪除*n");printf("*Q退出*n");scanf("%c",&n);getchar();switch(n)case 'A':case 'a':printf("A 請輸入需要賦值的串n");StrAssign(str1,cstr1);printf("
17、輸出 str1=");DispStr(str1);menus();break;case 'E':case 'e':printf("E 判斷串 str1 和 str2是否相等:n");StrAssign(str1,cstr1);StrAssign(str2,cstr2);m=StrEqual(str1,str2);if(m=1)printf("EQUALn");elseprintf("NUEQUALn");menus();break;case 'C':case 'c
18、9;:printf(" 輸入要連接的兩個串:n");printf(" 將串 str1 和串 str2連接起來形成串s1: n");StrAssign(str1,cstr1);StrAssign(str2,cstr2);s1=Concat(str1,str2);DispStr(s1);menus();break;case 'L':case 'l':printf(" 輸入要求長度的串:n");StrAssign(str1,cstr1);printf("str1 的長度為:%dn",Str
19、Length(str1);menus();break;case 'S':case 's':printf(" 提取串 str1 的第a個字符開始的b 個字符而產(chǎn)生串s2n");StrAssign(str1,cstr1);int a,b;scanf("%d %d",&a,&b);s2=SubStr(str1,a,b);DispStr(s2);menus();break;case 'R':case 'r':printf(" 在串 str1 中,將第p 個字符開始的q 個字
20、符構(gòu)成的子串用str2替換 ,形成s3: n");StrAssign(str1,cstr1);int p,q;scanf("%d %d",&p,&q);StrAssign(str2,cstr2);s3=RepStr(str1,p,q,str2);DispStr(s3);menus();break;case 'D':case 'd':printf(" 從串 str1 中刪去第i 個字符開始的長度為j 的子串, 形成串 s3:n");StrAssign(str1,cstr1);int x,y;scan
21、f("%d %d",&x,&y);s3=DelStr(str1,x,y);DispStr(s3);menus();break;case 'Q':case 'q':break;void main() /主函數(shù) menus();六、實驗截圖1. 測試用例(1) A s = deng 回車 ,應(yīng)顯示s = deng ;(2) E“ 回車,應(yīng)顯示“ EQUAL ”;(3) E , abc?,abcd? 回車,應(yīng)顯示“UNEQUAL ”;(4) I,a?“ 回車,應(yīng)報告:參數(shù)非法;(5) R , dengbolun? ,2 4 ?, h
22、uizhi?回車,應(yīng)顯示, ba?;(6) D , dengbolun ? ,2 4?回車,應(yīng)顯示:dolun;(7) 7) D ,fdhagkjh?, 3 6 ? 回車,應(yīng)顯示:fdjh;(8) 8) C ,deng? ,bolun? 回車,應(yīng)顯示:dengbolun;(9) 9) L ,abcdefg?回車,應(yīng)顯示:7;2. 程序截圖XMXXXXXMXXXXXXXXX MX*X*X XMXMXXXE劉斷裙等 屣S求壬串切P顯不Q退出第除聯(lián)子刪定位*M*M*M*XMMXMMg判斷串stK和sS2是否相等:Enter a string:abc'Enter a string:abed
23、39;MUEQUAL從串stK中刪去第i個字符開始的長度為j的子串,形成串S3: Enter a string:fdhagkjh3 6fdIXXXXXXX等HHP 術(shù)Uli 斷子示顯E s p出退富除 聯(lián)子刪穎女要連拼電兩個集:一一存串st£和串sti2連接起來形成串si nter a string:longnter a string:olunlengbo lunMXXXXXXMXXXXXXXXA «<E刻斷相等C聯(lián)接L沃長度S求壬R串替換P顯小Q退出I子串定位MMMMD 刪除 xxxxxxx從串stK中刪去第i個字符開始的長度為j的子串,形成串s3 : Enter
24、a string: dengbolun 2 4o lun3. 實驗結(jié)果分析經(jīng)檢驗,測試數(shù)據(jù)預(yù)期結(jié)果和測試得出結(jié)果一致。Microsoft Visual C+ 上實現(xiàn)的1)熟悉串的定義和串的基本操作。2)掌握順序串的基本運算。3)加深對串數(shù)據(jù)結(jié)構(gòu)的理解,逐步培養(yǎng)解決實際問題的編程能力。4)運用到了串的鏈式存儲結(jié)構(gòu),對鏈表也有了進一步提高。附錄:源代碼#include <stdio.h>#include <stdlib.h>#include <string.h>/定義順序串#define MaxSize 100typedef structchar dataMax
25、Size;/ 存放串字符int len;/串長SqString;void menus();void Scanf(char cstrr)cstrr100;printf("Enter a string:n");/ 提示用戶輸入字符串int j=0;while(cstrrj=getchar()!='n') j+;cstrrj='0'/串賦值void StrAssign(SqString &s,char cstr)Scanf(cstr);int i;for(i=0;cstri!='0'i+) s.datai=cstri;s.l
26、en=i;/判斷串是否相等int StrEqual(SqString s,SqString t)int same=1,i;if (s.len!=t.len)/長度不相等時返回same=0;elsefor (i=0;i<s.len;i+)if (s.datai!=t.datai)/有一個對應(yīng)字符不相同時返回 same=0;return same;/將串 t 復(fù)制給串svoid StrCopy(SqString &s,SqString t)int i;for(i=0;i<t.len;i+)s.datai=t.datai;s.len=t.len;/求串長int StrLength
27、(SqString s)return s.len;/求子串SqString SubStr(SqString s,int i,int j)SqString str;int k;str.len=0;if(i<=0|i>s.len|j<0|i+j-1>s.len)return str;/參數(shù)不正確時返回空串for(k=i-1;k<i+j-1;k+)/將s.datai.i+j 復(fù)制到 strstr.datak-i+1=s.datak;str.len=j;return str;/串的連接:返回由兩個串連接在一起的新串SqString Concat(SqString s,Sq
28、String t)SqString str;int i;str.len=s.len+t.len;for(i=0;i<s.len;i+)/將s復(fù)制到 strstr.datai=s.datai;for(i=0;i<t.len;i+)/將t 復(fù)制到 strstr.datas.len+i=t.datai;return str;/串的替換SqString RepStr(SqString s,int i,int j,SqString t)int k;SqString str;str.len=0;if(i<=0|i>s.len|i+j-1>s.len) return str;f
29、or(k=0;k<i-1;k+)str.datak=s.datak;for(k=0;k<t.len;k+)str.datai+k-1=t.datak;for(k=i+j-1;k<s.len;k+)str.datat.len+k-j=s.datak;str.len=s.len-j+t.len;return str;/參數(shù)不正確時返回空串/將s.data0.i-2復(fù)制到str/將 t 復(fù)制到 str/將s.datai+j-1.s.len-1 復(fù)制到 str/參數(shù)不正確時返回空串/將s.data0 s.datai-2復(fù)制到 str/將s.datai+j-1 datas.length
30、-1 復(fù)制到 str/串的刪除SqString DelStr(SqString s,int i,int j) int k;SqString str;str.len=0;if (i<=0 | i>s.len| i+j>s.len+1)printf(" 參數(shù)不正確n");return str;for (k=0;k<i-1;k+)str.datak=s.datak;for (k=i+j-1;k<s.len;k+)str.datak-j=s.datak;str.len=s.len-j;return str;/串比較int Strcmp(SqString
31、 s,SqString t)int i,comlen;if(s.len<t.len)comlen=s.len;/求s 和 t 的共同長度elsecomlen=t.len;for(i=0;i<comlen;i+)/在共同長度內(nèi)逐個字符比較if(s.datai<t.datai)return -1;else if(s.datai>t.datai)return 1;if(s.len=t.len)return 0;/s=telse if(s.len<t.len)return -1;/s<telsereturn 1;/s>t/輸出串void DispStr(SqS
32、tring str)int i;if (str.len>0)for (i=0;i<str.len;i+) printf("%c",str.datai);printf("n");void main()menus();char cstr180,cstr280;SqString str1,str2,s1,s2,s3; void menus()int i,j,m,x,y;char n;printf("*A賦值E 判斷相等C聯(lián)接 *n");printf("*L求長度S 求子串I子串定位*n");printf(&q
33、uot;*R串替換P 顯示D刪除*n");printf("*Q退出*n");printf(*n");scanf("%c",&n);getchar();switch(n)case 'A':case 'a':printf("A 請輸入需要賦值的串n");StrAssign(str1,cstr1);printf(" 輸出 str1=");DispStr(str1);menus();break;case 'E':case 'e':printf("E 判斷串 str1 和 str2 是否相等:n");StrAssign(str1,cstr1);StrAssign(str2,cstr2);m=StrEqual(str1,str2);if(m=1)printf("EQU
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024河北省職稱計算機考試操作題步驟
- 《物質(zhì)生活與習(xí)俗的變遷》課件
- 《激光的基本特性》課件
- 《證券投資學(xué)課程》課件
- 《電器安全知識》課件
- 農(nóng)業(yè)新紀元模板
- 銀行工作總結(jié)辛勤勞動取得佳績
- 三年級安全教育行動
- 法制教育心得體會15篇
- 輸血科護士工作總結(jié)
- 火力發(fā)電廠有關(guān)職業(yè)病的危害及防護
- 民主測評票(三種樣式)
- 班車安全檢查表(2015-7-14)V3 0 (2)
- 城投集團年度安全管理工作計劃
- 一、 行業(yè)協(xié)會申請設(shè)立分支機構(gòu)、代表機構(gòu)應(yīng)提交的文件:
- 幼兒園幼兒園理事會成員一覽表
- 學(xué)生對課堂教學(xué)滿意度調(diào)查
- 住房公積金中心窗口人員個人工作總結(jié)
- 集成電路單粒子效應(yīng)評估技術(shù)研究PPT課件
- 幼兒園小班生成活動教案20篇
- 講師與平臺的合作協(xié)議
評論
0/150
提交評論