🚀 Tutorial Vectori în C#

Învață să lucrezi cu vectori de numere întregi

📚 1. Bazele Vectorilor

Ce este un vector?

Un vector (array) este o structură de date care stochează mai multe elemente de același tip într-o zonă contiguă de memorie.

Declarare și Inițializare

// Declarare simplă
int[] numere;

// Declarare cu inițializare
int[] numere = new int[5];  // Vector cu 5 elemente, toate 0

// Inițializare cu valori
int[] numere = {10, 20, 30, 40, 50};

// Inițializare alternativă
int[] numere = new int[] {10, 20, 30, 40, 50};
Sfat: Indicii vectorilor încep de la 0! Primul element este la poziția 0, nu 1.

Accesarea Elementelor

int[] numere = {10, 20, 30, 40, 50};

// Citire element
int primulElement = numere[0];  // 10
int ultimulElement = numere[4];  // 50

// Modificare element
numere[2] = 35;  // Al treilea element devine 35

// Aflarea lungimii
int lungime = numere.Length;  // 5

🔄 2. Parcurgerea Vectorilor

Parcurgere cu FOR

int[] numere = {10, 20, 30, 40, 50};

// Parcurgere de la stânga la dreapta
for (int i = 0; i < numere.Length; i++)
{
    Console.WriteLine($"Element la poziția {i}: {numere[i]}");
}

// Parcurgere inversă (de la dreapta la stânga)
for (int i = numere.Length - 1; i >= 0; i--)
{
    Console.WriteLine($"Element la poziția {i}: {numere[i]}");
}

Parcurgere cu FOREACH

int[] numere = {10, 20, 30, 40, 50};

// Parcurgere simplă (doar citire)
foreach (int numar in numere)
{
    Console.WriteLine($"Valoare: {numar}");
}

Parcurgere cu WHILE

int[] numere = {10, 20, 30, 40, 50};
int index = 0;

while (index < numere.Length)
{
    Console.WriteLine($"Element: {numere[index]}");
    index++;
}
🎯 Exercițiu: Suma Elementelor

Calculează suma tuturor elementelor dintr-un vector folosind parcurgerea.

int[] numere = {5, 10, 15, 20, 25};
int suma = 0;

for (int i = 0; i < numere.Length; i++)
{
    suma += numere[i];
}

Console.WriteLine($"Suma elementelor: {suma}");  // 75

⚙️ 3. Operații de Bază

🔍 Căutare Element

static int CautaElement(int[] vector, int valoare)
{
    for (int i = 0; i < vector.Length; i++)
    {
        if (vector[i] == valoare)
        {
            return i;  // Returnează poziția
        }
    }
    return -1;  // Nu a fost găsit
}

// Utilizare
int[] numere = {10, 20, 30, 40, 50};
int pozitie = CautaElement(numere, 30);
Console.WriteLine($"Elementul 30 se află la poziția: {pozitie}");  // 2
Complexitate: O(n)

📊 Găsire Minim și Maxim

static void GasesteMinMax(int[] vector, out int min, out int max)
{
    min = vector[0];
    max = vector[0];
    
    for (int i = 1; i < vector.Length; i++)
    {
        if (vector[i] < min)
            min = vector[i];
        if (vector[i] > max)
            max = vector[i];
    }
}

// Utilizare
int[] numere = {45, 12, 78, 34, 89, 23};
int minim, maxim;
GasesteMinMax(numere, out minim, out maxim);
Console.WriteLine($"Minim: {minim}, Maxim: {maxim}");  // Minim: 12, Maxim: 89
Complexitate: O(n)

🔄 Inversare Vector

static void InverseazaVector(int[] vector)
{
    int stanga = 0;
    int dreapta = vector.Length - 1;
    
    while (stanga < dreapta)
    {
        // Schimbă elementele
        int temp = vector[stanga];
        vector[stanga] = vector[dreapta];
        vector[dreapta] = temp;
        
        stanga++;
        dreapta--;
    }
}

// Utilizare
int[] numere = {1, 2, 3, 4, 5};
InverseazaVector(numere);
// Rezultat: {5, 4, 3, 2, 1}
Complexitate: O(n/2)

