Тема: Реалізувати роботу банкомату
Реалізувати роботу банкомату. Обов’язковим є реалізація синхронізації та використання багатопотоковості.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Java → Реалізувати роботу банкомату
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Реалізувати роботу банкомату. Обов’язковим є реалізація синхронізації та використання багатопотоковості.
Забули дописати "негайно, раби". Так природніше виглядає.
Ось проект, його треба удосконалювати, чи навпаки треба зробити простіше???
Bankomat.java
package souces.javabegin.bankomat;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Bankomat implements ActionListener {
    //компоненты GUI
    private JFrame frame;
    private JPanel mainPanel;
    private JLabel jlblBalanceCaption, jlblBalance, jlblMoneyCaption;
    private JTextField jtxtMoney;
    private JButton jbtnWithdraw, jbtnDeposit;
    
    //изначально баланс равен 100
    private Account account = new Account(100.00);
    // запуск программы
    public static void main(String[] args) {
        //запуск программы в safe потоке
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                setGUI();
            }
        });
    }
    private static void setGUI() {
        Bankomat gui = new Bankomat();
    }
    //конструктор
    public Bankomat() {
        //контейнеры
        frame = new JFrame("Банкомат");
        mainPanel = new JPanel();
        mainPanel.setLayout(new GridLayout(3, 2)); //3 строки 2 столбца
        frame.getContentPane().add(mainPanel);
        addComponents();
        //свойства фрейма
        frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setSize(200, 150);
        frame.setLocation(300, 300);
        frame.setVisible(true);
        //показать баланс в формате в текстовом окне
        displayBalance();
    }
    // добавление всех необходимых компонентов
    private void addComponents() {
        jlblBalanceCaption = new JLabel("Баланс: \u20AC  ");// \u20AC - символ валюты Евро
        jlblBalance = new JLabel(" ");
        jlblMoneyCaption = new JLabel("Деньги: \u20AC  ");
        jtxtMoney = new JTextField();
        jbtnWithdraw = new JButton("Снять");
        jbtnDeposit = new JButton("Пополнить");
        //выравнивание
        jlblBalanceCaption.setHorizontalAlignment(JLabel.RIGHT);
        jlblMoneyCaption.setHorizontalAlignment(JLabel.RIGHT);
        //зеленый цвет на черном фоне
        jlblBalance.setForeground(Color.GREEN);
        jlblBalance.setBackground(Color.BLACK);
        jlblBalance.setOpaque(true);
        //добавление компонентов на панель
        mainPanel.add(jlblBalanceCaption);
        mainPanel.add(jlblBalance);
        mainPanel.add(jlblMoneyCaption);
        mainPanel.add(jtxtMoney);
        mainPanel.add(jbtnWithdraw);
        mainPanel.add(jbtnDeposit);
        //слушатели событий
        jbtnWithdraw.addActionListener(this);
        jbtnDeposit.addActionListener(this);
    }
    //перехват нажатия кнопки
    @Override
    public void actionPerformed(ActionEvent e) {
        //нажали кнопку "Снять"
        if (e.getSource() == jbtnWithdraw) {
            withdraw();
            //нажали кнопку "Пополнить"
        } else if (e.getSource() == jbtnDeposit) {
            deposit();
        }
    }
    //показывает баланс
    private void displayBalance() {
        //конвертировать число в строку
        String balance = String.format("%.2f", account.getBalance());
        //показать результат в текстовом поле
        jlblBalance.setText(balance);
    }
    //пополнение
    private void deposit() {
        // проверка - пополнять можно минимум 100
        if (isValidDepsoit()) {
            //получить введенные данные
            double money = Double.parseDouble(jtxtMoney.getText());
            //добавить деньги на счет
            account.deposit(money);
            //сообщение пользователю
            JOptionPane.showMessageDialog(frame, "Пополнение прошло успешно", "Сообщение", JOptionPane.INFORMATION_MESSAGE);
            // пересчет баланса
            displayBalance();
        }
    }
    //снятие
    private void withdraw() {
        // проверка на снятие суммы
        if (isValidWithdrawal()) {
            //получить введенные данные
            int money = Integer.parseInt(jtxtMoney.getText());
            //вычесть деньги со счета
            account.withdraw(money);
            //сообщение пользователю
            JOptionPane.showMessageDialog(frame, "Снятие прошло успешно", "Сообщение", JOptionPane.INFORMATION_MESSAGE);
            // пересчет баланса
            displayBalance();
        }
    }
    //проверка суммы для пополнения
    private boolean isValidDepsoit() {
        String message = "";
        //если не число
        if (!isDouble(jtxtMoney.getText())) {
            message = "Введите число";
            //если < 100
        } else if (Double.parseDouble(jtxtMoney.getText()) < 100.0) {
            message = "Минимум для пополнения: 100";
            //если > 500
        } else if (Double.parseDouble(jtxtMoney.getText()) > 500.0) {
            message = "Максимум для пополнения: 500";
            // если все ок
        } else {
            return true;
        }
        //сообщение пользователю об ошибке
        JOptionPane.showMessageDialog(frame, message, "Ошибка", JOptionPane.WARNING_MESSAGE);
        jtxtMoney.requestFocus();
        jtxtMoney.selectAll();
        return false;
    }
    //проверку на сумму снятия
    private boolean isValidWithdrawal() {
        String message = "";
        //если не число
        if (!isInteger(jtxtMoney.getText())) {
            message = "Введите число";
            //если < 10
        } else if (Integer.parseInt(jtxtMoney.getText()) < 10) {
            message = "Минимум для снятия: 10";
            //если > 250
        } else if (Integer.parseInt(jtxtMoney.getText()) > 250) {
            message = "Максимум для снятия: 250";
            // если не кратно 10
        } else if (Integer.parseInt(jtxtMoney.getText()) % 10 != 0) {
            message = "Сумма должна быть кратной 10";
            // недостаточно средств
        } else if (account.getBalance() - Integer.parseInt(jtxtMoney.getText()) < 0) {
            message = "Недостаточно средств";
            //если все ок
        } else {
            return true;
        }
        //сообщение пользователю
        JOptionPane.showMessageDialog(frame, message, "Ошибка", JOptionPane.WARNING_MESSAGE);
        jtxtMoney.requestFocus();
        jtxtMoney.selectAll();
        return false;
    }
    //проверка строки на тип Double
    private boolean isDouble(String num) {
        try {
            Double.parseDouble(num);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
    //проверка строки на тип Integer
    private boolean isInteger(String num) {
        try {
            Integer.parseInt(num);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
}Account.java
package souces.javabegin.bankomat;
/*
 * класс "Счет" - хранит деньги
 */
public class Account {
    private double balance;
    //конструктор
    public Account(double bal) {
        balance = bal;
    }
    //получить баланс
    public double getBalance() {
        return balance;
    }
    //добавить деньги
    public void deposit(double money) {
        balance = balance + money;
    }
    // снять деньги
    public void withdraw(int money) {
        balance = balance - money;
    }
}Ось проект, його треба удосконалювати, чи навпаки треба зробити простіше???
треба робити вiдповiдно до завдання
як i будь який проект
Як би ж я знав як треба правильно писати програми, то не звертався б до форуму програмістів. А новачку можна й допомогти.
caballero написав:Ось проект, його треба удосконалювати, чи навпаки треба зробити простіше???
треба робити вiдповiдно до завдання
як i будь який проектЯк би ж я знав як треба правильно писати програми, то не звертався б до форуму програмістів. А новачку можна й допомогти.
Як програміст, який 2 роки працював з банкоматами, наведу кілька уточнень:
1. Не варто називати клас "Bankomat", щоб не смішити заочно колег з-за кордону. "ATM", будь ласка.
2. Ви не навели адекватного опису завдання. Якщо говорити узагальнено - банкомат складається з купи пристроїв (купюроприймач, диспенсер, сенсори, пін-клавіатура, принтер, тощо), тож у процесі роботи інтерфейс мусить рахуватися і з ними також. Якщо ж усе простіше - питань нема (як нема наразі і опису завдання, яке підтвердило б це).
3. У різних банків - різний функціонал на банкоматах. Варто якось окреслити межі (бо приватівський банкомат буде на порядок потужнішим, ніж мегабанківський, за функціоналом, наприклад).
Arni65 написав:caballero написав:треба робити вiдповiдно до завдання
як i будь який проектЯк би ж я знав як треба правильно писати програми, то не звертався б до форуму програмістів. А новачку можна й допомогти.
Як програміст, який 2 роки працював з банкоматами, наведу кілька уточнень:
1. Не варто називати клас "Bankomat", щоб не смішити заочно колег з-за кордону. "ATM", будь ласка.
2. Ви не навели адекватного опису завдання. Якщо говорити узагальнено - банкомат складається з купи пристроїв (купюроприймач, диспенсер, сенсори, пін-клавіатура, принтер, тощо), тож у процесі роботи інтерфейс мусить рахуватися і з ними також. Якщо ж усе простіше - питань нема (як нема наразі і опису завдання, яке підтвердило б це).
3. У різних банків - різний функціонал на банкоматах. Варто якось окреслити межі (бо приватівський банкомат буде на порядок потужнішим, ніж мегабанківський, за функціоналом, наприклад).
Потрібно не банкомат запрограмувати, а консольну програму яка імітує роботу банкомата (Зняття грошей, та поповнення рахунку ,використовуючи багатопоточність)
Потрібно не банкомат запрограмувати, а консольну програму яка імітує роботу банкомата (Зняття грошей, та поповнення рахунку ,використовуючи багатопоточність)
Так програма консольна чи ні? У Вас, в коді елементи SWINGа "проскакували". Якщо з SWINGом то використовуйте для багатопоточності SwingWorker і буде Вам щастя.
Та й взагалі, консольна програмка чи десктопна програмка, по вище наданому коду, я не бачу сенсу в багатопоточності. У Вас в коді не має "важких" чи "довгих" завдань, натиснувши на клавішу "добавити гроші" Ви не встигнити курсор переверсти на клавішу "зняти гроші", як до суми в 100.00 доплюсується 100.00. Якщо у Вас рахунків буде багато і вони будуть знаходитися в БД, тоді і багатопоточність застосовуйте.
Потрібно не банкомат запрограмувати, а консольну програму яка імітує роботу банкомата (Зняття грошей, та поповнення рахунку ,використовуючи багатопоточність)
Гаразд, приклад емпіричної моделі такого АТМ:
Головний потік: цикл виконання команд у меню для будь-яких команд (видача коштів, перевірка балансу, поповнення мобілки - залежно, що вимагається).
Побічний потік 1: слухання сервера банку на предмет адмінських команд (щоб зберегти їх результат і за першої нагоди виконати).
Побічний потік 2: моніторинг стану пристроїв банкомату (з виставлянням прапорців статусу. У разі помилки головний потік знатиме, що, наприклад, диспенсер - налистувач купюр - не може видати кошти, бо вони застрягли у тракті, і відіб'є транзакцію).
І більшої паралельності я не раджу робити: для таких пристроїв це, загалом, не прийнятно (надійність ставиться вище, ніж "круто-написаність" коду).
Якщо у Вас рахунків буде багато і вони будуть знаходитися в БД, тоді і багатопоточність застосовуйте.
Яких рахунків? Якщо ви про бухгалтерські - їх на АТМ зроду не було ніколи. Якщо про карткові - теж (вони хіба що на самій картці можуть міститися). Робота з рахунками - справа сервера процесингу, а не АТМ.
fed_lviv написав:Якщо у Вас рахунків буде багато і вони будуть знаходитися в БД, тоді і багатопоточність застосовуйте.
Яких рахунків? Якщо ви про бухгалтерські - їх на АТМ зроду не було ніколи. Якщо про карткові - теж (вони хіба що на самій картці можуть міститися). Робота з рахунками - справа сервера процесингу, а не АТМ.
Вам видніше, я не профі, але дивлячись на код я не бачу сенсу в багатопоточності:
Ось проект, його треба удосконалювати, чи навпаки треба зробити простіше???
...
Вам видніше, я не профі, але дивлячись на код я не бачу сенсу в багатопоточності:
Вам цілком добре видно: багатопоточність тут опціональна (і може бути замінена альтернативними методами у разі потреби). 
Інша справа, що тут же не банкомат-у-собі, а %курсач-лаба% детектед, а там важливий не сенс задачі, а методи, які нею мають закріпитися (багатопоточність та ж)...
Вам цілком добре видно: багатопоточність тут опціональна (і може бути замінена альтернативними методами у разі потреби).
Інша справа, що тут же не банкомат-у-собі, а %курсач-лаба% детектед, а там важливий не сенс задачі, а методи, які нею мають закріпитися (багатопоточність та ж)...
Не стверджую, але по коду і по повідомленнях, складається враження, що це не курсова чи лабораторна, а просто людина, починає вивчати джаву і вирішила написати просту програму. 
Як би ж я знав як треба правильно писати програми, то не звертався б до форуму програмістів. А новачку можна й допомогти.
Тому я думаю, що спочатку потрібно визначитись конкретно, що даний "банкомат буде робити", а що ні, а потім вже писати код. Оскільки Arni65, надав код та хоче застосовувати багатопоточність, то мені цікаво, його обгрунтування, навіщо в ДАНОМУ КОДІ, БАГАТОПОТОЧНІСТЬ?
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися