C ATM 控制台应用程序






4.62/5 (9投票s)
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 月