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.pswp.cn/news/213016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213016.shtml
英文地址,請注明出處:http://en.pswp.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) 其函數原型為&#…