ATM改进版

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "conio.h"//getch()函数头文件 
#define MAX 10
int id;//用户id 
int c;//用户结构体数组下标 
int count=0;// 读入用户条数
char filename[]="d:\\代码\\ATM项目\\123.txt"; //文件路径 
//====================================
//定义用户结构体====================== 
typedef struct user
{
	int id;
	char name[20];//一个汉字为2个字节 
	char password[7];//需用字符串存放密码,若用int,则002022为2022 
	float money;
}AC;
AC a[MAX];
//声明函数============================================================================ 
//====================================================================================
void menu();//功能界面函数 
int userlogin();//用户登陆函数 
int system_in();//系统函数 
void update(FILE *fp);//用户信息更新函数 
void money_cut();//取款函数 
void money_add();//存款函数 
void infor_view();//用户信息查询函数 
void password_reset();//重置密码函数 
void money_transfer();//转账函数 
void system_ready(FILE *fp);//系统初始化函数 
AC typeChang(char *ch);//将字符串转换成一个结构体变量 
void password_into(char *p);//密码输入函数(包括密码输入合法性检测) 
//=====================================================================================
//=====================================================================================
int main()
{
    FILE *fp=fopen(filename,"r+");
    if(fp==NULL)
	exit(0);
    system_ready(fp);
    if(userlogin()==1)
    system_in();//调用系统函数(进入系统)
    update(fp);//更新用户信息 
    fclose(fp);
    puts("感谢使用");
    return 0;
 } 
//===============================================
//功能:将字符串转换成一个结构体变量
//作者:史继炜
//时间:2019.5.13 
AC typeChang(char *ch)//用字符型指针接收字符数组(字符数组首地址) 
{
	AC t;
	char *p;
	p=strtok(ch,";");
    printf("%d\n",sscanf(p,"%d",&t.id));
    //-------------------------
    p=strtok(NULL,";"); 
    printf("%d\n",sscanf(p,"%s",t.name));
	//-------------------------
	p=strtok(NULL,";"); 
    printf("%d\n",sscanf(p,"%s",t.password));
    //--------------------------
	p=strtok(NULL,";");
     printf("%d\n",sscanf(p,"%f",&t.money));
    return t;
}
//==================================================================== 
//读取用户信息 (系统初始化)
void system_ready(FILE *fp)  
{
    int i=0;
    char ch[80];
    char *t;
    while(!feof(fp))
    {
	    t=fgets(ch,sizeof(ch),fp); 
	     if(count>=MAX)
	    {
	    	printf("该系统只能读取%d个用户信息\n",MAX);
			break; 
		}
		//----------------------------------------------
		if(t!=NULL)//将用户信息读入结构体变量 
		{
			a[i]=typeChang(t);
			i++;
			count++;
	    }
    }
}
//======================================================
//功能界面函数
void menu() 
{
	puts("================================");
	puts("1、取款     2、存款    3、查询  ");
	puts("4、改密码   5、转账    6、退出  "); 
	puts("================================"); 
}
//=====================================================
//功能:密码输入(输入的密码用*覆盖,包含密码输入合法性)
//时间:2019.5.13
//作者:史继炜 
void password_into(char *p)
{
   	int i=0;//密码字符数组下标 
   	char ch;
	while(i<6)//密码长度6位
	{
		ch=getch();
		if(ch>='0'&&ch<='9')//密码的输入只能为数字 
		{
			p[i]=ch;
			putchar('*');
			i++; 
		}
		else 
		{ 
			puts("请输入合法的密码格式(数字0-9)");
			i=0	;
		} 
	}
	p[i]='\0';
	printf("\n");
}
//====================================================
//用户登陆 
int userlogin()
{
	char password_s[7];
	int t=0;
	//-------------------------------------------------------
    puts("请输入id"); 
    while(1)
	{ 
	  scanf("%d",&id);//敲回车时,键盘缓冲区存在一个\n,会影响下一次输入 ;解决方法:在两次输入之间用fflush(stdin)函数清空或getchar()将\n接收 
	  fflush(stdin);//清空键盘缓冲区 
    	for(c=0;c<count;c++)
	    {
		  if(id==a[c].id)//同时确定了用户在结构体数组中的下标
		    break;
	    } 
	  if(id==a[c].id)
	    break;
	  puts("id不存在,请重新输入"); 
	}
	//-------------------------------------------------------
	puts("输入密码");
	while(t<3)
	{
		password_into(password_s);//调用密码输入函数 
		system("cls");
		if(strcmp(password_s,(a[c].password))==0)//函数strcmp(str1,str2)比较两个字符串,若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
		   return 1;
	    else
	    {
	       t++;
	       puts("密码错误,重新输入密码");
	    }
        }
       puts("记不住密码就莫来了");
	   return 0;
}
//======================================================
//系统函数(用户登陆后进入,可调用其它功能函数) 
int system_in()
{ 
	int i; 
	menu();//调用菜单
	while(1)
	{
	scanf("%d",&i);
	getchar();
	if(i>=0&&i<=6)
	   break;
	puts("请根据界面选择正确的功能"); 
    }
	system("cls");
	switch(i)
	{
		case 1:money_cut();break;
		case 2:money_add();break;
		case 3:infor_view();break;
		case 4:password_reset();break;
		case 5:money_transfer();break;
		case 6:return 0;
	}
	 
}
//=======================================================================================
//改密码功能函数 
void password_reset()
{
	char password_s[7];
	char password_1[7],password_2[7];
	puts("请输入原密码:");
	while(1)
	{
		password_into(password_s);
		if(strcmp(password_s,a[c].password)==0)
		   break;
		puts("密码错误,请重新输入原密码:"); 
	}
	 puts("请输入新密码:");
	while(1)
	{
		password_into(password_1);
		puts("请再次输入新密码:");
		password_into(password_2);
		if(strcmp(password_1,password_2)==0)
		   break; 
		puts("两次输入的新密码不相同,请重新输入新密码:");
	}
	strcpy(a[c].password,password_1); 
	puts("修改密码成功!");
    system("pause");
	system("cls"); 
	system_in();
}
//======================================================================================
//存款功能函数 
void money_add()
{
	float m;
	puts("输入存款金额");
	scanf("%f",&m);
    fflush(stdin);
	a[c].money=a[c].money+m;
	puts("存款成功");  
	system("pause");
	system("cls"); 
    system_in();
}
//=======================================================================================
//取款功能函数 
void money_cut()

