美文网首页
C-ATM实战

C-ATM实战

作者: 小石头呢 | 来源:发表于2019-08-08 09:19 被阅读0次

    目的

    通过模拟实现ATM相关功能,达到训练条件语句,循环语句,函数的作用

    技术

    switch语句,while循环与break语句,函数该如何使用,getchar()的使用

    如何使用

    1.switch语句

    • 计算表达式的值,再逐个和 case 后的常量表达式比较,若不等则继续往下比较,若一直不等,则执行 default 后的语句。

    • 若等于某一个常量表达式,则从这个表达式后的语句开始执行,并执行后面所有 case 后的语句。

    • 每一个case对应一个break,它会找到一个case执行,直到看到break语句才退出。

    //接收用户的选择
    int choice = getChoice();
            
    //判断用户的选择
    switch(choice){
        case 1:
            //取款
            withdraw();
            break;
        case 2:
            //存款
            deposit();
            break;
        case 3:
            //设置密码
            setPassword();
            break;
        default:
            exitATM(EXIT_SUCCESS);
            break;
    }        
    

    上面的例子是根据choice的值进入相应的case中进行相关的操作

    2.while循环与break语句

    break是循环控制语句之一,用于终止循环,是用来跳出循环语句,条件语句if不可以使用,switch中的用法和这里的不同。

    printf("请输入取款金额:");
    while (1){       
        scanf_s("%d",&tempMoney);
    
        if (changeMoneyInATM(tempMoney,ChangeTypeOut)){
            printf("取款成功");
            break;
        }else{
            printf("余额不足,请重新输入:");
        }
    }
    

    上面的例子是一个输入取款金额的死循环,只有当输入的取款金额合法的时候才会经过break跳出循环

    3.函数的使用

    • 函数的形式:返回值 函数名(参数列表)
    • 函数是完成某一个特定功能的代码块,是否有返回值和参数完全取决于你完成这个功能是否需要一些参数的帮助,完成之后是否需要返回一些值给你的调用者。
    void exitATM(int status){
        printf("*************************\n");
        printf("   感谢你的使用 再见!!!\n");
        printf("*************************\n");
        exit(status);
    }
    

    上面的函数是一个没有返回值有一个参数的例子,这个函数的功能是完成退出程序的功能。函数内部调用了系统函数exit(),需要外部传入参数帮助我们调用。

    bool isContinue(void){
        fflush(stdin);
        printf("是否继续?(y/n):");
    
        char ch = getchar();
        if (ch == 'n') {
            return false;
        }else{
            return true;
        }
    }
    

    上面的函数是完成是否继续的功能。接受一个缓冲流的字符,比较字符得到一个bool值。我们将我们做完事得到的bool值返回给外部,告诉外部是否继续。

    4.getchar()的使用

    • int getchar(void);从标准输入流只读取一个字符(包括空格、回车、tab),读到回车符('\n')时退出,键盘输入的字符都存到缓冲区内。

    • 一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值

    • getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕。

    • 如果用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。

    int getChoice(void){
    
        //将输入的所有字符串全部从缓冲区里面读取出来
        int ch;
        
        while (1) {
            printf("请选择操作:");
            scanf_s("%d", &ch);
         
            if (ch == 1 || ch == 2 || ch == 3 || ch == 4) {
               return ch;
            }else{
                printf("输入不合法,");
                fflush(stdin);
            }
        }      
    }
    

    上面的函数是返回一个合法的输入值给外部,我们调用getchar()接受一个字符。因为有可能多次输出,所以在每次新的比较之前调用fflush(stdin);清空缓冲区。

    具体使用

    #define ATM
    
    #include <stdio.h>
    #include <stdlib.h>
    
    //定义全局变量
    int orgPassword = 123;
    int totalMoney = 1000;
    
    //函数声明
    bool loginATM(void);
    void welcome(void);
    void exitATM(int status);
    void showMenu(void);
    int getChoice(void);
    void withdraw(void);//取款
    bool isContinue(void);
    void deposit(void);//存款
    void setPassword(void);
    
    #endif
    
    #include "ATM.h"
    
    int main(int argc, const char * argv[]) {
        //欢迎界面
        welcome();
        
        //登录
        bool result = loginATM();
        if (result == false) {
            //密码错误次数过多
            exitATM(EXIT_FAILURE);
        }
        
        //主要操作
        while (1) {
            //提示操作
            showMenu();
            
            //接收用户的选择
            int choice = getChoice();
            
            //判断用户的选择
            switch(choice){
                case 1:
                    //取款
                    withdraw();
                    break;
                case 2:
                    //存款
                    deposit();
                    break;
                case 3:
                    //设置密码
                    setPassword();
                    break;
                default:
                    exitATM(EXIT_SUCCESS);
                    break;
            }
    
            system("CLS");
            
        }
        
        return 0;
    }
    
    bool loginATM(void){
        int password = 0;
        int wrongTime = 0;
        
        while(1){
            printf("请输入密码:");
            scanf_s("%d", &password);
            
            if (password == orgPassword) {
                return true;
            }else{
                wrongTime++;
                if (wrongTime == 4) {
                    return false;
                }else{
                    printf("密码错误,");
                }
            }
        }
    }
    
    void welcome(void){
        printf("***************\n");
        printf("   欢迎使用ATM\n");
        printf("***************\n");
    }
    
    void exitATM(int status){
        printf("*************************\n");
        printf("   感谢你的使用 再见!!!\n");
        printf("*************************\n");
        exit(status);
    }
    
    void showMenu(void){
        printf("**************\n");
        printf("1.取款\n");
        printf("2.存款\n");
        printf("3.设置密码\n");
        printf("4.退出\n");
        printf("**************\n");
    }
    
    int getChoice(void){
        //将输入的所有字符串全部从缓冲区里面读取出来
    
        int ch;
        
        while (1) {
            printf("请选择操作:");
            scanf_s("%d", &ch);
         
            if (ch == 1 || ch == 2 || ch == 3 || ch == 4) {
               return ch;
            }else{
                printf("输入不合法,");
                fflush(stdin);
            }
        }
            
    }
    
    //取款
    void withdraw(void){
        int outMoney = 0;
        
        while (1) {
            printf("请输入取款金额:");
            scanf_s("%d", &outMoney);
            
            if(outMoney > 0 && outMoney <= totalMoney){
                totalMoney = totalMoney - outMoney;
                
                printf("取款成功 余额为:%d\n", totalMoney);
                //提示是否继续
                bool ch = isContinue();
                if (ch == false) {
                    return; //break;
                }
            }else{
                printf("余额不足,");
            }
        }
    }
    
    bool isContinue(void){
        fflush(stdin);
        printf("是否继续?(y/n):");
    
        char ch = getchar();
        if (ch == 'n') {
            return false;
        }else{
            return true;
        }
    }
    
    void deposit(void){
        int intputMoney = 0;
        while (1) {
            printf("请输入存款金额:");
            scanf_s("%d", &intputMoney);
            
            totalMoney = totalMoney + intputMoney;
            printf("存款成功,余额为:%d\n", totalMoney);
            bool ch = isContinue();
            if (ch == false) {
                return; //break;
            }
        }
    }
    
    
    void setPassword(void){
        int newPwd1 = 0;
        int newPwd2 = 0;
        
        while (1) {
            //输入原始密码
            bool result = loginATM();
            if (result == true) {
                while (1) {
                    printf("请输入新密码:");
                    scanf_s("%d", &newPwd1);
                    
                    printf("请确认密码:");
                    scanf_s("%d", &newPwd2);
                    
                    if (newPwd1 == newPwd2) {
                        printf("设置密码成功!\n");
                        fflush(stdin);
                        getchar();
                        return;
                    } else{
                        printf("两次密码不一致,");
                    }
                }
               
            }
        }
    }
    

    运行结果:

    相关文章

      网友评论

          本文标题:C-ATM实战

          本文链接:https://www.haomeiwen.com/subject/drtzrctx.html