C语言模拟ATM机Word格式文档下载.docx

上传人:b****4 文档编号:17132175 上传时间:2022-11-28 格式:DOCX 页数:38 大小:425.32KB
下载 相关 举报
C语言模拟ATM机Word格式文档下载.docx_第1页
第1页 / 共38页
C语言模拟ATM机Word格式文档下载.docx_第2页
第2页 / 共38页
C语言模拟ATM机Word格式文档下载.docx_第3页
第3页 / 共38页
C语言模拟ATM机Word格式文档下载.docx_第4页
第4页 / 共38页
C语言模拟ATM机Word格式文档下载.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

C语言模拟ATM机Word格式文档下载.docx

《C语言模拟ATM机Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言模拟ATM机Word格式文档下载.docx(38页珍藏版)》请在冰豆网上搜索。

C语言模拟ATM机Word格式文档下载.docx

三、程序已经实现的功能点

实验要求均已实现。

此外还有:

1.卡号、密码位数输错时,提示并返回重新输入,

2.简化取款时的输入

3.转账时,转账账户为原账户时,提示并返回重新输入

4.在多个模块中添加了退出功能,无需回到主菜单即可退出系统

5.在查询模块中加入了存取记录明细查询

四、程序运行截图及说明

1.登陆模块

1)卡号不为16位时,输出提示并返回重新输入

2)卡号不存在时,输出提示并返回重新输入

3)密码位数输错时,输出提示并返回重新输入密码,不作为密码错误处理,也无需重新输入卡号

4)密码连续输错三次时,锁定卡号,今日无法登录

2.登录后的系统主菜单

3.查询模块

1)查询模块主菜单

2)查询明细

4.取款模块

1)当余额不足50时,无法进入取款模块

2)取款模块主菜单

3)便捷取款

4)手动输入取款金额

输错时,返回重新输入

5)取款后的菜单

6)取款完成后选择显示余额

5.存款模块

1)解决输入错误问题

2)存款成功

6.密码修改模块

1)原密码输错时,返回重新输入,不提供退出功能

2)

密码位数输错、两次输入新密码不一致时,返回重新输入

3)输入无误时

7.转账模块

1)转入卡号位数输错时,提示并返回重新输入

2)未查找到该卡号时,输出提示,提供退出功能,键入除*外任意键重新输入

3)转入卡号与当前卡号相同时,输出提示

4)输出转入卡账户的部分用户名

5)解决转账金额输错的问题

6)转账成功

五、采用的主要技术

1.宏定义:

由于本程序的printf语句较多,为了便于编写,故用PR代替

2.链表:

账户信息采用链表结构,存动态分配,使用存无限制,可以扩展到所有可以使用的存

3.switch多分支选择结构

4.文本文件的读写

5.利用time.h头文件,简便地获取系统日期

6.system()函数和fflush()函数的简单使用

六、设计心得

1.各函数的功能要相对独立,逐步求精。

2.如果函数的参数为指针,且仅作为输入参数,则应在类型前加const,以防止该指针在函数体被意外修改

 

附:

程序代码

/***

*运行本程序前,请在本程序根目录下建立文件“accounts.txt”,格式如下:

*卡号1(16位)1账户余额1密码1

*卡号2(16位)2账户余额2密码2

*……

****/

#include<

stdio.h>

stdlib.h>

string.h>

time.h>

#definePRprintf

typedefstruct

{

shortintyear;

shortintmonth;

shortintday;

}Date;

//日期

typedefstructAccount

charno[17];

charname[20];

doublebalance;

charpassword[7];

structAccount*next;

}Account;

Datedate;

doublenumber;

}Record;

//记录

Account*head=NULL;

//账户信息链表表头

Account*now_acc=NULL;

//当前账户

/************函数申明************/

voidInitializeAccount();

//导入账户信息

//--------------------------------------

charLockAccountTopic(constchar*no);

//检测账户是否被锁定

voidLockAccount(constchar*no);

//锁定账户

voidLogin();

//登录

Account*FindbyNo(constchar*no);

//查找卡号对应账户信息在链表中的地址

voidDemand();

//查询主菜单

voidPrintBalance();

//输出余额

voidPrintetail();

//输出明细

voidModifiy();

//修改密码

voidWithdrawal();

//取款主界面

voidWithdrawalOt(longmoney);

//取款

voidDepositing();

//存款

voidTransfer();

//转账

char*CoverUpName(constchar*name);

//掩盖部分用户名

voidLog(doublemoney,constchar*no);

//将存款记录写入文件中

voidSave();

//保存账号信息

voidFreeData();

//释放链表空间

intmain()

charchoose;

InitializeAccount();

Login();

do

