通信工程C++课程设计字符串类的设计与实现_第1页
通信工程C++课程设计字符串类的设计与实现_第2页
通信工程C++课程设计字符串类的设计与实现_第3页
通信工程C++课程设计字符串类的设计与实现_第4页
通信工程C++课程设计字符串类的设计与实现_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、封 皮(按学校要求手工填写)成 绩 评 定 表学生姓名班级学号专 业通信工程课程设计题目字符串类的设计与实现评语组长签字:成绩日期20 年 月 日课程设计任务书学 院信息科学与工程专 业通信工程学生姓名班级学号课程设计题目字符串类的设计与实现实践教学要求与任务进行字符串类的设计,具体要求如下:(1) 使用堆分配存储表示实现字符串的存储;(2) 实现串赋值操作StrAssign(&T,chars);(3) 实现串比较操作StrCompare(S,T);(4) 实现求串长操作StrLength(S);(5) 实现串连接操作Concat(&T,S1,S2);(6) 实现求子串操作Su

2、bString(&Sub,S,pos,len);(7) 实现清空子串操作ClearString(&S);(8) 将上述功能作为类的成员函数实现,编写主函数测试上述功能。工作计划与进度安排第17周:分析题目,查阅课题相关资料,进行类设计、算法设计;第18周:程序的设计、调试与实现;第19周:程序测试与分析,撰写课程设计报告,进行答辩验收。指导教师: 201 年 月 日专业负责人:201 年 月 日学院教学副院长:201 年 月 日摘 要类是C+中十分重要的概念,它是实现面向对象程序设计的基础。C+对C的改进,最重要的就是增加了“类”这样一种类型。类是对象的抽象,而对象则是类的具体

3、实例,如果一种计算机语言中不包含类,它就不能称为面向对象的语言。一个有一定规模的C+程序是由许多类所构成的。本文进行了对字符串类的设计与实现,该程序实现的主要目的是对串赋值操作、串比较操作、求串长操作、串连接操作、求子串操作和清空子串操作进行功能测试。本文采用Visual C+ 6.0的控制台工程和MFC工程分别实现了对字符串的相应操作功能的测试,通过对两种程序的测试结果对比分析,表明:本文字符串类的设计思想正确,两种程序均能正确执行对所需功能的测试操作。关键词:类;字符串类的设计与实现;控制台工程;MFC工程目 录1 需求分析12 算法基本原理13 类设计24 基于控制台的应用程序34.1

4、类的接口设计34.2 类的实现44.3 主函数设计114.4 基于控制台的应用程序测试125 基于MFC的应用程序155.1 基于MFC的应用程序设计155.1.1 MFC程序界面设计155.1.2 MFC程序代码设计175.2基于MFC的应用程序测试22结论24参考文献251 需求分析(1) 类是C+中十分重要的概念,它是实现面向对象程序设计的基础。C+对C的改进,最重要的就是增加了“类”这样一种类型。(2) 类是对象的抽象,而对象则是类的具体实例,如果一种计算机语言中不包含类,它就不能称为面向对象的语言。一个有一定规模的C+程序是由许多类所构成的。(3) 类是C+的灵魂,如果不真正掌握类,

5、就不能真正掌握C+。2算法基本原理字符串类的设计与实现 输入字符串求字符串子串求字符串串长字符串的比较字符串的赋值清空子串字符串的连接 输出测试后的结果图2-1基本原理图3 类设计从上面的算法分析可以看到,本设计的关键是类的成员函数的定义。可以定义一个字符数组类string,然后在类内声明类的成员函数。字符数组类的各成员函数负责对输入的字符串进行按要求处理,输入的字符串用一个一维数组来存放,字符数组类string的数据成员包括数组strN和len。字符数组类string的功能需要有实现串赋值操作StrAssign(&T,chars)、实现串比较操作StrCompare(S,T)、实现求

6、串长操作StrLength(S)、实现串连接操作Concat(&T,S1,S2)、实现求子串操作SubString(&Sub,S,pos,len)和实现清空子串操作ClearString(&S)。从问题的需要来看,字符数组类string的功能需要有实现串赋值操作StrAssign(&T,chars)、实现串比较操作StrCompare(S,T)、实现求串长操作StrLength(S)、实现串连接操作Concat(&T,S1,S2)、实现求子串操作SubString(&Sub,S,pos,len)和实现清空子串操作ClearString(&

7、S)。字符数组类string的组成如图1所示。string# strN: char# len: int+ string(char *p)+ string ()+ copy(char *s1,char *s2):void+ copy(char *s):void+ strset():void+ strout():void+ length ():int+ StrAssign(char*s):void+ StrCompare(char*s):int+ StrLengh():int+ Concat(char*s):void+ SubString(char*s,int a,int b):void+ Cle

