您好,欢迎来到刀刀网。
搜索
您的当前位置:首页ATM机

ATM机

来源:刀刀网
本案例知识要点

 数组的使用  引用类型变量的使用  类的设计和使用  友元类的使用

一、案例需求

1.案例描述

模拟银行的自动取款机ATM 使用过程中的界面和用户交互过程。 2.案例效果图

3.功能说明

(1)模拟自动取款机(ATM)的流程,实现查询银行卡余额、取款、修改密码、退出系统等功能。

(2)卡号、密码输入最多3次,否则直接退出系统。

(3)取款金额受卡余额、ATM机单笔最

大取款金额及ATM机当前剩余金额的。

二、案例分析

本案例涉及到一个银行卡和ATM机器之间的“对话”。需要处理两个对象ATM 和银行卡,可以定义两个类来解决这个问题。

ATM 机类有“单笔取款最高”、“每日取款总金额”、“余额”等基本属性。需要实现“核对密码”、 “修改密码”、 “取款”、 “查询信息”、 “退出系统”、 “锁机吞卡”等操作。把这些操作定义成ATM机类的成员函数。

银行卡类具有“用户姓名”、“用户密码”、“存款额”等特征。需要实现“身份验证”、“查询余额”、“修改密码”、“交易成功更改余额”等操作。把这些操作定义成银行卡类的成员函数。

三、案例设计

1.类的设计

根据以上的设计思想,设计了两个类,ATM类 和BankCard类。ATM类完成自动柜员机的模拟,包括:显示登陆界面、验证卡号密码、修改密码、取款、显示所插卡信息、退出系统等功能。银行卡类完成银行卡的模拟,包括设置姓名、卡号、密码、余额等信息。类的定义和实现均保存在头文件ATM.h文件中。

(1) BankCard类的设计

图15-3 BankCard类图

 数据成员

char passwd[8]; 用来存储用户密码。

char name[20]; 用来存储用户姓名。

char num[20]; 用来存储银行卡号。

float money; 用来存储银行卡金额。  函数成员

BankCard(char Name[],char Num[], float Money,char Password[]);

用来初始化银行卡信息,建立银行卡用户姓名、卡号、余额及其密码。

char * getname(); 取得银行卡用户姓名。

char * getnum(); 取得银行卡卡号。

char * getpasswd(); 取得银行卡密码。 float getmoney(); 取得银行卡余额。

void setpasswd(char pwd[]); 设置银行卡密码。

void setmoney(float m);

更新银行卡余额,在原有余额的基础上减去m。 (2)ATM类的设计

 数据成员

int times;

用来记录密码输入次数。

float

totalmoney;

用来记录本 ATM 机存款总

额。

float

leftmoney;

用来记录ATM机剩余金额。

float

oncemoney;

用来记录取款单笔最高金额。 BankCard& BankCardAtATM;

用来记录插入ATM机的银行卡信息。  函数成员

ATM(BankCard& bc):BankCardAtATM(bc) 用于初始化自动取款机,建立自动取款机的每日最高存放金额、单笔取款最高上限金额、ATM机目前剩余金额。其中,bc是BankCard类的引用型变量。这样定义ATM类的构造函数是因为在ATM类中要使用BankCard类的数据成员,完成ATM机中所插银行卡的信息处理。

void welcome(); 登陆界面。

bool checkpasswd(char n[],char pwd[]); 核对所输卡号、密码是否正确。

void changepasswd(); 修改密码。

void fetchmoney(); 完成取款功能,此处要求一不能超过卡中余额,二不能超过ATM机单笔取款上限金,三不能超过目前ATM机剩余金额。

void information(); 显示插入ATM中的银行卡的信息。

void exitATM(); 显示结束信息,正常退出系统,结束程序。 void functionshow();

显示功能选择界面。

void

lock(); 锁卡,退出系统,结束程序。

2.主程序设计

两个类ATM类及BankCard类

完成了几乎全部功能,自动取款机主程序流程图如图15-5所示。

在主函数main()中,先建立

了一个BankCard类的对象模拟银行卡,然后建立一个ATM类的对象模拟自动取款机,最后调用ATM类的成员函数welcome()启动登陆界面。取款、查余额等工作全部交由两个类来完成。

四个功能中,由于修改密码、

查询余额、退出系统的流程较简单,下面只给出取款过程的流程图。如图

15-6所示。

图15-6 取款过程流程图

四、案例实现

// ***************************************************************** // * ATM.h 类声明头文件

