import sqlite3
class ExpenseTracker:
def _init_(self, db_name):
self.conn = sqlite3.connect(db_name)
self.cursor = self.conn.cursor()
self.create_table()
def create_table(self):
self.cursor.execute('''CREATE TABLE IF NOT EXISTS expenses
(id INTEGER PRIMARY KEY, category TEXT, amount REAL)''')
self.conn.commit()
def add_expense(self, category, amount):
self.cursor.execute("INSERT INTO expenses (category, amount) VALUES (?, ?)", (category, amount))
self.conn.commit()
def total_expenses(self):
self.cursor.execute("SELECT SUM(amount) FROM expenses")
total = self.cursor.fetchone()[0]
return total if total else 0
def expenses_by_category(self):
self.cursor.execute("SELECT category, SUM(amount) FROM expenses GROUP BY category")
expenses_by_category = self.cursor.fetchall()
return dict(expenses_by_category)
def print_expenses(self):
print("Expense Tracker")
print("--------------")
self.cursor.execute("SELECT category, amount FROM expenses")
for row in self.cursor.fetchall():
print(f"{row[0]}: ${row[1]}")
def close(self):
self.conn.close()
# Example usage:
tracker = ExpenseTracker("expense_tracker.db")
tracker.add_expense("Food", 50)
tracker.add_expense("Transportation", 30)
tracker.add_expense("Entertainment", 20)
tracker.add_expense("Food", 25)
tracker.print_expenses()
print("Total expenses:", tracker.total_expenses())
print("Expenses by category:", tracker.expenses_by_category())
tracker.close()-- your code goes here
aW1wb3J0IHNxbGl0ZTMKCmNsYXNzIEV4cGVuc2VUcmFja2VyOgogICAgZGVmIF9pbml0XyhzZWxmLCBkYl9uYW1lKToKICAgICAgICBzZWxmLmNvbm4gPSBzcWxpdGUzLmNvbm5lY3QoZGJfbmFtZSkKICAgICAgICBzZWxmLmN1cnNvciA9IHNlbGYuY29ubi5jdXJzb3IoKQogICAgICAgIHNlbGYuY3JlYXRlX3RhYmxlKCkKCiAgICBkZWYgY3JlYXRlX3RhYmxlKHNlbGYpOgogICAgICAgIHNlbGYuY3Vyc29yLmV4ZWN1dGUoJycnQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgZXhwZW5zZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgY2F0ZWdvcnkgVEVYVCwgYW1vdW50IFJFQUwpJycnKQogICAgICAgIHNlbGYuY29ubi5jb21taXQoKQoKICAgIGRlZiBhZGRfZXhwZW5zZShzZWxmLCBjYXRlZ29yeSwgYW1vdW50KToKICAgICAgICBzZWxmLmN1cnNvci5leGVjdXRlKCJJTlNFUlQgSU5UTyBleHBlbnNlcyAoY2F0ZWdvcnksIGFtb3VudCkgVkFMVUVTICg/LCA/KSIsIChjYXRlZ29yeSwgYW1vdW50KSkKICAgICAgICBzZWxmLmNvbm4uY29tbWl0KCkKCiAgICBkZWYgdG90YWxfZXhwZW5zZXMoc2VsZik6CiAgICAgICAgc2VsZi5jdXJzb3IuZXhlY3V0ZSgiU0VMRUNUIFNVTShhbW91bnQpIEZST00gZXhwZW5zZXMiKQogICAgICAgIHRvdGFsID0gc2VsZi5jdXJzb3IuZmV0Y2hvbmUoKVswXQogICAgICAgIHJldHVybiB0b3RhbCBpZiB0b3RhbCBlbHNlIDAKCiAgICBkZWYgZXhwZW5zZXNfYnlfY2F0ZWdvcnkoc2VsZik6CiAgICAgICAgc2VsZi5jdXJzb3IuZXhlY3V0ZSgiU0VMRUNUIGNhdGVnb3J5LCBTVU0oYW1vdW50KSBGUk9NIGV4cGVuc2VzIEdST1VQIEJZIGNhdGVnb3J5IikKICAgICAgICBleHBlbnNlc19ieV9jYXRlZ29yeSA9IHNlbGYuY3Vyc29yLmZldGNoYWxsKCkKICAgICAgICByZXR1cm4gZGljdChleHBlbnNlc19ieV9jYXRlZ29yeSkKCiAgICBkZWYgcHJpbnRfZXhwZW5zZXMoc2VsZik6CiAgICAgICAgcHJpbnQoIkV4cGVuc2UgVHJhY2tlciIpCiAgICAgICAgcHJpbnQoIi0tLS0tLS0tLS0tLS0tIikKICAgICAgICBzZWxmLmN1cnNvci5leGVjdXRlKCJTRUxFQ1QgY2F0ZWdvcnksIGFtb3VudCBGUk9NIGV4cGVuc2VzIikKICAgICAgICBmb3Igcm93IGluIHNlbGYuY3Vyc29yLmZldGNoYWxsKCk6CiAgICAgICAgICAgIHByaW50KGYie3Jvd1swXX06ICR7cm93WzFdfSIpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIHNlbGYuY29ubi5jbG9zZSgpCgojIEV4YW1wbGUgdXNhZ2U6CnRyYWNrZXIgPSBFeHBlbnNlVHJhY2tlcigiZXhwZW5zZV90cmFja2VyLmRiIikKdHJhY2tlci5hZGRfZXhwZW5zZSgiRm9vZCIsIDUwKQp0cmFja2VyLmFkZF9leHBlbnNlKCJUcmFuc3BvcnRhdGlvbiIsIDMwKQp0cmFja2VyLmFkZF9leHBlbnNlKCJFbnRlcnRhaW5tZW50IiwgMjApCnRyYWNrZXIuYWRkX2V4cGVuc2UoIkZvb2QiLCAyNSkKCnRyYWNrZXIucHJpbnRfZXhwZW5zZXMoKQoKcHJpbnQoIlRvdGFsIGV4cGVuc2VzOiIsIHRyYWNrZXIudG90YWxfZXhwZW5zZXMoKSkKcHJpbnQoIkV4cGVuc2VzIGJ5IGNhdGVnb3J5OiIsIHRyYWNrZXIuZXhwZW5zZXNfYnlfY2F0ZWdvcnkoKSkKCnRyYWNrZXIuY2xvc2UoKS0tIHlvdXIgY29kZSBnb2VzIGhlcmU=