8、arString(char*s):int图1string类的UML图形表示在字符串类的设计与实现过程中,在字符数组类string的成员函数StrAssign(char*s)、StrCompare(char*s)、StrLengh()、Concat(char*s)、SubString(char*s,int a,int b)和ClearString(char*s)中,实现对所选择的测试功能进行测试的操作。4 基于控制台的应用程序整个程序分为三个独立的文档,string.h文件中是字符数组类string的声明,string.cpp文件中包括类的成员函数实现文件;main.cpp文件包括程序的主函数,

9、主函数中定义了一个类string的对象,通过这个对象对字符串类的实现进行功能测试操作。4.1 类的接口设计/string.h文件,实现类的声明#include<iostream.h>const int N=200;int n ,flag=0;class string/string类声明private:char strN; /字符串一维数组int len; /串的长度string(char *p) /字符串的构造 copy(str,p); string ();void copy(char *s1,char *s2);void copy(char *s); void strset()

10、/字符串的输入 cin>>str; void strout() /字符串的输出 cout<<str<<endl; int length ();void StrAssign(char*s); /串赋值 intStrCompare(char*s); /串比较int StrLengh(); /求串长void Concat(char*s); /串连接void SubString(char*s,int a,int b); /求子串 int ClearString(char*s); /清空子串;对字符数组类string的成员函数进行建立,类的成员是公有和私有类型,对于s

11、tring类对象的外部模块来讲,类的私有成员是无法访问的。在程序中,字符串一维数组和串的长度采用了动态内存分配技术,这些工作都是在类的构造函数中完成,它们的清理工作在析构函数中完成。4.2 类的实现/string.cpp文件,类实现#include "string.h"/包含类的声明头文件/string类的实现int strlen(char*s) int i=0;while(si+!='0');return i-1;int string:length() int i=0;while(stri+!='0');return i-1;void st

12、ring:StrAssign(char*s) /串赋值 int i,k=length();for(i=0;i<k;i+)stri=si;stri='0'intstring:StrCompare(char*s) /串比较int i=0;int k1,k2,t;k1=strlen(s);k2=length();if(k1<k2)t=k1;k1=k2;k2=t;for(i=0;i<k1;i+)if(si<stri)return 1;else if(si>stri)return -1;return 0;intstring:StrLengh() /求串长in

13、t i=0;while(stri+!='0');return i-1;void string:Concat(char*s) /串连接int i=0,k=length();while(si!='0')strk=si;k+; i+;strk='0'void string:SubString(char*s,int a,int b) /求子串int i,k=0;for(i=a-1;i<b;i+)strk=si;k+;strk='0'int string:ClearString(char*s) /清空子串 int i,k=strlen

14、(s);for(i=0;i<k;i+)si=NULL; return 1;void show() char yorn;cout<<"n是否退出系统Y/N:" cin>>yorn;cout<<endl;if(yorn='y'|yorn='Y') flag=1;elseif(yorn='n'|yorn='N')flag=0;cout<<"请再次输入功能序号n" else flag=0;cout<<"输入有误,请重新输入&

15、quot;<<endl; void menu() /功能列表 cout<<"*"<<endl;cout<<" 字符串类的设计与实现"<<endl;cout<<"*"<<endl; cout<<"设计人:司志磊"<<endl;cout<<"学号:1103060135"<<endl;cout<<"功能选择菜单:"<<endl;

16、 cout<<"1)串赋值n"<<"2)串比较n"<<"3)求串长n"<<"4)串连接n"<<"5)求子串n"<<"6)清空子串n"cout<<"请您输入相应功能的序号!"<<endl;void c1() /测试功能1:串赋值 string s;char s1N; cout<<"您选择的功能是串赋值n"cout<<&q

17、uot;请输入字符串,并以回车结束:"s.strset();s.StrAssign(s1);cout<<"串赋值为:"s.strout();show(); void c2() /测试功能2:串比较 string s; char s1N;cout<<"您选择的功能是串比较n"cout<<"请输入第一串字符并以回车结束: "s.strset();cout<<"请输入第二串字符并以回车结束: "cin>>s1;cout<<"结果:

18、"<<s.StrCompare(s1)<<endl;show();void c3() /测试功能3:求串长 string s;char s1N;cout<<"您选择的功能是求串长n"cout<<"请输入字符串并以回车结束: "s.strset();cout<<"结果:"<<s.StrLengh()<<endl;show();void c4() /测试功能4:串连接 char s1N;string s;cout<<"您选择

19、的功能是串连接n"cout<<"请随意输入一串字符并以回车结束:"s.strset();cout<<"请输入一串想连接的字符并以回车结束:"cin>>s1;s.Concat(s1);cout<<"连接后的新字符串为:"s.strout();show();void c5() /测试功能5:求子串 string s;int a,b;char s1N;cout<<"您选择的功能是求子串n"cout<<"请输入母串,并以回车结束:&

20、quot;cin>>s1;cout<<"请输入子串的始位置:"cin>>a;cout<<"请输入子串的末位置:"cin>>b;cout<<endl;s.SubString(s1,a,b);cout<<"所取子串为:"s.strout();show();void c6() /测试功能6:清空子串 string s;char s1N;cout<<"您选择的功能是清空子串n"cout<<"请输入所要清空的

21、子串,并以回车结束:"cin>>s1;cout<<endl; cout<<"结果:"<<s.ClearString(s1)<<endl;show();void cs(char &n1) /开关键 n=n1-'0'switch(n) case 1:c1();break;case 2:c2();break;case 3:c3();break; case 4:c4();break;case 5:c5();break; case 6:c6();break;default: cout<

22、<"您输入的功能序号有误,请重新输入!"<<endl; 在类的成员函数实现过程中,类的构造函数为字符数组动态分配了内存空间。类的析构函数在系统内部完成了函数调用。类的成员函数可以自由地访问类的私有数据成员。串赋值操作实现,则返回赋值后的串;串比较操作实现,若字符串1大于字符串2,返回值为1,若字符串1等于字符串2,返回值为0,若字符串1小于字符串2,返回值为-1;求串长操作实现,则返回值为所输入的串的长度;串连接操作实现,则返回连接后的字符串;求子串操作实现,则返回所求的子串;清空子串操作实现,正常完成之后,返回值为1。根据函数的返回值,就可以判断操作实现

23、的情况。4.3 主函数设计/main.cpp主函数#include "string.h"int main()/主函数char a;menu();while(1)if(flag) cout<<"谢谢你的使用!n" break; cin>>a;cs(a);return 0;在程序的主函数部分,首先,选择你所要测试的功能的序号,之后从键盘输入需要的一个或两个字符串作为一个实际例子来进行功能的测试。字符串使用一维数组来存储。字符数组类string的成员函数StrAssign(char*s)、StrCompare(char*s)、StrLe

24、ngh()、Concat(char*s)、SubString(char*s,int a,int b)和ClearString(char*s)会分别完成对所选功能的测试任务,show( )函数会提示是否继续进行功能测试,继续进行功能测试则从键盘输入Y,退出系统,结束对功能的测试则输入N。4.4 基于控制台的应用程序测试程序运行结果如图2和图3所示。图2 程序运行结果图3 程序运行结果从图2和图3中可以看出,程序能够实现所选序号的功能,但是,对于功能实现的结果的正确性问题却无法获知,为了能够验证结果的正确性,对所输入的字符串进行人为功能实现,如果两次的功能实现结果相同,即说明功能实现的结果是正确的

25、,否则,说明功能实现存在问题,需对程序进行进一步调试分析。5基于MFC的应用程序MFC的图形界面程序设计可在上述类设计的基础上进行改造,MFC的图形界面程序与DOS界面程序的主要不同点是:MFC图形界面程序与DOS界面程序的输入输出方式不同,DOS界面程序采用字符交互式实现数据输入输出,主要通过cin,cout等I/O流实现,而MFC的图形程序界面采用标准Windows窗口和控件实现输入输出,因此必须在MFC类的框架下加入上面所设计的矩阵和方程组类,并通过图形界面的输入输出改造来完成。5.1 基于MFC的应用程序设计 MFC程序界面设计首先在VC中建立MFC AppWizard(exe)工程,

