面向对象程序设计实验报告

课程设计报告

面向对象程序设计

(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();

}

相关推荐