1

Тема: Реалізувати роботу банкомату

Реалізувати роботу банкомату. Обов’язковим є реалізація синхронізації та використання багатопотоковості.

2

Re: Реалізувати роботу банкомату

Забули дописати "негайно, раби". Так природніше виглядає.

Подякували: Master_Sergius, yarko, Djalin, raxp4

3

Re: Реалізувати роботу банкомату

Ось проект, його треба удосконалювати, чи навпаки треба зробити простіше???

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;
    }
}

4

Re: Реалізувати роботу банкомату

Ось проект, його треба удосконалювати, чи навпаки треба зробити простіше???

треба  робити  вiдповiдно  до  завдання
як  i  будь який проект

Подякували: koala, raxp2

5 Востаннє редагувалося Arni65 (16.05.2015 14:52:21)

Re: Реалізувати роботу банкомату

caballero написав:

Ось проект, його треба удосконалювати, чи навпаки треба зробити простіше???

треба  робити  вiдповiдно  до  завдання
як  i  будь який проект

Як би ж я знав як треба правильно писати програми, то не звертався б до форуму програмістів. А новачку можна й допомогти.

6

Re: Реалізувати роботу банкомату

Arni65 написав:
caballero написав:

Ось проект, його треба удосконалювати, чи навпаки треба зробити простіше???

треба  робити  вiдповiдно  до  завдання
як  i  будь який проект

Як би ж я знав як треба правильно писати програми, то не звертався б до форуму програмістів. А новачку можна й допомогти.

Як програміст, який 2 роки працював з банкоматами, наведу кілька уточнень:

1. Не варто називати клас "Bankomat", щоб не смішити заочно колег з-за кордону. "ATM", будь ласка.
2. Ви не навели адекватного опису завдання. Якщо говорити узагальнено - банкомат складається з купи пристроїв (купюроприймач, диспенсер, сенсори, пін-клавіатура, принтер, тощо), тож у процесі роботи інтерфейс мусить рахуватися і з ними також. Якщо ж усе простіше - питань нема (як нема наразі і опису завдання, яке підтвердило б це).
3. У різних банків - різний функціонал на банкоматах. Варто якось окреслити межі (бо приватівський банкомат буде на порядок потужнішим, ніж мегабанківський, за функціоналом, наприклад).

7

Re: Реалізувати роботу банкомату

Bartash написав:
Arni65 написав:
caballero написав:

треба  робити  вiдповiдно  до  завдання
як  i  будь який проект

Як би ж я знав як треба правильно писати програми, то не звертався б до форуму програмістів. А новачку можна й допомогти.

Як програміст, який 2 роки працював з банкоматами, наведу кілька уточнень:

1. Не варто називати клас "Bankomat", щоб не смішити заочно колег з-за кордону. "ATM", будь ласка.
2. Ви не навели адекватного опису завдання. Якщо говорити узагальнено - банкомат складається з купи пристроїв (купюроприймач, диспенсер, сенсори, пін-клавіатура, принтер, тощо), тож у процесі роботи інтерфейс мусить рахуватися і з ними також. Якщо ж усе простіше - питань нема (як нема наразі і опису завдання, яке підтвердило б це).
3. У різних банків - різний функціонал на банкоматах. Варто якось окреслити межі (бо приватівський банкомат буде на порядок потужнішим, ніж мегабанківський, за функціоналом, наприклад).

Потрібно не банкомат запрограмувати, а консольну програму яка імітує роботу банкомата (Зняття грошей, та поповнення рахунку ,використовуючи багатопоточність)

8

Re: Реалізувати роботу банкомату

Arni65 написав:

Потрібно не банкомат запрограмувати, а консольну програму яка імітує роботу банкомата (Зняття грошей, та поповнення рахунку ,використовуючи багатопоточність)

Так програма консольна чи ні? У Вас, в коді елементи SWINGа "проскакували". Якщо  з SWINGом то використовуйте для багатопоточності SwingWorker і буде Вам щастя.

9

Re: Реалізувати роботу банкомату

так, консольну программу

10

Re: Реалізувати роботу банкомату

*WALL* Тоді навіщо, Вам клас Bankomat?!

11

