65.9K
CodeProject 正在变化。 阅读更多。
Home

C ATM 控制台应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.62/5 (9投票s)

2014年4月29日

CPOL

4分钟阅读

viewsIcon

40410

downloadIcon

74

C 银行 ATM 概念控制台应用程序。

引言

以下 C 语言控制台应用程序是一个关于 ATM/ABM 如何运行的简单概念。 基本上,该控制台应用程序通过为用户提供选项来操作数据,使用顺序和随机访问文件,就像它是一个实时的银行应用程序一样。

本文对那些有兴趣使用 C 语言目标编程技能和技术(例如声明变量、通过顺序和随机访问文件操作数据、调用函数、传递值或引用以及使用指针等)的初学者和中级开发人员都很有用。

该代码将帮助开发人员测试和理解 C 语言编程概念。 请评分 :)

背景

以下列表和代码片段显示了 C 语言 ATM 控制台应用程序的基本功能。

登录:参见 customers.txt

对于客户: 账号:1000 密码:0

对于管理员: 账号:2000 密码:0

启动时

  • 登录(用户交易) – 如果选择,系统会要求用户输入其帐户凭据(这类似于刷卡),即账号和密码。 输入并成功登录后,将显示用户交易菜单。
  • 退出 – 结束应用程序。

客户交易菜单

  • 客户登录 - 如果使用客户账号登录,则会显示以上选项。

管理菜单

管理登录 - 如果使用管理员账号登录,则会显示以上选项。

使用代码

以下 C 应用程序使用一个 C 文件编写,因为当时我正在创建一个使用结构体的简单应用程序。 然而,将您的代码组织在多个文件中是一个好习惯,这样您和其他人就可以更轻松地调试您的程序。 也就是说,这个 C 文件按函数分组并相应地组织。 参见下载。

以下是一个代码片段,显示了为存储我的数据而声明的 C 库和我的三个数据结构,以有组织的方式存储。 使用 typedef 与 struct 帮助我定义我的数据类型,存储记录,并在操作数据时减少错误。 这种方法至今仍在使用。

//c libraries
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h> 
#define LINE printf("\n");
#define INPUT printf("-->\t");

// Grouping the data structure for the atm vault balance
typedef struct bank *vault;
typedef struct bank
{
    float money;
}atm;

// Grouping the data structure for users 
typedef struct user *ulist;
typedef struct user
{
    int userid,pin;
    int type,state;  // for type = 0 customer, 1 admin. for state = 0 active, 1 locked
    float sum;
    ulist *next;
}users;

// Grouping the data structure for logs
typedef struct log *hlist;
typedef struct log
{
    int operation,opuserid;
    float opactivity;
    hlist *next;
}logs; 

以下是在 C 语言 ATM 控制台应用程序中使用的以下函数/方法。 大多数函数都使用参数。 这有助于传递、重用和操作各种函数的数据。 该技术对于调试、组织和在各种函数之间共享“工作”很有用。

分而治之是开发大型应用程序的关键技术。

//ulist Records functions 
ulist client_hlist (void);
hlist history_hlist(void);

//ATM Structures functions 
atm banknotes(float balance);
atm read_vaultdb();

//Users login functions 
int login(ulist header,hlist headerh, int acctno, int acctpin,atm cash);
void userlogin ();

int search_client(ulist header,int key); //returns 1 if it finds, 0 otherwise
void create_log(hlist headerh,int noperation, int nopuserid,float noactions);

//Display functions
void option1(ulist header,hlist headerh,int login,int pin,atm cash);
void option2(ulist header,hlist headerh,int login,int pin,atm cash);
void menu(ulist header,hlist headerh,int login,int pin,atm cash);
void menu2(ulist header,hlist headerh,int login, int pin,atm cash);

//Admin functions 
void create_client(ulist header,hlist headerh,int login,int pin,atm cash);
void create_user(ulist header, int nuserid, int npin, float namount, int ntype, int nstate);
void print_log(ulist header,hlist headerh,int login,int pin,atm cash);
void delete_client(ulist header,hlist headerh,int login, int pin,atm cash);
void print_clients(ulist header,hlist headerh,int login,int pin,atm cash);
int unlock_client(ulist header,hlist headerh,int login, int pin,atm cash);  

//Customer functions 
void query_acct(ulist header,hlist headerh,int login, int pin,atm cash);
void cust_deposit(ulist header, hlist headerh,int login, int pin, atm cash);
void cust_transfer(ulist header,hlist headerh,int login, int pin,atm cash);
void cust_withdraw(ulist header,hlist headerh, int login, int pin, atm cash);
void print_custlog(ulist header,hlist headerh,int login,int pin,atm cash);
int change_client_pin(ulist header,hlist headerh,int login,int pin,atm cash); 

//Read&Write functions
void write_custdb(ulist header);
void read_custdb(ulist header);
void read_logdb(hlist headerh);
void write_logdb(hlist headerh);
void write_vaultdb(atm cash);

