用C语言实现ATM机的功能(初学者必备)

一、实验目的及要求

1、学会函数的嵌套调用、函数的递归调用的用法。

2、学会局部变量、全局变量的用法。

二、实验内容

1、学会C-FREE5环境中利用嵌套调用、函数的递归调用解决程序中的问题。

三、实验指导

使用ATM的流程包含如下几个部分:

  1. 用户插卡即显示待机界面,提示用户插入磁卡;
  2. 密码验证即用户插入磁卡后,提示用户输入密码并进行密码的验证。若用户输入密码正确,则显示服务信息。反之,则提示用户重复输入。当用户的输入超过3次时,提示吞卡。
  3. 功能选择提示即显示服务的信息;
  4. 选择功能即用户按照显示的服务信息进行选择,从而完成不同的操作;
  5. 查余额即用户可以完成查询余额操作;
  6. 取款即用户可以完成取款操作;
  7. 快速取款即用户可以完成快速取款操作;
  8. 退卡即用户可以退出服务界面;

为了提高程序的可维护性,使用模块化方法完成模拟ATM工作流程程序的设计。针对以上8个部分分别写出8个函数,main()函数中按工作过程调用相应的函数完成操作。

1. 待机函数welcome()

当没有用户使用ATM时,ATM显示待机界面。待机界面的功能是提醒用户插入磁卡。本模拟系统中,用户按下任意键来模拟磁卡的插入,即只要接收到键盘上输入的一个字符,就表示插入了磁卡。使用getchar()函数可以读入键盘上的输入字符。待机函数没有返回值。

待机函数对应的代码:

void welcome()

{

    printf("-----------ATM取款机----------\n");
    printf("请插入磁卡(按任意键完成)\n");
    getchar(); 

}

2. 验证密码函数pass()

用户输入密码的次数要小于等于3次。由于要多次进行密码的验证,因此需要使用循环结构实现。循环变量n即为用户输入的次数。当用户第一次输入密码,即n等于1时,界面上应显示的信息是“请输入密码(最多可输入3次)”,而当用户第2次和第3次输入时,表示用户前面输入的密码不正确,所以界面上应显示的信息为“密码错误请重新输入!”。每次显示完提示信息后,都要接收用户输入的密码并进行密码的匹配。若密码匹配成功,则退出循环即可。循环退出后,可以根据用户的输入次数n来判断执行什么样的操作。若n>3,则提示吞卡信息,并结束整个程序。

验证密码函数对应的代码:

void pass()

{

int n,p;
    for(n=1;n<=3;n++){
      printf("请输入密码:");
      scanf("%d",&p);
      if(p=123456){
          printf("密码输入正确\n");
          break;
      }
      else{
          printf("密码输入错误,请重新输入:"); 
      }
    }
    if(n>3){
        printf("密码错误超过三次,卡被吞,联系前台\n");
        exit(0);
    }

}

3. 显示服务信息函数 service()

当密码匹配成功后,表示用户已经通过身份验证,此时显示服务信息。即向屏幕输出提示信息即可。信息的内容参考一般的ATM服务界面,在此将其进行简化,只保留查询余额、取款、快速取款和退出等四个功能。显示完毕,需要用户根据服务信息进行选择。用户在键盘上输入相应的数字,service()函数返回用户的输入,以便根据输入执行下一步的操作。

显示服务信息函数对应的代码:

int service()

{

      int select;
    printf("查询余额*************1\n");
    printf("取款操作*************2\n");
    printf("快速取款*************3\n");
    printf("退出系统*************0\n");
    printf("请输入你的选择:\n");
    scanf("%d",&select);
    return select; 

}

4. 查询余额函数selectmoney()

从前面的分析可以看出有多个函数会访问账户余额信息,因此将账户余额total定义为全局变量。在本函数中直接返回该全局变量的值即可。

查询余额函数对应的代码:

void selectmoney(int a)

{

       }

由于是使用的是全局变量,因此函数也可以不指定参数,写成以下的形式:

void selectmoney()//查询余额

{

       printf("您的余额为%lf元\n",total);

}

