/
verse_coder
/
java-finance-tracker
Обзор
Документация
Войти
/
verse_coder
/
java-finance-tracker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
FinanceTracker.java
351 строка
15 KB
ololrik
Добавил ИИ-советника в меню программы
07 июн 2026, 12:22
07 июн 2026, 12:22
9a3f432
Код
Авторство
О чём код?
import java.time.LocalDate; import java.time.YearMonth; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * Главный класс финансового трекера "3 кошелька" * Простая консольная программа для учета финансов */ public class FinanceTracker { // Список для хранения истории всех операций private static List<Transaction> transactionHistory = new ArrayList<>(); // Кошельки: "Обязательно", "Жизнь", "Хотелки" private static Wallet mandatoryWallet = new Wallet("Обязательно"); private static Wallet lifeWallet = new Wallet("Жизнь"); private static Wallet wantsWallet = new Wallet("Хотелки"); // Список всех кошельков для удобного доступа по индексу private static Wallet[] wallets = { mandatoryWallet, lifeWallet, wantsWallet }; // Создаем сканер для ввода данных из консоли private static Scanner scanner = new Scanner(System.in); /** * Класс Transaction (Операция) * Представляет одну финансовую операцию */ static class Transaction { private double amount; // Сумма операции private String walletType; // Тип кошелька (откуда/куда) private LocalDate date; // Дата операции /** * Конструктор для создания операции * @param amount сумма операции * @param walletType тип кошелька * @param date дата операции */ public Transaction(double amount, String walletType, LocalDate date) { this.amount = amount; this.walletType = walletType; this.date = date; } // Геттеры для доступа к полям public double getAmount() { return amount; } public String getWalletType() { return walletType; } public LocalDate getDate() { return date; } // Метод для красивого отображения операции @Override public String toString() { return String.format("Дата: %s | Сумма: %.2f | Кошелек: %s", date, amount, walletType); } } /** * Класс Wallet (Кошелек) * Представляет отдельный кошелек с балансом */ static class Wallet { private String name; // Название кошелька private double balance; // Текущий баланс /** * Конструктор для создания кошелька * @param name название кошелька */ public Wallet(String name) { this.name = name; this.balance = 0.0; } // Геттер для названия public String getName() { return name; } // Геттер для баланса public double getBalance() { return balance; } /** * Метод для пополнения кошелька * @param sum сумма пополнения */ public void refill(double sum) { balance += sum; } /** * Метод для списания денег с кошелька * @param sum сумма списания * @return true если списание успешно, false если недостаточно средств */ public boolean spend(double sum) { if (balance >= sum) { balance -= sum; return true; } else { return false; } } } /** * Метод для отображения главного меню */ private static void showMenu() { System.out.println("\n=== Финансовый трекер '3 кошелька' ==="); System.out.println("1. Пополнить кошелек"); System.out.println("2. Добавить расход"); System.out.println("3. Показать баланс и дневной лимит"); System.out.println("4. Показать историю операций"); System.out.println("5. AI-совет финансового трекера"); System.out.println("6. Выход"); System.out.print("Выберите действие (1-6): "); } /** * Метод для выбора кошелька пользователем * @return индекс выбранного кошелька (0, 1 или 2) */ private static int selectWallet() { System.out.println("\nВыберите кошелек:"); System.out.println("1. " + mandatoryWallet.getName()); System.out.println("2. " + lifeWallet.getName()); System.out.println("3. " + wantsWallet.getName()); System.out.print("Введите номер кошелька (1-3): "); String input = scanner.nextLine().trim(); try { int choice = Integer.parseInt(input); if (choice < 1 || choice > 3) { System.out.println("Ошибка: введите число от 1 до 3"); return -1; } return choice - 1; // Преобразуем в индекс массива (0, 1, 2) } catch (NumberFormatException e) { System.out.println("Ошибка: введите корректное число"); return -1; } } /** * Метод для ввода положительной суммы от пользователя * @return введенная сумма (положительное число) */ private static double inputPositiveAmount() { System.out.print("Введите сумму: "); String input = scanner.nextLine().trim(); try { double amount = Double.parseDouble(input); if (amount <= 0) { System.out.println("Ошибка: сумма должна быть положительной"); return -1; } return amount; } catch (NumberFormatException e) { System.out.println("Ошибка: введите корректное число"); return -1; } } /** * Метод для пополнения кошелька */ private static void refillWallet() { int walletIndex = selectWallet(); if (walletIndex == -1) return; double amount = inputPositiveAmount(); if (amount <= 0) return; wallets[walletIndex].refill(amount); System.out.println("Кошелек '" + wallets[walletIndex].getName() + "' успешно пополнен на " + amount + " руб."); } /** * Метод для добавления расхода */ private static void addExpense() { int walletIndex = selectWallet(); if (walletIndex == -1) return; double amount = inputPositiveAmount(); if (amount <= 0) return; Wallet wallet = wallets[walletIndex]; if (wallet.spend(amount)) { // Создаем объект операции и добавляем в историю Transaction transaction = new Transaction( amount, wallet.getName() + " (расход)", LocalDate.now() ); transactionHistory.add(transaction); System.out.println("Расход добавлен: " + amount + " руб. с кошелька '" + wallet.getName() + "'"); } else { System.out.println("Ошибка: недостаточно средств на кошельке '" + wallet.getName() + "'"); } } /** * Метод для расчета дней до конца месяца * @return количество дней до конца текущего месяца */ private static int getDaysUntilMonthEnd() { LocalDate today = LocalDate.now(); YearMonth currentMonth = YearMonth.from(today); int daysInMonth = currentMonth.lengthOfMonth(); return daysInMonth - today.getDayOfMonth(); } /** * Метод для показа баланса всех кошельков и дневного лимита */ private static void showBalances() { System.out.println("\n=== Баланс всех кошельков ==="); System.out.println(mandatoryWallet.getName() + ": " + String.format("%.2f", mandatoryWallet.getBalance()) + " руб."); System.out.println(lifeWallet.getName() + ": " + String.format("%.2f", lifeWallet.getBalance()) + " руб."); System.out.println(wantsWallet.getName() + ": " + String.format("%.2f", wantsWallet.getBalance()) + " руб."); // Расчет дневного лимита для кошелька "Жизнь" int daysLeft = getDaysUntilMonthEnd(); if (daysLeft > 0) { double dailyLimit = lifeWallet.getBalance() / daysLeft; System.out.println("\nДни до конца месяца: " + daysLeft); System.out.println("Дневной лимит (кошелек 'Жизнь'): " + String.format("%.2f", dailyLimit) + " руб."); } else { System.out.println("\nТекущий месяц закончился, дневной лимит не рассчитан"); } } /** * Метод для показа истории операций */ private static void showHistory() { System.out.println("\n=== История операций ==="); if (transactionHistory.isEmpty()) { System.out.println("История операций пуста"); } else { // Выводим операции в обратном порядке (сначала новые) for (int i = transactionHistory.size() - 1; i >= 0; i--) { System.out.println(transactionHistory.get(i)); } } System.out.println("Всего операций: " + transactionHistory.size()); } /** * Метод для показа AI-совета на основе баланса кошельков */ private static void showAiAdvice() { System.out.println("\n=== AI-совет финансового трекера ==="); double lifeBalance = lifeWallet.getBalance(); double wantsBalance = wantsWallet.getBalance(); // Проверяем ситуации и выводим соответствующий совет if (wantsBalance > lifeBalance) { // Если в "Хотелках" денег больше, чем в "Жизни" System.out.println("Ого, кажется, развлечения вышли из-под контроля! Пора прижать хвост и вспомнить про покупку гречки."); } else if (lifeBalance > 0 && wantsBalance == 0) { // Если в "Жизни" есть деньги, а в "Хотелках" ноль System.out.println("Ты отлично держишь бюджет! Но не забывай радовать себя — выдели немного на кошелек 'Хотелки'."); } else if (lifeBalance > 0 && wantsBalance > 0 && mandatoryWallet.getBalance() > 0) { // Если во всех кошельках есть деньги System.out.println("Баланс идеален. Финансовый дзен достигнут!"); } else if (lifeBalance < 100 && wantsBalance < 100 && mandatoryWallet.getBalance() < 100) { // Если везде почти ноль (менее 100 рублей в каждом кошельке) System.out.println("Время затянуть пояса. Переходим на режим экономии энергии и финансов."); } else { // Для остальных случаев System.out.println("Ваш финансовый статус требует внимания. Проверьте распределение средств между кошельками."); } } /** * Главный метод программы */ public static void main(String[] args) { System.out.println("Добро пожаловать в финансовый трекер '3 кошелька'!"); System.out.println("Ваша программа для управления финансами!"); // Бесконечный цикл для работы с меню while (true) { showMenu(); try { String input = scanner.nextLine().trim(); int choice = Integer.parseInt(input); switch (choice) { case 1: refillWallet(); break; case 2: addExpense(); break; case 3: showBalances(); break; case 4: showHistory(); break; case 5: showAiAdvice(); break; case 6: System.out.println("До свидания! Берегите свои деньги!"); scanner.close(); return; // Выход из программы default: System.out.println("Ошибка: выберите действие от 1 до 6"); } } catch (NumberFormatException e) { System.out.println("Ошибка: введите корректное число от 1 до 6"); } catch (Exception e) { System.out.println("Ошибка: " + e.getMessage()); } } } }