C语言之函数及函数实现ATM功能

  • 概述

本文章主要介绍的是C语言中的函数,函数在C语言中是非常重要的一环,今天除了介绍函数外,还会用函数的方式实现一个完整的ATM项目

  • 详解

什么是函数

对于一个 C 程序而言,它所有的命令都包含在函数内,每个函数都会执行特定的任务。

有一个特别的函数,那就是main()函数,main函数是程序启动后,第一个执行的函数。其他所有函数都是 main()函数的子函数(或者与之相关联的过程,例如回调函数),并且它们的函数名称可以自己设定。

每个函数都只能被定义一次,但一个函数可以根据需要被多次的声明和调用。

为什么要使用函数?

为什么要用函数呢?不用函数不行吗?当然可以,函数实现了的功能其实都可以直接在main函数里实现,那为什么还要函数呢?函数是将实现的功能一个个分离开,需要的时候调用就行了;其目的是使main函数更简洁,层次感更鲜明,代码的阅读性,以及降低代码间的耦合性(便于移植)

函数定义的形式结构一般如下:

函数结构
  • ATM功能实现

ATM功能:
1.存款
2.取款
3.更改密码
4.查询
5.退出

代码如下:

  • 定义全局(静态)变量模拟密码和金额
static long passWord = 123;
static float money = 1000.0;
  • 欢迎使用界面
//欢迎使用提示界面
void welcome(void){
    printf("*********************\n");
    printf("\n");
    printf("\n");
    printf("     欢迎使用!");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("*********************\n");
}
  • 输入密码并验证真假
//验证密码是否正确
bool getPassword(void){
    long pwd = 0;
    //记录密码错误次数
    int wrongtime = 0;
    printf("请输入密码:");
    
    while (1) {
        scanf("%ld",&pwd);
        //判断密码
        if (pwd == passWord) {
            //密码正确
            printf("密码正确\n");
            return true;
        }else{
            //密码错误
            wrongtime++;
            if (wrongtime >= 3) {
                //错误三次 跳出循环
                printf("密码错误次数过多,密码已锁定,请联系客服\n");
                exit(EXIT_FAILURE);
            }else{
                printf("密码错误,请重新输入:");
            }
        }
        
    }
    
    return false;
}
  • 显示操作界面
void options(void){
    printf("\n*******************\n");
    printf("1.存款\n");
    printf("2.取款\n");
    printf("3.查询\n");
    printf("4.更改密码\n");
    printf("5.退出\n");
    printf("*******************\n");
}

  • 选择操作,并判断是否合法
//选择操作
int choose(int maxOption){
    printf("请选择操作:");
    int ch = 0;
    while (1) {
        scanf("%d",&ch);
        //判断操作是否合法
        if (ch > 0 && ch <= maxOption) {
            //操作合法
            return ch;
        }else{
            //操作不合法
            printf("操作不合法,请从新输入");
        }
    }
    return 0;
}
  • 是否继续提示操作
void ifContinue(void){
    while (1) {
        printf("是否继续?y/n   ");
        char c;
        getchar();
        c = getchar();
        if (c == 'y') {
            //继续
            break;
        }else{
            //退出
            Exit();
        }
    }
}
  • 存款
//存款
void putinMoney(void){
    printf("请输入存款金额:");
    int inMoney = 0;
    scanf("%d",&inMoney);
    money += inMoney;
    printf("存款成功,余额为:%.2f\n",money);
}
  • 取款
//取款
void getMoney(void){
    while (1) {
        printf("请输入取款金额:");
        int outMoney = 0;
        scanf("%d",&outMoney);
        if (outMoney <= money) {
            money -= outMoney;
            printf("取款成功,余额为:%.2f\n",money);
            break;
        }else{
            printf("余额不足,是否继续?y/n");
            char c;
            getchar();
            c = getchar();
            if (c == 'y') {
                //继续
            }else{
                break;
            }
        }
    }
}
  • 查询
void consult(void){
    printf("您当前的余额为:%.2f\n",money);
}
  • 更改密码
//更改密码
void changePassword(void){
    while (1) {
        printf("请输入密码:");
        long pwd = 0;
        scanf("%ld",&pwd);
        if (pwd == passWord) {
            //原密码正确
            printf("请输入新密码:");
            long newPwd = 0;
            scanf("%ld",&newPwd);
            printf("请确认新密码:");
            long newPwd2 = 0;
            scanf("%ld",&newPwd2);
            if (newPwd == newPwd2) {
                //密码设置成功
                printf("密码设置成功\n");
                pwd = newPwd;
                break;
            }else{
                printf("密码设置失败,是否继续?y/n");
                char c;
                getchar();
                c = getchar();
                if (c == 'y') {
                    //继续
                }else{
                    break;
                }
            }
        }
    }
}
  • 退出
//退出
void myExit(void){
    printf("感谢您的使用,再见!\n");
    exit(EXIT_SUCCESS);
}
  • 创建一个新的文件,将方法名在头文件(.h)中声明,在.c文件中将以上方法写入实现
#ifndef ATMMethod_h
#define ATMMethod_h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

static long passWord = 123;
static float money = 1000.0;
//函数声明
bool getPassword(void);   //登陆输入密码
void welcome(void);
int choose(int maxOption);  //选择
void options(void);     //显示供选择的操作
void ifContinue(void);
void myExit(void);      //退出
void changePassword(void);
void getMoney(void);     //取款
void putinMoney(void);   //存款
void consult(void);     //查询

#endif /* ATMMethod_h */
  • 最后在main函数中导入上述头文件,调用方法运行
#include <stdio.h>
#include "ATMMethod.h"


int main(int argc, const char * argv[]) {
    //欢迎界面
    welcome();
    //输入密码 判断是否正确
    bool result = getPassword();
    if (result == true) {
        
        while (1) {
            options();
            int chioce = choose(5);
            switch (chioce) {
                case 1:
                    //存款
                    putinMoney();
                    break;
                case 2:
                    getMoney();
                    //取款
                    break;
                case 3:
                    //查询
                    consult();
                    break;
                case 4:
                    changePassword();
                    //更改密码
                    break;
                case 5:
                    //退出
                    myExit();
                    break;
                default:
                    break;
            }
            ifContinue();
        }
        
    }
    return 0;
}
  • 运行结果如下

ATM.gif
  • 总结感悟

学习一个知识,只有在实际项目中才能更快的熟悉和掌握。
函数虽然表现形式只有那一种,但实现的功能千变万化,在ATM这个demo中可以看出:C语言是面向过程的编程语言,用函数将功能剥离出来,在main函数中一目了然地看出运行过程与功能。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容