下面的代码片段显示了数据是如何存储到这三个文件中的。 基本上,每个文件由两个函数控制,一个读取,另一个写入。 在这种情况下,数据存储在三个(3)个文本文件中

  • ATM 金库(存储可用总金额)
  • 帐户信息(客户和管理员帐户)
  • 日志信息(存储管理员和客户帐户的所有活动)

每种方法都使用我声明的数据结构中的参数。 随着这些变量值的变化,它们将继续分组并具有在我的数据结构中定义的数据类型。 因此,当数据在各种方法中被操作和更改时,调用这些写入或读取方法不会给我一个奇怪的输出,因为我的数据类型在其数据结构组中是一致的。

////FILING
 
//--------------------------------------------------------------------------//
//Writes Funds added to ATM Total Funds to file
void write_vaultdb(atm cash)
{
    FILE *f_cash = fopen("vault.txt", "w");
    fprintf(f_cash,"%6.2f",cash.money );
    fclose(f_cash);
}
//--------------------------------------------------------------------------//
//Reads ATM Total Funds available from file
atm read_vaultdb()
{
    float money;
    float balance;
 
    FILE *f_cash = fopen("vault.txt", "r");
    if (f_cash == NULL)
    {
        FILE *f_cash = fopen("vault.txt", "w");
        fscanf(f_cash,"%f",&balance);
        return banknotes(balance);
    }
    else
        fscanf(f_cash,"%f", &money);
    return banknotes(money);
}
//--------------------------------------------------------------------------//
//Reads Customers information from file ie. account no, pin, total funds, account type, and status
void read_custdb(ulist header)
{
    int i,pin,type,state,userid;
    float sum;
    
    FILE *f_clients= fopen("customers.txt", "r"); 
    int res = fscanf(f_clients, "%d\t\t%d\t\t%f\t\t%d\t\t%d\n", &userid,&pin,&sum,&type,&state);
    for (i = 0; res > 0; i++)
    {
        create_user(header,userid,pin,sum,type,state);
        res = fscanf(f_clients, "%d\t\t%d\t\t%f\t\t%d\t\t%d\n", &userid,&pin,&sum,&type,&state);
    }
    fclose (f_clients);
}
//---------------------------------------------------------------------------//
//Writes customers banking details to file ie. account no, pin, total funds, account type, and status
void write_custdb(ulist header)
{
    ulist l=header->next;
    FILE *f_clients = fopen("customers.txt", "w");
 
    while (l)
    {
        fprintf (f_clients, "%d\t\t%d\t\t%6.2f\t\t%d\t\t%d\n", l->userid,l->pin,l->sum,l->type,l->state); 
        l=l->next;
    }
    fclose(f_clients);
}
//-----------------------------------------------------------------------------//
//Checks and Reads Activity logs to and from File
void read_logdb(hlist headerh)
{
    int nop,nuid,i;
    float ndest;
    hlist l = headerh->next;

    FILE *f_hist = fopen("logs.txt", "r");
    if (f_hist == NULL)
    {
        FILE *f_hist = fopen("logs.txt", "w");
    }
    else
    {
        int res = fscanf(f_hist, "%d %d %f\n", &nop,&nuid,&ndest);
        for (i = 0; res > 0; i++)
        {
            create_log(headerh,nop,nuid,ndest);
            res = fscanf(f_hist, "%d %d %f\n", &nop,&nuid,&ndest);
        }
        fclose (f_hist);
    }
}
//-----------------------------------------------------------------------------//
//Writes Activity logs to File
void write_logdb(hlist headerh)
{
    hlist l=headerh->next;
    FILE *f_hist= fopen("logs.txt", "w");
 
    while (l)
    {
        fprintf (f_hist,"%d %d %6.2f\n",l->operation,l->opuserid,l->opactivity); 
        l=l->next;
    }
    fclose(f_hist);
}

当您熟悉这种 C 编码技术时,创建一个方法以一致地获取、操作和返回数据是在 C 和其他面向对象的语言中编程的基本方法。 在这种情况下,定义数据结构、数据类型并将它们分组并保持它们一致地存储,确实是 C 和其他面向对象语言至今仍在使用并且如此强大的原因。

一个简单的数据结构组可以让你添加、减去和删除,如下面的代码片段所示

ulist d = header->next;

//add new value to atm balance
 cash.money+=value;
//substract fee from login account
d->sum-=fee;
//add new value to login account balance
d->sum+=total;  
    

关注点

开发这个代码很有趣,尽管它并不完美,但我为我所做的事情感到自豪。 自从安卓入侵手机以来,我一直没有使用 C。 :) 我一直专注于 Java 和各种 Web 技术。 但是,我为某个课堂项目编写了这段代码,这花不了我多长时间才完成,并且得到了很好的评价。 分享这段代码会让我知道我可以改进的地方以及有多少积极的反馈。 请评分 :)

历史

2014 年 3 月

一个 C 语言 ATM 控制台应用程序 - CodeProject - 代码之家
© . All rights reserved.