




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、封 皮(按學校要求手工填寫)課 程 設 計 任 務 書學院信息科學與工程專業(yè)通信工程學生姓名*學號10030603*設計題目字符串類的設計與實現(xiàn)內容及要求:計算機處理的對象分為數(shù)值數(shù)據(jù)和非數(shù)值數(shù)據(jù),字符串是最基本的非數(shù)值數(shù)據(jù)。其應用非常廣泛,它是許多軟件系統(tǒng)(如字符編輯、情報檢索、詞法分析、符號處理、自然語言翻譯等系統(tǒng))的操作對象。其重要性不言而喻。要求采用C+語言實現(xiàn)進行字符串類的設計,具體要求如下:(1)使用堆分配存儲表示實現(xiàn)字符串的存儲;(2)實現(xiàn)串賦值操作StrAssign(&T, chars);(3)實現(xiàn)串比較操作StrCompare(S,T);(4)實現(xiàn)求串長操作StrLe
2、ngth(S);(5)實現(xiàn)串連接操作Concat(&T,S1,S2)(6)實現(xiàn)求子串操作SubString(&Sub,S,pos,len)(7)實現(xiàn)清空子串操作ClearString(&S);(8)將上述功能作為類的成員函數(shù)實現(xiàn),編寫主函數(shù)測試上述功能。進度安排:第17周:分析題目,查閱課題相關資料,進行類設計、算法設計;第18周:程序的設計、調試與實現(xiàn);第19周:程序測試與分析,撰寫課程設計報告,進行答辯驗收。指導教師(簽字):年 月 日學院院長(簽字)年 月 日目 錄1 需求分析- 1 -2 算法基本原理- 1 -3 類設計- 2 -4 詳細設計- 3 -4.1 類
3、的接口設計- 3 -4.2 類的實現(xiàn)- 5 -4.3 主函數(shù)設計- 10 -5 DOS界面程序運行結果及分析- 11 -5.1 程序運行結果- 11 -5.2運行結果分析- 12 -6 基于MFC的圖形界面程序開發(fā)- 13 -6.1 基于MFC的圖形界面程序設計- 13 -6.2 程序測試- 17 -6.3 MFC程序編寫總結- 19 -7 參考文獻- 19 -1 需求分析(1) 計算機處理的對象分為數(shù)值數(shù)據(jù)和非數(shù)值數(shù)據(jù),字符串是最基本的非數(shù)值數(shù)據(jù)。其應用非常廣泛,它是許多軟件系統(tǒng)(如字符編輯、情報檢索、詞法分析、符號處理、自然語言翻譯等系統(tǒng))的操作對象。其重要性不言而喻。(2)字符串是字符的
4、有限集合,可記作a=a1 an。其中a是字符串的名,單括號里的字符序列是字符串的值,單引號不是字符串的成分,其作用是為了避免變量名與常量混淆。ai(0<i<n+1)稱為字符串的元素,是構成字符串的基本單位。N表示字符串的長度,且n=>0,如果等于0,則稱a為空串,記作:a=。 2 算法基本原理(1)字符串從結構上看是一種以字符為數(shù)據(jù)元素的線性表,從存儲結構的不同可分為順序表和鏈式存儲結構,它們都適用于字符串,但由于要求的操作不同,為了提高運算效率所選用的存儲結構也是不同的。對于字符串改動較頻繁的一般用鏈式存儲結構,而順序存儲結構能夠高效的讀取。所以各有優(yōu)點。本程序由于需要大量
5、改動數(shù)據(jù),理所當然的選擇鏈式存儲結構,其算法結構為: Typedef structChar *ch; /*若字符串為空,則按長度分配存儲區(qū),否則為NULL */Int length; /*字符串的長度*、(2)本題字符串要求用堆來分配字符串的存儲空間,采用堆分配函數(shù)malloc,它的格式為T->ch=(char *)malloc(sizeof(char)*len,就會為字符串分配內存。(3)函數(shù)是有字符串類進行調用的,通過在主函數(shù)中定義字符串類的對象,作為函數(shù)的參數(shù),對于需要改寫對象的需要進行址傳遞,我們可以通過函數(shù)在主函數(shù)中的反映來觀察他的執(zhí)行狀態(tài)。3 類設計4 詳細設計整個程序分為三
6、個獨立的文檔,Linequ.h文件中包括矩陣類Matrix和線性方程組類Linequ的聲明,Linequ.cpp文件中包括這兩個類的成員函數(shù)實現(xiàn)文件;main.cpp文件包括程序的主函數(shù),主函數(shù)中定義了一個類Linequ的對象,通過這個對象求解一個四元線性方程組。4.1 類的接口設計/Linequ.h文件,實現(xiàn)類的聲明#include <iostream>#include <cmath>using namespace std;class Matrix/基類Matrix聲明public:/外部接口Matrix(int dims=2);/構造函數(shù)Matrix();/析構函數(shù)
7、void SetMatrix(double *rmax);/矩陣賦初值void PrintM();/顯示矩陣protected:int index;/方陣的行數(shù)double* MatrixA;/矩陣存放數(shù)組首地址;class Linequ:public Matrix/公有派生類Linequ聲明public:/外部接口Linequ(int dims=2);/構造函數(shù)Linequ();/析構函數(shù)void SetLinequ(double *a, double *b);/方程賦值void PrintL();/顯示方程int Solve();/全選主元高斯消去法求解方程void ShowX();/顯示
8、方程的解private:/私有數(shù)據(jù)double *sums;/方程右端項double *solu;/方程的解;經(jīng)過公有派生,Linequ類獲得了除構造函數(shù)、析構函數(shù)之外的Matrix類的全部成員,由于基類的成員是公有和保護類型,因此在派生類中的成員函數(shù)中,基類繼承來的成員全部可以訪問,而對于建立Linequ類對象的外部模塊來講,基類的保護成員是無法訪問的。通過保護訪問類型和公有的繼承方式,實現(xiàn)了基類Matrix的數(shù)據(jù)的有效共享和可靠保護。在程序中,方程的系數(shù)矩陣、解以及右端項全部采用了動態(tài)內存分配技術,這些工作都是在基類、派生類的構造函數(shù)中完成,它們的清理工作在析構函數(shù)中完成。4.2 類的實現(xiàn)
9、4.3 主函數(shù)設計int main()int a=1,p,len; MyString S; MyString st1; MyString st2; MyString sub; MyString T; char ch120; char cl; cout<<"*歡迎進入字符串操作程序*"<<endl;while (a!=0) cout<<"-"<<endl;cout<<"請選擇功能操作:"<<endl;cout<<"n1.字符串的賦值n2.字符串
10、的長度n3.字符串的比較n4.字符串的連接n5.求字符串的子串n6.清空字符串n0.退出"<<endl;cin >>a; switch(a)case 0:cout<<"*謝謝使用!祝您工作順利!*"<<endl;break;case 1: cout<<"請輸入用于賦值新字符串"<<endl;cin>>ch1; InitString(&st1); StrAssign(&st1,ch1);cout<<"字符串被賦的值為:&quo
11、t; PrintString(st1);break ;case 2: cout<<"請輸入新字符串S"<<endl; cin>>ch1; InitString(&st1); StrAssign(&st1,ch1); cout<<"長度為:"<<StrLength(st1)<<endl;break;case 3: cout<<"請輸入要比較的兩個字符串S pk T"<<endl; cout<<"請輸入第一
12、個字符串st1(長度<20:)" cin>>ch1; InitString(&st1); StrAssign(&st1,ch1); cout<<"請輸入第二個字符串st2(長度<20):" cin>>ch1; InitString(&st2); StrAssign(&st2,ch1); StrCompare(st1,st2); int flag=StrCompare(st1,st2); if(flag=0) cout<<"字符串st1與st2相等"<
13、;<endl; else if(flag>0) cout<<"字符串st1比st2大"<<endl; else cout<<"字符串st1比st2小"<<endl; break ; case 4:cout<<"請輸入要連接的兩個字符串S1 & S2"<<endl; cout<<"請輸入第一個字符串(長度<20):" cin>>ch1; InitString(&st1); StrAssig
14、n(&st1,ch1); cout<<"請輸入第二個字符串(長度<20):" cin>>ch1; InitString(&st2); StrAssign(&st2,ch1); InitString(&T);Concat(&T,st1,st2);cout<<"連接后的新字符串:"<<endl;PrintString(T);break; case 5:cout<<"請輸入主串S(長度<20):"<<endl;cin&
15、gt;>ch1; InitString(&S); StrAssign(&S,ch1); InitString(&sub); cout<<"請輸入起始位置p:"<<endl; cin>>p; cout<<"請輸入子串的長度len(請考慮主串的長度)"<<endl; cin>>len; cout<<"所求子串為:"<<endl; SubString(&sub,S,p,len); PrintString(su
16、b); break;case 6:cout<<"確定要清空的字符串(Y/N)"<<endl;cin>>cl;if(cl='y'|cl='Y') ClearString(&st1); ClearString(&st2); ClearString(&sub); ClearString(&T);cout<<"字符串操作清除成功!"<<endl;break;default:cout<<"操作錯誤!請輸入正確序號!&qu
17、ot;<<endl; ; return 0;主函數(shù)的設計思路是通過定義mystring類的對象,然后通過生成的對象去調用相應的函數(shù)從而達到調試所編寫的函數(shù)功能的目的。此主函數(shù)有著演示函數(shù)的要求,為了使它能夠更靈活的進行函數(shù)的調用,首先設計了一個循環(huán)體,由整型變量a控制,當a=0時就結束循環(huán)。而在循環(huán)體中又由switch(a)函數(shù)來控制,通過輸入不同的a的值來控制不同的操作,即函數(shù)的演示。5 DOS界面程序運行結果及分析從它運行的界面可以看出,當進入函數(shù)調試狀態(tài)時我們可也通過輸入相應的操作序號來選擇不同的操作。例如選擇輸入1將進入字符串的賦值操作。下面就來看一下相應的函數(shù)。輸入1點回
18、車鍵就被要求輸入要賦得值,函數(shù)原型為StrAssign(&T, chars),執(zhí)行后就把字符串chars賦給對象T了。輸入2則進入字符串的長度函數(shù),我們要測試它的功能只要輸入一個字符串就可以加以驗證。例如上圖所示輸入字符串為:sfdffgffh,則串長為9.選擇4則進行字符串的比較功能,這個函數(shù)需要讀取相比較的兩個字符串,通過對字符串的每個字符的逐個的比較有一個返回值返給調用函數(shù)。選擇4則進行字符串的連接功能,把一個字符串連在另一個字符串的后面,如上圖所示:第一個字符串為dfghgh,另一個字符串為fgghf,則連接的字符串為dfghghfgghf。輸入5則選擇求字符串子串的功能,這個
19、函數(shù)需要輸入一個主串,起始位置p和子串長度len,輸入好參數(shù)后就可輸出所求的子串了。因為上述字符串操作中都給字符串賦了值,所以需要字符串,回到初始狀態(tài)。選擇0則結束函數(shù)演示。5.1 程序運行結果圖2 程序運行結果從圖2中可以看出,程序能夠實現(xiàn)全選主元高斯消去法對于線性方程組的求解,但是,對于求解結果的正確性問題卻無法獲知,為了能夠驗證求解結果的正確性,考慮將求解結果x帶入原方程Ax=b中,如果滿足原方程,即說明求解結果是正確的,否則,說明求解存在問題,需對程序進行進一步調試分析。為此,考慮在Linequ類中增加測試函數(shù)Test,用以驗證求解結果的正確性。void Linequ:test()/求
20、解結果驗證函數(shù)double *b2;b2=new doubleindex;for (int i=0;i<index;i+)/將解solu帶入原方程求出新的右端項b2b2i=0;for (int j=0;j<index;j+)b2i=b2i+MatrixAi*index+j*soluj;for (i=0;i<index;i+)/輸出新的右端項cout<<b2i<<" "cout<<endl;在主函數(shù)main中增加語句:equ1.test();/驗證求解結果經(jīng)過驗證的程序運行結果如圖3所示。圖3 程序運行結果的驗證從圖3中可
21、以看出,方程組求解驗證的右端項結果與原右端項結果完全一致,這說明了方程組求解的正確性。5.2運行結果分析整個程序中的矩陣存儲采用的是一維數(shù)組和動態(tài)內存分配方式?;愂菍iT處理矩陣的類,公有派生類Linequ是針對線性方程組而設計的,除了繼承基類的基本特征之外,結合問題的實際需要,增加了很多線性方程組所特有的成員,使基類Matrix進一步具體化、特殊化,達到對問題的有效描述和處理。程序的訪問控制也是根據(jù)問題的需要而設計的。基類的數(shù)據(jù)成員的存儲、維護著矩陣數(shù)據(jù),這正是派生類方程組的系數(shù)矩陣,使派生類解方程成員函數(shù)必須訪問的。利用保護成員特征,將基類數(shù)據(jù)成員的訪問控制屬性設置為保護型,在公有派生類L
22、inequ中就可以訪問到基類繼承下來的保護成員;而對于類外的其余模塊,這些數(shù)據(jù)無法訪問。這樣,就在數(shù)據(jù)的共享與隱藏之間尋找到一個比較恰當?shù)慕Y合點。在派生過程中,基類的構造函數(shù)和析構函數(shù)無法繼承下來,因此在派生類中需要添加構造函數(shù)、析構函數(shù)來完成派生類的初始化和最后清理工作。派生類的構造函數(shù)通過調用基類的構造函數(shù)來對基類數(shù)據(jù)進行初始化,本設計中,派生類Linequ的構造函數(shù)調用了基類Matrix的構造函數(shù)并傳遞必須的初始化參數(shù)。派生類的析構函數(shù)調用基類的構造函數(shù),共同完成清理任務。6 基于MFC的圖形界面程序開發(fā)MFC的圖形界面程序設計可在上述類設計的基礎上進行改造,MFC的圖形界面程序與DOS
23、界面程序的主要不同點是:MFC圖形界面程序與DOS界面程序的輸入輸出方式不同,DOS界面程序采用字符交互式實現(xiàn)數(shù)據(jù)輸入輸出,主要通過cin,cout等I/O流實現(xiàn),而MFC的圖形程序界面采用標準Windows窗口和控件實現(xiàn)輸入輸出,因此必須在MFC類的框架下加入上面所設計的矩陣和方程組類,并通過圖形界面的輸入輸出改造來完成。6.1 基于MFC的圖形界面程序設計(1)界面設計首先在VC中建立MFC AppWizard(exe)工程,名稱為GuassLineGUI,并在向導的Step1中選擇Dialog based,即建立基于對話框的應用程序,如下圖45所示。圖4 建立MFC AppWizard(
24、exe)工程圖5 建立基于對話框的應用程序將對話框資源中的默認對話框利用工具箱改造成如下界面,如圖6所示。圖6 方程組求解程序界面設計圖6所示的界面中包含了3個Static Text控件,3個Button控件,和24個Edit Box控件,控件的基本信息列表如下表1所示。表1 控件基本信息控件類別控件ID控件Caption說明Static TextIDC_STATIC系數(shù)矩陣A方程組右端項b解XBottonIDC_BUTTON_Read讀入數(shù)據(jù)IDC_BUTTON_CALC計算求解IDC_BUTTON_Exit退出Edit BoxIDC_EDIT_A00 IDC_EDIT_A33矩陣A的16個
25、元素IDC_EDIT_b0 IDC_EDIT_b3向量b的4個元素IDC_EDIT_X0 IDC_EDIT_X3解X的4個元素(2)代碼設計為了能夠將對話框界面上的控件能夠與代碼聯(lián)系起來,需要為24個Edit Box控件建立Member Variables,按Ctrl+w鍵進入MFC ClassWizard界面,選擇Member Variables選項卡,可顯示成員變量設置界面,如圖7所示。圖7 成員變量設置界面通過該界面設置與24個Edit Box控件對應的成員變量,具體如表2所示。表2 控件基本信息控件ID成員變量類型成員變量名稱IDC_EDIT_A00 IDC_EDIT_A33doubl
26、em_A00m_A33IDC_EDIT_b0 IDC_EDIT_b3doublem_b0m_b3IDC_EDIT_X0 IDC_EDIT_X3doublem_X0m_X3下面是編寫代碼的重要階段,可以借鑒在設計基于DOS界面的控制臺應用程序的代碼,并將其作必要的改寫,具體改寫的步驟與內容如下。將Linequ.h文件和Linequ.cpp文件合并成一個文件,重新命名為Linequ.h,并將其加入MFC工程。修改Linequ.h文件具體包括:l 將顯示矩陣PrintM()函數(shù)和顯示方程PrintL()函數(shù)注釋掉,因為在圖形界面的程序上已經(jīng)不需要連個函數(shù)承擔輸出功能了;l 將輸出方程組的解ShowX
27、()函數(shù)加入?yún)?shù)double x變成ShowX(double x),以實現(xiàn)將所求的解輸出至參數(shù)x中,并最終完成在對話框界面上的顯示;l 將全選主元高斯法求解函數(shù)Solve()中的兩處cout語句去掉,因為不需要也不能夠使用cout流實現(xiàn)輸出。在對話框類的實現(xiàn)文件GuassLineGUIDlg.cpp中加入#include "Linequ.h",以實現(xiàn)在該文件中可使用Linequ類。在GuassLineGUIDlg.cpp文件中加入以下全局變量的定義,以實現(xiàn)GuassLineGUIDlg類和Linequ類之間的通信,具體代碼如下:double a=/系數(shù)矩陣0.2368,0.
28、2471,0.2568,1.2671,0.1968,0.2071,1.2168,0.2271,0.1581,1.1675,0.1768,0.1871,1.1161,0.1254,0.1397,0.1490;double b4= 1.8471,1.7471,1.6471,1.5471;/方程右端項double *X;/存放方程組的解編寫讀入數(shù)據(jù)按鈕的消息處理函數(shù),實現(xiàn)將矩陣和右端項的數(shù)據(jù)刷新到界面上,具體代碼如下:void CGuassLineGUIDlg:OnBUTTONRead() / TODO: Add your control notification handler code here
29、m_A00=a0; m_A01=a1; m_A02=a2; m_A03=a3;m_A10=a5; m_A11=a6; m_A12=a7; m_A13=a8;m_A20=a9; m_A21=a10; m_A22=a11; m_A23=a12;m_A30=a13; m_A31=a14; m_A32=a15; m_A33=a16;m_b0=b0; m_b1=b1; m_b2=b2; m_b3=b3;UpdateData(FALSE);編寫計算求解按鈕的消息處理函數(shù),實現(xiàn)將方程求解,具體代碼如下:void CGuassLineGUIDlg:OnButtonCalc() / TODO: Add your control notification handler code hereLinequ equ1(4);/定義一個四元方程組對象equ1.SetLinequ(a,b);/設置方程組X=new double4;if(equ1.Solve()/求解方程組equ1.ShowX(X);/輸出方程組的解m_X0=X0;m_X1=X1;m_X2=X2;m_X3=X3;UpdateData(FALSE);elseMessageBox("求解失敗");/求解失敗
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)大數(shù)據(jù)與機器學習的結合策略
- 工業(yè)機器人技術與產(chǎn)業(yè)應用
- 工業(yè)機器人技術及其產(chǎn)業(yè)應用
- 工業(yè)機器人產(chǎn)業(yè)發(fā)展現(xiàn)狀及趨勢分析
- 工業(yè)機器人安全操作與管理培訓
- 工業(yè)自動化生產(chǎn)流程優(yōu)化
- 工業(yè)燃氣管道系統(tǒng)安全分析
- 工業(yè)自動化控制技術詳解
- 工業(yè)設計與用戶需求的精準對接
- 工業(yè)設計在產(chǎn)品開發(fā)中的作用與價值
- 中文版匹茲堡睡眠質量指數(shù)量表 (PSQI)1-2-10
- 供應商糾正措施表
- 路燈控制器的設計與仿真
- 3D打印技術3Done電子教案(續(xù))
- 新生入學報到證明(新生)
- 來料質量異常反饋單
- n系列蒸汽型溴化鋰吸收式冷水機組f.ju.1
- 會展策劃與管理高水平專業(yè)群建設項目建設方案
- 2021-2022學年江蘇省揚州市高一下學期期末地理試題
- 司爐崗位應急處置卡(燃氣)參考
- 最新四川省教師資格認定體檢表
評論
0/150
提交評論