当selectmoney()函数没有参数时,对应的函数调用中也要把参数去掉。以上两种函数的区别是:前者在函数调用时把全局变量total作为实参使用,将账户余额传递给了形式参数a,然后使用形式参数做处理,函数体中显示的是a的数值;后者直接在函数体中访问并显示total的值。

5. 取款函数getmoney()

用户取款时,需要首先提示用户输入取款的金额。系统接收到用户的输入后,要将该输入与用户账户余额进行比较,只有当账户余额大于用户提款金额时,才能够正确执行提款操作,即修改账户余额信息,提示用户取走现金,同时询问用户是否需要打印凭证。若用户的余额不足,则进行相关提示。

取款函数对应的代码如下:

void getmoney()

{

          float m;
    printf("请输入取款金额:\n");
    scanf("%f",&m);
    total=total-m;
    if(total>=0){
        printf("卡内所剩余额为%lf\n",total);
     }     
     else{
       printf("余额不足\n");
     }  

}

   6. 快速取款函数quickgetmoney()

   快速取款函数的思想和取款函数类似,不同的是取款函数中,取款的金额由用户在键盘上输入,而在快速取款函数中,该金额以选项的形式体现。执行该函数时,首先需要显示不同输入对应的金额,然后用户在键盘上输入选项值,该值有4种有效输入,分别是“1”,“2”,“3”,“4”,根据不同的选项来为要取的金额number赋值。所以,适合使用switch语句来实现。

快速取款函数的代码如下:

void quickgetmoney()//快速取款

{

      int sel,num;
    printf("请输入您的选择:");
    printf("\t\t100.00(1)\t\t200.00(2)\n");
    printf("\t\t\t\t500.00(3)\t\t1000.00(4)\n");
    scanf("%d",&sel); 
    switch(sel){
        case 1:num=100.00;break;
        case 2:num=200.00;break;
        case 3:num=500.00;break;
        case 4:num=1000.00;break; 
    }
    printf("取走%d元\n",num);
    printf("卡内所剩余额为%lf\n",total-num); 

}

该函数中输出打印凭证判断部分的代码与取款函数不同。取款函数通过一个变量flag来实现该判断,当flag=1时,输出提款信息。而快速取款函数中将flag设置为字符型的变量。可以使用cin.get(flag)来从键盘上获取一个字符并赋给flag。由于字符有大小写之分,调用toupper()函数将其转换为大写字母后才进行判断。toupper(char a)函数的作用是将字符a转换为大写字母。

7. 退出函数exitatm()

退出函数的作用是提示用户取走磁卡,并结束程序。

退出函数的代码:

void exitatm()

{

  printf("请取走您的磁卡,谢谢,欢迎下次光迎!\n");

  exit(0);

}

8. 选择服务函数selectservice()

service()函数提供了一个用户的选择值,系统要根据这个选择值去执行不同的操作。由于选择值存在多种取值,不同取值对应不同的函数调用,因此这是一个多路选择问题,适合使用switch语句来实现。switch语句的判断表达式即service语句的返回值。根据service函数的显示信息可知,该返回值有4中有效的取值,分别是“1”,“2”,“3”,“0”。

选择服务函数对应的代码:

void selectservice( int select )

{

switch(select){
        case 1:selectmoney();
                   break;
        case 2:getmoney();
                   break;
        case 3:quickgetmoney();
                   break;
        case 0:exitatm();
                   break; 
        default:printf("非法操作!");
               
    }

}

9. 主函数

main()中要做的是顺次的去调用各个函数。用户通过密码验证后,要执行的操作可能不止一次,因此需要将服务信息显示函数和用户选择服务函数放在一个循环中。由于用户选择服务的次数不确定,因此该循环是一个无限循环,循环的条件永远成立。只有当用户选择了退出服务后,才能够关闭整个程序。

主函数的代码:

#include<stdio.h>

#include<string.h>

double total=1000;

void main()

{  

int select;
    welcome();
    pass();
    do{
        select=service();
        selectservice(select);
    }while(1);

}

  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值