// *****************************************************************

//********************************************************** // 1-26行是ATM类的声明部分

#1 class BankCard; //银行卡类的提前声明 #2 class ATM // ATM取款机类的定义 #3 {

#4 public:

#5 ATM(BankCard& bc):BankCardAtATM(bc) //bc是BankCard类的引用型变量, #6 { //因ATM类中有BankCard类的私有数据成员,

#7 //所以必须调用BankCard类的构造函数初始化变量bc

#8 totalmoney=20000.0; #9 oncemoney=5000.0; #10 leftmoney=20000.0; #11 }

#12 void welcome(); // 登陆界面 #13 bool checkpasswd(char n[],char pwd[]);//核对所输卡号、密码是否正确。 #14 void changepasswd(); // 修改密码 #15 void fetchmoney(); // 取款

#16 void information(); // 显示插入ATM中的银行卡的信息 #17 void exitATM(); // 退出系统 #18 void functionshow(); // 功能界面

#19 void lock(); // 锁卡,推出系统 #20 private:

#21 int times; // 记录密码输入次数 #22 float totalmoney; //记录本 ATM 机存款总额 #23 float leftmoney; //记录剩余金额

#24 float oncemoney; //记录取款单笔最高金额 #25 BankCard& BankCardAtATM; //插入ATM机的银行卡信息 #26 };

//********************************************************** // 27-44行是BankCard类的声明部分 #27 class BankCard // 银行卡类 #28 {

#29 public:

#30 friend class ATM; //将ATM类设置为BankCard类的友元类 #31 BankCard(char Name[],char Num[], float Money,char Password[]); #32 protected:

#33 char* getname(); //取得银行卡姓名 #34 char* getnum(); //取得银行卡卡号

#35 char* getpasswd(); //取得银行卡密码 #36 float getmoney(); //取得银行卡余额 #37 void setpasswd(char pwd[]); //设置银行卡密码 #38 void setmoney(float m); //更新银行卡余额 #39 private:

#40 char passwd[8]; //存储用户密码 #41 char name[20]; //存储用户姓名 #42 char num[20]; //存储银行卡号 #43 float money; //存储银行卡金额 #44 };

//**********************************************************

// 45-75行是BankCard类的成员函数实现

#45 BankCard::BankCard(char Name[],char Num[],float Money,char Password[]) #46 {

#47 strcpy(name,Name); #48 strcpy(num,Num); #49 money=Money;

#50 strcpy(passwd,Password); #51 }

#52 float BankCard::getmoney() //取得银行卡余额 #53 {

#54 return money; #55 }

#56 char* BankCard::getname() //取得银行卡姓名 #57 {

#58 return name; #59 }

#60 char* BankCard::getnum() //取得银行卡卡号 #61 {

#62 return num; #63 }

# char* BankCard::getpasswd() //取得银行卡密码 #65 {

#66 return passwd; #67 }

#68 void BankCard::setmoney(float m) //更新银行卡余额 #69 {

#70 money-=m; #71 }

#72 void BankCard::setpasswd(char pwd[]) //设置银行卡密码 #73 {

#74 strcpy(passwd,pwd); #75 }

//********************************************************** // 76-239行是ATM类的成员函数实现

#76 void ATM::welcome() //显示欢迎界面 #77 {

#78 times=0;

#79 cout<<\" 欢迎使用本ATM! \"<#84 i=0;

#85 cout<#86 do //输入银行卡号,回车结束输入 #87 {

#88 cin.get(ch); # num[i++]=ch; #90 }while(ch!='\\n'); #91 num[i-1]='\\0'; #92 i=0;

#93 cout<<\"请输入密码:\";

#94 do //输入银行卡密码,回车结束输入 #95 {

#96 cin.get(ch); #97 pwd[i++]=ch; #98 }while(ch!='\\n'); #99 pwd[i-1]='\\0';

#100 if(!checkpasswd(num,pwd)) //检查卡号、密码是否正确 #101 {

#102 cout<<\"你输入的卡号或密码有误,请重新输入\"<#107 functionshow(); //检查合格,显示功能选择界面 #108 }

#109 }while(times<3);

#110 lock(); //卡号、密码不正确超过3次,锁卡退出系统 #111 }

#112 bool ATM::checkpasswd(char num[],char pwd[]) //检查卡号、密码 #113 { //检查卡号、密码是否正确 #114 if(strcmp(num,BankCardAtATM.getnum())==0 && #115 strcmp(pwd,BankCardAtATM.getpasswd())==0) #116 return true; #117 else