{

system("

cls"

);

PR("

\t\t\n"

\t\t请选择服务\n"

\t\t+-+---------++---------+-+\n"

\t\t|5|\33转账||查询\32|1|\n"

\t\t+-+---------++---------+-+\n\n"

\t\t+---------+-+\n"

\t\t|取款\32|2|\n"

\t\t+---------+-+\n\n"

\t\t|存款\32|3|\n"

\t\t|0|\33退出系统||修改密码\32|4|\n"

请选择服务:

"

fflush(stdin);

choose=getchar();

switch(choose)

{

case'

1'

:

Demand();

break;

//查询

2'

Withdrawal();

3'

Depositing();

4'

Modifiy();

5'

Transfer();

0'

FreeData();

return0;

//退出

default:

printf("

输入错误,请重新选择\n"

//解决用户可能的输入错误

system("

pause"

}

}while

(1);

}

/**********导入账户信息**********/

voidInitializeAccount()

FILE*fp;

Accounttemp;

PR("

系统初始化中,请稍侯...\n"

if(!

(fp=fopen("

accounts.txt"

"

r"

)))

\07"

//响铃

读取信息失败,请在本程序根目录建立信息文件(accounts.txt)。

格式如下:

\n"

卡号1(16位)1账户余额1密码1\n"

卡号2(16位)2账户余额2密码2\n"

……\n"

exit(0);

}

while(fscanf(fp,"

%s%s%lf%s"

temp.no,temp.name,&

temp.balance,temp.password)==4)

{//读入账户信息

Account*t=head;

head=(Account*)malloc(sizeof(Account));

*head=temp;

head->

next=t;

fclose(fp);

system("

//清除“系统初始化中,请稍侯...”提示

/**********登录**********/

voidLogin()

charno[17];

\n\n\n\n\t\t\t请输入16位卡号:

gets(no);

if(strlen(no)!

=16)

PR("

卡号应为16位\n"

continue;

if(LockAccountTopic(no))

{//当该卡号被锁定时

\n\n您的登陆密码今日连续输错三次,已被临时锁定,次日将自动解锁,或当日持本人有效证件到柜台办理密码重置。

\n\n"

if(!

(now_acc=FindbyNo(no)))//将卡号对应信息在链表的地址赋给now_acc

{//当卡号不存在时

\n\n此卡号不存在,请重新输入!

chara='

;

//计算剩余可输错密码次数

do

charpassword[7];

%s\n"

now_acc->

no);

\n\n\t\t\t请输入6位密码:

fflush(stdin);

scanf("

%s"

password);

if(strlen(password)!

=6)

{

PR("

密码应为6位\n"

system("

continue;

}

if(!

strcmp(now_acc->

password,password))

return;

//密码正确,回到主函数

if(a=='

{//输错密码三次,锁定账户

LockAccount(no);

break;

密码输入错误,您还可以尝试%c次\n\n"

a--);

}while

(1);

/**********检测账户是否被锁定**********/

charLockAccountTopic(constchar*no)//被锁定则返回0

charCruuentTime[11];

//当前日期

charArchiveTime[11];

//锁卡档案日期

chart[17];

LockAccount.txt"

a+"

)))//课本上讲以“a”方式打开文件,若文件不存在,会出错。

VS2013实测,并不会出错,而是新建。

为免第一次使用本程序时,根目录下没有LockAccount.txt而导致出错,故此处不采用“r”方式。

LockAccount.txt无法打开\n\n"

rewind(fp);

{//获取当前日期

time_trawtime;

structtm*timeinfo;

time(&

rawtime);

//获取时间,以秒计,从1970年1月一日起算,存于rawtime

timeinfo=localtime(&

//转为当地时间,tm时间结构

strftime(CruuentTime,11,"

%Y-%m-%d"

timeinfo);

//格式化时间

fgets(ArchiveTime,11,fp);

//获取锁卡档案时间

if(strcmp(ArchiveTime,CruuentTime))

{//若无锁卡档案,或锁卡档案日期与当前日期不同,则无账户被锁定

fclose(fp);

return0;

t)==1)

strcmp(t,no))

{//锁卡档案中,包含此卡号,返回1

fclose(fp);

return1;

//锁卡档案中,不含此卡号,返回0

/**********查找卡号对应账户信息在链表中的地址**********/

Account*FindbyNo(constchar*no)

for(Account*i=head;

i;

i=i->

next)

strcmp(i->

no,no))

returni;

returnNULL;

/**********锁定账户**********/

voidLockAccount(constchar*no)

erroronopenLockAccount.txtfile!

//获取时间,以秒计,从1970年1月1日起算,存于rawtime

{//若档案日期与当前日期不同,则说明档案已过期或无档案,新建记录。

w"

exit(0);

fprintf(fp,"

CruuentTime);

else//若记录日期与当前日期相同,则追加记录

a"

//添加记录

fprintf(fp,"

no);

/**********查询函数主菜单**********/

voidDemand()

PrintBalance();

\t\t\t\t\t+---------+-+\n"

\t\t\t\t\t|查询明细\32|1|\n"

\t\t\t\t\t+---------+-+\n\n"

\t\t|0|\33退出系统||返回\32|2|\n"

Printetail();

//查询明细

return;

//返回

exit(0);

//退出系统

/**********输出余额**********/

voidPrintBalance()

\n\n\n\n\n\n\n\n\n\t\t+---------------+---------------+\n"

\t\t|您的账户余额\32|%-15.2f|\n"

balance);

\t\t+---------------+---------------+\n\n\n\n\n\n\n"

/**********输出明细**********/

voidPrintetail()

Recordtemp;

intflag=1;

//当有记录时,置0

records.txt"

无存取记录,请进行存取后再使用本功能\n\n"

return;

+---------+--------------+\n"

|日期|存取金额|\n"

%s%d-%d-%d%lf"

temp.no,&

temp.date.year,&

temp.date.month,&

temp.date.day,&

temp.number)==5)

(strcmp(temp.no,now_acc->

no)))

flag=0;

|%d-%d-%d|%-14.2f|\n"

temp.date.year,temp.date.month,temp.date.day,temp.number);

|日期

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1