上海电力学院
课程设计报告
面向对象程序设计
(2012 /20##学年第一学期)
课题名称 模仿ATM机存取款管理系统设计
院(系) 电子与信息工程学院
专 业 通信工程
学 号
姓 名
时 间 20##年1月12日至1月18日
地 点 奋进楼4楼5机房
指导教师 王剑云
目录
一、设计目的与任务...................................................................... 2
1、本课程设计的目的....................................................................................................................................... 2
2、本课程设计的任务....................................................................................................................................... 2
二、设计方案.................................................................................. 3
1. 总体设计...................................................................................................................................................... 3
2. 系统功能...................................................................................................................................................... 3
3. 系统截图..................................................................................................................................................... 4
4. 核心代码设计............................................................................................................................................. 6
三.心得体会.................................................................................... 13
一、设计目的与任务
1、本课程设计的目的
(1)课程设计是实践教学环节。设置课程设计的目的是加强学生对本课程及相关课程知识的理解,培养学生综合运用理论知识分析和解决实际问题的方法与能力。有助于提高学生的创新能力和创新意识。搞好课程设计教学工作,对实现专业培养目标,提高学生全面素质有重要作用。
(2)通过课程设计更进一步理解 C++的基础知识。
(3)训练用系统的观点及软件开发的一般规范进行软件开发,并在此过程中培养严谨的科学态度和良好的工作作风。初步掌握软件开发过程中的问题分析、系统设计、程序编码、调试、测试等方面的基本方法和技能。
(4)熟练掌握 C++知识在程序中的应用,了解书本知识在解决实际问题中的用途。
2、本课程设计的任务
模拟银行的自动取款机使用过程中的界面和用户交互过程。实现查询银行卡余额、取款、修改密码、退出系统等功能。
功能要求:
(1)卡号、密码输入最多三次,否则直接退出系统。
(2)取款功能:取款金额受卡余额、机单笔最大取款金额及机当前剩余金额的限制。
(3)查询功能:实现查询余额功能。
(4)更改密码:实现密码更改功能,对于密码要有2次验证。
(5)锁卡功能:实现卡被锁的功能。
(6)退卡功能:实现退出系统功能。
二、设计方案
1. 总体设计
设计的这个程序是模拟ATM取款机的使用过程,该程序功能包括:1)卡号、密码输入最多三次,否则直接退出系统。2)取款功能:取款金额受卡余额、机单笔最大取款金额及机当前剩余金额的限制。3)查询功能:实现查询余额功能。4)更改密码:实现密码更改功能,对于密码要有2次验证。5)锁卡功能:实现卡被锁的功能。6)退卡功能:实现退出系统功能。
2. 系统功能
首先编写一个class consumer(用户类)、class ATM(ATM取款机类)和一个main()函数,程序开始运行时调用main函数里设置好的用户信息,通过main函数来调用class ATM(ATM取款机类)和class consumer(用户类)中的相关函数和数据来达到程序的要求。class ATM(ATM取款机类)内主要有
void welcome(); // 登陆界面
bool check_passwd(char n[],char pwd[]); // 核对密码
void fetchmoney(); // 取款功能
void functionshow(); // 功能界面
void information(); // 查询功能
void change_passwd(); // 更改密码
void lock(); // 锁卡功能
void exitATM(); // 退卡功能
class consumer(用户类)内主要有
char* get_name(); // 获取姓名
char* get_num(); // 获取卡号
char* get_passwd(); // 获取密码
float get_money(); // 获取余额
void set_passwd(char pwd[]); // 设置密码
void set_money(float m); // 取款
通过在主界面的输入指令来实现各个函数的调用,以达到模仿ATM取款机的功能。
系统功能图与流程图
3.系统截图
(1)主界面
(2)卡号、密码输入最多三次,否则直接退出系统。
(3)取款功能:取款金额受卡余额、机单笔最大取款金额及机当前剩余金额的限制。
(4)查询功能:实现查询余额功能。
(5)更改密码:实现密码更改功能,对于密码要有2次验证。
(6)锁卡功能:实现卡被锁的功能
(7)退卡功能:实现退出系统功能。
4.核心代码设计
(1)类编写
通过定义两个类,class consumer(用户类)和class ATM(ATM取款机类),对于class ATM,public有登陆界面,核对密码,取款功能,功能界面,查询功能,更改密码,锁卡功能,退卡功能。Private有记录密码输入次数。对于class consumer,public有获取姓名,获取卡号,获取密码 ,获取余额,设置密码,取款。Private有用户密码,用户姓名。
(2)类的成员函数
class ATM // ATM取款机类
{
public:
ATM(consumer& cn):cnsm(cn){}
void welcome(); // 登陆界面
bool check_passwd(char n[],char pwd[]); // 核对密码
void fetchmoney(); // 取款功能
void functionshow(); // 功能界面
void information(); // 查询功能
void change_passwd(); // 更改密码
void lock(); // 锁卡功能
void exitATM(); // 退卡功能
private:
int times; // 记录密码输入次数
consumer& cnsm;
};
class consumer// 用户类
{
public:
friend class ATM;
consumer(char Name[],char Num[],float Money,char Password[]);
protected:
char* get_name(); // 获取姓名
char* get_num(); // 获取卡号
char* get_passwd(); // 获取密码
float get_money(); // 获取余额
void set_passwd(char pwd[]); // 设置密码
void set_money(float m); // 取款
private:
char passwd[8];// 用户密码
char name[20]; // 用户姓名
char num[20];
float money;
};
(3)各个功能的实现
(1)卡号、密码输入最多三次,否则直接退出系统。
void ATM::exitATM() //退卡
{
cout<<endl<<" 感谢您支持,欢迎下次光临! "<<endl;
cout<<" 请取回你的卡片 "<<endl;
exit(0);
}
//后面的退卡需要调用此函数
void ATM::welcome()
{
times=0;
cout<<"★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl;
cout<<"=================================================="<<endl;
cout<<" *中国农业银行* "<<endl;
cout<<" 欢迎使用ATM自动柜员机 "<<endl;
cout<<"=================================================="<<endl;
cout<<"★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl;
char pwd[8],num[20],ch;
int i=0;
do
{
i=0;
cout<<endl<<"请输入卡号:";
do
{
cin.get(ch); //对于键盘字符串的接收!
num[i++]=ch;
}while(ch!='\n');
num[i-1]='\0';
i=0;
cout<<"请输入密码:";
do{
cin.get(ch);
pwd[i++]=ch;
}while(ch!='\n');
pwd[i-1]='\0';
if(!check_passwd(num,pwd))
{
cout<<"你输入的卡号或密码有误,请重新输入"<<endl;
times++;
}
else
{
functionshow();
}
}while(times<3);
exitATM();
}
(2)取款功能:取款金额受卡余额、机单笔最大取款金额及机当前剩余金额的限制。
void ATM::fetchmoney() //取款
{
float m;
char ch;
do
{
cout<<endl<<"您要取多少钱:"<<endl; // 两种情况
cin>>m;
while(m<=0)
{
cout<<"请输入您的取款金额!"<<endl;
cin>>m;
}
if(cnsm.get_money()-m<0)
{
cout<<"对不起,你的余额不足!"<<endl;
}
else
{
cout<<endl<<"操作成功!请于30秒内取走您的钞票!"<<endl;
cnsm.set_money(m);
}
cout<<"是否要继续该项操作:(y/n) "<<endl;
cin>>ch;
}while(ch=='y'||ch=='Y');
}
(3)查询功能:实现查询余额功能。
void ATM::information() //查询
{
cout<<"=================================================="<<endl;
cout<<"您当前所剩余额为: "<<cnsm.get_money()<<endl; //必须声明友元才能用cnsm调用其成员函数
cout<<"=================================================="<<endl;
}
(4)更改密码:实现密码更改功能,对于密码要有2次验证。
void ATM::change_passwd() //更改密码
{
char pwd[8],repwd[8];
times=0;
do
{
cout<<endl<<"请输入旧密码:";
cin>>pwd;
if(!check_passwd(cnsm.get_num(),pwd))
times++;
else
break;
}while(times<3);
int t=1;
do
{
cout<<"请输入新密码:";
cin>>pwd;
cout<<"请确认新密码:";
cin>>repwd;
t=strcmp(pwd,repwd); // 相同返回0;
if(t!=0)
cout<<"对不起,您输入的两次密码不一样,请重新输入!"<<endl;
}while(t!=0);
cnsm.set_passwd(pwd);
cout<<"密码修改成功!"<<endl;
}
(5)锁卡功能:实现卡被锁的功能。
void ATM::lock() //锁卡
{
cout<<endl<<"对不起,由于你的操作有误,你的卡片已被没收! "<<endl;
exit(1); // 系统非正常退出
}
if(times==3)
lock(); //当密码输入三次错误后,进行锁卡
(6)退卡功能:实现退出系统功能。
void ATM::exitATM() //退卡
{
cout<<endl<<" 感谢您支持,欢迎下次光临! "<<endl;
cout<<" 请取回你的卡片 "<<endl;
exit(0);
}
(4)主函数
void main()
{
consumer c("张丽","20112218",5000,"456258");// 先构造一个用户
ATM atm(c);
atm.welcome();
}
三.心得体会
本次面向对象程序设计实践中,我完成了一个模仿ATM机存取款管理系统设计,刚开始时,对于这个课题的设计我首先是先进行功能的分析,针对其功能再设计其函数,在实现各个功能的时候,遇到了许多的问题,比如说取款金额受卡余额、机单笔最大取款金额及机当前剩余金额的限制,在进行设计时,就没有实现机单笔最大取款金额限制这一要求功能,在实验中,有一些问题难以解决,但是通过查询资料,上网搜索,也得到一定程度的解决。在设计过程中还有其他的各种问题,有请教老师的,老师都对我进行耐心的指导,解决了一些问题,还有问同学的,做相同课题同学们间的互相交流也使我受益匪浅。
经过一个星期的上机实验,对于面向程序设计这一门课我从课本上的例题教学,上机实验到现在的设计操作,明显有不同的感受,也许在书本上的例题能够看明白看懂,但是在自己进行设计并且运行的时候会出现许多的问题,检验自己许多方面的能力,细心程度,耐心程度等等。
此次课程设计,我对面向对象程序设计的认识得到了一定的提高,其实许多课程也是如此,我们不能单独停留在书本所交给我们的知识里,有时候的很多问题当你通过上机亲自操作,你会发现亲自实践比看书来得直观明了,这次的课程设计的目的也在于此,让我们通过实践来对所学知识进行检验以及深入的理解。
源代码
#include<iostream>
using namespace std;
class consumer;
class ATM // ATM取款机类
{
public:
ATM(consumer& cn):cnsm(cn){}
void welcome(); // 登陆界面
bool check_passwd(char n[],char pwd[]); // 核对密码
void fetchmoney(); // 取款功能
void functionshow(); // 功能界面
void information(); // 查询功能
void change_passwd(); // 更改密码
void lock(); // 锁卡功能
void exitATM(); // 退卡功能
private:
int times; // 记录密码输入次数
consumer& cnsm;
};
class consumer// 用户类
{
public:
friend class ATM;
consumer(char Name[],char Num[],float Money,char Password[]);
protected:
char* get_name(); // 获取姓名
char* get_num(); // 获取卡号
char* get_passwd(); // 获取密码
float get_money(); // 获取余额
void set_passwd(char pwd[]); // 设置密码
void set_money(float m); // 取款
private:
char passwd[8];// 用户密码
char name[20]; // 用户姓名
char num[20];
float money;
};
consumer::consumer(char Name[],char Num[],float Money,char Password[])
{
strcpy(name,Name);
strcpy(num,Num);
money=Money;
strcpy(passwd,Password);
}
float consumer::get_money()
{return money;}
char* consumer::get_name() // 对于数组的返回操作 返回指针
{return name;}
char* consumer::get_num()
{return num;}
char* consumer::get_passwd()
{return passwd;}
void consumer::set_money(float m)
{money-=m;}
void consumer::set_passwd(char pwd[])
{strcpy(passwd,pwd);}
void ATM::welcome()
{
times=0;
cout<<"★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl;
cout<<"=================================================="<<endl;
cout<<" *中国农业银行* "<<endl;
cout<<" 欢迎使用ATM自动柜员机 "<<endl;
cout<<"=================================================="<<endl;
cout<<"★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl;
char pwd[8],num[20],ch;
int i=0;
do
{
i=0;
cout<<endl<<"请输入卡号:";
do
{
cin.get(ch);
num[i++]=ch;
}while(ch!='\n');
num[i-1]='\0';
i=0;
cout<<"请输入密码:";
do{
cin.get(ch);
pwd[i++]=ch;
}while(ch!='\n');
pwd[i-1]='\0';
if(!check_passwd(num,pwd))
{
cout<<"你输入的卡号或密码有误,请重新输入"<<endl;
times++;
}
else
{
functionshow();
}
}while(times<3);
exitATM();
}
bool ATM::check_passwd(char num[],char pwd[])
{
if(strcmp(num,cnsm.get_num())==0&&strcmp(pwd,cnsm.get_passwd())==0)
return true;
else
return false;
}
void ATM::functionshow()
{
int n;
do
{
cout<<" "<<endl;
cout<<"本机可办理以下业务,请你输入相应的操作序号进行操作:"<<endl;
cout<<"<1> 查询 "<<endl<<"<2> 取款 "<<endl<<"<3> 更改密码 "<<endl<<"<4> 退出 "<<endl;
cin>>n;
while(n<1||n>4)
{
cout<<"对不起,本机无此项操作,请输入正确的操作序号!"<<endl;
cin>>n;
}
switch(n)
{
case 1:information(); break;
case 2:fetchmoney();break;
case 3:change_passwd(); break;
case 4:exitATM(); break;
}
}while(true);
}
void ATM::information() //查询
{
cout<<"=================================================="<<endl;
cout<<"您当前所剩余额为: "<<cnsm.get_money()<<endl; //必须声明友元才能用cnsm调用其成员函数
cout<<"=================================================="<<endl;
}
void ATM::fetchmoney() //取款
{
float m;
char ch;
do
{
cout<<endl<<"您要取多少钱:"<<endl; // 两种情况
cin>>m;
while(m<=0)
{
cout<<"请输入您的取款金额!"<<endl;
cin>>m;
}
if(cnsm.get_money()-m<0)
{
cout<<"对不起,你的余额不足!"<<endl;
}
else
{
cout<<endl<<"操作成功!请于30秒内取走您的钞票!"<<endl;
cnsm.set_money(m);
}
cout<<"是否要继续该项操作:(y/n) "<<endl;
cin>>ch;
}while(ch=='y'||ch=='Y');
}
void ATM::change_passwd() //更改密码
{
char pwd[8],repwd[8];
times=0;
do
{
cout<<endl<<"请输入旧密码:";
cin>>pwd;
if(!check_passwd(cnsm.get_num(),pwd))
times++;
else
break;
}while(times<3);
int t=1;
do
{
cout<<"请输入新密码:";
cin>>pwd;
cout<<"请确认新密码:";
cin>>repwd;
t=strcmp(pwd,repwd); // 相同返回0;
if(t!=0)
cout<<"对不起,您输入的两次密码不一样,请重新输入!"<<endl;
}while(t!=0);
if(times==3)
lock(); //当密码输入三次错误后,进行锁卡
cnsm.set_passwd(pwd);
cout<<"密码修改成功!"<<endl;
}
void ATM::lock() //锁卡
{
cout<<endl<<"对不起,由于你的操作有误,您的卡片已被锁!请于柜台办理相关业务! "<<endl;
exit(1); // 系统非正常退出
}
void ATM::exitATM() //退卡
{
cout<<endl<<" 感谢您支持,欢迎下次光临! "<<endl;
cout<<" 请取回你的卡片 "<<endl;
exit(0);
}
void main()
{
consumer c("张丽","20112218",5000,"456258");// 先构造一个用户
ATM atm(c);
atm.welcome();
}
面向对象程序设计之课程设计上海电力学院课题名称院系专业学号姓名时间地点指导教师课程设计报告面向对象程序设计20xx20xx学年第一…
面向对象程序设计实验报告姓名学号班级专业学院实验三函数的应用一实验目的掌握函数的定义和调用方法练习重载函数使用练习函数模板的使用练…
题目11问题描述建立一个二维坐标系的类TwoCoor用xy表示坐标值实现两坐标点的加减运算计算两坐标点间的距离并重载输入输出运算符…
综合实验报告面向对象程序设计专业名称班级姓名学号信息科学与工程学院二零一三年七月信息科学与工程学院面向对象程序设计综合实验报告目录…
课程实验报告课程名称面向对象程序设计实验名称面向过程的整型栈编程院系计算机科学与技术专业班级学号姓名指导教师年日面向对象程序设计实…
安徽广播电视大学梁伍七一、引言中期评估之前,我校加强网络教学的同时,逐步形成了“面授辅导+网络教学+小组学习”的课程教学模式实践模…
课程实验报告课程名称面向对象程序设计实验名称面向过程的整型栈编程院系计算机科学与技术专业班级学号姓名指导教师年日面向对象程序设计实…
Java面向对象程序设计第1版Java面向对象程序设计课程实验一报告学号姓名专业学校1Java面向对象程序设计第1版11实验目标查…
C面向对象程序设计课程设计报告题目分数计算器设置班级专业计算机科学与技术学号K031241521姓名周林指导教师小组成员周林张齐满…
面向对象程序设计课程设计报告题目门禁系统的设计与实现系(院)计算机科学技术系专业软件技术班级20##级3班学生姓名学号指导教师二〇…
综合实验报告面向对象程序设计专业名称班级姓名学号信息科学与工程学院二零一三年七月信息科学与工程学院面向对象程序设计综合实验报告目录…