Member 12743888 Ответов: 1

Нужна помощь в доступе к классу из другого класса. До диез


Нужна помощь в доступе к классу учетной записи. Когда я запускаю программу, она запрашивает WriteLine класса ATM ("Welcome/Enter Account/Exit");. Однако после того, как я ввожу номер, командное окно просто закрывается. Я не знаю, что здесь делать. Я должен также упомянуть, что это моя первая программа с Си-Диезом.

Класс Счета:

using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication3
    {
        class Account //Within the Account class, we have balance, withdraw,and deposit
        {
    
            ////An account array to create 3 seperate accounts each with a default balance of $100.00. 
            //int[] myAccount = new int[3];
            Account[] account = new Account[3];
    
    
            public double balance;
    
            public void deposit(double n)
            {
                balance += n;
            }
            public void withdraw(double n)
            {
                balance -= n;
            }
            public void calcInterest(double n)
            {
                //Here is where we calculate the interest!
            }
    
            public void menu()
            {
                {
                    {
    
                        int input = Convert.ToInt32(Console.ReadLine());
                        var currAccount = account[input]; // Not sure what this code is for. 
    
    
                        if (account[input] == null)
                        {
                            account[input] = new Account();
                            account[input].balance = 100; //Set initial balance to $100
                        }
    
                        if (input != 4)
                        {
    
                            Console.WriteLine("1) Deposit");
                            Console.WriteLine("2) Withdraw");
                            Console.WriteLine("3) Get Balance");
                            Console.WriteLine("4) Exit");
                            if(input == 1)
                                {
                                Console.WriteLine("How much would you like to deposit today?");
                                int moneyIn = Convert.ToInt32(Console.ReadLine());
                                account[input].deposit(moneyIn); //access the deposit method and increase balance by the amount entered by user.
                                Console.WriteLine("Here is your current balance:" + account[input].balance);
                            }
    
                                if(input == 2)
                                {
    
                                Console.WriteLine("How much would you like to withdraw today?");
                                int moneyOut = Convert.ToInt32(Console.ReadLine());
                                account[input].withdraw(moneyOut); //Access the withdraw method and decrease balance by the amount entered by user.
                                Console.WriteLine("Here is your current balance:" + account[input].balance);
                            }
    
                            if (input == 3)
                                {
    
                                Console.WriteLine("Here is your current balance:"+account[input].balance);
                                //return account[input].balance;
                            }
    
                            if (input == 4)
                            {
                                //I want to exit the application here. 
                            }                  
                         }
                     }
                }
            }
        }
    }




Класс банкомата:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    class Atm //With the atm class we will have the atm menu
    {
        static void Main(string[] args)
        {
                int input = -1;
            do
            {
                Console.WriteLine("Welcome!");
                Console.WriteLine("Please enter your account number (1-3 or '4' to exit.");
                if (Int32.TryParse(Console.ReadLine(), out input))
                {
                    if (input >= 1 && input <= 3)
                    {
                        Console.WriteLine("You have entered " + input);
                        Console.ReadLine();

                        //ConsoleApplication3.Account[input]; // How do I access the account here? 
                    }
                }
            }
            while (input != 4); 
                { 
                                    Console.WriteLine("Goodbye.");
                }

        }
    }
}





















Класс Программы:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    class Program
    {
      //Not really sure what this is for at the moment, or if it is even needed.
    }
}


Что я уже пробовал:

Я довольно долго искал в интернете, но, похоже, не нашел ничего похожего на ту проблему, с которой столкнулся. Это моя первая программа, над которой я работаю Соло для класса.

[no name]

Поиск в интернете "как использовать отладчик"

[no name]

В этом нет необходимости. Вы говорите, что в вашей программе есть ошибки. Отладчик поможет вам найти их.

1 Ответов

Рейтинг:
10

OriginalGriff

Потому что ваш основной метод делает очень мало:

static void Main(string[] args)
    {
    Console.WriteLine("Welcome!");
    Console.WriteLine("Please enter your account number (1-3 or '4' to exit.");
    int input = Convert.ToInt32(Console.ReadLine());
    if (input >= 1 && input <= 3)
        {
        Console.WriteLine("You have entered " + input);
        Console.ReadLine();
        //ConsoleApplication3.Account[input]; // How do I access the account here? 
        }
    else if (input == 4)
        {
        Console.WriteLine("Goodbye.");
        //Exit Application
        }
    }
Как только вы вводите номер, он выходит, и окно закрывается, так что вы ничего не видите.
Так что начните с изменения этого и добавления цикла:
static void Main(string[] args)
    {
    int input = -1;
    do
        {
        Console.WriteLine("Welcome!");
        Console.WriteLine("Please enter your account number (1-3 or '4' to exit.");
        if (int32.TryParse(Console.ReadLine(), out input))
            {
            if (input >= 1 && input <= 3)
                {
                Console.WriteLine("You have entered " + input);
                Console.ReadLine();
                //ConsoleApplication3.Account[input]; // How do I access the account here? 
                }
            }
        } while input != 4)
    Console.WriteLine("Goodbye.");
    }
Я также заменил Convert на TryParse - это означает, что ваше приложение не выйдет из строя, если вы наберете что-то не то!

Другая ваша проблема - это бит "я хочу использовать учетную запись здесь" - он немного запутан относительно того, что именно вам нужно, но попробуйте:
Account acc = new Account();
acc.menu();
Но на самом деле вы не должны помещать консольные вещи в класс Account - он должен заниматься только манипулированием учетными записями, а не обработкой пользовательского ввода. Ваш основной метод должен обрабатывать пользовательский ввод, передавать данные в класс Account и вызывать методы внутри него, когда пользователь просит, чтобы что-то произошло.

"Учетная запись связана с интерфейсом, потому что она должна знать, какой метод вызывать. Банкомат должен иметь возможность позвонить по счету, а затем выбрать действие, нажав клавишу. Итак, мне нужно переместить интерфейс в раздел ATM, потому что он содержит основной метод?"

Банкомат - это "интерфейс" точно так же, как вход в систему через интернет, но вы же не ожидаете, что они будут одинаковыми только потому, что они имеют доступ к одному и тому же счету, не так ли? Во-первых, куда вы собираетесь вставить банковскую карту в свой компьютер? :смеяться:
Банкомат создает экземпляр счета (который имеет правильный номер счета), запрашивая список счетов (или что-то еще) для самого счета и передавая ему номер счета.
Отказ от ответственности: возможно, вы не захотите использовать этот код (на самом деле я бы рекомендовал вам этого не делать), но он может объяснить, что я имею в виду:
public class Account
    {
    private static Account[] accounts = new Account[3];
    private decimal balance = 0.0M;
    public Account(decimal openingDeposit, int accountNumber)
        {
        if (accountNumber >= 0 && accountNumber < accounts.Length)
            {
            balance = openingDeposit;
            accounts[accountNumber] = this;
            }
        }
    public Account GetAccount(int index)
        {
        if (index >= 0 && index < accounts.Length)
            {
            return accounts[index];
            }
        return null;
        }
    public decimal MakeDeposit(decimal deposit)
        {
        balance += deposit;
        return balance;
        }
    public decimal MakeWithdrawl(decimal deposit)
        {
        balance -= deposit;
        return balance;
        }
    public decimal GetBalance()
        {
        return balance;
        }
    }

Теперь ваш основной метод может "заполнить пробелы":
public static void Main(string[] args)
    {
    Account a = new Account(123.88M, 0);
    Account b = new Account(456.99M, 1);
    Account c = new Account(1.24M, 2);
    ...
    if (int.TryParse(Console.ReadLine(), out input))
        {
        if (input >= 1 && input <= 3)
            {
            Account acc = Account.GetAccount(input - 1);
            Console.WriteLine("The account balance is: {0}", acc.GetBalance());
            }
        }
    }
Здесь учетная запись имеет дело сама с собой, что означает, что она "знает", к какой учетной записи она должна получить доступ - это называется instance класса Account, и каждый экземпляр отделен друг от друга. У них разные номера счетов, разные балансы-и один счет не может повлиять на другой.
Там, вероятно, довольно много всего, что не имеет особого смысла, но попробуйте немного замять это и получить "ощущение" того, что происходит.

Банкомат (ваш основной метод) знает, как обращаться с пользователем через экран и пару клавиш, но это не влияет на сам ваш счет - он просит основные системы вашего банка сделать это, и это разделение "реального мира" отражается в программном обеспечении.

Подумайте и посмотрите, поймете ли вы, что я имею в виду - я сейчас ухожу, так как сама настаиваю на том, чтобы я "получила жизнь", и последствия за непослушание здесь могут стать серьезными! :смеяться:


