Înapoi la blog
#python#proiect#productivitate#studiu

Aplicație pentru organizarea timpului de studiu

Construiește în Python un planificator de studiu care îți împarte materiile pe zile și îți calculează timpul total. Proiect util cu cod complet și explicat.

„Mâine mă apuc serios de învățat" — apoi vine mâine și nu știi de unde să începi. O aplicație simplă te poate ajuta: îi spui ce materii ai și cât timp ai, iar ea îți face un plan. Hai să o construim în Python. Vei exersa liste, dicționare și un pic de logică.

Ce face aplicația

  • ții o listă de sarcini de studiu, fiecare cu o durată;
  • le distribui pe zilele săptămânii;
  • calculezi timpul total și cât rămâne de făcut.

Pasul 1: o sarcină de studiu

Reprezentăm fiecare sarcină ca un dicționar cu nume, durată (în minute) și starea ei.

sarcina = {
    "materie": "Matematică",
    "minute": 60,
    "gata": False,
}
print(sarcina["materie"], sarcina["minute"], "min")

Un dicționar e potrivit pentru că grupează informații legate între ele sub un singur nume.

Pasul 2: o listă de sarcini

Punem mai multe sarcini într-o listă.

plan = [
    {"materie": "Matematică", "minute": 60, "gata": False},
    {"materie": "Română", "minute": 45, "gata": False},
    {"materie": "Informatică", "minute": 90, "gata": True},
    {"materie": "Engleză", "minute": 30, "gata": False},
]

Pasul 3: cât timp îmi ia totul?

Calculăm timpul total și timpul rămas (sarcinile încă nefăcute).

def total_minute(plan):
    return sum(s["minute"] for s in plan)

def minute_ramase(plan):
    return sum(s["minute"] for s in plan if not s["gata"])

print("Total:", total_minute(plan), "min")
print("Rămas:", minute_ramase(plan), "min")

sum(s["minute"] for s in plan) parcurge fiecare sarcină și adună durata. În a doua funcție adăugăm if not s["gata"] ca să numărăm doar ce mai e de făcut.

Pasul 4: împărțim pe zile

Vrem să distribuim sarcinile pe zile, fără să depășim un buget zilnic de minute.

def imparte_pe_zile(plan, minute_pe_zi):
    zile = []
    zi_curenta = []
    timp_zi = 0
    for s in plan:
        if s["gata"]:
            continue
        if timp_zi + s["minute"] > minute_pe_zi:
            zile.append(zi_curenta)
            zi_curenta = []
            timp_zi = 0
        zi_curenta.append(s["materie"])
        timp_zi += s["minute"]
    if zi_curenta:
        zile.append(zi_curenta)
    return zile

program = imparte_pe_zile(plan, 90)
for i, zi in enumerate(program, start=1):
    print(f"Ziua {i}: {', '.join(zi)}")

Logica e simplă: adăugăm sarcini în ziua curentă până când următoarea ar depăși bugetul; atunci începem o zi nouă. enumerate(..., start=1) ne dă și numărul zilei, iar ', '.join(zi) lipește materiile într-un text frumos.

Pasul 5: marcăm o sarcină ca terminată

def marcheaza_gata(plan, materie):
    for s in plan:
        if s["materie"] == materie:
            s["gata"] = True
            print(f"{materie} - terminat!")
            return
    print("Materia nu există în plan.")

marcheaza_gata(plan, "Română")
print("Rămas:", minute_ramase(plan), "min")

Sfat de productivitate: studiile arată că pauzele scurte ajută memoria. Poți adăuga automat o pauză de 10 minute după fiecare sarcină — încearcă tu ca exercițiu!

Pasul 6: ordonăm după prioritate

Nu toate materiile sunt la fel de urgente. Hai să adăugăm o prioritate fiecărei sarcini și să le ordonăm, ca să studiezi întâi ce contează cel mai mult.

plan = [
    {"materie": "Matematică", "minute": 60, "prioritate": 3, "gata": False},
    {"materie": "Engleză", "minute": 30, "prioritate": 1, "gata": False},
    {"materie": "Informatică", "minute": 90, "prioritate": 2, "gata": False},
]

plan_ordonat = sorted(plan, key=lambda s: s["prioritate"], reverse=True)

for s in plan_ordonat:
    print(f"{s['prioritate']} - {s['materie']}")

Funcția sorted întoarce o listă nouă, ordonată. key=lambda s: s["prioritate"] îi spune după ce să sorteze (după prioritate), iar reverse=True pune cea mai mare prioritate prima. lambda e doar o funcție foarte scurtă, scrisă pe o singură linie.

Pasul 7: un mic raport de progres

Util să vezi cât din plan ai bifat, în procente.

def progres(plan):
    total = len(plan)
    facute = sum(1 for s in plan if s["gata"])
    if total == 0:
        return 0
    return round(facute / total * 100)

print(f"Progres: {progres(plan)}%")

sum(1 for s in plan if s["gata"]) numără câte sarcini sunt gata: adună câte un 1 pentru fiecare sarcină bifată. Înmulțit cu 100 și împărțit la total, obții procentul.

Recapitulare

FuncțieCe face
total_minutetimpul total de studiu
minute_ramasecât mai ai de făcut
imparte_pe_ziledistribuie pe zile
marcheaza_gatabifează o sarcină

Concluzie

Ai un planificator real care te poate ajuta înainte de teze sau bac. Îl poți extinde cu priorități, termene-limită sau salvare în fișier ca să nu pierzi planul când închizi programul.

La ByteSchool construim împreună astfel de unelte utile, pas cu pas, alături de mentori din Big Tech care îți arată cum se gândește un produs, nu doar o bucată de cod.