ATM的转账

【 1 】明确我们要实现的功能

# ===================用户功能菜单=====================
#                   1.注册
#                   2.登陆
#                   3.取款
#                   4.转账
#                   5.充值余额
#                   6.查看流水
#                   7.查看银行信息(查看自己的卡号、余额、流水等信息)
# ======================欢迎使用=======================

 【 2 】注册

我们可以用文件操作里面学到的直用文本读写我们要的信息

def enroll(username, password, age, gender, bankcard, withdraw_password, balance):with open('5.txt', 'a', encoding='utf-8') as f:f.write(f'{username}:{password}:{age}:{gender}:{bankcard}:{withdraw_password}:{balance}\n')

首先我们先定义一个enroll函数来定再用文件里的模式里的“a”追加功能

f.write(f'{username}:{password}:{age}:{gender}:{bankcard}:{withdraw_password}:{balance}\n')  #这个就是换行并且用:分隔

如果你要单独实现的话就是这样:

if xuan == 1:new_username = input('请输入你的用户名:')new_password = input('请输入你的密码:')new_age = input('请输入你的年龄:')new_gender = input('请输入你的性别:')new_bankcard = input('请输入你的银行卡号:')new_withdraw_password = input('请输入你的提现密码:')new_balance = input('请输入你的余额: ')enroll(new_username, new_password, new_age, new_gender, new_bankcard, new_withdraw_password, new_balance)print('恭喜你注册成功')
elif xuan == 0:print('退出程序')
else:print('无效的选择')print('-------------------------------------------')

【 3 】登录

 我们肯定要从文件里把数据读取出来才能进行下一步操作:

def login(username, password):# 打开文件以读取用户名和密码with open("5.txt", "r", encoding='utf-8') as file:for line in file:#遍历values = line.strip().split(':')# 如果5.txt里面的文件字符不超过7就会触发if len(values) < 7:print(f'文件格式错误,第{line}数据不完整')continue#  会先去除行末的换行符和空白符,然后按逗号分隔返回一个包含用户名、密码、性别和年龄的字符串列表。new_username, new_password, age, gender, bankcard, withdraw_password, balance = valuesif username == new_username and password == new_password:print("登录成功!")print(f'用户名:{new_username}')print(f'性别:{gender}')print(f'年龄:{age}')print(f'银行卡:{bankcard}')print(f'银行卡密码:{withdraw_password}')print(f'余额:{balance}')return Trueprint("用户名或密码错误,请重新登录。")return False

【 4 】取款

def withdraw(username, password, amount):# 打开文件读取文本信息with open('5.txt', 'r', encoding='utf-8') as file:# 读取每一行的信息lines = file.readlines()# 遍历文件中的每一行,并将每一行的内容赋值给line,同时获取每一行的索引赋值给ifor i, line in enumerate(lines):# 这行代码将行文本按逗号分割后的部分存储在values变量中,以便后续处理或使用。values = line.strip().split(':')if len(values) < 7:# print('文件格式错误,里面数据不完整')continue# 获取用户信息save_username, save_password, age, gender, bankcard, withdraw_password, balance = valuesif username == save_username and save_password == password:# 把余额转化成小数类型balance = float(balance)if amount <= float(balance):# 余额总数减去要取的值balance = float(balance) - float(amount)  # balance -= amountlines[i] = f"{save_username}:{save_password}:{age}:{gender}: {bankcard}:{withdraw_password}:{balance}\n"with open('5.txt', 'w', encoding='utf-8') as file:file.writelines(lines)print(f'请取走{amount} 元, 当钱余额为{balance} 元')else:print('穷逼还来取钱')return Trueprint('用户名或密码错误')return False

【 5 】转账

def transfer(second_username, second_password, jieshuo_username, amount):with open("5.txt", "r", encoding='utf-8') as file:# 读取所有行的信息lines = file.readlines()# 遍历文件的每一行for i, line in enumerate(lines):# 分割每一行的值values = line.strip().split(':')if len(values) < 7:continueusername, password, age, gender, bankcard, withdraw_password, balance = valuesif username == second_username and password == second_password:balance = float(balance)if balance >= float(amount):balance -= float(amount)lines[i] = f"{username}:{password}:{age}:{gender}:{bankcard}:{withdraw_password}:{balance}\n"breakelse:print("余额不足,无法完成转账。")return# 重新打开文件并写入更新后的信息with open('5.txt', 'w', encoding='utf-8') as f:f.writelines(lines)# 增加接收者的余额with open('5.txt', 'r+', encoding='utf-8') as f:lines = f.readlines()# 其中enumerate() 函数用于同时获取每一行的内容和行号,方便后续操作。line.split(':')则使用冒号分隔符将每行的数据分割成一个列表。for i, line in enumerate(lines):values = line.strip().split(':')# 读取文件中的每一行,并将其解析成一个列表,如果列表长度小于7,则跳过这一行,不进行处理。if len(values) < 7:continueusername, password, age, gender, bankcard, withdraw_password, balance = valuesif username == jieshuo_username:balance = float(balance)balance += float(amount)# 更新用户信息lines[i] = f"{username}:{password}:{age}:{gender}:{bankcard}:{withdraw_password}:{balance}\n"break# 最后将更新的信息写回文件with open('5.txt', 'w', encoding='utf-8') as f:f.writelines(lines)print(f'转账成功!{amount} 元 用户{second_username} 账户转到{jieshuo_username}中')

【 6 】充值金额

def chongqian(username,password,amount):with open("5.txt", "r", encoding='utf-8') as file:# 读取所有行的信息lines = file.readlines()# 遍历文件的每一行for i, line in enumerate(lines):# 分割每一行的值values = line.strip().split(':')if len(values) < 7:continuesecond_username, second_password, age, gender, bankcard, withdraw_password, balance = valuesif username == second_username and password == second_password:balance = float(balance)if float(amount) <= 0:print('充值金额不能是负数:')return  False# 更新余额信息balance += float(amount)new_lines = f"{second_username}:{second_password}:{age}:{gender}: {bankcard}:{withdraw_password}:{balance}\n"lines[i] = new_lines# 将更新后的用户信息写回文件中with open('5.txt', 'w', encoding='utf-8') as f:f.writelines(lines)print(f'充值成功!当前余额为{balance}人民币')return Trueprint('用户名或密码错误')return False

【 7】 查看流水

from _datetime import datetime# 读取保存用户信息的文件,逐行读取每个用户的信息。
# 对于每个用户,提取其操作记录(例如转账、取款等)。
# 将操作记录写入一个新的文件中,并输出到控制台。
def chalook_water():# 打开文件并读出所用行with open('5.txt', 'r', encoding='utf-8') as flie:lines = flie.readlines()# 遍历每一行并打印出来,并添加时间for line in lines:timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")  # 获取当前时间print(f"{timestamp} {line.strip()}")# 使用文本的a的追加将流水时间写入文件with open('5.log', 'a', encoding='utf-8') as f:f.write(f'{timestamp} {line.strip()}')print(timestamp,line.strip())

【 8 】查看银行信息

 

def chalook_bankard(username, password, timestamp):with open('5.txt', 'r', encoding='utf-8') as f:for line in f:values = line.strip().split(":")if len(values) < 7:# print('文件格式错误,里面数据不完整')continuecha_username, cha_password, age, gender, bankcard, withdraw_password, balance = valuesif username == cha_username and password == cha_password:print(f'银行卡卡号:{bankcard}')print(f'余额{balance}')with open('5.log', 'a', encoding='utf-8') as f:timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")# 生成当前时间戳,并使用f.write()向文件中写入一行文本,文本内容包括时间戳、银行卡号和余额信息。f.write(f'{timestamp} 银行卡卡号:{bankcard} 余额:{balance}\n')return Trueprint("账户或密码错误:")return False

【 9 】 主界面

       

