2023年數據結構串的實驗報告_第1頁
2023年數據結構串的實驗報告_第2頁
2023年數據結構串的實驗報告_第3頁
2023年數據結構串的實驗報告_第4頁
2023年數據結構串的實驗報告_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

HUBEIUNIVERSITYOFAUTOMOTIVETECHNOLOGY數據結構程序設計實驗報告03實訓題目:串的構造與應用(自行編寫)專業:軟件工程班級:軟件161姓名:王洋學號:完畢日期:2023年11月5日2023年11月目錄TOC\h\z\u\t"標題2,1,標題4,2"HYPERLINK\l"_Toc"一實驗前提 PAGEREF_Toc\h3HYPERLINK\l"_Toc"一、1. 實驗序言 3HYPERLINK\l"_Toc"一、2. 實驗目的?PAGEREF_Toc\h3HYPERLINK\l"_Toc"一、3.?實驗背景 PAGEREF_Toc\h3HYPERLINK\l"_Toc"一、4.?實驗方式 PAGEREF_Toc\h4HYPERLINK\l"_Toc"二程序原理 PAGEREF_Toc\h4HYPERLINK\l"_Toc"二、1.?設計思緒?PAGEREF_Toc\h4HYPERLINK\l"_Toc"二、2. 實驗原理 PAGEREF_Toc\h4HYPERLINK三、2. 程序界面?PAGEREF_Toc\h6HYPERLINK\l"_Toc"四功能實現?PAGEREF_Toc\h7HYPERLINK\l"_Toc"四、1.?串的初始化?PAGEREF_Toc\h7HYPERLINK\l"_Toc"四、2.?串的插入和刪除 PAGEREF_Toc\h8HYPERLINK四、3. 串的修改及提取子串?PAGEREF_Toc\h9HYPERLINK\l"_Toc"四、4. 程序調試?PAGEREF_Toc\h10HYPERLINK\l"_Toc"四、5.?程序細節 PAGEREF_Toc\h10HYPERLINK五}程序總結 PAGEREF_Toc\h12HYPERLINK五、1. 程序收獲清單?PAGEREF_Toc\h12HYPERLINK\l"_Toc"五、2. 程序局限性改善 PAGEREF_Toc\h12HYPERLINK\l"_Toc"六實驗總結?PAGEREF_Toc\h12實驗前提實驗序言每一次實驗都是一種歷練和進步,至少在每次進行序言的時候,都會去總結和想辦法改善程序。即使能力有限,我也切身感受到了進步,以及進步后對程序的稍微深度地思考。而這次對于串的實驗,顯然讓我感受到了,這樣的思考非常欠缺,我所需要完畢的尚有很多,特別是隨著功能的完善,和進一步的編程,會發現其中有更多的地方需要我去改善,特別是功能越多越進一步,這種感覺就越明顯實驗目的串的基本操作的編程實現(2學時,驗證型),掌握串的建立、遍歷、插入、刪除等基本操作的編程實現,也可以進一步編程實現查找、合并、剪裁等操作,存儲結構可以在順序結構或鏈接結構、索引結構中任選,也可以所有實現。也鼓勵學生運用基本操作進行一些應用的程序設計。實驗背景在較純熟的掌握關于對象的編程方法后,這次我就改用了C++進行編寫,并且難度要比我預期的要低,效果反而更好了。同時,串基于字符數組實現要容易得多,并且對于一維數組的具體操作,已經相對較為純熟,并且也提供了很多關于字符串的相關函數,所認為了提高編程水平,這次對于串的操作,都不依賴系統函數和字符串函數,相反,進一步初始化,插入,刪除,遍歷等功能的本質,對字符串的底層進行編程實現。同時也可以使用以前掌握的表格打印方法,讓字符串的位置一目了然,同時也方便了字符串的刪除和插入等操作。實驗方式本次實驗的插入和刪除函數的對于長度的判斷,我在自行編寫的時候出現了錯誤,所以參閱了課本后對其進行了修改,再者就是如何定一個一個字符串類,其他的所有函數和表格打印輸出,界面等都自行編寫,并且較以往,有了明顯的突破,此外,這次上機是運用類進行的對字符串的編寫,以后也會多嘗試使用C++進行編寫。程序原理設計思緒本次實驗與以往有很多不同,一方面就是在可以移植的界面和函數外,其他的都改用C++進行編程,并用類實現了字符串。另一方面,就是在編程過程中,隨著功能和函數實現的進一步,我發現了越來越多的問題,并對其進行了改正,而在改正過程中進行進一步思考,又發現了更多的問題,這些問題本領不是程序的問題,也不是函數錯誤,而是功能上的缺陷和隱患。與以往的寫完就沒其他重大問題不同,這次的編寫的確可以發現很多之前沒有也無法注意到的問題,所以一直盡自己的努力在改善。以下是本次兩個程序的設計圖。修改調試基于修改調試基于類進行功能實現多次優化輸出打印改用C++實現拷貝多次優化輸出打印改用C++實現拷貝框架和界面圖1—程序設計流程圖實驗原理串的基本功能實現依舊是基于字符數組,且對串的操作也是對數組的操作,而對數組基本的操作,一方面就需要對數組進行初始化。而串的插入和刪除等操作,由于用戶的不可預見性,所以操作的長度需要提前進行解決,插入多少位置就需要把插入位置的右端所有的數據進行移動,而刪除指定兩端位置的字符串,與插入實現方法無異,這都會導致大量的移動,因此內部解決操作工程量巨大,并且效率不高,即使鏈表可以輕松解決這個問題,但對于串的特殊性,它在這里的作用反而是它最大的弊病,因此相比之下,數組在一定限度上反而要比鏈表容易設計和操作。修改功能則需要考慮的更多,一般分為三種情況:1.只修改一個字符,直接找到位置進行修改;2.修改字符數短于指定位置長度,需要修改替換,然后把多余的位置進行整體向前移動,具體的操作示意圖如下圖2。ABC123DD56789ABC123456789ABC123456789(1)獲得修改位置長度(2)修改指定長度字符(3)多余位置進行移動圖2—修改字符數短于指定位置長度的操作示意圖3.修改字符數長于指定位置長度,需要修改替換指定長度,然后移動指定右端位置的后面的數據,騰出剩下需要修改的字符空間,最后進行寫入即可。具體的操作示意圖如下圖3。ABC123DD78ABC1234578ABC1234589ABC123456789(1)獲得修改位置長度(2)修改指定長度字符(3)移動所需剩余長度(4)寫入剩余修改字符圖3—修改字符數長于指定位置長度的操作示意圖總體來看,數據的移動量太大,效率不高,但是可以保證操作的邏輯性和對的性,在編程實現方面也簡樸了許多。程序設計重要功能串可以實現的功能很多,但是作為一個設計者,有時候可以優化一些方案,把功能結合起來,用一個部分實現一些功能,比如我把數據的打印顯示做的人性化,在某些方面來說,簡化了數據求長,子串的搜索,當然,這些考慮,只是基于較短的數據輸入條件,并不可取。一般的功能即新串插入、舊串刪除、當前串遍歷、當前串求長度、求指定位置子串。但是將遍歷和求數據長度單獨提取出來作為一個功能覺得不合適,于是,程序整體是在每次操作前后,都進行一次遍歷,在使用功能前后都可以讓用戶清楚地讀取當前串情況。(1)初始化串內容,并自動獲得串長(2)串插入、刪除、修改(3)獲得子串(4)串長度以及遍歷程序界面串的實現界面沿襲了之前的實驗界面,并且將用戶輸入,和計算機提醒都鎖定在了兩行之內,保證表格的對的打印。輸入輸出方格下面是數據和數據表格顯示的區域,具體如下圖。圖4—串的簡樸操作程序界面圖功能實現串的初始化串的實現改用類進行實現,所以在構造函數內只對串就行動態內存獲取,以及長度歸零。同時為了能多次進行初始化,在每次擬定長度以前,對長度進行歸零操作。串內容的獲取,采用getchar函數進行緩存區讀取,保存回車,和空格在讀取到“~”字符時,結束循環。這個地方我當時有一個疑問就是,我在動態內存分派的時候,故意使用1長度,發現仍然可以進行任意長度的輸入,并且操作去除長度判斷,其他的函數都是可以運營的。這讓我非常疑惑,疑惑在動態內存分派到底起到作用沒有?之后和吳貝貝同學討論發現,循環獲取字符的操作中,我直接對內存進行了訪問和操作,所以動態內存申請就顯得沒有作用了,并且也沒有必要。但是仔細想后有發現,目前我們對操作系統如何分派內存的機制不是很了解,假如當我們在進行循環訪問和操作內存的時候,一連串的內存的某個地方出現了其他程序使用的區域,那么循環到下一個正在使用的區域,就會打破此外一個程序的內存訪問區,也許會導致其他程序的崩潰,但是后來查詢資料發現,內存的分派,系統都會自動對的地選取一系列連續的可用內存給程序使用,所以不必要考慮到會破壞其他程序的內存區域。但是這只是小部分的獲取字符串內容,假如碰到大量的字符需要輸入,就必須要考慮到這個問題,畢竟對一個連續的內存區域進行操作,難免會出現錯誤……這些問題,不僅讓我進一步體會到編程中我們沒有考慮過的問題,也讓我意識到,我們思考的主線不夠,此后的實驗中,以后的編程里,還需要考慮更多更多,以下是初始化函數代碼。voidstring::strCreate(){ ?inti=0;length=0;//可多次進行輸入? getchar();//吃掉選擇功能的回車? while((str[i]=getchar())!='~'||str[i+1]==NULL) //不是~繼續獲得字符?由于對內存進行操作需要保證下一個內存空??i++;//當然str[i+1]==NULL這個我不能保證真正能用上或是自身就是個錯誤?length=i;}串的插入和刪除(1)插入插入部分,獲得插入位置,同時輸入插入內容,通過插入的內容判斷長度,并把這些參數傳入設立好的成員函數,并給對象發消息,進行插入操作。本質上也就是通過插入內容的長度來進行原串的移動,然后進行數據寫入。當然,由于我設立了可以保存空格和回車,特別是回車,并且將其遍歷內容打印到表格中,在某些情況下會犯錯。比如假如字符串內有了回車,我的打印內容會在表格內也會換行,這樣觀測字符串長度就會犯錯(在表格上看)由于表格上的空位置,在串內是不存在的,如下圖,這樣就對復雜的插入操作,就需要更復雜的輸出打印方式,所以程序需要考慮,可以進步的地方的確很多。圖5—輸入需要插入的位置圖6—由于長度問題和表格會提醒錯誤(2)刪除刪除功能同樣是數據的移動,用戶輸入需要刪除的左右位置,就可以通過字符的移動來實現。和插入功能有著相同的問題,就是帶有回車的部分不好解決,重要是由于我加入了表格打印,這個打印限制了我不少發揮的地方,但是它的確又好用,所以目前的我不能兩全其美,也需要反省和進一步學習。對于普通的刪除操作基本沒有多大問題,如下圖演示。圖7—輸入所需要刪除的位置圖8—成功刪除指定位置內容串的修改及提取子串(1)刪除,如實驗原理所述,這里不再具體闡述,重要存在一些仍由于打印表格出現的問題,就是修改帶回車內容的字符串,修改后打印出來的內容會不好解決,不帶回車的是沒有問題的,由于變化性太大,所以不好把控,如下圖,我在當前串內對4和5直接的位置進行修改,回車確認后如下顯示。。圖9—修改錯誤范例圖10—回車后顯示錯亂(2)獲得子串,原理與刪除相同,函數內得到位置之后返回一個新的數組指針,然后對其輸出顯示即可,同時尚有顯示長度,當然由于回車和空格的存在,并且回車符號雖然可以用其他的符號顯示出來,代替看不見的回車或者空格,但是這樣的替代系統不認可,顯示不出來,所以也移除了這個功能,導致假如串內有回車或者字符,字符長度和肉眼看到的不同樣。程序調試程序功能實現后,進行了大量的改善具體如下。(1)該用表格打印,方便觀看。(2)加入初始化含回車,重新考慮輸出打印。(3)加入獲得子串功能。(4)在輸出打印的部分,調試了很久,為了保證每一行被輸滿,并且要考慮到回車的效果,改善了很多,同時也加入了可以修改表格的長和寬的效果。。程序細節(1)運用類實現串的操作。(2)使用了制表符制作表格,讓輸入打印更美觀。(3)運用光標定位,讓用戶輸入和輸出提醒被鎖定在一個區域內,不僅方便觀看和操作,也保證了表格的安全和完整。(4)加入回車和空格輸入,讓輸入變得靈活。(5)將一些語句很短的判斷性質的函數融合在一起,并使用了重載。要點函數功能源碼打印輸出串(遍歷)源碼。voidstring::strTraverse(){ inti,j;?intitem;//增長中間變量,防止i被修改 for(i=0,j=0,item=0;i<length-1;i++,item++)//最后一個字符單獨判斷 {? if(i!=0&&i%column==0||str[i]=='\n')//需要分情況? {?? if(str[i]=='\n') ?{? ? i++;//直接換行,跳過回車字符 item=0;//當碰到回車,需要返回左邊進行打印???} j++;?? item=0;//當碰到整行,需要返回左邊進行打印? }??SetPos(3+3*item,16+j*2); ?std::cout<<str[i]; }??if(str[length-1]=='~')//假如最后一行只有結束符那么不讓它顯示?? std::cout<<std::endl;??else//假如不是就把它打印出來??{ S

溫馨提示

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

評論

0/150

提交評論