Member 12743888

Ладно, я изменил его на то, как ты написал код. Я рад узнать о Трипарсе, спасибо вам за это знание. Почему мы начинаем с input = -1? И насчет запутанной части. Я пытаюсь понять, как вызвать меню учетной записи. Он находится в классе account, поэтому теоретически вам будет предложено ввести номер счета, после чего он спросит вас, Хотите ли вы внести депозит, снять деньги, проверить баланс или выйти.

OriginalGriff

Почему -1? Чтобы придать ему значение,которое не будет соответствовать ни одному из ваших вариантов. Это хорошая идея, чтобы явно присвоить значение, так как ваш код не будет компилироваться, если система видит любой возможный маршрут через ваш код, что означает, что переменная может быть "прочитана" без "записи" - даже если на практике это невозможно.

Это "немного запутано", потому что вы написали это таким образом! Пожалуйста, не обижайтесь, но это выглядит так, как будто вы начали кодировать еще до того, как начали думать, и дошли до того момента, когда уже не уверены, что делает то, что делает. И это нормально - все делают это в самом начале, и требуется время, чтобы понять, что гораздо быстрее остановиться и подумать, спланировать, спроектировать, прежде чем прикоснуться к клавиатуре!

Ваши" приветствуйте и получите счет нет": почему это часть счета? Это часть вашего банка? Или это зависит от того, как вы получаете доступ к учетной записи? Если вы входите в филиал, это не тот же интерфейс, что и использование телефона, и опять же это отличается от использования интернета. Но за всем этим стоит один и тот же счет, один и тот же код, который проверяет номера счетов, остатки и так далее, и передает его обратно в конкретный интерфейс, который вы используете в данный момент, да?
Так почему же ваша учетная запись связана с интерфейсом, с деталями того, какую клавишу нажимать?

Пусть файл, содержащий основной метод, имеет дело с интерфейсом - обязательно добавьте туда методы, обрабатывающие выбор пользователя, - и передайте им экземпляр учетной записи, который он выбрал. Затем пусть они разберутся с выбором пользователя: 1 для баланса, 2 для депозита и так далее, а затем вызовут соответствующий метод в экземпляре счета, чтобы разобраться с ним.
Подумайте об этом некоторое время и посмотрите, сможете ли вы понять, что я имею в виду. Это занимает немного как ваша голова круглая, чтобы начать с.

Member 12743888

Хорошо, теперь я понимаю аспект -1. Спасибо, я не обижаюсь, мне нравится конструктивная критика. Учетная запись связана с интерфейсом, потому что ей нужно знать, какой метод вызывать. Банкомат должен иметь возможность позвонить по счету, а затем выбрать действие, нажав клавишу.

Итак, мне нужно переместить интерфейс в раздел ATM, потому что он содержит основной метод?

OriginalGriff

Ответ обновлен.

Member 12743888

Да, учетная запись должна быть создана на лету. Я просто подожду, пока у меня будет время поговорить об этом с моим учителем. Я понимаю большую часть кода и то, как он работает. Вы мне очень помогли, я действительно очень ценю все ваше время и усилия. Поэтому мне нужно исправить код, чтобы сделать то, что когда-либо было введено при входе,а не раньше с помощью a,b, c. Который я могу просто использовать как-то одну и ту же входную переменную.

OriginalGriff

Пожалуйста!

Member 12743888

Кроме того, что делает часть "out input"?

OriginalGriff

Это часть вызова метода: TryParse принимает два параметра.
Первый-это строка, на которую нужно посмотреть и попробовать преобразовать.
Во-вторых, куда поместить значение, если преобразование работает.

Метод может возвращать только одно значение-и в случае TryParse это bool, который говорит:" это сработало! " - true-или "это было не число" - false. Поэтому вам нужен второй параметр, чтобы он возвращал фактическое значение. Он должен иметь "выход" перед собой, чтобы метод мог изменить значение-этот бит становится сложным и имеет отношение к типам значений и ссылочным типам, а также к тому, что такое ссылка и значение, так что на данный момент просто примите это как Евангелие: "" выход "необходим, или он не работает", пока у вас не будет гораздо больше этого за поясом! Ваш наставник доберется до него позже (и, вероятно,заставит вашу голову болеть...) :)