#118 return false; #119 }

#120 void ATM::functionshow() //显示功能菜单 #121 {

#122 int n;

#123 do #124 {

#125 cout<#126 cout<<\"1) 修改密码 \"<\\\\\"; #128 cin>>n;

#129 while(n<1||n>4) //输入正确的功能代号,不正确则反复重输 #130 {

#131 cout<<\"请输入正确的操作序号!\"<\\\\\"; #133 cin>>n; #134 }

#135 switch(n) #136 {

#137 case 1:

#138 changepasswd(); //选择修改密码 #139 break; #140 case 2:

#141 fetchmoney(); //选择取款 #142 break; #143 case 3:

#144 information(); //选择查询余额 #145 break; #146 case 4:

#147 exitATM(); //选择退出系统 #148 break; #149 }

#150 }while(true); #151 }

#152 void ATM::changepasswd() //修改卡密码 #153 {

#154 char pwd[8],repwd[8]; #155 times=0;

#156 do //先有3次机会输入旧密码 #157 {

#158 cout<>pwd;

#160 if(!checkpasswd(BankCardAtATM.getnum(),pwd)) #161 times++; #162 else

#163 break; #1 }while(times<3);

#165 if(times==3) // 3次都没有输入正确的旧密码,则锁卡退出系统

#166 lock(); #167 int t=0; #168 do #169 {

#170 cout<<\"请输入新密码:\"; #171 cin>>pwd;

#172 cout<<\"请再输入一次新密码:\"; #173 cin>>repwd;

#174 if((t=strcmp(pwd,repwd))!=0)

#175 cout<<\"你输入的两次密码不一样, 请重新输入!\"<#177 BankCardAtATM.setpasswd(pwd);//调用BankCard类的成员函数setpasswd

#178 //设置新密码 #179 cout<<\"密码修改成功,请牢记!\"<#181 void ATM::fetchmoney() //取款 #182 {

#183 float m; #184 char ch; #185 do #186 {

#187 cout<\\\\\"<>m;

#1 while(m<=0) //金额不能为负 #190 {

#191 cout<<\"请输入正确的数字!\"<\\\\ \"; #193 cin>>m; #194 }

#195 if(BankCardAtATM.getmoney()-m<0)

#196 cout<<\"对不起,你的余额不足!\"<#198 if (m>oncemoney)

#199 cout <#201 if (m>leftmoney) //银行卡余额足,单笔取款也未超过ATM, #202 //但ATM机余额不足 #203 cout <#206 cout<#210 cout<<\"是否要继续该项操作:(Y/N) \" <\\\\ \"; #212 cin>>ch;

#213 while(ch!='n'&&ch!='N'&&ch!='Y'&&ch!='y') #214 {

#215 cout<<\"$ >\\\\\"; #216 cin>>ch; #217 }

#218 }while(ch=='y'||ch=='Y'); #219 }

#220 void ATM::information() //显示银行卡信息

#221 {

#222 cout<<\"**********************************\"<#224 cout<<\"* 用户姓名:\"<#229 void ATM::lock() //锁卡退出系统 #230 {

#231 cout<#234 void ATM::exitATM() //正常使用结束,退出系统 #235 {

#236 cout<// ********************************************************** // * ATM.cpp 系统主文件

// ********************************************************** #1 #include #2 #include #3 #include

#4 #include\"ATM.h\" //用包含命令将类定义头文件包含进来 #5 void main() #6 {

#7 BankCard c1(\"梁玲\先构造一个用户 #8 ATM atm(c1); #9 atm.welcome(); #10 }

五、案例总结与提高

1.案例总结

本案例完整地再现了一个自动取款机的工作流程。虽然案例功能很完备,但是主程序很简洁,这要归功于两个类的设计很合理。类本身完成了程序的绝大部分功能。这样做使整个程序架构清晰,且便于将来类的复用及升级。

对于本案例首先要注意两个类的设计思路,还需注意由于要在ATM机中插卡,所以在ATM类中设计了一个BankCard类的数据成员,该成员储存的恰好是插在ATM机中的卡的信息。读者需注意ATM类的构造函数在初始化时还需同时初始化其中的BankCard类的数据成员。

2.案例提高

在全面理解的基础上,读者可以对本案例做一些改动与提高:

读者可以继续添加一些功能,例如:代缴话费、水电费、煤气费等功能,使得该自动取款机变成一个功能完善的自动柜员机。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务