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?
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.
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.
Maximul dintr-un tablou
Sa vedem cum arata algoritmul in C++. Vom folosi tabloul note[5] = {7, 9, 4, 10, 6} ca exemplu.
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.
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).
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.
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.
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.
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].
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!