📚 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
📊 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
🔄 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}
🎯 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}
➖ Ș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}
📈 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}
📊 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
🔄 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}
💪 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.