Invatare Atomica

Vreau sa gasesc cel mai mare si cel mai mic!

Progres lectie:
0%
🎯

Obiectivul lectiei

Ai un tablou cu 30 de note. Care e cea mai mare? Dar cea mai mica? Cum gasesti raspunsul fara sa te uiti la fiecare pe rand?

Dupa aceasta lectie vei putea:

  • Sa explici de ce conteaza sa gasim maximul si minimul
  • Sa implementezi algoritmul de cautare a maximului
  • Sa aplici maximul dintr-un tablou
  • Sa aplici minimul dintr-un tablou
  • Sa aplici nu doar valoarea, ci si unde se afla

Incearca singur!

🎯 INCEARCA

Testeaza inainte sa inveti!

Nu trebuie sa intelegi totul acum. Doar copiaza, ruleaza si observa ce se intampla.

Misiunea ta (7 minute):
1
Copiaza codul de mai jos si lipeste-l pe OneCompiler. Apasa Run. Observa ce nota maxima gaseste programul.
#include <iostream> using namespace std; int main() { int note[5] = {7, 9, 4, 10, 6}; int maxim = note[0]; // presupunem ca prima nota e cea mai mare for (int i = 1; i < 5; i++) { if (note[i] > maxim) { maxim = note[i]; cout << "Nou maxim gasit: " << maxim << " (la pozitia " << i << ")" << endl; } } cout << endl; cout << "Nota maxima este: " << maxim << endl; return 0; }
▶ Deschide OneCompiler
2
Schimba notele in {3, 1, 8, 2, 5} si ruleaza din nou. Cate mesaje "Nou maxim gasit" apar acum? De ce?
3
Incearca cu notele ordonate descrescator: {10, 9, 8, 7, 6}. Cate mesaje "Nou maxim gasit" apar? Gandeste-te de ce.
4
Schimba semnul > in < pe linia cu if. Ce gaseste acum programul in loc de maxim? Ruleaza si observa!
5
Incearca cu numere negative: {-3, -7, -1, -5, -2}. Functioneaza corect? Care e maximul?
🌟 BONUS: Modifica programul sa gaseasca si MINIMUL in acelasi timp. Vei avea nevoie de o a doua variabila minim si un al doilea if in interiorul buclei.
Blocat la pasul 2? Click aici pentru un indiciu

Cu notele {3, 1, 8, 2, 5}, maximul initial e note[0] = 3.

Apoi: 1 < 3 (nu schimbam), 8 > 3 (NOU MAXIM = 8), 2 < 8 (nu), 5 < 8 (nu).

Deci apare un singur mesaj "Nou maxim gasit" - doar cand gasim pe 8.

Blocat la pasul 3? Click aici

Cu {10, 9, 8, 7, 6}, maximul initial e note[0] = 10.

Nicio alta nota nu e mai mare decat 10, deci nu apare niciun mesaj!

Maximul a fost deja pe prima pozitie - cel mai bun caz posibil (0 comparatii cu succes).

Blocat la pasul 4? Click aici

Daca schimbi > in <, conditia devine: "daca elementul curent e MAI MIC decat campionul actual".

Deci algoritmul gaseste acum minimul in loc de maxim! Schimba si numele variabilei din maxim in minim ca sa fie clar.

Blocat la BONUS? Click aici

Adauga o variabila int minim = note[0]; langa variabila maxim.

In interiorul buclei for, adauga un al doilea if:

if (note[i] < minim) minim = note[i];

La final, afiseaza si minimul: cout << "Nota minima: " << minim;

1

De ce conteaza sa gasim maximul si minimul?

De ce conteaza sa gasim maximul si minimul?

In programare, gasirea celei mai mari sau celei mai mici valori dintr-o colectie de date este una dintre cele mai frecvente operatii. Apare peste tot:

Scoala: Care e cea mai mare nota din clasa? Dar cea mai mica?
Meteo: Care a fost ziua cea mai rece din saptamana? Cea mai calda?
Jocuri: Care jucator are cel mai mare scor? Cine e ultimul in clasament?
Sport: Care e cel mai bun timp la 100m? Cel mai slab?

🥇 Analogie: Campionul dintr-o linie de oameni

Imagineaza-ti ca esti la ora de sport si profesorul vrea sa afle cine e cel mai inalt din clasa. Cum face?

Ia primul elev si spune: "Tu esti cel mai inalt deocamdata." Apoi compara cu al doilea. Daca al doilea e mai inalt, el devine noul campion. Continua asa pana la ultimul elev. La final, campionul este cel mai inalt din clasa.

Exact asa functioneaza si algoritmul de maxim: presupunem un campion, apoi il comparam cu fiecare element pe rand.

2

Algoritmul de cautare a maximului

Algoritmul de cautare a maximului

Algoritmul are doar 3 pasi:

Pasul 1: Presupune ca primul element este maximul (campionul initial).
Pasul 2: Parcurge restul elementelor (de la al doilea pana la ultimul).
Pasul 3: La fiecare element, daca e mai mare decat campionul curent, el devine noul campion.

La final, campionul care a supravietuit tuturor comparatiilor este maximul real.

Algoritmul in pseudocod
// Algoritmul de MAXIM maxim ← x[0] // presupunem ca primul e campion pentru i de la 1 pana la n-1: daca x[i] > maxim: // daca gasim unul mai mare maxim ← x[i] // el devine noul campion
3

Maximul dintr-un tablou

Maximul dintr-un tablou

Sa vedem cum arata algoritmul in C++. Vom folosi tabloul note[5] = {7, 9, 4, 10, 6} ca exemplu.

Gasirea maximului
int note[5] = {7, 9, 4, 10, 6}; int maxim = note[0]; // maxim = 7 (primul element) for (int i = 1; i < 5; i++) { // parcurgem de la 1 la 4 if (note[i] > maxim) { // daca gasim ceva mai mare maxim = note[i]; // actualizam maximul } } cout << "Maximul este: " << maxim << endl; // Maximul este: 10
💡 De ce bucla incepe de la 1, nu de la 0?

Pentru ca maxim este deja initializat cu note[0]. Daca am incepe si bucla de la 0, am compara note[0] cu el insusi - o comparatie inutila. Nu e gresit, dar e o munca in plus fara rost.

4

Minimul dintr-un tablou

Minimul dintr-un tablou

Algoritmul de minim este identic cu cel de maxim, dar cu o singura schimbare: semnul de comparatie. In loc de > (mai mare), folosim < (mai mic).

Gasirea minimului
int note[5] = {7, 9, 4, 10, 6}; int minim = note[0]; // minim = 7 (primul element) for (int i = 1; i < 5; i++) { // parcurgem de la 1 la 4 if (note[i] < minim) { // daca gasim ceva MAI MIC minim = note[i]; // actualizam minimul } } cout << "Minimul este: " << minim << endl; // Minimul este: 4
5

Nu doar valoarea, ci si UNDE se afla

Nu doar valoarea, ci si UNDE se afla

Uneori nu e suficient sa stii ca nota maxima e 10. Vrei sa stii si al catelea elev a luat-o. Pentru asta, trebuie sa retinem si indexul (pozitia) la care se afla maximul.

Adaugam o variabila poz_max care pastreaza pozitia campionului curent. De fiecare data cand campionul se schimba, actualizam si pozitia.

Maxim cu pozitie
int note[5] = {7, 9, 4, 10, 6}; int maxim = note[0]; int poz_max = 0; // pozitia campionului initial for (int i = 1; i < 5; i++) { if (note[i] > maxim) { maxim = note[i]; // actualizam valoarea poz_max = i; // actualizam SI pozitia } } cout << "Nota maxima: " << maxim << endl; // 10 cout << "Se afla la pozitia: " << poz_max << endl; // 3 cout << "Elevul " << poz_max + 1 << endl; // Elevul 4
6

De ce sa parcurgem tabloul de doua ori?

De ce sa parcurgem tabloul de doua ori?

Daca vrem si maximul si minimul, am putea scrie doi for separati. Dar e ineficient - parcurgem tabloul de doua ori!

Mai bine punem ambele verificari in acelasi for. O singura trecere prin tablou, doua rezultate.

Max si Min simultan
int x[5] = {7, 9, 4, 10, 6}; int maxim = x[0], minim = x[0]; // ambele pornesc de la primul element for (int i = 1; i < 5; i++) { if (x[i] > maxim) maxim = x[i]; // verificam maximul if (x[i] < minim) minim = x[i]; // verificam minimul } cout << "Maxim: " << maxim << endl; // 10 cout << "Minim: " << minim << endl; // 4
7

Gaseste maxim, minim si pozitiile lor

Gaseste maxim, minim si pozitiile lor

Acum punem totul impreuna intr-un program complet care citeste note de la tastatura, gaseste maximul si minimul, si afiseaza pozitiile lor.

Program complet - ruleaza-l!
#include <iostream> using namespace std; int main() { int n; cout << "Cate note ai? "; cin >> n; int note[100]; // tablou suficient de mare // Citim notele de la tastatura for (int i = 0; i < n; i++) { cout << "Nota " << i + 1 << ": "; cin >> note[i]; } // Initializam maxim si minim cu primul element int maxim = note[0], poz_max = 0; int minim = note[0], poz_min = 0; // Parcurgem tabloul de la al doilea element for (int i = 1; i < n; i++) { if (note[i] > maxim) { maxim = note[i]; poz_max = i; } if (note[i] < minim) { minim = note[i]; poz_min = i; } } // Afisam rezultatele cout << endl; cout << "=== REZULTATE ===" << endl; cout << "Nota maxima: " << maxim << " (elevul " << poz_max + 1 << ")" << endl; cout << "Nota minima: " << minim << " (elevul " << poz_min + 1 << ")" << endl; cout << "Diferenta: " << maxim - minim << endl; return 0; }
▶ Ruleaza pe OneCompiler
8

Retinem doar pozitia, nu si valoarea

Retinem doar pozitia, nu si valoarea

Exista o varianta mai eleganta: retinem doar pozitia maximului, nu si valoarea. De ce? Pentru ca daca stim pozitia, putem oricand afla valoarea cu x[poz_max].

Doar cu pozitia
int x[5] = {7, 9, 4, 10, 6}; int poz_max = 0; // retinem DOAR pozitia for (int i = 1; i < 5; i++) { if (x[i] > x[poz_max]) // comparam cu elementul de la pozitia campionului poz_max = i; } cout << "Maximul este " << x[poz_max] // valoarea: 10 << " la pozitia " << poz_max << endl; // pozitia: 3
💡 Cand sa folosesti care varianta?

Cu valoare + pozitie (maxim si poz_max): Mai clara, mai usor de inteles. Recomandata pentru incepatori.
Doar cu pozitie (doar poz_max): Mai eleganta, mai putine variabile. Folosita de programatorii experimentati.

Ambele variante sunt corecte si dau acelasi rezultat. Alege-o pe cea care ti se pare mai clara!

Exercitii practice

Exercitiul 1 (Nivel minim) - Analiza algoritmului

Raspunde la urmatoarele intrebari despre algoritmul de maxim si minim:

  1. Avem tabloul int x[6] = {12, 3, 7, 15, 9, 1};. Completeaza un tabel de urmarire (trace table) cu coloanele: iteratia, i, x[i], maxim, minim. Urmareste pas cu pas cum se schimba valorile.
  2. De ce initializarea int maxim = 0; este gresita? Da un exemplu concret de tablou pentru care algoritmul da un rezultat incorect. Apoi arata ce rezultat gresit obtii si care este rezultatul corect.
  3. Care este numarul maxim de schimbari ale campionului (maximului) daca tabloul are n elemente? In ce situatie se atinge acest maxim? Dar numarul minim de schimbari?

Raspunde numerotat: 1. ... 2. ... 3. ...

Exercitiul 2 (Nivel standard) - Temperaturi extreme

Cerinta: Scrie un program C++ care citeste temperaturile din fiecare zi a unei saptamani (7 valori, pot fi si negative), apoi afiseaza:

  1. Temperatura cea mai ridicata si in ce zi a fost (Luni=1, Marti=2, ..., Duminica=7)
  2. Temperatura cea mai scazuta si in ce zi a fost
  3. Amplitudinea termica (diferenta intre maxim si minim)

Exemplu input/output:

Temperaturi: -2 3 5 1 -1 4 2

Cea mai calda zi: ziua 3 cu 5 grade
Cea mai rece zi: ziua 1 cu -2 grade
Amplitudine termica: 7 grade

Indicii:

  • Foloseste int temp[7]; pentru temperaturi
  • Retine atat valorile maxim/minim, cat si pozitiile lor (poz_max si poz_min)
  • Amplitudinea = maxim - minim
  • Numele zilei: poti folosi un tablou de string-uri sau pur si simplu poz_max + 1

Exercitiul 3 (Nivel performanta) - Explicatie scrisa

Cerinta: Explica algoritmul de gasire a maximului folosind una dintre urmatoarele analogii din viata reala:

  1. Optiunea A: Campionatul de arm wrestling (brat de fier). Cum se decide cine e cel mai puternic?
  2. Optiunea B: Un profesor care cauta cea mai buna lucrare dintr-un teanc de 30 de lucrari.

In explicatia ta, acopera:

  1. Ce corespunde "campionului initial" (initializarea cu x[0])?
  2. Ce corespunde "comparatiei" (if-ul din bucla)?
  3. Ce corespunde "schimbarii campionului" (maxim = x[i])?
  4. De ce e important ca fiecare participant sa fie comparat cu campionul curent, nu cu cel anterior?

Cuvinte cheie de folosit: maxim, minim, initializare, comparatie, parcurgere, pozitie, campion, tablou

Ce ai invatat astazi

  • Ai invatat de ce conteaza sa gasim maximul si minimul
  • Acum stii algoritmul de cautare a maximului
  • Ai descoperit maximul dintr-un tablou
  • Ai explorat minimul dintr-un tablou
  • Ai inteles nu doar valoarea, ci si unde se afla
  • Ai invatat de ce sa parcurgem tabloul de doua ori
  • Acum stii gaseste maxim, minim si pozitiile lor
  • Ai descoperit retinem doar pozitia, nu si valoarea

Urmatoarea lectie

Continua cu lectia urmatoare pentru a aprofunda cunostintele.

Continua →