Re: Реалізувати роботу банкомату

Та й взагалі, консольна програмка чи десктопна програмка, по вище наданому коду, я не бачу сенсу в багатопоточності. У Вас в коді не має "важких" чи "довгих" завдань, натиснувши на клавішу "добавити гроші" Ви не встигнити курсор переверсти на клавішу "зняти гроші", як до суми в 100.00 доплюсується 100.00. Якщо у Вас рахунків буде багато і вони будуть знаходитися в БД, тоді і багатопоточність застосовуйте.

12

Re: Реалізувати роботу банкомату

Arni65 написав:

Потрібно не банкомат запрограмувати, а консольну програму яка імітує роботу банкомата (Зняття грошей, та поповнення рахунку ,використовуючи багатопоточність)

Гаразд, приклад емпіричної моделі такого АТМ:

Головний потік: цикл виконання команд у меню для будь-яких команд (видача коштів, перевірка балансу, поповнення мобілки - залежно, що вимагається).
Побічний потік 1: слухання сервера банку на предмет адмінських команд (щоб зберегти їх результат і за першої нагоди виконати).
Побічний потік 2: моніторинг стану пристроїв банкомату (з виставлянням прапорців статусу. У разі помилки головний потік знатиме, що, наприклад, диспенсер - налистувач купюр - не може видати кошти, бо вони застрягли у тракті, і відіб'є транзакцію).

І більшої паралельності я не раджу робити: для таких пристроїв це, загалом, не прийнятно (надійність ставиться вище, ніж "круто-написаність" коду).

13

Re: Реалізувати роботу банкомату

fed_lviv написав:

Якщо у Вас рахунків буде багато і вони будуть знаходитися в БД, тоді і багатопоточність застосовуйте.

Яких рахунків? Якщо ви про бухгалтерські - їх на АТМ зроду не було ніколи. Якщо про карткові - теж (вони хіба що на самій картці можуть міститися). Робота з рахунками - справа сервера процесингу, а не АТМ.

14

Re: Реалізувати роботу банкомату

Bartash написав:
fed_lviv написав:

Якщо у Вас рахунків буде багато і вони будуть знаходитися в БД, тоді і багатопоточність застосовуйте.

Яких рахунків? Якщо ви про бухгалтерські - їх на АТМ зроду не було ніколи. Якщо про карткові - теж (вони хіба що на самій картці можуть міститися). Робота з рахунками - справа сервера процесингу, а не АТМ.

Вам видніше, я не профі, але дивлячись на код я не бачу сенсу в багатопоточності:

Arni65 написав:

Ось проект, його треба удосконалювати, чи навпаки треба зробити простіше???
...

15

Re: Реалізувати роботу банкомату

fed_lviv написав:

Вам видніше, я не профі, але дивлячись на код я не бачу сенсу в багатопоточності:

Вам цілком добре видно: багатопоточність тут опціональна (і може бути замінена альтернативними методами у разі потреби). :)
Інша справа, що тут же не банкомат-у-собі, а %курсач-лаба% детектед, а там важливий не сенс задачі, а методи, які нею мають закріпитися (багатопоточність та ж)...

16

Re: Реалізувати роботу банкомату

Bartash написав:

Вам цілком добре видно: багатопоточність тут опціональна (і може бути замінена альтернативними методами у разі потреби). :)
Інша справа, що тут же не банкомат-у-собі, а %курсач-лаба% детектед, а там важливий не сенс задачі, а методи, які нею мають закріпитися (багатопоточність та ж)...

Не стверджую, але по коду і по повідомленнях, складається враження, що це не курсова чи лабораторна, а просто людина, починає вивчати джаву і вирішила написати просту програму.

Arni65 написав:

Як би ж я знав як треба правильно писати програми, то не звертався б до форуму програмістів. А новачку можна й допомогти.

Тому я думаю, що спочатку потрібно визначитись конкретно, що даний "банкомат буде робити", а що ні, а потім вже писати код. Оскільки Arni65, надав код та хоче застосовувати багатопоточність, то мені цікаво, його обгрунтування, навіщо в ДАНОМУ КОДІ, БАГАТОПОТОЧНІСТЬ?