Tablouri
Tablouri

    Variabilele utilizate pana acum puteau contine o singura valoare. De multe ori e nevoie sa folosim variabile care pot stoca mai multe valori. Cu alte cuvinte se simte nevoia utilizarii tablourilor. Un tablou permite folosirea unei singure variabile pentru a stoca mai multe valori. Valorile sunt stocate la adrese consecutive cu alte cuvinte, la indecsi consecutivi incepand cu 0 . Utilizarea tablourilor ar un mare avantaj, care consta in posibilitatea utilizarii instructiunilor repetitive pentru a relucra toate valorile stocate in tablouri. Din acest motiv, tablourile mai sunt numite si "masive de date"

  • Declararea unui tablou

        Un tablou este similar cu o variabila, deci el trebuie declarat inainte de a putea fi folosit.

     Dim  nume_tablou(nr_elemente)  As  tip
    


         Toate valorile dintr-un tablou trebuie sa fie de acelasi tip.
        Sa realizam o aplicatie care cere 5 numere de la tastatura dupa care le afiseaza. Numerele vor fi memorate intr-un tablou dupa care vor fi afisate.

    Module Module1
        'Programul utilizeaza un tablou numit "numere"
        'Programul cere 5 numere dupa care le afiseaza
    
        Sub Main()
            Dim i As Integer
            Dim numere(5) As Double
            For i = 0 To 4
                Console.Write("Introduceti numarul (" & i & ")=")
                numere(i) = Console.ReadLine()
            Next
            Console.WriteLine("Numerele introduse sunt:  ")
            For i = 0 To 4
                Console.WriteLine(" numarul (" & i & ") =" & numere(i))
            Next
            Console.ReadKey()
        End Sub
    
    End Module
    


        Daca rulam acest program, acesta ne cere cinci numere dupa care le afiseaza similar cu imaginea de jos:



        Am definit deci o singura variabila numita "numere" insa am precizat numarul de elemente respectiv "[5]". Am creat astfel un tablou pe care putem usor sa-l manevram din instructiuni repetitive.

        Putem sa cerem numarul de elemente ce vor fi introduse de la tastatura. In acest caz programul devine:

    Module Module1
        'Programul utilizeaza un tablou numit "numere"
        'Programul cere n numere dupa care le afiseaza
    
        Sub Main()
            Dim i, n As Integer
            Const nmax As Integer = 10
            Dim numere(nmax) As Double
            Console.Write("Introduceti valoarea lui n (maxim 10):")
            n = Console.ReadLine()
            For i = 0 To n - 1
                Console.Write("Introduceti numarul (" & i & ")=")
                numere(i) = Console.ReadLine()
            Next
            Console.WriteLine("Numerele introduse sunt:  ")
            For i = 0 To n - 1
                Console.WriteLine(" numarul (" & i & ") =" & numere(i))
            Next
            Console.ReadKey()
        End Sub
    
    End Module
    


  • Initializarea unui tablou

        Daca pentru o variabila initializarea inseamna atribuirea unei valori, pentru un tablou initializarea inseamna stabilirea dimensiunii si precizarea numarului de elemente ale tabloului. Exista doua metode de initializare a unui tablou: prin dimensionare explicita su prin dimensionare implicia.

         Dimensionarea explicita a unui tablou.

        In cazul in care se defineste un tablou si se precizeaza numarul de elemente se defineste explicit. Este cazul aplicatiei anterioare in care am definit tabloul numere astfel: Dim numere(5) As Double

         Dimensionarea implicita a unui tablou.

        Vom initializa prin dimensionare explicita, un tablou numit "luni" si vom atribui 12 valori pentru lunile din an.
        Declaram tabloul de tip string, deci elementele vor fi chiar numele lunilor. Utilizand tabloul "luni", vom realiza o aplicatie in care se cere numarul lunii dupa care programul, afiseaza numele lunii.

    Module Module1
        'Programul utilizeaza un tablou numit "luni"
        'Programul cere numarul lunii dupa care le afiseaza numele lunii
    
        Sub Main()
            Dim i, n As Integer
            Dim luni() As String = {"ianuarie", "februarie", "martie", "aprilie", "mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie"}
            Console.Write("Introduceti luna (1-12):")
            n = Console.ReadLine()
            Console.Write("Luna introdusa este : " & luni(n - 1))
            Console.ReadKey()
        End Sub
    
    End Module
    


  • Atribuirea de valori elementelor tabloului

        Dupa initializarea unui tablou, se pot atribui valori fiecarui element din tablou. Citirea elementelor tabloului se poate face numai dupa ce acestora le-au fost atribuite valori.
        Sa realizam o aplicatie care initializeaza un tablou de tip double cu maxim 10 elemente, dupa care acestora li se atribuie valori aleatoare intre 0 si 100. Vom folosi pentru aceasta instructiunea rand() care genereaza numere intregi intre 0 si 1

    Module Module1
        'Programul utilizeaza un tablou numit "numere"
        'Programul genereaza  n numere intre 0-100 pe care le memoreaza intr-un tablou
        'Programul afiseaza numerele salvate in tablou
    
        Sub Main()
            Dim i As Integer
            Const nmax As Integer = 10
            Dim numere(nmax) As Double
            Dim r As Double
            Randomize()
    
            For i = 0 To nmax - 1
                r = 100 * Rnd()
                'numere(i) = CInt(r)
                numere(i) = r
            Next
            Console.WriteLine("Numerele introduse sunt:  ")
            For i = 0 To nmax - 1
                Console.WriteLine("Numere [ " & i & "] =" & numere(i))
            Next
            Console.ReadKey()
        End Sub
    End Module
    


        Dupa rularea aplicatiei si introducerea valorii 9 pentru n, obtinem:



        Tablourile sunt des utilizate in programare. Exista o gama larga de cazuri in care sunt necesare tablourile. Sa luam de exemplu aplicatiile de ordonare siruri analizate in cadrul schemelor logice. Pentru a implementa aceste scheme avem nevoie de tablouri in care sa pastram fiecare element. Tabloul contine deci toate numerele din sir. Acest tablou este de ordinul 1 si il vom numi vector.

  • Tablouri bidimensionale (matrici)

        Sa initializam o matrice de tip int cu n x m elemente si sa-i atribuim valori aleatoare in domeniul 0-100;

    Module Module1
        'Programul utilizeaza o matrice cu n x m elemente
        'Elementelor matricii li se atribuite valori intregi aleatoare intre 0 si 100
        'Programul afiseaza elementele salvate in tablou
    
        Sub Main()
            Dim i, j As Integer
            Const nmax As Integer = 10
            Const mmax As Integer = 10
            Dim numere(nmax, mmax) As Double
            Dim r As Double
            Randomize()
            For j = 0 To mmax - 1
                For i = 0 To nmax - 1
                    r = 100 * Rnd()
                    numere(i, j) = CInt(r)
                Next
            Next
    
            Console.WriteLine("Numerele introduse sunt:  ")
            For j = 0 To mmax - 1
                For i = 0 To nmax - 1
                    Console.WriteLine("Numere (" & i & ")(" & j & ") =" & numere(i, j))
                Next
                Console.WriteLine()
            Next
            Console.ReadKey()
        End Sub
    End Module
    
    


  • Tablouri in spatiul System

        Sa realizam acum o aplicatie VB Windows Forms Application care foloseste tablouri bidimensionale. Sa incercam sa desenam in mod continuu cercuri la diferite pozitii, de dimensiuni aleatoare si totodata sa stergem cercurile mai vechi in asa fel incat pe ecran sa avem un numar stabil de cercuri.

        Deschidem un nou proiect Windows Forms Application intitulat "matr_wfa" pe care plasam un obiect timer pe caruia ii setam intervalul la 10.

        Vom utiliza o matrice care sa tina pozitiile x si y ale cercurilor precum si razele acestora. Pe fiecare eveniment Tick se va desena un cerc si se va sterge altul. Avand sa zicem 100 de cercuri incepem sa stergem cele mai vechi de 50 si vom avea in permanenta 50 de cercuri.
        Pozitiile cercurilor si razele acestora se vor genera aleator in asa fel incat sa poata fi desenate pe form-ul curent. Sunt o serie de variabile si obiecte care trebuie sa aiba deci domeniul de vizibilitate in diverse proceduri deci trebuie puse in zona #pragma region .
         Completam deci #pragma region cu :

        Dim i, j, k As Integer
        Const nr_c As Integer = 100
        Dim Desen As Graphics
        Dim Creion_rosu As Pen
        Dim Creion_pic As Pen
        Dim n As Random
        Dim cercuri(nr_c, 3) As Integer
     

        Completam procedura deschisa pe evenimentul Paint al obiectului form-ului cu :

        Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
            k = nr_c / 2
            Desen = Me.CreateGraphics()
            Creion_rosu = New Pen(Brushes.Red, 1)
            Creion_pic = New Pen(Me.BackColor, 1)
            n = New Random()
            Desen.Clear(Me.BackColor)
            For i = 0 To nr_c
                cercuri(i, 0) = CInt(n.Next(Me.Width))
                cercuri(i, 1) = CInt(n.Next(Me.Width))
                cercuri(i, 2) = CInt(n.Next(75))
            Next
        End Sub
     

        Completam procedura deschisa pe evenimentul Tick al obiectului timer1 cu :

        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    
            Desen.DrawEllipse(Creion_rosu, cercuri(j, 0), cercuri(j, 1), cercuri(j, 2), cercuri(j, 2))
            Desen.DrawEllipse(Creion_pic, cercuri(k, 0), cercuri(k, 1), cercuri(k, 2), cercuri(k, 2))
            j = j + 1
            If (j > nr_c - 1) Then
                j = 0
            End If
            k = k + 1
            If (k > nr_c - 1) Then
                k = 0
            End If
        End Sub
     

        Dupa lansarea aplicatiei vom avea tot timpul 50 de cercuri pe ecran dar in diverse pozitii si de diverse marimi.


        Se observa ca aparitia cercurilor nu este total aleatoare. Dupa o desenare a tuturor cercurilor se reia desenarea acelorasi cercuri.

    Lucrari de laborator