Тема: Реалізувати роботу банкомату
Реалізувати роботу банкомату. Обов’язковим є реалізація синхронізації та використання багатопотоковості.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, 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
Для відправлення відповіді ви повинні увійти або зареєструватися