flag = True
while True:print(''''双面龟的日常生活1.注册2.登陆3.取款4.退出5.转账6.查看流水7.查看银行信息8.充值业务''')xuan = int(input('请选择你想要的程序:'))if xuan == 1:username = input('请输入你用户名:')password = input('请输入你密码:')age = input('请输入你年龄:')gender = input('请输入你性别:')bankcard = input('请输入你的银行卡卡号:')withdraw_password = input('请输入你的银行卡密码:')balance = input('请输入你余额·:')enroll(username, password, age, gender, bankcard, withdraw_password, balance)if username is not None:print('恭喜你注册成功')elif xuan == 2:username = input('请输入你用户名:')password = input('请输入你密码:')login(username, password)elif xuan == 3:username = input('请输入用户名:')password = input('请输入密码:')amount = int(input('请输入取款金额:'))withdraw(username, password, amount)elif xuan == 4:flag = Falseprint('欢迎光临')breakelif xuan == 5:second_username = input('请输入你用户:')second_password = input(('请输入你的用户密码:'))jieshuo_username = input('请输入你的接收用户账户: ')amount = input('请输入你要转账的金额: ')transfer(second_username, second_password, jieshuo_username, amount)elif xuan == 6:chalook_water()elif xuan == 7:username = input('请输入用户名: ')password = input('请输入密码:')timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")chalook_bankard(username, password, timestamp)elif xuan == 8:username = input('请输入你要充值的用户: ')password = input('请输入你要充值的用户的密码: ')amount = input('请输入你要充值的金额: ')chongqian(username,password,amount)else:print('无效的选项')

结果:

        双面龟的日常生活1.注册2.登陆3.取款4.退出5.转账6.查看流水7.查看银行信息8.充值业务请选择你想要的程序:1
请输入你用户名:mao
请输入你密码:123
请输入你年龄:16
请输入你性别:nan
请输入你的银行卡卡号:6666
请输入你的银行卡密码:1111
请输入你余额·:500000
---------------------------------
恭喜你注册成功
'双面龟的日常生活1.注册2.登陆3.取款4.退出5.转账6.查看流水7.查看银行信息8.充值业务请选择你想要的程序:1
请输入你用户名:tian
请输入你密码:123
请输入你年龄:19
请输入你性别:nv
请输入你的银行卡卡号:5555
请输入你的银行卡密码:1111
请输入你余额·:50000000
---------------------------------
恭喜你注册成功
'双面龟的日常生活1.注册2.登陆3.取款4.退出5.转账6.查看流水7.查看银行信息8.充值业务请选择你想要的程序:1
请输入你用户名:tian
请输入你密码:123
请输入你年龄:18
请输入你性别:nan
请输入你的银行卡卡号:7777
请输入你的银行卡密码:1111
请输入你余额·:50000
---------------------------------
恭喜你注册成功
'双面龟的日常生活1.注册2.登陆3.取款4.退出5.转账6.查看流水7.查看银行信息8.充值业务请选择你想要的程序:3
请输入用户名:tian
请输入密码:123
请输入取款金额:2000
请取走2000 元, 当钱余额为108211.2 元
'双面龟的日常生活1.注册2.登陆3.取款4.退出5.转账6.查看流水7.查看银行信息8.充值业务请选择你想要的程序:5
请输入你用户:mao
请输入你的用户密码:123
请输入你的接收用户账户: tian
请输入你要转账的金额: 1000
转账成功!1000 元 用户mao 账户转到tian中
'双面龟的日常生活1.注册2.登陆3.取款4.退出5.转账6.查看流水7.查看银行信息8.充值业务请选择你想要的程序:7
请输入用户名: mao
请输入密码:123
银行卡卡号:  3333
余额147888.7
'双面龟的日常生活1.注册2.登陆3.取款4.退出5.转账6.查看流水7.查看银行信息8.充值业务请选择你想要的程序:8
请输入你要充值的用户: mao
请输入你要充值的用户的密码: 123
请输入你要充值的金额: 600000
充值成功!当前余额为747888.7人民币
'双面龟的日常生活1.注册2.登陆3.取款4.退出5.转账6.查看流水7.查看银行信息8.充值业务请选择你想要的程序:4
欢迎光临

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/213016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Redis在定时任务里判断其他定时任务是否已经正常执行完的方案

执行的定时任务是基于其他定时任务计算得到的结果基础上做操作的&#xff0c;那么如何来确定其他存在数据依赖的定时任务已经执行完成呢&#xff1f; 在分布式环境里&#xff0c;可通过集群的redis来解决这个问题&#xff1a; 即&#xff0c;在跑批任务开始时&#xff0c;将任…

SSD数据在写入NAND之前为何要随机化?-part2

接part1介绍&#xff1a; 如何达到这个目的&#xff1f;业内常用的是对写入数据的数据进行随机化处理&#xff0c;这部分主要在SSD控制器中通过硬件实现。 上图b/c&#xff1a;在控制器芯片通过硬件方式实现随机化的读写流程&#xff0c;这个也是业内通常做法。随机化处理是在写…

【K8S in Action】服务:让客户端发现pod 并与之通信(1)

服务是一种为一组功能相同的 pod 提供单一不变的接入点的资源。当服务存在时&#xff0c;它的 IP 地址和端口不会改变。 客户端通过 IP 地址和端口号建立连接&#xff0c; 这些连接会被路由到提供该服务的任意一个 pod 上。 pod 是短暂&#xff0c;会删除增加&#xff0c;调度…

Android 13 Settings蓝牙列表卡顿问题排查及优化过程

一.背景 此问题是蓝牙列表界面息屏后再点击亮屏蓝牙界面卡住,划不动也不能返回,在人多的时候(附近开启的蓝牙设备过多的时候)会卡住大概四五秒才能滑动. 优化前效果见资源: 二.查找耗时点 根据Android Studio的Profiler工具进行排查,查找主线程时间线比较长的方法,如下:…

IDEA远程调试与JDWP调试端口RCE漏洞

文章目录 前言Docker远程调试Java调试原理远程调试实践 JDWP端口RCE调试端口探测调试端口利用 总结 前言 在对一些 Java CVE 漏洞的调试分析过程中&#xff0c;少不了需要搭建漏洞环境的场景&#xff0c;但是本地 IDEA 搭建的话既麻烦&#xff08;通过 pom.xml 导入各种漏洞组…

面向对象编程教程

面向对象编程是一种基于对象的编程范型&#xff0c;它将程序中的数据和操作数据的方法看作一个整体&#xff0c;通过封装、继承和多态等机制来实现代码的复用和可扩展性。面向对象编程也是现代软件开发的主流编程范式之一&#xff0c;广泛应用于各种编程语言中&#xff0c;如C、…

Zookeeper系统性学习-应用场景以及单机、集群安装

Zookeeper 是什么&#xff1f; Zookeeper 为分布式应用提供高效且可靠的分布式协调服务&#xff0c;提供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。在解决分布式数据一致性方面&#xff0c;ZooKeeper 并没有直接采用 Paxos 算法&#xff0c;而是采用了名为 …

Android Studio Gradle下载慢解决方法

Android Studio Gradle下载慢解决方法 最近在练习模型部署&#xff0c;主要是在手机端部署&#xff0c;所以使用到了Android Studio&#xff0c;但是在创建项目的时候&#xff0c;一致在下载gradle&#xff0c;而且网速还很慢&#xff0c;不对&#xff0c;是极慢哪种&#xff0…

MQTT发布、订阅和取消订阅

在本文中&#xff0c;我们将深入了解MQTT发布、订阅和取消订阅相关的内容。如果你刚接触发布/订阅模型&#xff0c;建议阅读本专栏之前的文章。 什么是MQTT发布消息 在MQTT中&#xff0c;一个客户端连接到代理&#xff08;broker&#xff09;之后可以立即发布消息。这些消息依…

NetSuite预算管理实践

NetSuite预算相关的原生功能有两个&#xff1a; 一个是Expense Commitments And Budget Validation这个SuiteApp&#xff0c;我们在一年前写过一篇文章介绍过。它强调预算的过程控制&#xff0c;但由于功能很有限&#xff0c;没有实际用处。 NetSuite Budget功能包_netsuite …

Vue3 pinia的基本使用

pinia的使用跟vuex很像&#xff0c;去除了很多没用的api&#xff0c;写法有两种&#xff0c;一种老式的选项式api还有一种组合式api&#xff0c;用哪种根据自己喜好来&#xff0c;以下示例为组合式api 更多教程参考官网&#xff1a;pinia官网https://pinia.vuejs.org/zh/ 安装…

机器学习基本概念2

资料来源&#xff1a; https://www.youtube.com/watch?vYe018rCVvOo&listPLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2J&index1 https://www.youtube.com/watch?vbHcJCp2Fyxs&listPLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2J&index2 分三步 1、 定义function b和w是需要透…

linux之autoconf(1)基础介绍

Linux之autoconf(1)基础介绍 Author&#xff1a;Onceday Date&#xff1a;2023年2023年12月10日 漫漫长路&#xff0c;才刚刚开始… 本文主要内容翻译自Autoconf官方文档&#xff0c;仅供学习交流之用。 全系列文章请查看专栏: buildroot编译框架_Once_day的博客-CSDN博客。…

FL Studio21最新FL水果编曲软件中文版在哪下载?

FL Studio21水果编曲软件是一款专业的音乐制作软件&#xff0c;被广泛地应用于电子音乐、hip-hop、流行乐等多种音乐类型的制作。该软件提供了丰富的音频编曲工具和音乐效果器&#xff0c;让用户可以轻松地创作出高品质的音乐作品。同时&#xff0c;这也是一款非常易于上手的软…

[ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证

文章目录 一、前言二、在 Azure Portal 中创建 VM三、验证已创建的虚拟机资源3.1 方法一&#xff1a;在虚拟机服务中查看验证3.1 方法二&#xff1a;在资源组服务中查看验证 四、文末总结 一、前言 本文会开始创建新系列的专栏&#xff0c;专门更新 Azure 云实践相关的文章。 …

7-7 求补码

整数在内存中以二进制补码形式存储。对于给定的整数n&#xff0c;要求输出其4个字节长的补码。1个字节8个二进制位。 输入格式: 输入一个整数n(−231≤n≤231−1)。 输出格式: 输出n的补码。 输入样例1: 123输出样例1: 00000000000000000000000001111011输入样例2: -12…

YOLOv8改进 | 2023检测头篇 | 利用AFPN改进检测头适配YOLOv8版(全网独家创新)

一、本文介绍 本文给大家带来的改进机制是利用今年新推出的AFPN&#xff08;渐近特征金字塔网络&#xff09;来优化检测头&#xff0c;AFPN的核心思想是通过引入一种渐近的特征融合策略&#xff0c;将底层、高层和顶层的特征逐渐整合到目标检测过程中。这种渐近融合方式有助于…

【react hook】ahook的useThrottleEffect 是干嘛的

import { useThrottleEffect } from ahooks;useThrottleEffect 是 React Hooks 中的一个自定义 Hook&#xff0c;用于创建具有节流效果的副作用函数。 在 React 组件中&#xff0c;副作用函数通常在组件生命周期方法中执行&#xff0c;如 componentDidMount、componentDidUpda…

软件无线电SDR-频谱采集python实现

sdr做的频谱采集&#xff0c;保存的500张频谱图&#xff0c;能看出来是什么东西吗&#xff1f;

VC++使用GetProcessTimes获取进程创建时间、销毁时间、用户态时间、内核态时间

一、GetProcessTimes函数简介&#xff08;微软MSDN&#xff09; 微软提供了一个非常有用的API函数GetProcessTimes用来获取进程创建时间、销毁时间、用户态时间、内核态时间&#xff0c;msdn连接为&#xff1a;GetProcessTimes 函数 (processthreadsapi.h) 其函数原型为&#…