C++课程设计报告Word格式.docx
《C++课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告Word格式.docx(71页珍藏版)》请在冰点文库上搜索。
):
+getlength():
+getcontents():
void
+setcontents(s:
char*):
+friendvoidstrcompare(str1:
CMyString,str2:
CMyString):
+strjudge():
void
+operator[](n:
int):
char&
+friendCMyStringoperator+(CMyString&
st1,CMyString&
st2):
+voidoperator=(constCMyString&
s):
图1-1-1字符串类的类图
通过类来实现字符串的封装,用成员函数和友元函数、运算符的重载来实现字符串的基本操作。
2.1.2详细设计(要求详细写出每个模块的功能实现,关键技术,关键代码解释等。
)
操作模式:
功能实现:
用一个主函数,把许多功能融入集中
关键代码:
voidmain()
{
charstr[2][100];
for(inti=0;
i<
2;
i++)
{
cout<
<
"
第"
i+1<
个字符串:
;
cin>
>
str[i];
}
CMyStringstr1(str[0]),str2(str[1]);
cout<
第一个字符串的长度:
str1.getlength()<
endl;
第二个字符串的长度:
str2.getlength()<
两个字符串的比较:
strcompare(str1,str2);
判断字符串是否为空,并置空:
第一个字符串"
str1.strjudge();
第二个字符串"
str2.strjudge();
str1.setcontents("
liyushan"
);
str2.setcontents("
studieshard."
CMyStringstr3("
chengjingui"
//字符串的赋值(调用带一个参数的构造函数)
第三个对象的内容:
str3.getcontents();
输入一个小于等于"
str3.getlength()<
的正整数:
intj;
cin>
j;
输出第"
j<
个字符是:
str3[j-1]<
str3=str1+str2;
第三个字符串的长度为:
第三个字符串的内容是:
str3..getaddress();
}
字符串类:
功能:
实现字符串的封装,安全
classCMyString//类的定义
char*string;
//字符串的内容
intlength;
//字符串的长度
public:
CMyString()//不带参数的构造函数
length=0;
string=NULL;
CMyString(char*s)//带一个参数的构造函数
length=strlen(s);
string=newchar[length+1];
strcpy(string,s);
CMyString(CMyString&
s)//拷贝构造函数:
来实现对象之间的拷贝
length=s.length;
string=s.string;
…………
};
字符串的比较:
实现字符串的比较
代码:
voidstrcompare(CMyStrings1,CMyStrings2)
//字符串的比较的实现(友元函数)
ints;
s=strcmp(s1.string,s2.string);
if(s>
0)cout<
s1.string<
大于"
s2.string<
elseif(s<
小于"
elsecout<
等于"
注意:
1.运用到类的成员函数的类外定义
2.运用到string.h头文件中的strcmp()
字符串的长度:
voidgetcontents()//求字符串的内容
string<
判断字符串是否为空:
friendvoidstrcompare(CMyStringstr1,CMyStringstr2);
//友元函数实现两个字符串对象的比较的声明
voidstrcompare(CMyStrings1,CMyStrings2)//字符串的比较的实现(友元函数)
1.运用友元函数并类外定义:
先声明再定义(不要加限定符)
2.要加关键字:
friend函数参数为对象
3.运用函数:
strcmp()
置空且赋值:
功能的实现:
是先用delete来置空,再分配内存进行赋值
voidsetcontents(char*s)//先置空,再重置字符串的内容
被置空"
deletestring;
重置后:
1.参数为指针
2.指针要先分配内存再运用
3.运用newdelede来分配动态内存
4.要注意内存长度的选择(内存的空间)
求字符串中的一个字符:
功能:
要用运算符的重载[]
关键代码:
operator[](intn)//求字符串中的字符用运算符重载[]
staticcharch=0;
if(n>
length-1)
{
cout<
整数下标越界"
returnch;
}
else
return*(string+n);
下标[]运算符的重载:
返回类型是char&
完成串的赋值与合并:
实现:
重载+
CMyStringoperator+(CMyString&
st2)
//运算符+重载的实现(友元函数):
实现两个字符串的连接
CMyStringt;
t.length=st1.length+st2.length;
//连接时:
先计算长度,
t.string=newchar[t.length+1];
//再重新分配内存
strcpy(t.string,st1.string);
//先拷贝再连接
strcat(t.string,st2.string);
returnt;
//返回类型是对象t
先分配再拷贝链接
voidoperator=(constCMyString&
s)//运算符=的重载
string=newchar[strlen(s.string+1)];
strcpy(string,s.string);
参数为类的引用
得到表示字符串的指针地址:
voidgetaddress()//得到字符串的指针地址
字符串的指针地址:
&
}
2.1.3调试及问题解决
问题1:
出现乱码,内存为空
解决:
析构与置空同时运用,使内存出现2次删除,出现错误
运用默认构造函数
问题2:
拷贝构造函数的深浅拷贝问题
定义拷贝构造函数
问题3:
运算符的重载问题
要对=进行重载解决问题
2.2利用C++中的类实现线性链表的常见操作
2.2.1总体设计
Node
intData;
Node*next;
图2-2-1链表结构体
list
-Node*head;
-intlength;
+list();
+list(list&
l);
+voidcreate();
+~list(){deletehead;
+voidMakeEmpty();
+intLength();
+voidInsert(intx,inti);
//将x插入到第i个结点(不含头结点)的之后
+intDelete(intx);
//删除链表中值为x的结点,成功返回1,否则返回0
+intReMove(inti);
//删除链表中第i个结点,成功返回1,否则返回0
+intFind(intx);
//在链表中查找数值为x的结点,成功返回1,否则返回0
+voidDisplay();
//显示整个链表各结点的数值
图2-2-2链表类
2.2.2详细设计
登录模式:
用主函数:
开始出现功能代码1、创建一个链表2、在第i个结点处插入值为x的结点3、求链表的长度4、删除值为x的结点5、删除第i个结点6.搜索结点7.显示所有的结点8、置空结点9.退出函数分别在其中调用各自的函数
inta;
listb;
*******需要先创建一个链表再操作*****"
while
(1)
选择你所需要的服务"
1.创建一个链表"
2.在第i个结点后插入值为x的结点"
3.求链表长度"
4.删除值为x结点"
5.删除第i个结点"
6.搜索结点"
7.显示所有结点"
8.置空结点"
9.退出程序"
请输入功能代码:
a;
if(a==1)
b.create();
b.Display();
elseif(a==2)
{intx,i;
分别输入要插入的数、位置i"
x>
i;
b.Insert(x,i);
b.Display();
elseif(a==3)
为链表长度:
b.Length()<
elseif(a==4)
请键入你所要删除的数字"
intc;
cin>
c;
b.Delete(c);
elseif(a==5)
请键入你所要删除的位置"
inti;
b.ReMove(i);
elseif(a==6)
请键入要查询的数"
inte;
e;
b.Find(e);
elseif(a==7)
elseif(a==8)
b.MakeEmpty();
elseif(a==9)
BYEBYE!
谢谢使用!
exit
(1);
你输入有误."
continue;
//结束本次循环,进行下一次的循环(continue只能用于循环语句中的)
循环结束了。
循环的运用
Breakcontinuereturnexit()的不同和运用
创建一个链表:
运用类的成员函数
voidlist:
:
create()
Node*p,*tail;
intdata,i;
输入链表的数据和长度"
data>
if(i==0)
head=NULL;
创建一个空的链表。
重新创造个链表"
create();
//递归调用
else
while(length<
i)
length++;
if(length==1)
{
head=newNode;
tail=head;
head->
Data=data;
}
else
p=newNode;
p->
tail->
next=p;
tail=p;
输入下一个结点的值"
data;
}
tail->
next=NULL;
length--;
先确定插入的链表数
当是0时:
我运用了递归让其建立一个不为空的链表
当不为0时,我先建立一个头文件,再在尾部加入新的结点,从而建立一个链表
在第i个结点处插入值为x的结点:
功能的实现:
需要找到第i个节点再插入x,不过要注意i的值
●length:
提示错误,用循环重写
●i<
=length:
插入头文件后或插入中间结尾
Insert(intx,inti)//将x插入到第i个结点(不含头结点)的之后
Node*p,*q,*s,*t=head;
s=newNode;
//创建新结点:
s
s->
Data=x;
s->
//新结点的数据是:
x
if(i>
length)
输入有误,请重新输入:
输入插入的数据和结点数:
else
for(intj=1;
t=t->
next)//查找第i个结点
j++;
p=t;
//p指向第i个结点,q指向第i+1个结点
q=p->
next;
if(p==NULL)
head=s;
s->
if(p->
next!
=NULL)
{
s->
next=q;
p->
next=s;
}
else
break;
求链表的长度:
通过遍历链表来得到链表的长度
intlist:
Length()//求链表的长度(结点数)
Node*p=head;
if(p==NULL)
该链表是空的。
returnlength;
for(length=1;
p->
=NULL;
p=p->
next)
//长度
}
函数类型为int
删除值为x的结点
从头往后找值为x的结点,找到后将其删除
Delete(intx)//删除链表中值为x的结点,成功返回1,否则返回0
Node*p=head,*q;
//p用于指向结点x,q指向结点x的前一个结点(删除值为x的结点p)
if(p==NULL)//若是空表
这是个空的链表,删除失败!
return0;
if(p->
Data==x)//若是第一个结点
head=p->
deletep;
删除第一个结点,值为"
x<
return1;
while(p->
Data!
=x&
=NULL)//查找值为x的结点p;
q=p;
p=p->
if(p->
Data==x)//如果有值为x的结点,返回1
q->
next=p->
deletep;
删除了值为"
的结点,删除成功。
return1;
没有该结点,删除失败!
return0;
//没有,返回0
删除第i个结点
找到结点将其删除
ReMove(inti)//删除链表中第i个结点,成功返回1,否则返回0
Node*p,*q,*t=head;
for(intj=1;
j++;
p=t;
q=p->
if(i==1)
删除第"
个结点,删除成功!
elseif(i>
1&
=length)
q->
else
链表中无该结点,删除失败!
搜索结点:
有循环的方法找到结点
Find(intx)//在链表中查找数值为x的结点,成功返回1,否则返回0
length=1;
while(p!
=NULL&
=x)
length++;
p=p->
Data==x)
找到第"
length<
个结点是:
没有找到数据是: