Alegerea problemei
Un algoritm este o secventa finita de pasi clar definiti care rezolva o problema. Gandeste-te la un algoritm ca la o reteta de bucatarie: ai ingrediente (date de intrare), urmezi pasii (instructiuni) si obtii un rezultat (date de iesire). Diferenta este ca un algoritm trebuie sa fie suficient de precis incat un calculator (care nu gandeste ca un om) sa il poata executa.
Alege una din problemele de mai jos pentru proiectul tau. Fiecare problema necesita structuri de control diferite si are un nivel de dificultate variat:
- Calculator de medie: Citeste note de la utilizator si calculeaza media aritmetica. Afiseaza daca elevul a promovat sau nu. Necesita: bucla PENTRU, decizie DACA
- Verificator de an bisect: Determina daca un an introdus de utilizator este bisect sau nu. Necesita: decizii DACA imbricate (un an este bisect daca este divisibil cu 4, dar nu cu 100, exceptie daca este divisibil cu 400)
- Convertor de unitati: Converteste intre km/mile, grade Celsius/Fahrenheit, kg/lb. Necesita: decizii DACA pentru alegerea conversiei, formule matematice
- Joc "Ghiceste numarul": Calculatorul alege un numar secret, iar utilizatorul incearca sa il ghiceasca. Necesita: bucla CAT TIMP, decizii DACA pentru a da indicii ("mai mare", "mai mic")
- Calculator de varsta: Citeste data nasterii si calculeaza varsta in ani, luni si zile. Necesita: calcule cu date, decizii DACA
Alege o problema care te intereseaza, dar care iti si provoaca gandirea algoritmica. Daca te simti sigur pe structurile de control, alege o problema mai complexa (cum ar fi jocul "Ghiceste numarul" sau calculatorul de varsta). Daca vrei sa consolidezi bazele, alege calculatorul de medie sau convertorul de unitati.
Indiferent de problema aleasa, procesul de rezolvare este acelasi: mai intai intelegi ce trebuie facut, apoi planifici solutia, o scrii in pseudocod, o testezi cu exemple si o corectezi daca este nevoie. Acest proces se numeste ciclul de dezvoltare software si este folosit de toti programatorii din lume.
Analiza problemei: INPUT / OUTPUT / PRELUCRARE
Inainte de a scrie o singura linie de pseudocod, trebuie sa faci o analiza completa a problemei . Aceasta analiza raspunde la trei intrebari esentiale: Ce primeste algoritmul? Ce trebuie sa produca? Ce operatii face cu datele?
Cele trei componente ale analizei:
- Date de intrare (INPUT): Ce informatii primeste algoritmul de la utilizator? Acestea sunt datele pe care le introduce cineva de la tastatura. De exemplu: notele unui elev, un an calendaristic, o temperatura
- Date de iesire (OUTPUT): Ce rezultat trebuie sa afiseze algoritmul? Acesta este raspunsul la problema. De exemplu: media calculata, daca anul este bisect, temperatura convertita
- Prelucrari (PROCESSING): Ce operatii trebuie facute asupra datelor de intrare pentru a obtine datele de iesire? Acestea sunt calculele, comparatiile si deciziile din algoritm
Exemplu complet - Calculator de medie:
- INPUT: numarul de materii (n) si notele la fiecare materie (nota1, nota2, ..., notan)
- OUTPUT: media aritmetica si mesajul "Promovat" sau "Nepromovat"
- PRELUCRARE: suma = nota1 + nota2 + ... + notan; media = suma / n; daca media >= 5 atunci "Promovat", altfel "Nepromovat"
Exemplu complet - Verificator an bisect:
- INPUT: un an calendaristic (de exemplu: 2024)
- OUTPUT: mesajul "Anul X este bisect" sau "Anul X nu este bisect"
- PRELUCRARE: verificam daca anul este divisibil cu 4, dar nu cu 100, sau daca este divisibil cu 400
Aceasta analiza pare simpla, dar este pasul cel mai important. Daca nu stii exact ce primeste si ce produce algoritmul, nu il poti scrie corect. Multi programatori experimentati petrec mai mult timp pe analiza decat pe scrierea codului. Un plan bun duce la un algoritm bun, in timp ce un plan slab duce la un algoritm cu erori.
Sfat: scrie analiza pe o foaie de hartie sau intr-un document Word inainte de a incepe pseudocodul. Aceasta documentatie va fi parte din proiectul tau final.
Structura alternativa: DACA-ATUNCI-ALTFEL
Structura DACA-ATUNCI-ALTFEL (IF-THEN-ELSE) este fundamentala in programare. Ea permite algoritmului sa ia decizii - sa execute un set de instructiuni daca o conditie este adevarata si un alt set daca conditia este falsa. Fara decizii, un algoritm ar face mereu acelasi lucru, indiferent de datele primite.
Sintaxa in pseudocod:
Exemplu practic - verificarea notei:
Poti avea si decizii imbricate (una in interiorul alteia) pentru situatii mai complexe. De exemplu, daca nota este peste 9 afisezi "Excelent", intre 7 si 9 "Bine", intre 5 si 7 "Suficient" si sub 5 "Nepromovat":
Un aspect important: ordinea conditiilor conteaza. In exemplul de mai sus, verificam mai intai daca nota este >= 9, apoi >= 7, apoi >= 5. Daca am inversa ordinea si am verifica mai intai nota >= 5, un elev cu nota 10 ar primi mesajul "Suficient" (pentru ca 10 >= 5 este adevarat). Gandeste intotdeauna de la conditia cea mai restrictiva la cea mai permisiva.
Structura repetitiva: PENTRU si CAT TIMP
Structurile repetitive (buclele) permit algoritmului sa execute aceleasi instructiuni de mai multe ori. Fara bucle, daca ai vrea sa citesti 10 note, ar trebui sa scrii 10 instructiuni CITESTE separate. Cu o bucla, scrii instructiunea o singura data si specifici de cate ori sa se repete.
Bucla PENTRU se foloseste cand stii dinainte de cate ori trebuie sa se repete operatia:
Exemplu: Citirea a 5 note si calcularea sumei lor:
Bucla CAT TIMP se foloseste cand nu stii de cate ori trebuie sa se repete operatia, dar stii conditia de continuare:
Diferenta esentiala: PENTRU stie de la inceput cate repetitii face (de exemplu, "repeta de 10 ori"). CAT TIMP nu stie - se repeta pana cand o conditie devine falsa (de exemplu, "repeta pana cand utilizatorul introduce 0"). Alege PENTRU cand numarul de repetitii este cunoscut si CAT TIMP cand depinde de ce face utilizatorul.
O greseala frecventa cu CAT TIMP este bucla infinita - cand conditia nu devine niciodata falsa si bucla se repeta la infinit. Pentru a evita acest lucru, asigura-te ca in corpul buclei exista cel putin o instructiune care modifica variabila din conditie. De exemplu, daca conditia este "nota < 1 SAU nota > 10", in corpul buclei trebuie sa existe "CITESTE nota" care permite utilizatorului sa introduca o valoare valida.
Validarea datelor de intrare
Validarea datelor inseamna verificarea ca informatiile introduse de utilizator sunt corecte si in limitele acceptate. Un algoritm bun nu presupune ca utilizatorul va introduce intotdeauna date corecte - el verifica si cere reintroducerea daca datele sunt invalide. Aceasta practica se numeste programare defensiva .
De ce este importanta validarea? Gandeste-te: ce se intampla daca un utilizator introduce -5 ca nota? Sau litera "abc" in loc de un numar? Sau 0 cand algoritmul trebuie sa faca o impartire? Fara validare, algoritmul ar produce rezultate gresite sau ar crapa (s-ar opri cu eroare).
Pattern-ul clasic de validare foloseste o bucla CAT TIMP:
Aceasta bucla functioneaza astfel: dupa prima citire, verifica daca nota este in afara intervalului valid. Daca da, afiseaza un mesaj de eroare si cere reintroducerea. Procesul se repeta pana cand utilizatorul introduce o valoare corecta. Dupa bucla, poti fi sigur ca nota are o valoare valida.
Alte exemple de validare:
- Numar pozitiv: CAT TIMP numar <= 0 (rejecteaza numerele negative si zero)
- An calendaristic rezonabil: CAT TIMP an < 1 SAU an > 9999
- Optiune din meniu: CAT TIMP optiune < 1 SAU optiune > 3 (daca meniul are 3 optiuni)
- Evitarea impartirii la zero: CAT TIMP n = 0 (cererea unui numar nenul)
Regula de aur: orice data introdusa de utilizator trebuie validata . Nu presupune niciodata ca utilizatorul va introduce ce trebuie. Chiar si in cazul unor date aparent simple (ca un numar de materii), adauga o verificare. Aceasta mentalitate te va face un programator mult mai bun pe termen lung.
Variabile si atribuiri
O variabila este un spatiu de memorie care are un nume si stocheaza o valoare. Gandeste-te la ea ca la o cutie cu eticheta: eticheta este numele variabilei, iar continutul cutiei este valoarea. Poti pune o valoare in cutie (atribuire), poti citi ce este in cutie (utilizare) si poti schimba continutul (reatribuire).
Reguli pentru numele variabilelor:
- Alege nume descriptive : "suma", "nota", "media", "contor" - nu "x", "a", "b" (cu exceptia variabilelor de bucla ca "i")
- Nu folosi spatii sau caractere speciale in nume: "numar_materii" sau "numarMaterii" sunt corecte, "numar materii" nu
- Incepe cu o litera, nu cu o cifra: "nota1" este corect, "1nota" nu
Operatia de atribuire pune o valoare intr-o variabila. In pseudocod folosim sageata ←:
O linie importanta de inteles este
suma ← suma + nota
. Aceasta NU este o ecuatie matematica (unde suma = suma + nota ar fi imposibil). Este o
instructiune
care spune: "Ia valoarea actuala a sumei, adauga nota la ea, si pune rezultatul inapoi in suma". Este ca si cum ai scoate banii dintr-un portofel, ai adauga inca ceva si ai pune totul la loc.
Initializarea variabilelor:
Inainte de a folosi o variabila intr-un calcul, trebuie sa ii dai o valoare initiala. De exemplu, daca vrei sa calculezi o suma, incepi cu
suma ← 0
(suma goala). Daca vrei sa numeri ceva, incepi cu
contor ← 0
. Uitarea initializarii este una dintre cele mai frecvente greseli in programare.
In algoritmul tau, vei folosi mai multe variabile. Fa o lista cu toate variabilele necesare inainte de a incepe scrierea pseudocodului. Pentru fiecare variabila, noteaza: numele, ce stocheaza si valoarea initiala (daca este cazul). Aceasta lista te va ajuta sa iti organizezi gandurile si sa eviti erori.
Mesaje pentru utilizator (interfata)
Un algoritm bun nu doar calculeaza corect - el comunica clar cu utilizatorul. Imagineaza-ti ca rulezi un program si pe ecran apare doar un cursor care clipeste, fara nicio explicatie. Nu stii ce trebuie sa introduci, cate numere, in ce format. Un algoritm fara mesaje explicative este inutilizabil, chiar daca logica este perfecta.
Tipuri de mesaje necesare:
- Mesaje de instructiune: Spun utilizatorului ce trebuie sa faca. Exemplu: "Introdu numarul de materii (1-15):"
- Mesaje de eroare: Informeaza utilizatorul ca a introdus ceva gresit. Exemplu: "Nota invalida! Trebuie sa fie intre 1 si 10."
- Mesaje de rezultat: Afiseaza rezultatul calculului. Exemplu: "Media ta este: 8.75"
- Mesaje de context: Dau informatii suplimentare. Exemplu: "Nota 3 din 5:" (arata progresul)
- Mesaje de confirmare: Confirma ca o actiune s-a realizat. Exemplu: "Datele au fost procesate cu succes!"
Exemplu de algoritm cu mesaje bune vs. mesaje proaste:
Observi diferenta? Varianta cu mesaje este mult mai prietenoasa si mai usor de folosit. Utilizatorul stie exact ce se asteapta de la el la fiecare pas.
Un sfat suplimentar: adauga un titlu la inceputul algoritmului (de exemplu, "=== Calculator de Medie ===") si un mesaj final la sfarsit (de exemplu, "Multumim pentru utilizare!"). Aceste detalii mici fac algoritmul tau sa para mai profesional si mai complet. Gandeste-te la mesaje ca la ambalajul unui cadou - continutul conteaza cel mai mult, dar ambalajul frumos creeaza o experienta mai placuta.
Testarea algoritmului (Trace Table)
Testarea este procesul prin care verifici ca algoritmul tau produce rezultate corecte pentru diferite seturi de date de intrare. Un algoritm care functioneaza pentru un singur exemplu nu este neaparat corect - trebuie sa il testezi cu mai multe cazuri, inclusiv cazuri limita (edge cases).
Metoda Trace Table (Tabelul de urmarire) este cea mai eficienta metoda de testare a unui algoritm pe hartie. Creezi un tabel cu o coloana pentru fiecare variabila si o coloana pentru output. Apoi parcurgi algoritmul pas cu pas, notand valorile variabilelor dupa fiecare instructiune.
Exemplu de Trace Table pentru calculul mediei a 3 note (7, 9, 5):
Ce seturi de date sa folosesti pentru testare:
- Date normale: Valori obisnuite care ar fi introduse in mod normal (de exemplu: note 7, 8, 9)
- Date limita: Valori la granita intervalului valid (de exemplu: nota 1 si nota 10, sau exact nota 5 pentru promovare)
- Date invalide: Valori pe care algoritmul ar trebui sa le respinga (de exemplu: nota -3, nota 15, numar de materii 0)
- Cazuri speciale: Situatii neobisnuite (de exemplu: o singura nota, toate notele identice, impartire la zero)
Pentru proiectul tau, trebuie sa testezi algoritmul cu minim 3 seturi de date diferite si sa documentezi rezultatele. Aceasta documentatie demonstreaza ca algoritmul tau functioneaza corect si ca ai inteles procesul de testare.
Un sfat profesional: programatorii experimentati scriu testele inainte de a scrie algoritmul. Aceasta practica (numita "Test-Driven Development") te ajuta sa intelegi mai bine problema si sa te asiguri ca algoritmul tau acopera toate cazurile.
Documentarea algoritmului
Documentarea inseamna adaugarea de explicatii si comentarii care ajuta pe oricine sa inteleaga algoritmul tau. Un algoritm bine documentat poate fi inteles si de cineva care nu l-a scris. Comentariile sunt ignorate de calculator - ele exista exclusiv pentru oameni.
Cum se scriu comentariile in pseudocod:
Ce sa documentezi:
- Antetul algoritmului: La inceput, scrie numele algoritmului, ce face, cine l-a scris si data. Scrie si lista de variabile cu rolul fiecareia
- Sectiunile principale: Inainte de fiecare bloc logic (validare, calcul, afisare), pune un comentariu care explica ce face acel bloc
- Logica complexa: Daca ai o conditie complicata sau un calcul neevident, explica-l intr-un comentariu
- Cazuri speciale: Daca tratezi un caz special (de exemplu, impartire la zero), noteaza de ce
Exemplu de algoritm bine documentat:
Nu exagera cu comentariile - nu trebuie sa comentezi fiecare linie. Comentariile trebuie sa adauge informatii pe care codul nu le transmite singur. De exemplu, linia
suma ← 0
nu are nevoie de comentariul "suma devine 0" (este evident), dar poate beneficia de "Initializez suma pentru calculul mediei".
Documentatia completa a proiectului tau trebuie sa includa: analiza problemei (INPUT/OUTPUT/PRELUCRARE), lista de variabile, algoritmul in pseudocod cu comentarii si rezultatele testarii cu cele 3 seturi de date.
Cerinte proiect si criterii de evaluare
Ai invatat toate conceptele necesare pentru a crea un algoritm complet si bine documentat. Acum este timpul sa pui totul in practica. Citeste cu atentie cerintele si criteriile de evaluare.
📋 Cerinte obligatorii:
- Alege o problema din lista propusa (sau propune una proprie de complexitate similara)
- Scrie analiza problemei: INPUT (ce date primeste), OUTPUT (ce rezultat produce), PRELUCRARE (ce operatii face)
- Listeaza variabilele: Numele, rolul si valoarea initiala a fiecarei variabile
- Scrie algoritmul in pseudocod: Complet, cu INCEPUT/SFARSIT, instructiuni clare si indentare corecta
- Foloseste minim o structura DACA-ATUNCI-ALTFEL pentru a lua o decizie
- Foloseste minim o structura repetitiva (PENTRU sau CAT TIMP)
- Include validarea datelor de intrare cu mesaje de eroare clare
- Adauga mesaje explicative pentru utilizator (instructiuni, erori, rezultate)
- Adauga comentarii care explica sectiunile principale ale algoritmului
- Testeaza algoritmul cu minim 3 seturi de date diferite si documenteaza rezultatele
-
Implementeaza algoritmul intr-un mediu de programare
(Scratch sau Python) si demonstreaza ca programul ruleaza corect si produce rezultatele asteptate
(Competente obligatorii OMEN 3393/2017: VII-1.4 si VII-3.3)
⭐ Bonus pentru nota maxima:
- Deseneaza schema logica (flowchart) a algoritmului pe hartie sau in Word (Insert → Shapes)
- Trateaza cazuri speciale (de exemplu: impartire la 0, valori extreme, o singura nota)
- Adauga un meniu care permite utilizatorului sa aleaga intre mai multe optiuni
- Adauga o functie de repetare : dupa afisarea rezultatului, intreaba utilizatorul daca vrea sa ruleze din nou
Criteriile de evaluare sunt: (1) Corectitudinea algoritmului - produce rezultate corecte pentru toate seturile de test (30%); (2) Structurile de control - foloseste corect DACA si bucle (20%); (3) Validarea datelor - respinge date invalide cu mesaje clare (15%); (4) Implementarea in mediu de programare (Scratch sau Python) - programul ruleaza si produce rezultate corecte (20%); (5) Documentatia - analiza completa, comentarii, teste documentate (10%); (6) Mesaje pentru utilizator - interfata clara si prietenoasa (5%).
Proiectul se preda intr-un document Word care contine: pagina de titlu (nume, clasa, data, titlu proiect), analiza problemei, lista de variabile, algoritmul in pseudocod si tabelele de testare cu cele 3 seturi de date. Salveaza documentul ca: Algoritm_Problema_NumeleTau.docx. Atasaza si fisierul de implementare: Algoritm_Problema_NumeleTau.sb3 (Scratch) sau Algoritm_Problema_NumeleTau.py (Python).
Exercitii practice
Exercitiul 1 (Nivel minim) - Identifica partile unui algoritm simplu
Citeste algoritmul de mai jos — este un algoritm liniar simplu, fara bucle sau decizii imbricate. Raspunde la cele 3 intrebari de mai jos.
- Care este data de intrare (INPUT) a algoritmului? Dar data de iesire (OUTPUT)?
- Algoritmul de mai sus are o singura variabila de intrare si una de iesire. Scrie pe hartie numele ambelor variabile si rolul lor (ce reprezinta fiecare).
- Ce structura de control este folosita in acest algoritm: secventiala, alternativa sau repetitiva? Motiveaza raspunsul.
Raspunde numerotat: 1. ... 2. ... 3. ...
Sfat: INPUT = ce introduci de la tastatura; OUTPUT = ce afiseaza algoritmul pe ecran. Structura secventiala inseamna ca instructiunile se executa una dupa alta, fara ramificatii sau repetari.
Exercitiul 2 (Nivel standard) - Mini-proiect: Scrie algoritmul tau complet
Urmeaza acesti pasi pentru a crea proiectul tau de algoritm. Parcurge fiecare pas in ordine si bifeaza-l cand l-ai terminat.
Cerinte obligatorii:
⭐ Bonus (pentru nota maxima):
- Deseneaza schema logica (flowchart) in Word folosind Insert → Shapes (dreptunghiuri pentru instructiuni, romburi pentru decizii, sageti pentru fluxul de executie)
- Adauga un meniu care permite utilizatorului sa aleaga tipul de calcul (de exemplu: "1-Medie, 2-Suma, 3-Minim/Maxim")
- Trateaza cel putin un caz special (impartire la 0, valoare extrema, input gol)
Salveaza documentul complet si trimite-l profesorului. Documentul trebuie sa contina: pagina de titlu, analiza, lista variabile, pseudocod cu comentarii si tabelele de test.
Exercitiul 3 (Nivel performanta) - Compunere - Gandirea algoritmica
Cerinta: Scrie un text de 8-10 randuri in care explici ce inseamna gandirea algoritmica si de ce este importanta, chiar si pentru cineva care nu va deveni programator. Descrie cele trei structuri de control (secventiala, alternativa, repetitiva) si da un exemplu din viata reala pentru fiecare. Argumenteaza de ce validarea datelor si testarea sunt la fel de importante ca scrierea algoritmului.
Indicii pentru structurarea raspunsului:
- Incepe prin a defini ce este un algoritm si ce este gandirea algoritmica
- Explica cele 3 structuri de control cu exemple din viata de zi cu zi (nu din informatica)
- Mentioneaza de ce validarea datelor este importanta (ce se intampla fara ea?)
- Explica de ce testarea este necesara, chiar daca crezi ca algoritmul este corect
- Incheie cu un argument despre utilitatea gandirii algoritmice in alte domenii (medicina, afaceri, stiinta)
Cuvinte cheie de folosit: algoritm, pseudocod, structura de control, DACA-ATUNCI, PENTRU, CAT TIMP, validare, testare, variabila, gandire algoritmica
Format: Scrie raspunsul intr-un document Word, folosind paragrafe coerente (nu liste!). Salveaza documentul si trimite-l profesorului.