C#银行项目如何用数组实现账户菜单 支持转账取款功能
C#银行系统问题修复方案
现存问题
- 用户存储数组结构缺失账户余额字段,仅存储了姓名、密码、年龄三个属性,无法支撑余额查询、转账、取款功能
- 登录逻辑硬编码校验规则,未复用已定义的users数组,且登录成功后未记录当前登录用户的下标,后续操作无法定位到对应用户的账户数据
- 登录校验结果未做流程控制,无论登录成功或失败都会进入功能菜单,存在权限问题
- 功能菜单仅实现了UI框架,无对应业务逻辑
- 未做输入格式校验,用户输入非数字内容时会直接触发程序崩溃
- 默认分支逻辑错误,输入无效选项时直接退出循环,不符合预期的「重试」要求
修复思路
- 调整二维数组维度,为每个用户新增三个账户的余额字段,初始化时设置默认余额
- 改造登录方法,匹配账号密码后返回当前用户的数组下标,匹配失败返回-1,仅登录成功后才进入功能菜单
- 补充各功能的业务逻辑:
- 查看余额:直接输出当前登录用户三个账户的余额
- 转账:支持选择转出/转入账户,校验转出账户余额充足后更新双方余额
- 取款:选择取款账户,校验余额充足后扣除对应金额
- 新增输入格式校验,避免非法输入导致程序崩溃
- 修正菜单默认分支逻辑,输入无效选项时仅提示错误,不退出循环
完整修复代码
using System; namespace Individuellt_Projekt { class Program { static void Main(string[] args) { // 数组维度调整:5个用户,每个用户6个属性 [姓名,密码,年龄,工资账户余额,储蓄账户余额,假期账户余额] string[,] users = new string[5, 6]; // 记录当前登录用户的下标,-1表示未登录 int currentUserId = -1; // 初始化用户数据,默认给每个账户设置初始余额 users[0, 0] = "Filip Oldin"; users[0, 1] = "hemlis123"; users[0, 2] = "24"; users[0, 3] = "15000"; // 工资账户初始余额 users[0, 4] = "32000"; // 储蓄账户初始余额 users[0, 5] = "8000"; // 假期账户初始余额 users[1, 0] = "Anna Holgersson"; users[1, 1] = "hemlis1234"; users[1, 2] = "54"; users[1, 3] = "22000"; users[1, 4] = "89000"; users[1, 5] = "15000"; users[2, 0] = "Tobbe Rikardsson"; users[2, 1] = "hemlis12345"; users[2, 2] = "43"; users[2, 3] = "18000"; users[2, 4] = "56000"; users[2, 5] = "12000"; users[3, 0] = "Kent Käll"; users[3, 1] = "hemlis123456"; users[3, 2] = "32"; users[3, 3] = "19500"; users[3, 4] = "41000"; users[3, 5] = "7500"; users[4, 0] = "Eva Hobert"; users[4, 1] = "hemlis1234567"; users[4, 2] = "19"; users[4, 3] = "8500"; users[4, 4] = "12000"; users[4, 5] = "3200"; Console.WriteLine("您好,欢迎来到AB银行"); Console.WriteLine("---------------------------------"); Console.WriteLine("登录页"); Console.WriteLine("---------------------------------"); Console.WriteLine("请输入您的用户名"); string username = Console.ReadLine()?.Trim() ?? ""; Console.WriteLine("---------------------------------"); Console.WriteLine("请输入您的密码"); string password = Console.ReadLine()?.Trim() ?? ""; currentUserId = CheckLogin(username, password, users); if (currentUserId != -1) { Console.WriteLine("登录成功!"); Console.WriteLine($"您好,{users[currentUserId,0]},欢迎进入您的账户菜单"); Console.WriteLine("按任意键进入功能菜单"); Console.ReadKey(); Console.Clear(); } else { Console.WriteLine("登录失败,用户名或密码错误,程序将退出"); Console.ReadKey(); return; } bool isRunning = true; while (isRunning) { Console.WriteLine(""); Console.WriteLine(" 请输入数字选择您要使用的账户功能 "); Console.WriteLine("-----------------------------"); Console.WriteLine("1. 查看账户及余额 "); Console.WriteLine("2. 账户间转账 "); Console.WriteLine("3. 取款 "); Console.WriteLine("4. 退出登录 "); Console.WriteLine(); // 输入校验,防止非数字输入崩溃 if (!int.TryParse(Console.ReadLine(), out int accou)) { Console.WriteLine("输入无效,请输入数字选项"); Console.WriteLine("按任意键重试"); Console.ReadKey(); Console.Clear(); continue; } Console.Clear(); switch (accou) { case 1: Console.WriteLine("=== 您的账户余额 ==="); Console.WriteLine($"工资账户余额:{users[currentUserId,3]} 元"); Console.WriteLine($"储蓄账户余额:{users[currentUserId,4]} 元"); Console.WriteLine($"假期账户余额:{users[currentUserId,5]} 元"); Console.WriteLine(""); Console.WriteLine("按回车键返回主菜单"); break; case 2: Console.WriteLine("=== 账户间转账 ==="); Console.WriteLine("可选账户:1-工资账户 2-储蓄账户 3-假期账户"); Console.WriteLine("请输入转出账户编号:"); if (!int.TryParse(Console.ReadLine(), out int fromAcc) || fromAcc <1 || fromAcc>3) { Console.WriteLine("账户编号无效"); break; } Console.WriteLine("请输入转入账户编号:"); if (!int.TryParse(Console.ReadLine(), out int toAcc) || toAcc <1 || toAcc>3) { Console.WriteLine("账户编号无效"); break; } if (fromAcc == toAcc) { Console.WriteLine("转出和转入账户不能相同"); break; } Console.WriteLine("请输入转账金额:"); if (!decimal.TryParse(Console.ReadLine(), out decimal transferAmount) || transferAmount <=0) { Console.WriteLine("金额无效,请输入正整数"); break; } // 转出账户余额转换 decimal fromBalance = Convert.ToDecimal(users[currentUserId, 2 + fromAcc]); if (fromBalance < transferAmount) { Console.WriteLine("转出账户余额不足,转账失败"); break; } // 执行转账 decimal toBalance = Convert.ToDecimal(users[currentUserId, 2 + toAcc]); users[currentUserId, 2 + fromAcc] = (fromBalance - transferAmount).ToString(); users[currentUserId, 2 + toAcc] = (toBalance + transferAmount).ToString(); Console.WriteLine($"转账成功!已从【{GetAccName(fromAcc)}】转出{transferAmount}元到【{GetAccName(toAcc)}】"); Console.WriteLine(""); Console.WriteLine("按回车键返回主菜单"); break; case 3: Console.WriteLine("=== 取款 ==="); Console.WriteLine("可选账户:1-工资账户 2-储蓄账户 3-假期账户"); Console.WriteLine("请选择取款账户编号:"); if (!int.TryParse(Console.ReadLine(), out int withdrawAcc) || withdrawAcc <1 || withdrawAcc>3) { Console.WriteLine("账户编号无效"); break; } Console.WriteLine("请输入取款金额:"); if (!decimal.TryParse(Console.ReadLine(), out decimal withdrawAmount) || withdrawAmount <=0) { Console.WriteLine("金额无效,请输入正整数"); break; } decimal accBalance = Convert.ToDecimal(users[currentUserId, 2 + withdrawAcc]); if (accBalance < withdrawAmount) { Console.WriteLine("账户余额不足,取款失败"); break; } // 执行取款 users[currentUserId, 2 + withdrawAcc] = (accBalance - withdrawAmount).ToString(); Console.WriteLine($"取款成功!已从【{GetAccName(withdrawAcc)}】取出{withdrawAmount}元,当前账户剩余余额:{users[currentUserId, 2 + withdrawAcc]}元"); Console.WriteLine(""); Console.WriteLine("按回车键返回主菜单"); break; case 4: Console.WriteLine("已退出登录,感谢使用AB银行"); isRunning = false; break; default: Console.WriteLine("输入无效,请输入1-4之间的数字重试"); break; } Console.WriteLine(); Console.ReadKey(); Console.Clear(); } } // 登录校验方法,返回匹配到的用户下标,未匹配返回-1 static int CheckLogin(string username, string password, string[,] users) { for (int i = 0; i < users.GetLength(0); i++) { if (users[i,0] == username && users[i,1] == password) { return i; } } return -1; } // 辅助方法,根据账户编号返回账户名称 static string GetAccName(int accId) { return accId switch { 1 => "工资账户", 2 => "储蓄账户", 3 => "假期账户", _ => "未知账户" }; } } }
内容的提问来源于stack exchange,提问作者Filip
相关产品推荐
相关产品推荐

