C# pentru începători

Tablouri în C#: indici, Length și parcurgere

Lucrează cu tablouri C# folosind indici de la zero și Length. Găsește primul maxim, verifică limitele și înțelege lungimea fixă a tabloului.

Un tablou păstrează mai multe valori de același tip sub un singur nume. Fiecare element are o poziție numită indice. În C#, primul indice al unui tablou obișnuit creat cu new int[n] este zero, iar ultimul este n−1.

Proprietatea Length reprezintă numărul total de elemente alocate în acel tablou. Nu este ultimul indice. Pentru patru valori, Length este 4, dar indicii valizi sunt 0, 1, 2 și 3. Accesul la poziția 4 depășește limitele, chiar dacă numărul pare egal cu dimensiunea.

Ideea pe care o folosim

Expresia new int[n] creează un tablou cu exact n elemente, inițial zero. Lungimea obiectului creat rămâne fixă. Variabila n este cunoscută la executare, iar alocarea se face atunci; nu este aceeași regulă de declarare ca pentru tablourile clasice din C++.

În exemplu citim toate cele n elemente, deci dimensiunea logică a datelor coincide cu Length. Dacă am rezerva un tablou mai mare și am folosi numai o parte, ar trebui să păstrăm separat numărul pozițiilor ocupate. List<int> este o altă colecție, potrivită pentru adăugări și eliminări; nu este necesară pentru acest exercițiu.

Intrare și rezultat

Citim n pe prima linie, cu 1≤n≤100, apoi câte un întreg pe fiecare dintre următoarele n linii. Valorile sunt între −1000 și 1000. Afișăm valoarea maximă și primul său indice, separate prin spațiu. Indicele afișat este de la zero. Pentru n invalid, valoare neconvertibilă, linie lipsă sau depășirea limitelor afișăm INVALID. Tabloul gol este exclus din contract.

Exemplu urmărit

Pentru n=4 și valorile 3, 7, 7, −2, inițial maximul este 3 la indicele 0. La indicele 1 găsim 7 și actualizăm maximul și poziția. La indicele 2 găsim tot 7, dar nu schimbăm poziția: cerința solicită prima apariție. Ultima valoare, −2, nu îmbunătățește maximul. Rezultatul este 7 1.

Tabloul are Length=4 și indicii 0..3; maximul 7 apare întâi la indicele 1.Tabloul are Length=4 și indicii 0..3; maximul 7 apare întâi la indicele 1.Mărește schema ↗

De ce obținem acest rezultat

Pornim de la primul element pentru că n este cel puțin unu. După prelucrarea indicilor 0..i, variabila maximum reprezintă maximul acelui prefix, iar position prima sa apariție. Actualizăm numai la o valoare strict mai mare. Egalitatea păstrează poziția anterioară și astfel respectă departajarea. Parcurgerea începe de la unu, deoarece poziția zero a fost deja folosită pentru inițializare.

Program complet C#

using System;

class Program
{
    static void Main()
    {
        if (!int.TryParse(Console.ReadLine(), out int n) || n < 1 || n > 100)
        {
            Console.WriteLine("INVALID");
            return;
        }

        int[] values = new int[n];
        for (int i = 0; i < values.Length; i++)
        {
            if (!int.TryParse(Console.ReadLine(), out int value) ||
                value < -1000 || value > 1000)
            {
                Console.WriteLine("INVALID");
                return;
            }
            values[i] = value;
        }

        int maximum = values[0];
        int position = 0;
        for (int i = 1; i < values.Length; i++)
        {
            if (values[i] > maximum)
            {
                maximum = values[i];
                position = i;
            }
        }

        Console.WriteLine($"{maximum} {position}");
    }
}

Greșeli de evitat

Nu inițializa maximul cu zero dacă sunt permise valori negative: pentru −8 și −3 ai obține un zero care nici nu apare în tablou. Nu folosi i <= values.Length în buclă; condiția corectă este strictă. Citirea și căutarea fac O(n) pași, iar memoria este O(n). Această analiză se referă la numărul elementelor, nu la valoarea maximului.

Exersează

  1. Pentru −8 și −3, rezultatul este −3 1.
  2. Pentru un singur element 5, rezultatul este 5 0.
  3. Ce modificare ar afișa ultima apariție a maximului? Actualizarea și la egalitate, folosind >=. Explică de ce poziția mai nouă ar înlocui-o pe cea veche.

Continuă parcursul C#

Vezi Variabile și tipuri în C#: int, double și bool. Vezi Citirea datelor în C# cu Console.ReadLine și TryParse. Vezi Bucla for în C#: numărare și acumulare.

Documentație de referință: Microsoft Learn.

Întrebări frecvente

Length este ultimul indice al tabloului?

Nu. Length este numărul elementelor. Ultimul indice valid este Length−1 pentru un tablou nevid indexat de la zero.

De ce inițializăm maximul cu primul element?

Astfel maximul pornește de la o valoare existentă și funcționează inclusiv când toate elementele sunt negative.

Lungimea unui tablou C# se schimbă la adăugare?

Obiectul tablou are lungime fixă. Pentru un număr variabil de elemente poți folosi o colecție precum List<int> sau crea un alt tablou.

Un pas mai departe

Autentifică-te pentru a păstra progresul în cont.

Exersează cu o problemă →