沈阳理工大学通信工程C课程设计doc.docx

上传人:b****6 文档编号:7312566 上传时间:2023-01-22 格式:DOCX 页数:27 大小:456.17KB
下载 相关 举报
沈阳理工大学通信工程C课程设计doc.docx_第1页
第1页 / 共27页
沈阳理工大学通信工程C课程设计doc.docx_第2页
第2页 / 共27页
沈阳理工大学通信工程C课程设计doc.docx_第3页
第3页 / 共27页
沈阳理工大学通信工程C课程设计doc.docx_第4页
第4页 / 共27页
沈阳理工大学通信工程C课程设计doc.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

沈阳理工大学通信工程C课程设计doc.docx

《沈阳理工大学通信工程C课程设计doc.docx》由会员分享,可在线阅读,更多相关《沈阳理工大学通信工程C课程设计doc.docx(27页珍藏版)》请在冰豆网上搜索。

沈阳理工大学通信工程C课程设计doc.docx

沈阳理工大学通信工程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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1