void WithdrawalOt(long money) { if (now_acc->balance < money) { PR(\响铃 PR(\您的余额不足%ld\\n\\n\ system(\ return; }
PR(\正在处理,请稍候...\\n\now_acc->balance -= money; Save();
Log(-money, now_acc->no);
PR(\取款成功\\n\\n\ system(\}
/**********存款**********/ void Depositing() { long money; do { PR(\请输入存款金额(50的倍数),单次存款金额不得超过20000元:\ fflush(stdin); scanf(\ if (money < 0 || money > 20000 || money % 50) {//解决输入金额为负数、超过20000、不是50的倍数的情况 PR(\响铃 PR(\输入有误,请重新输入\\n\ system(\ continue; } PR(\正在处理,请稍候...\\n\ now_acc->balance += money; Save();//保存账户数据 Log(money, now_acc->no);//保存存取数据 PR(\存款成功\\n\\n\ system(\ break; } while (1); }
/**********保存账户信息**********/ void Save() { FILE *fp;
int i = 1; char ch; if (!(fp = fopen(\ { PR(\响铃 PR(\读取帐户信息失败!accounts.txt无法打开\\n\ exit(0); } for (Account *i = head; i; i = i->next)//写入账户信息 fprintf(fp, \ fclose(fp); }
/**********修改密码**********/ void Modifiy() { char oldpass[7], newpass1[7], newpass2[7]; do {
PR(\请输入原密码:\fflush(stdin); gets(oldpass);
if (strlen(oldpass) != 6) {
PR(\密码应为6位\\n\ system(\ continue; }
if (strcmp(oldpass, now_acc->password))
{//解决密码输入有误,出于安全性的考虑,原密码输入错误时不提供返回功能 PR(\密码有误,请重新输入\\n\\n\ system(\ continue; } else break; } while (1); do { PR(\请输入六位新密码:\ fflush(stdin); scanf(\ if (strlen(newpass1) != 6) { PR(\密码应为6位\\n\ system(\
continue; }
PR(\请再次输入新密码:\fflush(stdin);
scanf(\
if (strcmp(newpass1, newpass2))
{//两次输入密码不一致时 PR(\密码不一致(输入*取消修改)\\n\ fflush(stdin); if (getchar() == '*') break; } else
{//输入一致时 strcpy(now_acc->password, newpass1);//修改密码 Save();//保存用户数据 PR(\密码修改成功!\\n\\n\ system(\ break; } } while (1); }
/**********转账**********/ void Transfer() { Account* aimsite;//转入卡号在链表中的地址 long money;//转账金额 if (now_acc->balance < 50)
{//当账户余额不足50时 PR(\响铃 PR(\您的余额不足50,无法转账\\n\\n\ system(\ return; } do {
char aim[17];//转入卡号
PR(\请输入转入卡/折号(16位):\fflush(stdin); gets(aim);
if (strlen(aim) != 16) { PR(\卡号应为16位\\n\ system(\ continue;
}
if (!(strcmp(aim, now_acc->no))) {//解决转账双方卡号相同的情况 PR(\双方账户相同,请核对后重试(输入*取消转账)\\n\ if (getchar() == '*') return; continue; }
if (aimsite = FindbyNo(aim))
break;//找到转入卡号对应信息时 else { PR(\未找到该卡号,输入*取消转账\\n\ if (getchar() == '*') return; continue; }
} while (1);
PR(\汇款目标用户名为:%s\\n\PR(\是否确认无误?(输入*确认,否则退出)\fflush(stdin);
if (getchar() != '*') return; do { PR(\请输入转账金额(50的倍数):\ fflush(stdin); scanf(\ if (now_acc->balance < money) { PR(\响铃 PR(\您的余额不足%lu,请重新输入转账金额\\n\\n\ system(\ continue; } if (money % 50)
{//当输入金额不是50的倍数时 PR(\响铃 PR(\输入有误,请重新输入\\n\ continue; }
PR(\转账中,请稍候...\\n\now_acc->balance -= money; aimsite->balance += money; Save();//保存账户数据
Log(-money, now_acc->no);//当前账户存取记录 Log(money, aimsite->no);//转入卡存取记录 PR(\转账成功\\n\\n\ system(\ break; } while (1); }
/**********掩盖部分用户名**********/ char *CoverUpName(const char *name) { char temp[20]; strcpy(temp, name); int words = 0;//用于存放姓名的字数 for (char* i = temp; *i; i += 2)
words++;//计算姓名的字数 switch (words) {
case 2:
temp[0] = '*', temp[1] = '*';//当姓名字数为2时,掩盖姓 strcpy(temp + 1, temp + 2);//消除一个*号 break; case 3: temp[2] = '*', temp[3] = '*';//当姓名字数为3时,掩盖名字中的第一个字 strcpy(temp + 3, temp + 4);//消除一个*号 break; default:
temp[0] = '*', temp[1] = '*', temp[2] = '*', temp[3] = '*';//姓名字数大于3时,掩盖姓和名字中的第一个字 strcpy(temp + 2, temp + 4);//消除两个*号 } return temp; }
/**********释放链表空间**********/ void FreeData() { Account* t; while (head) { t = head; head = head->next; free(t); } }
C语言模拟ATM机