🎯 4. Algoritmi Esențiali

➕ Inserare Element

static int[] InsereazaElement(int[] vector, int element, int pozitie)
{
    // Creăm un vector nou mai mare cu 1
    int[] vectorNou = new int[vector.Length + 1];
    
    // Copiem elementele până la poziția de inserare
    for (int i = 0; i < pozitie; i++)
    {
        vectorNou[i] = vector[i];
    }
    
    // Inserăm noul element
    vectorNou[pozitie] = element;
    
    // Copiem restul elementelor
    for (int i = pozitie; i < vector.Length; i++)
    {
        vectorNou[i + 1] = vector[i];
    }
    
    return vectorNou;
}

// Utilizare
int[] numere = {10, 20, 30, 40};
numere = InsereazaElement(numere, 25, 2);
// Rezultat: {10, 20, 25, 30, 40}
Complexitate: O(n)

➖ Ștergere Element

static int[] StergeElement(int[] vector, int pozitie)
{
    if (pozitie < 0 || pozitie >= vector.Length)
        return vector;
    
    int[] vectorNou = new int[vector.Length - 1];
    
    // Copiem elementele înainte de poziție
    for (int i = 0; i < pozitie; i++)
    {
        vectorNou[i] = vector[i];
    }
    
    // Copiem elementele după poziție
    for (int i = pozitie + 1; i < vector.Length; i++)
    {
        vectorNou[i - 1] = vector[i];
    }
    
    return vectorNou;
}

// Utilizare
int[] numere = {10, 20, 30, 40, 50};
numere = StergeElement(numere, 2);
// Rezultat: {10, 20, 40, 50}
Complexitate: O(n)

📈 Sortare (Bubble Sort)

static void BubbleSort(int[] vector)
{
    int n = vector.Length;
    
    for (int i = 0; i < n - 1; i++)
    {
        bool schimbat = false;
        
        for (int j = 0; j < n - i - 1; j++)
        {
            if (vector[j] > vector[j + 1])
            {
                // Schimbă elementele
                int temp = vector[j];
                vector[j] = vector[j + 1];
                vector[j + 1] = temp;
                schimbat = true;
            }
        }
        
        // Dacă nu s-a făcut nicio schimbare, vectorul e sortat
        if (!schimbat)
            break;
    }
}

// Utilizare
int[] numere = {64, 34, 25, 12, 22, 11, 90};
BubbleSort(numere);
// Rezultat: {11, 12, 22, 25, 34, 64, 90}
Complexitate: O(n²)

📊 Frecvența Elementelor

static void AfiseazaFrecventa(int[] vector)
{
    Dictionary<int, int> frecventa = new Dictionary<int, int>();
    
    // Calculează frecvența
    foreach (int element in vector)
    {
        if (frecventa.ContainsKey(element))
        {
            frecventa[element]++;
        }
        else
        {
            frecventa[element] = 1;
        }
    }
    
    // Afișează rezultatele
    foreach (var pereche in frecventa)
    {
        Console.WriteLine($"Elementul {pereche.Key} apare de {pereche.Value} ori");
    }
}

// Utilizare
int[] numere = {1, 2, 3, 2, 4, 1, 2, 5, 1};
AfiseazaFrecventa(numere);
// Output:
// Elementul 1 apare de 3 ori
// Elementul 2 apare de 3 ori
// Elementul 3 apare de 1 ori
// Elementul 4 apare de 1 ori
// Elementul 5 apare de 1 ori
Complexitate: O(n)

🔄 Rotire Vector

static void RotesteLaStanga(int[] vector, int pozitii)
{
    int n = vector.Length;
    pozitii = pozitii % n;  // Pentru cazul când pozitii > n
    
    // Salvăm primele 'pozitii' elemente
    int[] temp = new int[pozitii];
    for (int i = 0; i < pozitii; i++)
    {
        temp[i] = vector[i];
    }
    
    // Mutăm restul elementelor la stânga
    for (int i = pozitii; i < n; i++)
    {
        vector[i - pozitii] = vector[i];
    }
    
    // Punem elementele salvate la sfârșit
    for (int i = 0; i < pozitii; i++)
    {
        vector[n - pozitii + i] = temp[i];
    }
}