{
	float m;
	printf("输入取款金额,取款金额不可大于2000元\n");
	while(1)
	{ 
	scanf("%f",&m);
	fflush(stdin);
	if(m<=a[c].money&&m>=0&&m<2000)
	   break;
	puts("醒醒!你的钱没那么多!!!,重新输入取款金额:");   
	} 
	a[c].money=a[c].money-m;
    puts("取款成功!");
    printf("目前的余额:%f元\n",a[c].money); 
    system("pause"); //getchar()按回车键继续 
    system("cls");
    system_in();
}
//=======================================================================================
//查询功能函数 
void infor_view()
{
	printf("账户ID:%d\n",a[c].id);
	printf("姓名:%s\n",a[c].name);
	printf("密码:%s\n",a[c].password);
	printf("余额:%f\n",a[c].money);
	system("pause");
	system("cls");
    system_in();
}
//=======================================================================================
//转账功能函数 
void money_transfer()
{
	int i;
	float m;//转账金额 
	puts("请输入转账账号");
	while(1)
	{
	    scanf("%d",&i);
    	if(i>4)
	      puts("转账账号无效,请重新输入"); 
  	    else
	      break;
    }
    puts("请输入转账金额");
    while(1)
    {
      scanf("%f",&m);
      if(m>a[c].money)
         puts("您没那么多钱,请重新输入");
      else
	     break;
    }
    a[c].money=a[c].money-m;
    a[i-1].money=a[i-1].money+m;
    puts("转账成功!");
    printf("目前的余额:%f\n",a[c].money);
	system("pause");
	system("cls");
	system_in(); 
}
//=======================================================================================
//退出系统功能函数(更新用户信息) 
void update(FILE *fp)
{
	rewind(fp); 
	for(c=0;c<count-1;c++)
	{
    	fprintf(fp,"%d;%s;%s;%f\n",a[c].id,a[c].name,a[c].password,a[c].money);
    }
    fprintf(fp,"%d;%s;%s;%f",a[count-1].id,a[count-1].name,a[count-1].password,a[count-1].money);
}

链接:https://blog.csdn.net/weixin_44366851/article/details/89930964

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值