C++课程设计报告.docx
- 文档编号:10856420
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:60
- 大小:225.24KB
C++课程设计报告.docx
《C++课程设计报告.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告.docx(60页珍藏版)》请在冰点文库上搜索。
C++课程设计报告
一、课程设计目的及要求.2
1.1设计目的2
1.2设计要求2
1.2.1封装一个完善的字符串,实现字符串的基本操作2
1.2.2.利用C++中的类实现线性链表的常见操作2
1.2.3编写一个银行ATM自动取款机模拟程序3
二、课程设计具体实现3
2.1封装一个完善的字符串,实现字符串的基本操作3
2.1.1总体设计(总的任务画出总体设计图,总体设计方案及主要设计原理;(算
法的设计))3
2.1.2详细设计(要求详细写出每个模块的功能实现,关键技术,关键代码解释等。
)
4
2.1.3调试及问题解决8
2.2利用C++中的类实现线性链表的常见操作8
2.2.1总体设计8
2.2.2详细设计9
2.2.3调试及问题解决17
2.3编写一个银行ATM自动取款机模拟程序17
2.2.1总体设计17
2.2.2详细设计18
2.2.3调试及问题解决23
三、结束语(包括感想、致谢、设计总结)23
四、源代码(代码要加注释)23
4.1封装一个完善的字符串,实现字符串的基本操作23
4.2利用C++中的类实现线性链表的常见操作27
4.3编写一个银行ATM自动取款机模拟程序36
4.3.1面向过程的程序设计36
4.3.2面向对象的程序设计41
课程设计目的及要求
1.1设计目的
软件工程专业所开设的C++课程设计是教学实践环节中一项重要内容,进行此课程设计的旨在:
1.提高和加强学生的计算机应用与软件开发能力,使学生由初学者向专业的程序员过渡。
2.培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。
3.学习和掌握C++程序设计方法以及上机调试技巧,为今后学习其它专业课程打好基础。
本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指
定的任务,作出设计报告。
1.2设计要求
1.2.1封装一个完善的字符串,实现字符串的基本操作
要求如下:
定义一个串类CMyString,建立适当的构造函数
字符串使用指针保存字符串
必须实现如下操作,字符串比较、求串的长度、判断串是否为空、将串置空、字符
串赋值(包括两个字符串类复制,一个字符串赋值到CmyString对象)、求字符串中的
一个字符或改变字符串中的一个字符(采用重载[]),完成串的赋值与合并(重载+),
得到表示字符串的指针地址
在字符串类的基础上封装彩色字符串类。
(学会使用继承和多态)可选
1.2.2.利用C+冲的类实现线性链表的常见操作
带表头结点(存放的是该线性链表的长度),结点存放的是整型数值;实现以下操作:
置空MakeEmpty()求长度Length()插入Insert(intx,inti):
将x插入到第i个结点(不含头结点)的之后;
删除Delete(intx):
删除链表中值为x的结点,成功返回1,否则返回0;删除ReMove(inti):
删除链表中第i个结点,成功返回1,否则返回0;搜索Find(intx):
在链表中查找数值为x的结点,成功返回1,否则返回0;
显示Display():
显示整个链表各结点的数值。
写出类的构造函数、复制构造函数及析构函数
编写一个函数,使用户通过选择进行相关链表操作。
1.2.3编写一个银行ATM自动取款机模拟程序
实现ATM取款机的基本功能,如给用户提供查询余额、取款、修改密码、吃卡、退出系统等服务,可根据实际情况添加(如缴费、转账等服务)。
对于用户要求输入相应的帐号和密码,如果三次出错则将卡吃掉并打印出相应凭条。
若输入的取款金额超出账户余额,则提示用户输入有误并提供更正功能
二、课程设计具体实现
2.1封装一个完善的字符串,实现字符串的基本操作
2.1.1总体设计(总的任务画出总体设计图,总体设计方案
及主要设计原理;(算法的设计))
CMyString
-string:
char*
-length:
int
+CMyString():
+CMyString(s:
char*):
+CMyString(s:
CMyString&):
+getlength():
int
+getcontents():
void
+setcontents(s:
char*):
void
+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<<"第"<
";cin>>str[i];
}
CMyStringstr1(str[0]),str2(str[1]);
cout<<"第一个字符串的长度:
"< cout<<"第二个字符串的长度: "< cout<<"两个字符串的比较: ";strcompare(str1,str2); cout<<"判断字符串是否为空,并置空: "< cout<<"第一个字符串"; str1.strjudge(); cout<<"第二个字符串"; str2.strjudge(); str1.setcontents("liyushan"); str2.setcontents("studieshard."); CMyStringstr3("chengjingui");//字符串的赋值(调用带一个参数的构造函数) cout<<"第三个对象的内容: "; str3.getcontents(); cout<<"输入一个小于等于"< "; intj; cin>>j; cout<<"输出第"< "< cout<<"第三个字符串的长度为: "< cout<<"第三个字符串的内容是: ";str3.getcontents(); 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< elseif(s<0)cout< elsecout< } 注意: 子符串的长度: 代码: voidgetcontents()//求字符串的内容 { cout< } 判断字符串是否为空: 关键代码: friendvoidstrcompare(CMyStringstr1,CMyStringstr2); //友元函数实现两个字符串对象的比较的声明 voidstrcompare(CMyStrings1,CMyStrings2)//字符串的比较的实现(友元函数){ ints; s=strcmp(s1.string,s2.string); if(s>0)cout< elseif(s<0)cout< elsecout< } C;\Docu»entsandSettingsstrat25李-** 鮎空 3 虞虞112宀仝宀匕宀V. 为为为45的的比否不不聞士子第壬于行个个壬玉个汀一一不断一二 两判^ 1.运用友元函数并类外定义: 先声明再定义(不要加限定符) 2.要加关键字: friend函数参数为对象 3.运用函数: strcmp() 置空且赋值: 功能的实现: 是先用delete来置空,再分配内存进行赋值 代码: voidsetcontents(char*s)//先置空,再重置字符串的内容 { length=strlen(s);cout< string=newchar[length+1];strcpy(string,s); cout<<"重置后: "< 1.参数为指针 2.指针要先分配内存再运用 3.运用newdelede来分配动态内存 4.要注意内存长度的选择(内存的空间) 求字符串中的一个字符: 功能: 要用运算符的重载[] 求字符串中的字符用运算符重载[] 关键代码: char&operator[](intn)// { staticcharch=0; if(n>length-1) { cout<<"整数下标越界"< } else return*(string+n); } 下标[]运算符的重载: 返回类型是char& 完成串的赋值与合并: 实现: 重载+ 关键代码: CMyStringoperator+(CMyString&st1,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)〃运算符=的重载 { deletestring; string=newchar[strlen(s.string+1)];strcpy(string,s.string); } 注意: 参数为类的引用 得到表示字符串的指针地址: voidgetaddress()〃得到字符串的指针地址 { cout<<"字符串的指针地址: "<<&string< } 2.1.3调试及问题解决 问题1: 出现乱码,内存为空 解决: 析构与置空同时运用,使内存出现2次删除,出现错误 运用默认构造函数 问题2: 拷贝构造函数的深浅拷贝问题 解决: 定义拷贝构造函数 问题3: 运算符的重载问题 解决: 要对=进行重载解决问题 2.2利用C++中的类实现线性链表的常见操作 2.2.1总体设计 Node intData; Node*next; 图2-2-1链表结构体 +voidcreate。 ; +~list(){deletehead;} +voidMakeEmpty(); +intLength(); +voidInsert(intx,inti);〃 +intDelete(intx);// +intReMove(inti);// +intFind(intx);// +voidDisplay();// 将x插入到第i个结点(不含头结点)的之后 删除链表中值为x的结点,成功返回1,否则返回0 删除链表中第i个结点,成功返回1,否则返回0在链表中查找数值为x的结点,成功返回1,否则返回0显示整个链表各结点的数值 图2-2-2链表类 2.2.2详细设计 登录模式: 功能的实现: 用主函数: 开始出现功能代码1、创建一个链表2、在第i个结点处插入值 为x的结点3、求链表的长度4、删除值为x的结点5、删除第i个结点6.搜索结点7.显示所有的结点8、置空结点9.退出函数分别在其中调 用各自的函数 关键代码: voidmain() { inta; listb; cout<<"*******需要先创建一个链表再操作*****"< while (1) { cout<<"选择你所需要的服务"< cout<<"1.创建一个链表"< cout<<"2.在第i个结点后插入值为x的结点"< cout<<"3.求链表长度"< cout<<"4.删除值为x结点"< cout<<"5.删除第i个结点"< cout<<"6.搜索结点"< cout<<"7.显示所有结点"< cout<<"8.置空结点"< cout<<"9.退出程序"< cout<<"请输入功能代码: "< cin>>a; if(a==1) { b.create(); b.Display(); } elseif(a==2) {intx,i; cout<<"分别输入要插入的数、位置i"< cin>>x>>i; b.Insert(x,i); b.Display(); } elseif(a==3) cout<<"为链表长度: "< elseif(a==4) { cout<<"请键入你所要删除的数字"< cin>>c; b.Delete(c); b.Display(); } elseif(a==5) { cout<<"请键入你所要删除的位置"< cin>>i; b.ReMove(i); b.Display(); } elseif(a==6) { cout<<"请键入要查询的数"< inte; cin>>e; b.Find(e); } elseif(a==7) b.Display(); elseif(a==8) { b.MakeEmpty(); b.Display(); } elseif(a==9) { cout<<"BYEBYE! 谢谢使用! "< exit (1); } else 只能用于 {cout<<"你输入有误."< }}cout<<"循环结束了。 "< }注意: 循环的运用Breakcontinuereturnexit()的不同和运用创建一个链表: 功能的实现: 运用类的成员函数关键代码: voidlist: : create() { Node*p,*tail; intdata,i;cout<<"输入链表的数据和长度"< if(i==0) { head=NULL;cout<<"创建一个空的链表。 "< } else {while(length { length++;if(length==1) {head=newNode;tail=head;head->Data=data; } else {p=newNode;p->Data=data;tail->next=p;tail=p; } cout<<"输入下一个结点的值"< cin>>data; }tail->next=NULL;length--; } } 注意: 先确定插入的链表数 当是0时: 我运用了递归让其建立一个不为空的链表 当不为0时,我先建立一个头文件,再在尾部加入新的结点,从而建立一个链表 在第i个结点处插入值为x的结点: 功能的实现: 需要找到第i个节点再插入x,不过要注意i的值length: 提示错误,用循环重写i<=length: 插入头文件后或插入中间结尾关键代码: voidlist: : Insert(intx,inti)//将x插入到第i个结点(不含头结点)的之后 { Node*p,*q,*s,*t=head;s=newNode;//创建新结点: ss->Data=x; while (1) { s->Data=x;//新结点的数据是: xif(i>length) { cout<<"输入有误,请重新输入: "< ";cin>>x>>i;continue; } else { for(intj=1;jnext)//查找第i个结点 j++; p=t; //p指向第i个结点,q指向第i+1个结点q=p->next;if(p==NULL){head=s;s->next=NULL; if(p->next! =NULL) { s->next=q;p->next=s; } else { p->next=s;s->next=NULL; } } break; } } } 求链表的长度: 功能的实现: 通过遍历链表来得到链表的长度关键代码: intlist: : Length()//求链表的长度(结点数) { Node*p=head;if(p==NULL){cout<<"该链表是空的。 "< } else {for(length=1;p->next! =NULL;p=p->next){ length++;//长度 } returnlength; }}注意: 函数类型为int删除值为x的结点功能的实现: 从头往后找值为x的结点,找到后将其删除关键代码: intlist: : Delete(intx)//删除链表中值为x的结点,成功返回1,否则返回0 { Node*p=head,*q; 〃p用于指向结点x,q指向结点x的前一个结点(删除值为x的结点P)if(p==NULL)//若是空表 { cout<<"这是个空的链表,删除失败! "< return0; } if(p->Data==x)//若是第一个结点 { head=p->next; deletep; cout<<"删除第一个结点,值为"< return1; } else { while(p->Data! =x&&p->next! =NULL)//查找值为x的结点p; { q=p; p=p->next; } if(p->Data==x)//如果有值为x的结点,返回1 { q->next=p->next; deletep; cout<<"删除了值为"< "< } else { cout<<"没有该结点,删除失败! "< return0;//没有,返回0 } } q=p->next; if(i==1) {head=p->next;deletep; cout<<"删除第"< "< } elseif(i>1&&i<=length) {q->next=p->next;deletep; cout<<"删除第"< "< } else { cout<<"链表中无该结点,删除失败! "< } 1,否则 }搜索结点: 功能的实现: 有循环的方法找到结点关键代码: intlist: : Find(intx)//在链表中查找数值为x的结点,成功返回返回0 { Node*p=head; length=1;while(p! =NULL&&p->Data! =x) { length++;p=p->next; }if(p->Data==x) { cout<<"找到第"< "< } else { cout<<"没有找到数据是: "< } } 显示所有的结点 功能的实现: 考虑空
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计 报告