You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:06:02