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.
În acest material
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.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ă
- Pentru −8 și −3, rezultatul este −3 1.
- Pentru un singur element 5, rezultatul este 5 0.
- 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.