26、名称设置为000,并在向导的Step1中选择Dialog based,即建立基于对话框的应用程序,如下图45所示。图4 建立MFC AppWizard(exe)工程图5 建立基于对话框的应用程序将对话框资源中的默认对话框利用工具箱改造成所需要的界面,如图6所示。图6 字符串操作程序界面设计图6所示的界面中包含了5个Static Text控件,7个Button控件,和10个Edit Box控件,控件的基本信息列表如下表1所示。表1 控件基本信息控件类别控件ID控件Caption说明Static TextIDC_STATIC请输入字符串1请输入字符串2请输入子串的始位置请输入子串的末位置功能测试结

27、果BottonIDC_BUTTON1串赋值IDC_BUTTON2串比较IDC_BUTTON3求串长IDC_BUTTON4串连接IDC_BUTTON5求子串IDC_BUTTON6清空子串IDC_BUTTON7退出Edit BoxIDC_EDIT1字符串1IDC_EDIT2字符串2IDC_EDIT3串赋值的测试结果IDC_EDIT4串比较的测试结果IDC_EDIT5求串长的测试结果IDC_EDIT6串连接的测试结果IDC_EDIT7求子串的测试结果IDC_EDIT8子串的始位置IDC_EDIT9子串的末位置IDC_EDIT10清空子串 MFC程序代码设计为了能够将对话框界面上的控件能够与代码联系起

28、来,需要为10个Edit Box控件建立Member Variables,按Ctrl+w键进入MFC ClassWizard界面,选择Member Variables选项卡,可显示成员变量设置界面,如图7所示。图7 成员变量设置界面通过该界面设置与10个Edit Box控件对应的成员变量,具体内容如表2所示。表2 控件基本信息控件ID成员变量类型成员变量名称IDC_EDIT1CEditm_str1IDC_EDIT2CEditm_str2IDC_EDIT3CStringm_e1IDC_EDIT4intm_e2IDC_EDIT5intm_e3IDC_EDIT6CStringm_e4IDC_EDIT

29、7CStringm_e5IDC_EDIT8intm_shouIDC_EDIT9intm_weiIDC_EDIT10intm_e6下面是编写代码的重要阶段,可以借鉴在设计基于DOS界面的控制台应用程序的代码,并将其作必要的改写,具体改写的步骤与内容如下。将string.h文件和string.cpp文件合并成一个文件,重新命名为string.h,并将其加入MFC工程。修改string.h文件具体包括:l 将功能列表menu()函数和退出系统show()函数注释掉,因为在图形界面的程序设计上不需要这两个函数;l 将函数中的cout语句全部去掉,因为不需要也不能够使用cout流实现输出。编写执行测试功

30、能的按钮的函数,实现所需测试的功能,具体代码如下:void CMy000Dlg:OnButton1() / TODO: Add your control notification handler code hereUpdateData(TRUE); char cstr110;m_str1.GetWindowText(cstr1,10);m_e1=cstr1; UpdateData(FALSE);void CMy000Dlg:OnButton2() / TODO: Add your control notification handler code hereUpdateData(TRUE); c

31、har cstr110,cstr210;m_str1.GetWindowText(cstr1,10); m_str2.GetWindowText(cstr2,10);m_e2=strcmp(cstr1,cstr2);UpdateData(FALSE);void CMy000Dlg:OnButton3() / TODO: Add your control notification handler code hereUpdateData(TRUE); char cstr110;m_str1.GetWindowText(cstr1,10); m_e3=strlen(cstr1); UpdateDat

32、a(FALSE);void CMy000Dlg:OnButton4() / TODO: Add your control notification handler code hereUpdateData(TRUE); char cstr110,cstr210;m_str1.GetWindowText(cstr1,10); m_str2.GetWindowText(cstr2,10);int i=0,k=strlen(cstr1);while(cstr2i!='0')cstr1k=cstr2i;k+;i+;cstr1k='0' m_e4=cstr1; Update

33、Data(FALSE);void CMy000Dlg:OnButton5() / TODO: Add your control notification handler code hereUpdateData(TRUE); char cstr110;char cstr310;m_str1.GetWindowText(cstr1,10); int i,k=0;for(i=m_shou-1;i<m_wei;i+)cstr3k=cstr1i;k+;cstr3k='0'm_e5=cstr3;UpdateData(FALSE);void CMy000Dlg:OnButton6() / TODO: Add your control notification handler code hereUpdateData(TRUE);int i,k=strlen(m_e5);for(i=0;i<k;i+)m_e5i=NULL; if(m_e5)m_e6=1; UpdateData(FALSE);退出按钮比较简单,代码如下:void CMy000Dlg:OnButton7() / TODO: Add your

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论