Contact și feedback

Nu obții 100 de puncte sau ai nelămuriri în privința problemelor? Scrie-mi pe Instagram.


Ai găsit o greșeală, vrei să raportezi un utilizator sau vrei să comunici altceva? Folosește formularul de contact.


Vrei să ne transmiți o părere despre platformă? Folosește formularul de feedback.

Shortcuturi

Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.

Generale

Meniu shortcuturi?
Căutare probleme sau utilizatori/
Navigare printre rezultatele căutării↑, ↓
Meniu de contact și feedbackCTRL + Shift + F
Ieșire din meniuriEsc

Editor probleme

Setări editorCTRL + Shift + S
Schimbare stil editorCTRL + Shift + E
Șabloane de codCTRL + Shift + 1/2/3
Golire editorCTRL + Shift + 4

Vectorii în C++: declarare și parcurgere

Știm să lucrăm cu numere individuale, însă de multe ori este necesar să lucrăm cu un șir de numere. Aici intervin vectorii, sau tablourile unidimensionale, care ne permit lucrul cu un număr variabil de elemente.

Declararea unui vector

Pentru a declara un vector/tablou unidimensional în C++, avem următoarea structură:

tip nume[lungime];

Spre exemplu, următoarea structură delcară un vector de numere întregi (int), numit a, și cu dimensiunea de 10:

int a[10];

Mai precis, în memorie, calculatorul a creat un spațiu unde putem să stocăm 10 numere de tip int. Iată un exemplu de astfel de vector (cu elemente alese aleatoriu).

https://i.ibb.co/7tLK29v/image.png

Pentru a identifica câte un element din vector, fiecare are atribuit câte un indice, număr între 0 și lungime - 1 = 9.

Cum luăm un element din vector

Să zicem că vrem să luăm un element din vectorul nostru (element pe care putem să îl citim de la tastatură, să îl afișăm pe ecran, să îi atribuim o valoare — exact ca la numere normale). Pentru asta, putem folosi operatorul de indexare, care ne dă elementul din vector cu indicele dat. Iată cum luăm, spre exemplu, elementul cu indicele 8 din vector:

a[8] //care este egal cu 55

Practic, am luat din vectorul a, elementul cu indicele 8.

Ce se întâmplă dacă depășim lungimea vectorului?

Să zicem că avem următoarea secvență de cod, care declară un vector cu 10 elemente (cu indicii între 0 și 9) și citește elementul cu indicele 9999:

int a[10];
cin >> a[9999];

Acest program, deși sintactic corect, o să aibă un program impredictibil când se rulează, deoarece se iese din zona de memorie alocată vectorului. Astfel, trebuie avut grijă ca lungimea vectorului să fie destul de încăpătoare pentru a ține toate elementele dorite.

Așadar, dacă o problemă menționează că lungimea unui vector (de regulă notată cu n) are o limită maximă (cum ar fi n ≤ 1000), vectorul va trebui să aibă lungimea de minimum acest număr pentru ca operațiile cu vectorul să meargă cum sunt intenționate.

Parcurgerea unui vector

Am învățat cum putem să luăm elementele unui tablou unidimensional și să aplicăm diverse operații cu acestea:

a[5] = 4; //Elementul cu indicele 5 din vectorul a primește valoarea 4
cin >> a[0]; //Citim de la tastatură elementul cu indicele 0 din vectorul a
cout << a[3]; //Afișăm pe ecran elementul cu indicele 3 din vectorul a

Putem să parcurgem elementele vectorului folosind o structură repetitivă de tip for.

Să presupunem că avem un vector a de lungime n, cu 1 ≤ n ≤ 100 (astfel, lungimea tabloului a trebuie să fie de minimum 100). Ca să luăm elementele în ordine (cel cu indicele 0, cel cu indicele 1 și așa mai departe, până la cel cu indicele n - 1), putem parcurge cu ajutorul unui for astfel:

int a[100], n;
cin >> n; //Citim n (lungimea șirului), care este cel mult 100
for(int i = 0; i < n; i++) { //i de la 0 la n - 1
    a[i] = 0;
}

Exemplul anterior setează toate elementele șirului de la 0 la n - 1 cu 0.

Indexarea unui vector de la 1

Observăm că elementele vectorului sunt indexați de la 0 (au indicii de la 0 la n - 1), deoarece vectorul are indicii de la 0. Cu toate acestea, poate fi cam dificil lucrul de la 0, așadar recomandăm lucrul cu indicii de la 1 la n. Mai exact, nu vom utiliza elementul cu indicele 0 din vector, iar vectorul trebuie să aibă lungimea cu 1 mai mare (ca să încapă și elementul n). Iată aceeași parcurgere de mai sus, doar că cu indexarea de la 1:

int a[101], n; //Creștem lungimea tabloului a cu 1
cin >> n; //Citim n (lungimea șirului), care este cel mult 100
for(int i = 1; i <= n; i++) { //i de la 1 la n
    a[i] = 0;
}

