沈阳理工大学通信工程C课程设计doc.docx
《沈阳理工大学通信工程C课程设计doc.docx》由会员分享,可在线阅读,更多相关《沈阳理工大学通信工程C课程设计doc.docx(27页珍藏版)》请在冰豆网上搜索。
沈阳理工大学通信工程C课程设计doc
封皮
(按学校要求手工填写)
成绩评定表
学生姓名
班级学号
专业
通信工程
课程设计题目
字符串类的设计与实现
评
语
组长签字:
成绩
日期
20年月日
课程设计任务书
学院
信息科学与工程
专业
通信工程
学生姓名
班级学号
课程设计题目
字符串类的设计与实现
实践教学要求与任务
进行字符串类的设计,具体要求如下:
(1)使用堆分配存储表示实现字符串的存储;
(2)实现串赋值操作StrAssign(&T,chars);
(3)实现串比较操作StrCompare(S,T);
(4)实现求串长操作StrLength(S);
(5)实现串连接操作Concat(&T,S1,S2);
(6)实现求子串操作SubString(&Sub,S,pos,len);
(7)实现清空子串操作ClearString(&S);
(8)将上述功能作为类的成员函数实现,编写主函数测试上述功能。
工作计划与进度安排
第17周:
分析题目,查阅课题相关资料,进行类设计、算法设计;
第18周:
程序的设计、调试与实现;
第19周:
程序测试与分析,撰写课程设计报告,进行答辩验收。
指导教师:
201年月日
专业负责人:
201年月日
学院教学副院长:
201年月日
摘要
类是C++中十分重要的概念,它是实现面向对象程序设计的基础。
C++对C的改进,最重要的就是增加了“类”这样一种类型。
类是对象的抽象,而对象则是类的具体实例,如果一种计算机语言中不包含类,它就不能称为面向对象的语言。
一个有一定规模的C++程序是由许多类所构成的。
本文进行了对字符串类的设计与实现,该程序实现的主要目的是对串赋值操作、串比较操作、求串长操作、串连接操作、求子串操作和清空子串操作进行功能测试。
本文采用VisualC++6.0的控制台工程和MFC工程分别实现了对字符串的相应操作功能的测试,通过对两种程序的测试结果对比分析,表明:
本文字符串类的设计思想正确,两种程序均能正确执行对所需功能的测试操作。
关键词:
类;字符串类的设计与实现;控制台工程;MFC工程
1需求分析
(1)类是C++中十分重要的概念,它是实现面向对象程序设计的基础。
C++对C的改进,最重要的就是增加了“类”这样一种类型。
(2)类是对象的抽象,而对象则是类的具体实例,如果一种计算机语言中不包含类,它就不能称为面向对象的语言。
一个有一定规模的C++程序是由许多类所构成的。
(3)类是C++的灵魂,如果不真正掌握类,就不能真正掌握C++。
2算法基本原理
输入字符串
字符串的赋值
字符串的比较
清空子串
求字符串子串
字符串的连接
求字符串串长
输出测试后的结果
字符串类的设计与实现
图2-1基本原理图
3类设计
从上面的算法分析可以看到,本设计的关键是类的成员函数的定义。
可以定义一个字符数组类string,然后在类内声明类的成员函数。
字符数组类的各成员函数负责对输入的字符串进行按要求处理,输入的字符串用一个一维数组来存放,字符数组类string的数据成员包括数组str[N]和len。
字符数组类string的功能需要有实现串赋值操作StrAssign(&T,chars)、实现串比较操作StrCompare(S,T)、实现求串长操作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(&S)。
字符数组类string的组成如图1所示。
string
#str[N]:
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,inta,intb):
void
+ClearString(char*s):
int
图1string类的UML图形表示
在字符串类的设计与实现过程中,在字符数组类string的成员函数StrAssign(char*s)、StrCompare(char*s)、StrLengh()、Concat(char*s)、SubString(char*s,inta,intb)和ClearString(char*s)中,实现对所选择的测试功能进行测试的操作。
4基于控制台的应用程序
整个程序分为三个独立的文档,string.h文件中是字符数组类string的声明,string.cpp文件中包括类的成员函数实现文件;main.cpp文件包括程序的主函数,主函数中定义了一个类string的对象,通过这个对象对字符串类的实现进行功能测试操作。
4.1类的接口设计
//string.h文件,实现类的声明
#include
constintN=200;
intn,flag=0;
classstring//string类声明
{
private:
charstr[N];//字符串一维数组
intlen;//串的长度
public:
//外部接口
string(char*p)//字符串的构造
{
copy(str,p);
}
string(){};
voidcopy(char*s1,char*s2);
voidcopy(char*s);
voidstrset()//字符串的输入
{
cin>>str;
}
voidstrout()//字符串的输出
{
cout<}
intlength();
voidStrAssign(char*s);//串赋值
intStrCompare(char*s);//串比较
intStrLengh();//求串长
voidConcat(char*s);//串连接
voidSubString(char*s,inta,intb);//求子串
intClearString(char*s);//清空子串
};
对字符数组类string的成员函数进行建立,类的成员是公有和私有类型,对于string类对象的外部模块来讲,类的私有成员是无法访问的。
在程序中,字符串一维数组和串的长度采用了动态内存分配技术,这些工作都是在类的构造函数中完成,它们的清理工作在析构函数中完成。
4.2类的实现
//string.cpp文件,类实现
#include"string.h"//包含类的声明头文件
//string类的实现
intstrlen(char*s)
{
inti=0;
while(s[i++]!
='\0');
returni-1;
}
intstring:
:
length()
{
inti=0;
while(str[i++]!
='\0');
returni-1;
}
voidstring:
:
StrAssign(char*s)//串赋值
{
inti,k=length();
for(i=0;i{
str[i]==s[i];
}
str[i]='\0';
}
intstring:
:
StrCompare(char*s)//串比较
{
inti=0;
intk1,k2,t;
k1=strlen(s);k2=length();
if(k1{t=k1;k1=k2;k2=t;}
for(i=0;i{
if(s[i]return1;
elseif(s[i]>str[i])
return-1;
}
return0;
}
intstring:
:
StrLengh()//求串长
{
inti=0;
while(str[i++]!
='\0');
returni-1;
}
voidstring:
:
Concat(char*s)//串连接
{
inti=0,k=length();
while(s[i]!
='\0')
{
str[k]=s[i];
k++;i++;
}
str[k]='\0';
}
voidstring:
:
SubString(char*s,inta,intb)//求子串
{
inti,k=0;
for(i=a-1;i
{
str[k]=s[i];
k++;
}
str[k]='\0';
}
intstring:
:
ClearString(char*s)//清空子串
{
inti,k=strlen(s);
for(i=0;i{
s[i]=NULL;
}
return1;
}
voidshow()
{
charyorn;
cout<<"\n是否退出系统[Y/N]:
";
cin>>yorn;
cout<if(yorn=='y'||yorn=='Y')flag=1;
else
if(yorn=='n'||yorn=='N'){flag=0;cout<<"请再次输入功能序号\n";
}
else
{
flag=0;cout<<"输入有误,请重新输入"<}
}
voidmenu()//功能列表
{
cout<<"***************************************"<cout<<"字符串类的设计与实现"<cout<<"***************************************"<cout<<"设计人:
司志磊"<cout<<"学号:
1103060135"<cout<<"功能选择菜单:
"<cout<<"1)串赋值\n"<<"2)串比较\n"<<"3)求串长\n"<<"4)串连接\n"<<"5)求子串\n"<<"6)清空子串\n";
cout<<"请您输入相应功能的序号!
"<}
voidc1()//测试功能1:
串赋值
{
strings;
chars1[N];
cout<<"您选择的功能是串赋值\n";
cout<<"请输入字符串,并以回车结束:
";
s.strset();
s.StrAssign(s1);
cout<<"串赋值为:
";
s.strout();
show();
}
voidc2()//测试功能2:
串比较
{
strings;
chars1[N];
cout<<"您选择的功能是串比较\n";
cout<<"请输入第一串字符并以回车结束:
";
s.strset();
cout<<"请输入第二串字符并以回车结束:
";
cin>>s1;
cout<<"结果:
"<show();
}
voidc3()//测试功能3:
求串长
{
strings;
chars1[N];
cout<<"您选择的功能是求串长\n";
cout<<"请输入字符串并以回车结束:
";
s.strset();
cout<<"结果:
"<show();
}
voidc4()//测试功能4:
串连接
{
chars1[N];
strings;
cout<<"您选择的功能是串连接\n";
cout<<"请随意输入一串字符并以回车结束:
";
s.strset();
cout<<"请输入一串想连接的字符并以回车结束:
";
cin>>s1;
s.Concat(s1);
cout<<"连接后的新字符串为:
";
s.strout();
show();
}
voidc5()//测试功能5:
求子串
{
strings;
inta,b;
chars1[N];
cout<<"您选择的功能是求子串\n";
cout<<"请输入母串,并以回车结束:
";
cin>>s1;
cout<<"请输入子串的始位置:
";
cin>>a;
cout<<"请输入子串的末位置:
";
cin>>b;
cout<s.SubString(s1,a,b);
cout<<"所取子串为:
";
s.strout();
show();
}
voidc6()//测试功能6:
清空子串
{
strings;
chars1[N];
cout<<"您选择的功能是清空子串\n";
cout<<"请输入所要清空的子串,并以回车结束:
";
cin>>s1;
cout<cout<<"结果:
"<show();
}
voidcs(char&n1)//开关键
{
n=n1-'0';
switch(n)
{
case1:
c1();break;
case2:
c2();break;
case3:
c3();break;
case4:
c4();break;
case5:
c5();break;
case6:
c6();break;
default:
cout<<"您输入的功能序号有误,请重新输入!
!
"<}
}
在类的成员函数实现过程中,类的构造函数为字符数组动态分配了内存空间。
类的析构函数在系统内部完成了函数调用。
类的成员函数可以自由地访问类的私有数据成员。
串赋值操作实现,则返回赋值后的串;串比较操作实现,若字符串1大于字符串2,返回值为1,若字符串1等于字符串2,返回值为0,若字符串1小于字符串2,返回值为-1;求串长操作实现,则返回值为所输入的串的长度;串连接操作实现,则返回连接后的字符串;求子串操作实现,则返回所求的子串;清空子串操作实现,正常完成之后,返回值为1。
根据函数的返回值,就可以判断操作实现的情况。
4.3主函数设计
//main.cpp主函数
#include"string.h"
intmain()//主函数
{
chara;
menu();
while
(1)
{
if(flag)
{
cout<<"谢谢你的使用!
\n";break;
}
cin>>a;
cs(a);
}
return0;
}
在程序的主函数部分,首先,选择你所要测试的功能的序号,之后从键盘输入需要的一个或两个字符串作为一个实际例子来进行功能的测试。
字符串使用一维数组来存储。
字符数组类string的成员函数StrAssign(char*s)、StrCompare(char*s)、StrLengh()、Concat(char*s)、SubString(char*s,inta,intb)和ClearString(char*s)会分别完成对所选功能的测试任务,show()函数会提示是否继续进行功能测试,继续进行功能测试则从键盘输入Y,退出系统,结束对功能的测试则输入N。
4.4基于控制台的应用程序测试
程序运行结果如图2和图3所示。
图2程序运行结果
图3程序运行结果
从图2和图3中可以看出,程序能够实现所选序号的功能,但是,对于功能实现的结果的正确性问题却无法获知,为了能够验证结果的正确性,对所输入的字符串进行人为功能实现,如果两次的功能实现结果相同,即说明功能实现的结果是正确的,否则,说明功能实现存在问题,需对程序进行进一步调试分析。
5基于MFC的应用程序
MFC的图形界面程序设计可在上述类设计的基础上进行改造,MFC的图形界面程序与DOS界面程序的主要不同点是:
MFC图形界面程序与DOS界面程序的输入输出方式不同,DOS界面程序采用字符交互式实现数据输入输出,主要通过cin,cout等I/O流实现,而MFC的图形程序界面采用标准Windows窗口和控件实现输入输出,因此必须在MFC类的框架下加入上面所设计的矩阵和方程组类,并通过图形界面的输入输出改造来完成。
5.1基于MFC的应用程序设计
5.1.1MFC程序界面设计
首先在VC中建立MFCAppWizard(exe)工程,名称设置为000,并在向导的Step1中选择Dialogbased,即建立基于对话框的应用程序,如下图4~5所示。
图4建立MFCAppWizard(exe)工程
图5建立基于对话框的应用程序
将对话框资源中的默认对话框利用工具箱改造成所需要的界面,如图6所示。
图6字符串操作程序界面设计
图6所示的界面中包含了5个StaticText控件,7个Button控件,和10个EditBox控件,控件的基本信息列表如下表1所示。
表1控件基本信息
控件类别
控件ID
控件Caption
说明
StaticText
IDC_STATIC
请输入字符串1
请输入字符串2
请输入子串的始位置
请输入子串的末位置
功能测试结果
Botton
IDC_BUTTON1
串赋值
IDC_BUTTON2
串比较
IDC_BUTTON3
求串长
IDC_BUTTON4
串连接
IDC_BUTTON5
求子串
IDC_BUTTON6
清空子串
IDC_BUTTON7
退出
EditBox
IDC_EDIT1
字符串1
IDC_EDIT2
字符串2
IDC_EDIT3
串赋值的测试结果
IDC_EDIT4
串比较的测试结果
IDC_EDIT5
求串长的测试结果
IDC_EDIT6
串连接的测试结果
IDC_EDIT7
求子串的测试结果
IDC_EDIT8
子串的始位置
IDC_EDIT9
子串的末位置
IDC_EDIT10
清空子串
5.1.2MFC程序代码设计
为了能够将对话框界面上的控件能够与代码联系起来,需要为10个EditBox控件建立MemberVariables,按Ctrl+w键进入MFCClassWizard界面,选择MemberVariables选项卡,可显示成员变量设置界面,如图7所示。
图7成员变量设置界面
通过该界面设置与10个EditBox控件对应的成员变量,具体内容如表2所示。
表2控件基本信息
控件ID
成员变量类型
成员变量名称
IDC_EDIT1
CEdit
m_str1
IDC_EDIT2
CEdit
m_str2
IDC_EDIT3
CString
m_e1
IDC_EDIT4
int
m_e2
IDC_EDIT5
int
m_e3
IDC_EDIT6
CString
m_e4
IDC_EDIT7
CString
m_e5
IDC_EDIT8
int
m_shou
IDC_EDIT9
int
m_wei
IDC_EDIT10
int
m_e6
下面是编写代码的重要阶段,可以借鉴在设计基于DOS界面的控制台应用程序的代码,并将其作必要的改写,具体改写的步骤与内容如下。
①将string.h文件和string.cpp文件合并成一个文件,重新命名为string.h,并将其加入MFC工程。
②修改string.h文件具体包括:
●将功能列表menu()函数和退出系统show()函数注释掉,因为在图形界面的程序设计上不需要这两个函数;
●将函数中的cout语句全部去掉,因为不需要也不能够使用cout流实现输出。
③编写执行测试功能的按钮的函数,实现所需测试的功能,具体代码如下:
voidCMy000Dlg:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
charcstr1[10];
m_str1.GetWindowText(cstr1,10);
m_e1=cstr1;
UpdateData(FALSE);
}
voidCMy000Dlg:
:
OnButton2()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
charcstr1[10],cstr2[10];
m_str1.GetWindowText(cstr1,10);
m_str2.GetWindowText(cstr2,10);
m_e2=strcmp(cstr1,cstr2);
UpdateData(FALSE);
}
voidCMy000Dlg:
:
OnButton3()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
charcstr1[10];
m_str1.GetWindowText(cstr1,10);
m_e3=strlen(cstr1);
UpdateData(FALSE);
}
voidCMy000Dlg:
:
OnButton4()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
char