// Utilizare
int[] numere = {1, 2, 3, 4, 5};
RotesteLaStanga(numere, 2);
// Rezultat: {3, 4, 5, 1, 2}
Complexitate: O(n)

💪 5. Exerciții Practice

📝 Exercițiu 1: Numere Pare

Scrie o funcție care returnează un vector nou conținând doar numerele pare din vectorul original.

static int[] ExtragePare(int[] vector)
{
    // Numără câte numere pare sunt
    int contor = 0;
    foreach (int numar in vector)
    {
        if (numar % 2 == 0)
            contor++;
    }
    
    // Creează vectorul pentru numere pare
    int[] pare = new int[contor];
    int index = 0;
    
    foreach (int numar in vector)
    {
        if (numar % 2 == 0)
        {
            pare[index++] = numar;
        }
    }
    
    return pare;
}
📝 Exercițiu 2: Al Doilea Maxim

Găsește al doilea cel mai mare element din vector.

static int AlDoileaMaxim(int[] vector)
{
    if (vector.Length < 2)
        return -1;
    
    int max1 = int.MinValue;
    int max2 = int.MinValue;
    
    foreach (int numar in vector)
    {
        if (numar > max1)
        {
            max2 = max1;
            max1 = numar;
        }
        else if (numar > max2 && numar != max1)
        {
            max2 = numar;
        }
    }
    
    return max2;
}
📝 Exercițiu 3: Verificare Vector Sortat

Verifică dacă un vector este sortat crescător.

static bool EsteSortat(int[] vector)
{
    for (int i = 0; i < vector.Length - 1; i++)
    {
        if (vector[i] > vector[i + 1])
        {
            return false;
        }
    }
    return true;
}
📝 Exercițiu 4: Eliminare Duplicate

Elimină toate duplicatele dintr-un vector.

static int[] EliminaDuplicate(int[] vector)
{
    HashSet<int> unice = new HashSet<int>();
    
    foreach (int numar in vector)
    {
        unice.Add(numar);
    }
    
    int[] rezultat = new int[unice.Count];
    unice.CopyTo(rezultat);
    
    return rezultat;
}
📝 Exercițiu 5: Fuzionare Vectori Sortați

Fuzionează doi vectori sortați într-un singur vector sortat.

static int[] FuzioneazaVectori(int[] vector1, int[] vector2)
{
    int[] rezultat = new int[vector1.Length + vector2.Length];
    int i = 0, j = 0, k = 0;
    
    // Fuzionează elementele în ordine
    while (i < vector1.Length && j < vector2.Length)
    {
        if (vector1[i] <= vector2[j])
        {
            rezultat[k++] = vector1[i++];
        }
        else
        {
            rezultat[k++] = vector2[j++];
        }
    }
    
    // Adaugă elementele rămase din vector1
    while (i < vector1.Length)
    {
        rezultat[k++] = vector1[i++];
    }
    
    // Adaugă elementele rămase din vector2
    while (j < vector2.Length)
    {
        rezultat[k++] = vector2[j++];
    }
    
    return rezultat;
}
Sfaturi pentru rezolvarea exercițiilor:
  • Începe cu cazurile simple și testează codul pas cu pas
  • Folosește Console.WriteLine() pentru debugging
  • Verifică întotdeauna cazurile limită (vector gol, un element, etc.)
  • Desenează pe hârtie cum funcționează algoritmul înainte de a-l implementa
  • Practică rescrierea algoritmilor din memorie pentru a-i înțelege mai bine

📚 Rezumat

Ai învățat astăzi:

  • ✅ Cum să declari și să inițializezi vectori
  • ✅ Trei metode de parcurgere a vectorilor (for, foreach, while)
  • ✅ Operații de bază: căutare, minim/maxim, inversare
  • ✅ Algoritmi esențiali: inserare, ștergere, sortare, frecvență
  • ✅ Rezolvarea problemelor practice cu vectori
Următorii pași: Practică acești algoritmi, apoi explorează vectori bidimensionali (matrice) și structuri de date mai avansate precum List și ArrayList.