Codul acesta este mult mai ușor de înțeles. De menționat că ambele variante sunt la fel de corecte, iar utilizarea unui element în plus în vector în a doua variantă consumă doar puțin mai multă memorie (fiind neglijabil).

Citirea unui vector

Citirea unui vector presupune parcurgerea elementelor sale și citirea lor pe rând. Nu se poate citi ca la numere: cin >> a.

Iată citirea celor n elemente ale unui vector:

int a[101], n;
cin >> n; //Citim n (lungimea șirului)
for(int i = 1; i <= n; i++) {
    cin >> a[i]; //Citim elementele pe rând: a[1], a[2], …, a[n]
}

Afișarea unui vector

Similar, afișarea elementelor unui tablou unidimensional se realizează astfel:

int a[101], n;

for(int i = 1; i <= n; i++) {
    cout << a[i] << " "; //Afișăm elementele pe rând: a[1], a[2], …, a[n]
}

Afișăm câte un spațiu după fiecare element pentru a le putea separa între ele.

Inițializarea unui vector gol

Dacă vrem să inițializăm un vector gol, putem să egalăm la intrare vectorul cu {0} (echivalent cu un vector cu toate elementele egale cu 0):

int a[100] = {0};

Similar, putem să declarăm un vector cu primele elemente predefinite (și restul egale cu 0):

int b[100] = {2, 4, 6, 8}; //b = {2, 4, 6, 8, 0, 0, 0, …, 0} (restul elementelor sunt 0)

Dacă nu specificăm lungimea la declarare, vectorul va avea fix lungimea dată:

int c[] = {2, 4, 6, 8}; //c = {2, 4, 6, 8} are lungimea egală cu 4
//c[0] = 2, c[1] = 4, c[2] = 6, c[3] = 8

Problemă rezolvată

Inversarea unui vector (afișare inversă)

Dându-se un tablou unidimensional de dimensiune n (n ≤ 100), să se afișeze elementele sale în ordine inversă.

Exemplu: Pentru șirul a = (1, 2, 3, 4) de lungime n = 4, rezultatul va fi 4 3 2 1.

Rezolvare: Citim n și cele n elemente ale lui a folosind o structură repetitivă de tip for (cu i de la 1 la n), după care afișăm elementele sale folosind un for de la n la 1 (descrescător).

#include <iostream>

using namespace std;

int main()
{
    int a[101], n;
    cin >> n;
    for(int i = 1; i <= n; i++) { //i = 1, 2, 3, …, n - 1, n
        cin >> a[i];
    }
    for(int i = n; i >= 1; i--) { //i = n, n - 1, n - 2, …, 2, 1
        cout << a[i] << " ";
    }
    return 0;
}

Exercițiu propus

Să se afișeze elementele vectorului de la ultimul la primul, vectorul fiind indexat de la 0:

for(int i = ???; i >= 0; i--) {
    cout << a[i] << " ";
}

Probleme propuse

# Problemă Dificultate
75. Determinare vector 4 Ușoară (2 )
207. Toti sunt termeni Fibonacci Medie (4 )
211. Sir vale Medie (4 )
196. Ordonat descrescator Ușoară (2 )
209. Pseudopalindrom Medie (4 )
Vrei mai multe probleme? Pe această pagină găsești întreaga listă de probleme propuse.

Alte resurse sau bibliografie

Obține medalia mult dorită. Devino As la olimpiadă.

Curs complet de olimpiadă, pregătit de olimpici de la Oxford și TU Delft.

Cuprinsul lecției

Se încarcă…

Citește și

