




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C语言实现自动存取款机模拟系统本文实例为大家分享了C语言实现自动存取款机模拟系统的具体代码,供大家参考,具体内容如下
/*
c语言课程设计项目名称:自动存取款机模拟系统
作者:施瑞文
专业:软件工程(商业智能)
时间:2025.2.27
#includestdio.h
#includestring.h
#includestdlib.h
#includeconio.h
#includewindows.h
#includetime.h
#defineNsizeof(structAccount)
#defineMsizeof(structMoney)
structAccount
//账户信息
charname[10];
//账号昵称
charpassword[18];
//密码
structAccount*next;
//指针域
typedefstructAccountAcc;
typedefAcc*Accp;
structMoney
//钱
floatmoney;
chartime[10];//时间
chardate[10];//日期
structMoney*next;
typedefstructMoneymon;
typedefmon*monp;
//函数声明区
voidHideCursor();
//隐藏光标
voidtoxy(intx,inty);
//将光标移动到X,Y坐标处
voidcolor(shortx);
//设置颜色
voidmenu();
//菜单
Accpff();
//将文件中的内容读出
voidsignin();
//登陆或注册
voidlogin();
//注册账号
voidlogon();
//账号登陆
voidamend_password();
//修改密码
voidadd_money();
//存款
voidfind_money();
//查询
voidget_money();
//取款
voidtransfer_money();
//转账
voidsave_account(Accpp);
//将p所指向的内容存入文件中
voidsave_money(monpp);
//将p所指向的内容存入文件中
floatSum();
//求余额
voidover();
//退出系统
voidlist();
//账单明细
monpss();
char_name[20],_password[18];
//全局变量记住当前登陆账户
voidcolor(shortx)
if(x=0x=15)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
}
voidHideCursor()
//隐藏光标
CONSOLE_CURSOR_INFOcursor_info={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),cursor_info);
voidtoxy(intx,inty)
//将光标移动到X,Y坐标处
COORDpos={x,y};
HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(Out,pos);
Accpff()
//将存账号的文件里的内容输出到链表中
FILE*fp;
//文件指针
intn=0;
Accphead=NULL;
Accpp2,p;
fp=fopen("account","a+");
//以只读的方式打开文件
if(fp==NULL)
{
printf("cannotopenfile\n");
}
else
{
while(!feof(fp))
//判断文件位置标志是否移动到文件末尾
{
n++;
p=(Accp)malloc(N);//向内存申请一段空间
fread(p,N,1,fp);
//将fp所指向的文件中的内容赋给p
if(n==1)
{
head=p;
p2=p;
}
else
//创建链表
{
p2-next=p;
p2=p;
}
}
p2-next=NULL;
}
fclose(fp);
//关闭文件
returnhead;
//返回头指针
voidmenu()
//菜单
system("cls");
//清屏
do{
color(14);
//看着舒服的颜色
chart;
toxy(50,5);
printf("自动存取款机模拟系统");
toxy(50,6);
printf("当前账户为:%s",_name);
toxy(48,8);
printf("|
1.取款
|");
toxy(48,10);
printf("|
2.转账
|");
toxy(48,12);
printf("|
3.余额
|");
toxy(48,14);
printf("|
4.明细
|");
toxy(48,16);
printf("|
5.存款
|");
toxy(48,18);
printf("|
6.修改密码
|");
toxy(48,20);
printf("|
7.退出系统
|");
t=getch();
//利用不回显函数,输入t,可以不用手动按回车键
switch(t)
{
case'1':get_money();break;
case'2':transfer_money();break;
case'3':find_money();break;
case'4':list();break;
case'5':add_money();break;
case'6':amend_password();break;
case'7':over();break;
default:;break;
}
}while(1);
//永远为真
voidsignin()
//登陆或注册
system("cls");
color(12);
HideCursor();
//隐藏光标
chart;
toxy(50,5);
printf("自动存取款机模拟系统");
toxy(44,8);
printf("----------------------------");
toxy(45,10);
printf("请输入(1:登陆;2:注册.)");
toxy(44,12);
printf("----------------------------");
while(1)
{
t=getch();
switch(t)
{
case'1':logon();break;
case'2':login();break;
default:break;
}
}
voidlogon()
//账号登陆
system("cls");
//清屏
color(10);
//设置颜色
Accpp,head;
head=ff();
//调用函数,返回值为头结点的指针
do{
p=head;
chart,c,k;
inti=0;;
toxy(50,5);
printf("自动存取款机模拟系统");
toxy(45,6);
printf("***************************");
toxy(45,8);
printf("
登陆状态
");
toxy(45,10);
printf("*
请输入您的账号:");
gets(_name);
toxy(45,12);
printf("*
请输入您的密码:");
for(;;)
//此处为输入密码不回显操作
{
k=getch();
//输入k
if(k=='\r')
//如果输入k为回车,则跳出循环
{
break;
}
elseif(k=='\b')
//如果输入k为删除键
{
if(i0)
//如若密码还没完全删除
{
printf("\b");
printf("");
printf("\b");
i--;
}
}
else
//如果输入的k既不是删除键,也不是回车键
{
_password[i]=k;
//把k的值赋给_password[i];
printf("*");
//输出*号,保护用户隐私
i++;
//密码位数加1
}
}
_password[i]='\0';
while(p!=NULLstrcmp(p-name,_name)!=0)
//遍历链表,寻找当前输入的账户的账号
{
p=p-next;
}
if(p!=NULL)
//如果p不为空
{
if(strcmp(p-password,_password)==0)
//如果输入的密码正确
{
toxy(48,16);
printf("正在登陆....");
Sleep(500);
//暂停0.5秒
system("cls");
color(10);
toxy(48,10);
printf("登陆成功!");
break;
//跳出循环
}
else
//如果输入的密码错误
{
toxy(48,16);
printf("正在登陆....");
Sleep(500);
system("cls");
color(10);
toxy(46,8);
printf("-------------------------");
toxy(46,9);
printf("|
|");
toxy(46,10);
printf("|密码错误!是否继续?
|");
toxy(46,12);
printf("|1.是
2.否|");
toxy(46,13);
printf("|
|");
toxy(46,14);
printf("-------------------------");
while(1)
{
t=getch();
//输入t
if(t=='1')
{
system("cls");
//清屏
color(10);
break;
}
elseif(t=='2')
//如果输入t为n,进入开始界面
{
signin();break;
}
}
}
}
else
//如果p为空,即输入的账号不正确
{
toxy(48,16);
printf("正在登陆....");
Sleep(500);
system("cls");
color(10);
toxy(46,8);
printf("-------------------------");
toxy(46,9);
printf("|
|");
toxy(46,10);
printf("|
账号错误!是否继续?|");
toxy(46,11);
printf("|
|");
toxy(46,12);
printf("|
1.是
2.否|");
toxy(46,13);
printf("|
|");
toxy(46,14);
printf("-------------------------");
while(1)
//死循环防止其他按键干扰
{
c=getch();
if(c=='1')
{
system("cls");
color(10);
break;
}
elseif(c=='2')
{
signin();break;
}
}
}
}while(1);
//永远为真
Sleep(500);
//暂停0.5秒
menu();
//账号密码均正确,进入主菜单
voidlogin()
//注册账号
system("cls");
color(10);
Accpp1;
p1=(Accp)malloc(N);
//向内存申请一段空间
do{
color(10);
charname[20],password[18],againpassword[18],c,k;
inti=0;;
toxy(50,5);
printf("自动存取款机模拟系统");
toxy(45,6);
printf("**************************");
toxy(45,8);
printf("
正在注册");
toxy(45,10);
printf("*
请输入账号:");
gets(name);
toxy(45,12);
printf("*
请输入密码:");
for(;;)
//此处为输入密码不回显操作
{
k=getch();
//输入k
if(k=='\r')
//如果输入k为回车,则跳出循环
{
break;
}
elseif(k=='\b')
//如果输入k为删除键
{
if(i0)
//如若密码还没完全删除
{
printf("\b");
printf("");
printf("\b");
i--;
}
}
else
//如果输入的k既不是删除键,也不是回车键
{
password[i]=k;
//把k的值赋给_password[i];
printf("*");
//输出*号,保护用户隐私
i++;
//密码位数加1
}
}
password[i]='\0';
i=0;
toxy(45,14);
printf("*
请确认您的密码:");
for(;;)
//此处为输入密码不回显操作
{
k=getch();
//输入k
if(k=='\r')
//如果输入k为回车,则跳出循环
{
break;
}
elseif(k=='\b')
//如果输入k为删除键
{
if(i0)
//如若密码还没完全删除
{
printf("\b");
printf("");
printf("\b");
i--;
}
}
else
//如果输入的k既不是删除键,也不是回车键
{
againpassword[i]=k;
//把k的值赋给_password[i];
printf("*");
//输出*号,保护用户隐私
i++;
//密码位数加1
}
}
againpassword[i]='\0';
if(strcmp(password,againpassword)==0)
//如果输入的两次密码均正确
{
strcpy(p1-name,name);
strcpy(p1-password,password);
toxy(48,16);
printf("正在注册....");
Sleep(500);
system("cls");
color(12);
toxy(48,10);
printf("注册成功!");
Sleep(500);
//暂停0.5秒
break;
//跳出循环
}
else
//如果输入的两次密码不同
{
toxy(48,16);
printf("正在注册....");
Sleep(500);
system("cls");
color(12);
toxy(46,8);
printf("-----------------------------");
toxy(46,9);
printf("|
|");
toxy(46,10);
printf("|
注册失败!是否继续注册?|");
toxy(46,11);
printf("|
|");
toxy(46,12);
printf("|
1.是
2.否
|");
toxy(46,13);
printf("|
|");
toxy(46,14);
printf("-----------------------------");
while(1)
{
c=getch();
if(c=='1')
{
system("cls");
color(12);
break;
}
elseif(c=='2')
{
signin();
break;
}
}
}
}while(1);
//永远为真
save_account(p1);
//调用函数,将p1所指向的内容存储到文件中
toxy(48,12);
printf("正在自动为您登陆....");
Sleep(500);
menu();
//注册成功后进入主菜单
/*修改密码
方法比较笨,这里是先将储存在文件中的账户信息
输出在一个链表中,遍历链表,寻找当前登陆的账户账号,修改该节点的p-password,
再将修改后的链表存到文件中,需要注意的是修改之后再存到文件中需要将该文件中的内容
清空*/
voidamend_password()
//修改密码
system("cls");
//清屏
color(14);
//看着舒服的颜色
HideCursor();
Accpp,head;
//隐藏光标,看着更舒服
head=ff();
FILE*fp;
do
{
color(14);
HideCursor();
//隐藏光标,看着舒服
p=head;
charpassword[18],newpassword[18],t,k;
inti=0;
toxy(50,5);
//将光标移动到坐标为(50,5)的位置
printf("自动存取款机模拟系统");
toxy(50,8);
printf("修改密码");
toxy(48,10);
printf("请输入旧密码:");
for(;;)
//此处为输入密码不回显操作
{
k=getch();
//输入k
if(k=='\r')
//如果输入k为回车,则跳出循环
{
break;
}
elseif(k=='\b')
//如果输入k为删除键
{
if(i0)
//如若密码还没完全删除
{
printf("\b");
printf("");
printf("\b");
i--;
}
}
else
//如果输入的k既不是删除键,也不是回车键
{
password[i]=k;
//把k的值赋给_password[i];
printf("*");
//输出*号,保护用户隐私
i++;
//密码位数加1
}
}
password[i]='\0';
i=0;
toxy(48,12);
printf("请输入新密码:");
for(;;)
//此处为输入密码不回显操作
{
k=getch();
//输入k
if(k=='\r')
//如果输入k为回车,则跳出循环
{
break;
}
elseif(k=='\b')
//如果输入k为删除键
{
if(i0)
//如若密码还没完全删除
{
printf("\b");
printf("");
printf("\b");
i--;
}
}
else
//如果输入的k既不是删除键,也不是回车键
{
newpassword[i]=k;
//把k的值赋给_password[i];
printf("*");
//输出*号,保护用户隐私
i++;
//密码位数加1
}
}
newpassword[i]='\0';
while(p!=NULLstrcmp(p-name,_name)!=0)//遍历链表,寻找当前登陆账户的账号
{
p=p-next;
}
if(p!=NULL)
//如果p不为空
{
if(strcmp(p-password,password)==0)
//如果旧密码输入正确
{
strcpy(p-password,newpassword);
//将旧密码改为新密码
break;
//跳出循环
}
else
//如果旧密码输入错误
{
system("cls");
color(12);
toxy(46,8);
printf("--------------------------");
toxy(46,9);
printf("|
|");
toxy(46,10);
printf("|
密码错误!是否继续?
|");
toxy(46,11);
printf("|
|");
toxy(46,12);
printf("|
1.是
2.否
|");
toxy(46,13);
printf("|
|");
toxy(46,14);
printf("--------------------------");
while(1)
{
t=getch();
//输入t
if(t=='1')
{
system("cls");
color(12);
break;
}
elseif(t=='2')
menu();
}
}
}
}while(1);
//永远为真
p=head-next;
//使p指向第二个结点
fp=fopen("account","w");
//先清空原文件内容再将修改后的信息写入文件
if(fp==NULL)
{
printf("cannotopenfile\n");
}
if(fwrite(head,N,1,fp)!=1)
//将head所指向的数据写入fp所指向的文件
{
printf("filewriteerror\n");
}
fclose(fp);
//关闭文件
fp=fopen("account","a");
//打开account文件,方式为追加
while(p!=NULL)
//p不为空就执行循环体
{
if(fwrite(p,N,1,fp)!=1)
//将p所指向的1个大小为N的数据结构写入fp所指向的文件
{
printf("filewriteerror\n");
}
p=p-next;
//使p指向下一个结点
}
fclose(fp);
//关闭文件
toxy(48,14);
printf("修改成功!正在跳转...");
Sleep(500);
//暂停0.5秒
voidsave_account(Accpp1)
//将p1所指向的内容存储到文件中
FILE*fp;
//文件指针
fp=fopen("account","a");
//以追加的方式打开文件
if(fp==NULL)
{
printf("cannotopenfile\n");
}
if(fwrite(p1,N,1,fp)!=1)
//将p1所指向的1个大小为N的数据结构写入fp所指向的文件中
{
printf("filewriteerror\n");
}
fclose(fp);
//关闭文件
voidadd_money()
//存款
do
{
system("cls");
//清屏
color(11);
monpp;
chart;
chartime[10],date[10];
p=(monp)malloc(M);
//向内存申请一段空间
toxy(48,8);
printf("请输入您需要存入的金额:");
scanf("%f",p-money);
getchar();//吸收回车键
_tzset();
_strtime(time);
strcpy(p-time,time);
_strdate(date);
strcpy(p-date,date);
toxy(48,10);
printf("正在操作,请稍后....");
Sleep(500);
save_money(p);
system("cls");
toxy(46,8);
printf("-------------------------");
toxy(46,9);
printf("|
|");
toxy(46,10);
printf("|存入成功!是否继续?
|");
toxy(46,12);
printf("|1.是
2.否|");
toxy(46,13);
printf("|
|");
toxy(46,14);
printf("-------------------------");
while(1)
{
t=getch();
if(t=='1')
{
break;
}
elseif(t=='2')
{
menu();
}
}
}while(1);
voidfind_money()
//查询余额
system("cls");
color(13);
floatsum=0;
sum=Sum();
toxy(46,12);
printf("余额为:%f",sum);
toxy(46,16);
printf("按任意键回到主菜单");
getch();
menu();
voidget_money()
//取款
do
{
system("cls");
color(11);
monpp;
floatmoney,sum;
chart;
chartime[10],date[10];
toxy(46,12);
printf("请输入您要取的金额:");
scanf("%f",money);
getchar();//吸收回车键
sum=Sum();
if(moneysum)
//如果要取的金额大于余额
{
toxy(46,14);
printf("余额不足,请重新输入!");
Sleep(500);
continue;
//结束本次循环
}
p=(monp)malloc(M);
//向内存申请一段空间
_tzset();
_strtime(time);
strcpy(p-time,time);
_strdate(date);
strcpy(p-date,date);
p-money=-money;
save_money(p);
toxy(46,14);
printf("正在操作,请稍后....");
Sleep(500);
system("cls");
toxy(46,8);
printf("-------------------------");
toxy(46,9);
printf("|
|");
toxy(46,10);
printf("|取款成功!是否继续?
|");
toxy(46,12);
printf("|1.是
2.否|");
toxy(46,13);
printf("|
|");
toxy(46,14);
printf("-------------------------");
while(1)
{
t=getch();
if(t=='1')
{
break;
}
elseif(t=='2')
{
menu();break;
}
}
}while(1);
voidlist()
//明细
system("cls");
color(10);
monphead,p;
inti=10;
head=ss();
p=head;
toxy(50,5);
printf("自动存取款机模拟系统");
toxy(54,6);
printf("账单明细");
toxy(30,7);
printf("-------------------------------------------------------------");
toxy(31,8);
printf("金
额
时
间
日
期");
toxy(30,9);
printf("-------------------------------------------------------------");
while(p!=NULL)
{
toxy(30,i);
if(p-money=0)
{
printf("+%f
%-24s%s",p-money,p-time,p-date);
}
else
{
printf("%f
%-24s%s",p-money,p-time,p-date);
}
p=p-next;
i++;
}
toxy(50,i);
printf("请按任意键返回主菜单");
getch();
menu();
voidtransfer_money()
//转账
do
{
system("cls");
color(10);
FILE*fp1;
monpp,head,p1;
floatmoney,sum=0;
charname[20],t;
chartime[10],date[10];
toxy(46,12);
printf("请输入您要转入的账号:");
gets(name);
toxy(46,14);
printf("请输入您要转出的金额:");
scanf("%f",money);
getchar();
//吸收回车键
sum=Sum();
if(moneysum)
//如果要转出的金额大于余额
{
toxy(46,16);
printf("余额不足!");
Sleep(500);
continue;
//结束本次循环
}
fp1=fopen(name,"rb");
//以只读的方式打开名字为name的二进制文件
if(fp1==NULL)
//如果文件不存在
{
toxy(46,16);
printf("账户不存在!");
fclose(fp1);
Sleep(500);
continue;
}
fp1=fopen(name,"ab");
//以追加的方式打开名字为name的二进制文件
p=(monp)malloc(M);
//向内存申请一段空间
p-money=-money;
_tzset();
_strtime(time);
strcpy(p-time,time);
_strdate(date);
strcpy(p-date,date);
save_money(p);
p1=(monp)malloc(M);
p1-money=money;
strcpy(p1-time,time);
strcpy(p1-date,date);
if(fwrite(p1,M,1,fp1)!=1)
//将p1所指向的一个大小为M的节点存入fp1所指向的文件中
{
printf("转账失败,请重试!");
continue;
}
fclose(fp1);
toxy(46,18);
printf("正在操作,请稍后....");
Sleep(500);
system("cls");
toxy(46,8);
printf("-------------------------");
toxy(46,9);
printf("|
|");
toxy(46,10);
printf("|转账成功!是否继续?
|");
toxy(46,12);
printf("|1.是
2.否|");
toxy(46,13);
printf("|
|");
toxy(46,14);
printf("-------------------------");
while(1)
{
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高效备考市政工程考试攻略试题及答案
- 高效执行的2025年工程经济试题及答案
- 行政管理经济法课外阅读材料试题及答案
- 零售行业智慧门店建设与管理方案
- 分享经验2025年工程项目管理试题及答案
- 工程投资决策中的市场环境分析技巧试题及答案
- 应用文写作考试试题及答案
- 高效会议管理的策略计划
- 加强自我学习与知识更新的途径计划
- 展会营销与品牌推广计划
- 初中英语2023年中考专题训练任务型阅读-完成表格篇
- 数据中台-项目需求规格说明书
- 田径运动会检查员报告表
- 高级政工师职称面试题
- 老年人能力评估师高级第六章-需求评估
- 业主维权授权委托书范文
- 第四代EGFR-C797S药物管线及专利调研报告
- 骨科基础知识解剖篇
- 梁山伯与祝英台小提琴谱乐谱
- 有机硅化学课件-有机硅化合物的化学键特性
- 蒸汽和饱和蒸汽热焓表
评论
0/150
提交评论