




免费预览已结束,剩余41页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录一、课程设计目的及要求21.1设计目的21.2设计要求21.2.1封装一个完善的字符串,实现字符串的基本操作21.2.2.利用c+中的类实现线性链表的常见操作21.2.3 编写一个银行atm自动取款机模拟程序3二、课程设计具体实现32.1封装一个完善的字符串,实现字符串的基本操作32.1.1总体设计(总的任务画出总体设计图,总体设计方案及主要设计原理;(算法的设计)32.1.2详细设计(要求详细写出每个模块的功能实现,关键技术,关键代码解释等。)42.1.3调试及问题解决62.2利用c+中的类实现线性链表的常见操作62.2.1总体设计62.2.2详细设计62.2.3调试及问题解决62.3编写一个银行atm自动取款机模拟程序62.2.1总体设计62.2.2详细设计62.2.3调试及问题解决6三、结束语(包括感想、致谢、设计总结)6四、源代码(代码要加注释)64.1封装一个完善的字符串,实现字符串的基本操作64.2利用c+中的类实现线性链表的常见操作94.3编写一个银行atm自动取款机模拟程序194.3.1面向过程的程序设计194.3.2面向对象的程序设计24一、课程设计目的及要求1.1设计目的软件工程专业所开设的c+课程设计是教学实践环节中一项重要内容,进行此课程设计的旨在:1. 提高和加强学生的计算机应用与软件开发能力,使学生由初学者向专业的程序员过渡。2. 培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。3. 学习和掌握c+程序设计方法以及上机调试技巧,为今后学习其它专业课程打好基础。 本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,作出设计报告。1.2设计要求1.2.1封装一个完善的字符串,实现字符串的基本操作要求如下:l 定义一个串类cmystring,建立适当的构造函数l 字符串使用指针保存字符串l 必须实现如下操作,字符串比较、求串的长度、判断串是否为空、将串置空、字符串赋值(包括两个字符串类复制,一个字符串赋值到cmystring对象)、求字符串中的一个字符或改变字符串中的一个字符(采用重载),完成串的赋值与合并(重载+),得到表示字符串的指针地址l 在字符串类的基础上封装彩色字符串类。(学会使用继承和多态)可选1.2.2.利用c+中的类实现线性链表的常见操作 l 带表头结点(存放的是该线性链表的长度),结点存放的是整型数值; l 实现以下操作 :n 置空makeempty()n 求长度length() n 插入insert(int x,int i): 将x插入到第i个结点(不含头结点)的之后; n 删除delete(int x):删除链表中值为x的结点,成功返回1,否则返回0; n 删除 remove(int i):删除链表中第i个结点,成功返回1,否则返回0; n 搜索 find(int x):在链表中查找数值为x的结点,成功返回1,否则返回0;n 显示 display():显示整个链表各结点的数值。 l 写出类的构造函数、复制构造函数及析构函数 l 编写一个函数,使用户通过选择进行相关链表操作。1.2.3 编写一个银行atm自动取款机模拟程序实现atm取款机的基本功能,如给用户提供查询余额、取款、修改密码、吃卡、退出系统等服务,可根据实际情况添加(如缴费、转账等服务)。 l 对于用户要求输入相应的帐号和密码,如果三次出错则将卡吃掉并打印出相应凭条。 l 若输入的取款金额超出账户余额,则提示用户输入有误并提供更正功能 二、课程设计具体实现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 + friend void strcompare(str1:cmystring, str2:cmystring): + strjudge(): void+ operator(n : int) : char &+friend cmystring operator +( cmystring &st1, cmystring &st2):+void operator =(const cmystring &s):图1-1-1字符串类的类图 通过类来实现字符串的封装,用成员函数和友元函数、运算符的重载来实现字符串的基本操作。2.1.2详细设计(要求详细写出每个模块的功能实现,关键技术,关键代码解释等。)操作模式:功能实现:用一个主函数,把许多功能融入集中关键代码:void main()char str2100;for(int i=0;i2;i+)cout第i+1stri;cmystring str1(str0),str2(str1);cout第一个字符串的长度:str1.getlength()endl;cout第二个字符串的长度:str2.getlength()endl;cout两个字符串的比较:;strcompare(str1,str2);cout判断字符串是否为空,并置空:endl;cout第一个字符串;str1.strjudge();cout第二个字符串;str2.strjudge();str1.setcontents(liyushan);str2.setcontents( studies hard.); cmystring str3(chengjingui);/字符串的赋值(调用带一个参数的构造函数)cout第三个对象的内容:;str3.getcontents();cout输入一个小于等于str3.getlength()j;cout输出第j个字符是:str3j-1endl;str3=str1+str2;cout第三个字符串的长度为:str3.getlength()endl;cout0) couts1.string大于s2.stringendl;else if(s0) couts1.string小于s2.stringendl;else couts1.string等于s2.stringendl;注意:1. 运用到类的成员函数的类外定义2. 运用到string.h 头文件中的strcmp()字符串的长度:代码:void getcontents()/求字符串的内容coutstring0) couts1.string大于s2.stringendl;else if(s0) couts1.string小于s2.stringendl;else couts1.string等于s2.stringendl;注意:1. 运用友元函数并类外定义:先声明再定义(不要加限定符)2. 要加关键字:friend 函数参数为对象3. 运用函数:strcmp()置空且赋值:功能的实现:是先用delete 来置空,再分配内存进行赋值代码:void setcontents(char *s)/先置空,再重置字符串的内容length=strlen(s);coutstring被置空endl;delete string;string=new charlength+1;strcpy(string,s);cout重置后:stringlength-1)cout整数下标越界endl;return ch;else return *(string+n);注意:下标运算符的重载:返回类型是char &完成串的赋值与合并:实现:重载+关键代码:cmystring operator +( cmystring &st1, cmystring &st2)/运算符+重载的实现(友元函数):实现两个字符串的连接cmystring t;t.length=st1.length+st2.length;/连接时:先计算长度,t.string=new chart.length+1;/再重新分配内存strcpy(t.string,st1.string);/先拷贝 再连接strcat(t.string,st2.string);return t;/返回类型是对象t注意:先分配再拷贝链接void operator =(const cmystring &s)/运算符=的重载delete string;string=new charstrlen(s.string+1);strcpy(string,s.string);注意:参数为类的引用得到表示字符串的指针地址:void getaddress()/得到字符串的指针地址cout字符串的指针地址:&stringendl;2.1.3调试及问题解决问题1:出现乱码,内存为空解决:析构与置空同时运用,使内存出现2次删除,出现错误 运用默认构造函数问题2:拷贝构造函数的深浅拷贝问题解决:定义拷贝构造函数问题3:运算符的重载问题解决:要对=进行重载 解决问题2.2利用c+中的类实现线性链表的常见操作2.2.1总体设计nodeint data; node *next;图2-2-1链表结构体list-node *head; -int length;+list(); +list(list &l); +void create(); +list()delete head; +void makeempty(); +int length(); +void insert(int x,int i);/将x插入到第i个结点(不含头结点)的之后 +int delete(int x); /删除链表中值为x的结点,成功返回1,否则返回0 +int remove(int i); /删除链表中第i个结点,成功返回1,否则返回0 +int find(int x); /在链表中查找数值为x的结点,成功返回1,否则返回0 +void display(); /显示整个链表各结点的数值图2-2-2链表类2.2.2详细设计登录模式:功能的实现:用主函数:开始出现功能代码 1、创建一个链表 2、在第i个结点处插入值为x的结点 3、求链表的长度 4、删除值为x的结点 5、删除第i个结点 6.搜索结点 7. 显示所有的结点 8、置空结点 9. 退出函数 分别在其中调用各自的函数关键代码:void main()int a;list b;cout*需要先创建一个链表再操作*endl;while(1)cout 选择你所需要的服务endl;cout1.创建一个链表endl;cout2.在第i个结点后插入值为x的结点endl;cout3.求链表长度endl;cout4.删除值为x结点endl;cout5.删除第i个结点endl;cout6.搜索结点endl;cout7.显示所有结点endl;cout8.置空结点endl;cout9.退出程序endl;cout请输入功能代码:a;if(a=1)b.create();b.display();else if(a=2) int x,i;cout分别输入要插入的数、位置ixi;b.insert(x,i);b.display();else if(a=3)cout为链表长度:b.length()endl;else if(a=4)cout请键入你所要删除的数字c;b.delete(c);b.display();else if(a=5) cout请键入你所要删除的位置i;b.remove(i);b.display(); else if(a=6)cout请键入要查询的数e;b.find(e); else if(a=7)b.display();else if(a=8)b.makeempty();b.display();else if(a=9)coutbyebye!谢谢使用!endl;exit(1);else cout你输入有误.endl;continue;/结束本次循环,进行下一次的循环(continue 只能用于循环语句中的)cout循环结束了。endl;注意:循环的运用 break continue return exit()的不同和运用创建一个链表:功能的实现:运用类的成员函数关键代码:void list:create()node *p,*tail;int data,i;cout输入链表的数据和长度datai;if(i=0)head=null;cout创建一个空的链表。endl;cout重新创造个链表endl;create();/递归调用elsewhile(lengthdata=data;elsep=new node;p-data=data;tail-next=p;tail=p;cout输入下一个结点的值data; tail-next=null;length-;注意:先确定插入的链表数 当是0时:我运用了递归让其建立一个不为空的链表 当不为0时,我先建立一个头文件,再在尾部加入新的结点,从而建立一个链表在第i个结点处插入值为x的结点: 功能的实现:需要找到第i个节点再插入x,不过要注意i的值l length:提示错误,用循环重写l idata=x;while(1)s-data=x; /新结点的数据是:xif(ilength)cout输入有误,请重新输入:endl;coutxi;continue;elsefor(int j=1;jnext)/查找第i个结点j+;p=t; /p指向第i个结点,q指向第i+1个结点q=p-next;if(p=null)head=s;s-next=null;elseif(p-next!=null)s-next=q;p-next=s;elsep-next=s;s-next=null;break;求链表的长度:功能的实现:通过遍历链表来得到链表的长度 关键代码:int list:length()/求链表的长度(结点数)node *p=head;if(p=null)cout该链表是空的。next!=null;p=p-next)length+;/长度return length; 注意:函数类型为int 删除值为x的结点功能的实现:从头往后找值为x的结点,找到后将其删除关键代码: int list:delete(int x)/删除链表中值为x的结点,成功返回1,否则返回0node *p=head,*q;/p用于指向结点x,q指向结点x的前一个结点(删除值为x的结点p)if(p=null) /若是空表cout这是个空的链表,删除失败!data=x)/若是第一个结点head=p-next;delete p;cout删除第一个结点,值为xdata!=x&p-next!=null)/查找值为x的结点p;q=p;p=p-next;if(p-data=x)/如果有值为x的结点,返回1q-next=p-next;delete p;cout删除了值为x的结点,删除成功。endl;return 1;elsecout没有该结点,删除失败!endl;return 0;/没有,返回0 删除第i个结点功能的实现:找到结点将其删除关键代码:int list:remove(int i) /删除链表中第i个结点,成功返回1,否则返回0node *p,*q,*t=head;for(int j=1;jnext)/查找第i个结点j+;p=t; /p指向第i个结点,q指向第i+1个结点 q=p-next;if(i=1)head=p-next;delete p;cout删除第i个结点,删除成功!1&inext=p-next;delete p;cout删除第i个结点,删除成功!endl;return 1;else cout链表中无该结点,删除失败!data!=x)length+;p=p-next;if(p-data=x)cout找到第length个结点是:xendl;return 1;elsecout没有找到数据是:x的结点endl;return 0;显示所有的结点功能的实现:考虑空链表与非空的两种情况关键代码:void list:display()/显示整个链表各结点的数值并输出链表的长度node *p=head;length=0;if(head=null)cout这是一个空的链表endl;elsecout该链表是:;while(p!=null)coutdatanext;length+; coutendl;cout该链表的长度为:lengthnext; head=p-next; delete p;p=head;关键代码:void list:makeempty()/置空函数node *p=head;if(p=null)cout这个链表是空的。next!=null;p=p-next)head=p-next;delete p;p=head;delete p;head=null;return; 退出函数功能的实现:用exit()函数关键代码:else if(a=9)coutbyebye!谢谢使用!endl;exit(1);注意:本操作要退出程序:就需要退出循环,退出主函数,则用exit()或break或return 注意他们的区别!exit()重要2.2.3调试及问题解决问题1:链表的设计怎么吧?答:需要先创建一个非空链表再进行其他的操作。问题2:缺少头函数?答:在用exit()时缺少头文件。需要加上头文件#include,从而解决问题。问题3:创建一个链表时,当为空时不能继续进行?答:采用直接递归调用,实现创建一个非空的链表。2.3编写一个银行atm自动取款机模拟程序2.2.1总体设计开始登陆界面输入选择代码i判断i的值i=ii=2i=3i=4i=5i=6i=7i为其他2.2.2详细设计登陆模块:功能的实现:通过7个代码实现功能之间的选择1.开户 2.存款3.取款 4.查询余额5.转账6.更改密码7.退出关键代码:void main() int i;while(1)couttt*nendl;couttt* 欢迎使用自动取款机 *nendl;couttt-nendl; couttt请选择您要办理的手续:n;couttttt1.开户n;couttttt2.存款n; couttttt3.取款n; couttttt4.查询余额n; couttttt5.转账n;couttttt6.更改密码n; couttttt7.退出n; couti;if(7=6)break;switch(i)case 1:openaccount();/开户break;case 2:savemoney();/存款break;case 3:takemoney();/取款break;case 4:check();/查询余额break;case 5:transfer();/转账break;case 6:changepassword();break;default:coutaaatt你的输入有误,请输入1-7之间的数!n;开户:功能的实现:创建一个账号,用于下面的操作关键代码:/开户函数void openaccount()couttt欢迎开户::n;coutname;coutcardid;coutpassword;coutmoney;couttt恭喜您,开户成功!n;吃卡:功能的实现:如果密码三次输入错误,就吃卡,退出系统关键代码:void eatcard()long cid;char password120;for( int i=0;i3;i+)coutcid;coutpassword1;if(cid=cardid&strcmp(password1,password)=0)couttt输入正确!endl;return;elseswitch(i)case 0:case 1:cout*卡号密码输入有误*ntt请重新输入:endl;break;case 2:cout*吃卡*endl;exit(1);存款:功能的实现:先输入密码,进入存款关键代码:/存款void savemoney()int money1;couttt欢迎使用取款业务:n;eatcard();coutmoney1;money=money+money1;couttt取款成功,卡上余额为:moneyendl;取款:功能的实现:先输入密码,进行存款关键代码:/取款void takemoney()int money1;couttt欢迎您使用取款业务n; eatcard();coutmoney1;if(money1money)cout取款超过存款金额(money),请重新输入:;elsemoney=money-money1;couttt取款成功,您卡上余额为:moneyendl;return;查询余额:先输入密码,进行查询余额功能的实现:关键代码:/查询void check() couttt欢迎进行查询业务n;eatcard();couttt卡上余额为:moneyendl;转帐:功能的实现:先输入密码,再转帐关键代码:/转账void transfer()long bcid;int money1;couttt欢迎使用转账业务nendl; eatcard();coutbcid;coutmoney1;if(money1money)cout转账金额超过存款金额(money),请重新输入:;elsemoney=money-money1;couttt转账成功,您卡上余额为:moneyendl;return;修改密码:功能的实现:输入密码,再改密码关键代码:void changepassword()char password120,password220;couttt欢迎修改密码ttendl;eatcard();while(1)coutpassword1;coutpassword2;if(strcmp(password1,password2)=0)strcpy(password,password1);cout密码修改成功!endl;return;elsecout*更改密码不一致*n重新输入:;退出:功能的实现:用break退出循环从而退出系统关键代码:if(i=7)break;2.2.3调试及问题解决问题1:吃卡问题答:通过三次的判断,来解决问题三、结束语(包括感想、致谢、设计总结)通过前一段时间的学习,我们对c+有了一定的基础,我们也会编写一些小的程序。我认为自己已经学得不错了。但事实并非如此,我只是眼高手低。我认识到了自己许多的不足,我认识到了c+的重要性。经过两三星期的课程设计,我深有感触。我发现了许多,也认识到许多。我生气自己的不足,我放弃过,我伤心过,我思索过。经过激烈的奋斗,我战胜了自己,终于完成了一个又一个的程序。我是非常的喜悦,我的努力没有白费。我有加深了自己对知识的了解,我将更加的努力。我更深刻地明白了一个道理:我们不要害怕,我们要行动,把我们的想法写出了,去慢慢的实现。只有敢于行动,敢于下手,我们才有机会成功。我发现自己有一个不足:只敢想不敢做。我总认为想法不对,就不敢去行动了,从而失败了许多次。经过耐心的思考,我发现了自己的缺点,我要努力改变自己。在设计中,我也认识到许多基础知识的重要性。不然会漏洞百出,我一定会抓住基础,基础是成功的关键。更重要的是:我要多思考,多动手,只有这样,我们才能获得许多。四、源代码(代码要加注释)4.1封装一个完善的字符串,实现字符串的基本操作/*1.封装一个,完善字符串,字符串的基本操作要求如下: 定义一个串类cmystring,建立适当的构造函数 字符串使用指针保存字符串 必须实现如下操作,字符串比较、求串的长度、判断串是否为空、将串置空、字符串赋值(包括两个字符串类复制,一个字符串赋值到cmystring对象)、求字符串中的一个字符或改变字符串中的一个字符(采用重载),完成串的赋值与合并(重载+),得到表示字符串的指针地址 在字符串类的基础上封装彩色字符串类。(学会使用继承和多态)可选*/#include#includeclass cmystring/类的定义char *string;/字符串的内容int length;/字符串的长度public:cmystring()/不带参数的构造函数length=0;string=null;cmystring(char *s)/带一个参数的构造函数length=strlen(s);string=new charlength+1;strcpy(string,s); cmystring(cmystring &s)/拷贝构造函数:来实现对象之间的拷贝length=s.length;string=s.string;int cmystring:getlength()/求字符串的长度return length; void getcontents()/求字符串的内容coutstringendl; void setcontents(char *s)/先置空,再重置字符串的内容length=strlen(s);coutstring被置空endl;delete string;string=new charlength+1;strcpy(string,s);cout重置后:stringendl;friend void strcompare(cmystring str1,cmystring str2);/友元函数实现两个字符串对象的比较void strjudge()/判断字符串是否为空if(string!=null) cout不为空.endl;else cout为空.length-1)cout整数下标越界endl;return ch;else return *(string+n);friend cmystring operator +( cmystring &st1, cmystring &st2);/运算符+号的重载的声明void operator =(const cmystring &s)/运算符=的重载delete string;string=new charstrlen(s.string+1);strcpy(string,s.string);void getaddress()/得到字符串的指针地址cout字符串的指针地址:&string0) couts1.string大于s2.stringendl;else if(s0) couts1.string小于s2.stringendl;else couts1.string等于s2.stringendl;cmystring operator +( cmystring &st1, cmystring &st2)/运算符+重载的实现(友元函数):实现两个字符串的连接cmystring t;t.length=st1.length+st2.length;/连接时:先计算长度,t.string=new chart.length+1;/再重新分配内存strcpy(t.string,st1.string);/先拷贝 再连接strcat(t.string,st2.string);return t;/返回类型是对象t/*主函数*/void main()char str2100;for(int i=0;i2;i+)cout第i+1stri;cmystring str1(str0),str2(str1);cout第一个字符串的长度:str1.getlength()endl;cout第二个字符串的长度:str2.getlength()endl;cout两个字符串的比较:;strcompare(str1,str2);cout判断字符串是否为空,并置空:endl;c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园幼儿礼仪教育合作与推广合同
- 城市综合体屋顶光伏项目场地租赁与能源政策支持协议
- 遵义市文职辅警招聘考试真题
- 物联网智能设备数据采集、存储及数据安全服务合同
- 新版gsp计算机系统培训试题及答案
- 虚拟社交平台用户虚拟身份权属及使用协议
- 灾区模块化医院快速搭建与医疗设施安全保障合同
- 时尚潮流穿戴系统设计与生产合同
- 网络文学作品版权代理与网络文学版权授权及改编合作协议
- 医疗机构医疗隐私保护风险评估合同
- 平面向量的基本定理(说课)
- 人教版PEP英语3-6年级全部单词默写表格以及背诵版本
- 2024年新课标高考化学真题试题(原卷版+含解析)
- 《一起长大的玩具》整本书阅读(教学设计)统编版语文二年级下册
- 2024公需科目:数字经济与创新驱动发展题库
- 汽车租赁价格动态调整策略研究
- 湖北省武汉市江汉区2023-2024学年七年级下学期期末数学试题
- 专题04语法填空
- DZ∕T 0270-2014 地下水监测井建设规范
- (高清版)JTGT 3365-02-2020 公路涵洞设计规范
- 科普知识小学生飞机科普知识
评论
0/150
提交评论