Pagina informaticii

Teste de informatică pentru liceu, articole C#, C/C++, PHP

Lecţia 2 - Tablouri unidimensionale (vectori)

Vom menţiona un lucru important încă de la începutul acestui articol. În C# tipurile de date se împart în tipuri valoare şi tipuri referinţă. Tipurile valoare sunt tipurile simple (de exemplu int, int16, int64, double, char etc., precum şi tipul string). Variabilele de aceste tipuri se iniţializează într-o atribuire de tipul

  v = expresie

De exemplu:

 int x = 2;
 char ch = 'A';
 string s = "I am a Sith Lord";

Tipurile referinţă sunt tablourile, structurile, clasele. Variabilele (obiectele) de aceste tipuri se iniţializează printr-o instrucţiune de forma:

  t = new ...

P05. Se citeşte un număr natural n. Să se memoreze într-un vector primele n pătrate perfecte.

static void Main(string[] args)
{
	int i, j, n;
	int[] t;
	Console.Write("n = ");
	n = int.Parse(Console.ReadLine());

	// initializare vector cu n componente:
	t = new int[n];
	Random r = new Random();

	// generarea celor n numere aleatoare:
	for (i = 0; i < n; i++)
		t[i] = r.Next(0, 100);

	// afisarea elementelor tabloului:
	Console.WriteLine("Vectorul generat initial:");
	for (i = 0; i < n; i++)
		Console.Write(t[i] + " ");
	Console.WriteLine();

	// ordonare crescatoare:
	for (i = 0; i < n - 1; i++)
		for (j = i + 1; j < n; j++)
			if (t[i] > t[j])
			{
				int aux = t[i]; 
				t[i] = t[j]; 
				t[j] = aux;
			}
	// reafisarea vectorului:
	Console.WriteLine("Vectorul dupa ordonare:");
	for (i = 0; i < t.Length; i++)
		Console.Write(t[i] + " ");
	Console.WriteLine();
}

Remarcaţi mai întâi modul în care se declară un tablou. Este diferit faţă de C++. Dacă scriu linia: int[] a, b, c; înseamnă că toate cele trei variabile a, b, c sunt vectori.

Iniţializarea tabloului se face abia după citirea numărului n. În acest fel spaţiul de memorie utilizat este exact cât este necesar. Componentele vectorului sunt indexate de la 0 la n-1. După utilizarea vectorului, acesta poate fi dealocat. Acest lucru se realizează în ultima linie de program, mai simplu decât în C++. Nu trebuie să ne facem griji cu faptul că am lăsat "gunoi" în memorie. Există clasa GC (Garbage Collector) care dacă e nevoie se lansează automat pentru a elibera memorie. Dar putem face asta printr-o instrucţiune de forma: GC.Collect();

P06 Să se genereze n numere naturale aleatoare care se vor memora într-un vector. Se vor ordona apoi crescător elementele vectorului.

 
static void Main(string[] args)
{
	int i, j, n;
	int[] t;
	Console.Write("n = ");
	n = int.Parse(Console.ReadLine());

	// initializare vector cu n componente:
	t = new int[n];
	Random r = new Random();

	// generarea celor n numere aleatoare:
	for (i = 0; i < n; i++)
		t[i] = r.Next(0, 100);

	// afisarea elementelor tabloului:
	Console.WriteLine("Vectorul generat initial:");
	for (i = 0; i < n; i++)
		Console.Write(t[i] + " ");
	Console.WriteLine();

	// ordonare crescatoare:
	for (i = 0; i < n - 1; i++)
		for (j = i + 1; j < n; j++)
			if (t[i] > t[j])
			{
				int aux = t[i]; 
				t[i] = t[j]; 
				t[j] = aux;
			}
	// reafisarea vectorului:
	Console.WriteLine("Vectorul dupa ordonare:");
	for (i = 0; i < t.Length; i++)
		Console.Write(t[i] + " ");
	Console.WriteLine();
}

Pentru generarea aleatoare utilizăm un obiect al clasei Random. Cu funcţia membră Next a clasei Random se pot genera numere aleatoare astfel:

 x = r.Next(); // se genereaza un numar natural aleator intreg
 x = r.Next(50); // se genereaza un numar natural aleator intre 0 si 49
 x = r.Next(1, 100); // se genereaza un numar natural aleator cuprins intre 1 si 99

Pentru ordonare am folosit un algoritm Bubblesort. Observaţi de asemenea o modificare în a doua afişare a vectorului. În instrucţiunea for, în loc să utilizăm n am folosit expresia t.Length Aceasta este o proprietate care furnizează lungimea vectorului t. Mai multe despre Proprietăţi vom vorbi într-o lecţie ulterioară legată de clase în C#.

Observaţie: pentru sortarea crescătoare a vectorului t se putea utiliza şi funcţia statică Sort din clasa Array:

 Array.Sort(t);

P07. Utilizarea instrucţiunii foreach pentru parcurgerea elementelor unei colecţii.

static void Main(string[] args)
{
	int[] t = new int[10] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };

	// afisarea elementelor tabloului cu instructiunea foreach:
	foreach (int x in t)
		Console.Write(x + " ");
}

Remarcaţi modul în care se poate iniţializa un vector la declarare. Alte modalităţi la fel de corecte pentru iniţializare la declarare a unui vector sunt:

int[] t = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
int[] t = new int[] { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };

Privitor la instrucţiunea foreach, ea este folosită pentru parcurgerea elementelor unei colecţii, în cazul nostru colecţia fiind tabloul. Instrucţiunea foreach utilizează o variabilă întreagă x care de fapt preia pe rând fiecare valoare din vectorul t şi o afişează. Nu este necesar să cunoaştem astfel lungimea tabloului. Atenţie, x nu este indice, x preia pe rând valorile lui t[0], t[1], ...

Despre autor
Author

Dan Pracsiu deţinător www.dponline.ro
Profesor, Liceul Teoretic "Emil Racoviță" Vaslui
Membru în Comisia Naţională a Olimpiadelor de Informatică
Pasiuni: istoria, călătoriile, fotografia, muzica clasică

Comentarii (3)
Scrie un comentariu
Nume:

Comentariu:

15 + 10 =