Calculul combinărilor de n luate câte k (nCk) în C++Verificarea unui an bisect în C++Cum să afișezi partea întreagă a unui număr real în C++Verifică dacă un caracter este literă în C++Numărul de divizori al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Maximul și minimul a două valori în C++Transformarea unei litere mici în literă mare în C++Verifică dacă un număr este par sau impar fără modulo în C++Câte numere naturale sunt într-un interval dat? (C++)Copiuțe: Cifrele unui numărMatrice în C++. Declararea și parcurgerea tablourilor bidimensionaleVerifică dacă un caracter este cifră în C++Ce înseamnă variabilă globală și locală în C++?Vectorii în C++: citire și afișareSuma elementelor unui vector recursiv în C++Ce înseamnă endl în C++?Ce este o funcție void în C++?Tipuri de date în C++: numere întregi, reale, caractere și alteleFuncții în C++. Ce sunt subprogrameleRădăcina cubică a unui număr în C++ (cube root)Suma divizorilor unui număr în C++Instrucțiunea while (structuri repetitive)Comentarii în C++Verificare dacă șir de caractere este palindrom în C++Instrucțiunea do while (structuri repetitive)Algoritm recursiv pentru căutare binară (clasa a X-a)Aplicații cu ciurul lui Eratostene în C++: suma divizorilor, numărul divizorilorTransformarea unui număr din baza 10 în baza 2 în C++Numărul minim de peroane pentru o gară în C++Codul ASCII (tabel complet)CMMMC a două numere în C++ (cel mai mic multiplu comun)Recursivitate în C++Numere triunghiulare. Verificarea unui număr triunghiularCel mai frecvent element dintr-un șir în C++Numărul combinărilor în C++ (formula combinărilor)Cum să calculezi instant 2 la puterea N în C++Generarea șirului Fibonacci generalizat în C++De ce cer unele probleme răspunsul modulo 666013 sau modulo 1.000.000.007?Cel mai puțin semnificativ bit în C++Verifică dacă un număr dat este o putere de 2 în C++Tipul struct în C++. Ce sunt structurile de date neomogeneVerifică dacă o literă este vocală în C++Maximul și minimul unui vector în C++Vectorii în C++: declarare și parcurgereAria și circumferința unui cerc în C++Inversarea unui șir de caractere în C++Indicatorul lui Euler al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Matrice Fibonacci - al n-lea termen Fibonacci în timp logaritmicCMMDC recursiv a două numere naturale în C++Bordarea unei matrice în C++Cifra de control a unui numărValoarea absolută (modulul) unui număr în C++Află secolul unui an citit de la tastatură în C++Cea mai lungă secvență de elemente crescătoare în C++Aflarea sumei primelor N sume GaussCiurul lui Eratostene în C++Oglinditul unui număr în C++Instrucțiunea de decizie în C++: if, else, switch, caseInstrucțiunea for (structuri repetitive)Numărul de divizori primi ai unui număr în C++Operații cu numere mari în C++ - Toate funcțiile explicateSuma divizorilor numerelor de la 1 la N (Folosind ciurul lui Eratostene)Numărul de apariții al unui număr într-un vector în C++Funcții predefinite în C++ (matematice, șiruri de caractere)Șiruri de caractere în C++. Tot ce trebuie să știiCum să citești și să afișezi în fișiere în C++Inversarea unui vector în C++Radicalul unui număr în C++ (rădăcina pătrată)Transformarea unei litere mari în literă mică în C++Verifică dacă o literă este mică sau mare în C++Combinatorică în C++: permutări, aranjamente, combinări și alteleMaximul și minimul a trei valori în C++Cel mai mare divizor comun (CMMDC) a două numere în C++Căutare binară în C++Suma numerelor naturale dintr-un interval dat în C++Numărul de cifre ale factorialului unui numărCifra maximă a unui număr recursiv în C++Materia pentru olimpiada de informatică - tot ce trebuie să știiOglinditul recursiv al unui număr în C++Indicatorul lui Euler în C++Divide et Impera (metodă de programare C++)Al N-lea termen Fibonacci în C++Aria unui triunghi folosind coordonatele acestora în C++Numărul permutărilor în C++ (formula permutărilor)Interschimbarea a două variabile în C++ (3 metode)Numărul aranjamentelor în C++ (formula aranjamentelor)Cifra maximă și minimă a unui număr în C++Cel mai mic/mare divizor prim al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Vectori de frecvență (de apariții) în C++Tutorial instalare CodeBlocks (ușor) - Introducere în informatică C++Factorialul unui număr în C++Citirea și afișarea matricelor în C++Matrice pătratice în C++. Diagonala principală și secundarăAl N-lea termen dintr-o progresie geometricăSuma 1 + 2 + 3 + ... + N în C++Transformarea unui număr din baza 2 în baza 10 în C++Afișarea elementelor unui vector recursiv în C++Pointer în C++. Variabile de tipul char * (char steluță)Ridicarea la putere în timp logaritmic în C++. Exponențiere rapidăȘirul lui Fibonacci în C++Cel mai semnificativ bit în C++Complexitatea unui algoritm (timp și spațiu) în C++Prima cifră a unui număr în C++Verificare număr prim în C++ (Clasa a IX-a)Verifică dacă un bit de pe o anumită poziție este 1 sau 0 în C++Sortare crescătoare recursivă în C++ - Merge sort și Bubble sortAl N-lea termen dintr-o progresie aritmeticăMaximul și minimul a n valori în C++Citește un șir de caractere cu spații în C++Structuri repetitive (while, do while, for, etc)Do while vs while în C++ - Care e diferența?Interclasarea a doi vectori în C++Verifică dacă un număr aparține șirului Fibonacci în C++Instrucțiunea break (structuri repetitive)Numărul de divizori al unui număr în C++Cifrele unui număr. Prelucrarea cifrelor unui număr în C++Ce este o variabilă unsigned în C++?Mediana unui șir de valori în C++Verifică dacă trei puncte sunt coliniare C++Afișarea divizorilor primi ai unui număr în C++Cel mai mic număr cu suma cifrelor N în C++Instrucțiunea continue (structuri repetitive)Distanța dintre două puncte în C++Verificare dacă un număr este palindrom în C++

© Drepturi de autor

Echipa InfoAs își rezervă drepturile de autor pentru conținutul acestei pagini. Copierea conținutului fără acordul scris expres al InfoAs reprezintă o încălcare a Legii 8/1996 și va fi tratată ca atare.

Trimite lecția

Toată lecția

Doar videoclipul pe YouTube

Informatica devine ușoară cu InfoAs

Intră în cont