Strutture dati astratte – Record e Tabelle
Nella programmazione quando si devono memorizzare grosse quantità di dati nella memoria centrale del calcolatore è opportuno definire delle strutture dati astratte costituite da una raccolta di tipi semplici aggregati attraverso un nome collettivo e identificati da un indice. Ad esempio la gestione di una rubrica telefonica può essere ottenuta definendo per ciascun soggetto il nome, cognome, l’indirizzo e il numero di telefono. Se i soggetti sono molti ad esempio già in numero superiore a 10, la gestione di queste informazioni diventa gravosa e pertanto si conviene organizzare tali informazioni in una struttura di tipo tabella in cui ogni riga costituisce il recapito telefonico di un soggetto. Una struttura dati di questo tipo in memoria centrale è detta appunto tabella, su memoria di massa (su un unità di memorizzazione tipo disco fisso, unità a dischetti) è detto file. Per poter definire una tabella è importante definire la struttura dati elementare di cui è costituita la tabella: il record. Un record è una variabile strutturata eterogenea composta da elementi di tipo diverso e identificata da un nome collettivo. Ad esempio nell’esempio precedente si può definire un record di nome “recapito”. Le componenti del record sono detti campi. E’ utile quando si definisce in un algoritmo e quindi programma un record definire un modello di tale struttura che dia informazioni anche sulla dimensione del record (dimensione logica). La dimensione logica di un record è la somma delle dimensioni di tutte le dimensioni dei campi che formano il record stesso. Inoltre alcuni campi come quelli alfanumerici sono definiti dall’utente altri come quelli numerici hanno dimensioni prefisssate e la loro dimensione varia a seconda del linguaggio di programmazione in cui si codifica l’algoritmo. Ipotizzando che i numeri interi si rappresentano con interi di 2 o 4 byte a massimo e che i numeri reali da 4 a 16 byte non è difficile calcolare la dimensione logica del record. Infatti ogni carattere alfanumerico in base alla sua codifica ASCII occupa lo spazio di un solo byte. Nell’esempio introduttivo se ne rappresenta il tracciato record che è una rappresentazione formale della struttura dati (modello) che il programmatore definisce.
Nell’esempio proposto il tracciato record è:
Recapito | |||
Cognome | Nome | Indirizzo | Telefono |
15 caratteri | 15 caratteri | 50 caratteri | 10 caratteri |
Dimensione logica 90 caratteri = 90 byte |
Poiché il programmatore nel problema ha necessità di avere più record dello stesso tipo allora si definisce una tabella una variabile strutturata identificata da un nome collettivo in cui ogni singolo record è individuato da un indice intero.
Selezione di un campo specifico in un record e di un campo specifico nella tabella.
L’operazione di selezione di un campo specifico all’interno di un record avviene secondo la nomenclatura nome-record.nome-campo ad esempio se nel record “recapiti” si vuole selezionare il campo “indirizzo” si scriverà recapiti.indirizzi. In una tabella se si vuole selezionare del decimo decimo record il campo “telefono” la nomenclatura adottata ipotizzando che il nome della tabella sia “tb” e l’indice della tabella e/o vettore di record i:
tb(10).telefono
Come esempio poniamo il seguente problema dato una tabella di 10 record del tipo “recapito” caricare la tabella.
Classe | Nome | Tipo |
input | tb | tabella di 100 elementi di tipo recapito |
interno | k | intero indice della tabella |
Non ci sono output perché l’algoritmo ci chiede solo di caricare la tabella. La variabile r viene definita a partire dal modello. In fase di codifica si definisce prima un tipo dati (il nostro modello) e poi in seguito una variabile strutturata a partire dal tipo definito.
- Inizio
- Ciclo k= 1 a 10
- scrivi “dammi il cognome”
- leggi tb(k).cognome
- scrivi “dammi il nome”
- leggi tb(k).nome
- scrivi “dammi l’indirizzo”
- leggi tb(k).indirizzo
- scrivi “dammi telefono”
- leggi tb(k).telefono
- fine ciclo
- Fine
Se si vuole caricare la tabella attraverso un’interfaccia grafica si definisce un’interfaccia come segue:

In questo problema sono presenti tre procedure una per il caricamento dell’interfaccia, un’altra per l’aggiunta di un record, un altra per la chiusura dell’interfaccia.
Caricamento del Form o Interfaccia
Inizio Carica Form
k=1
Fine
Aggiunta di record alla tabella
Inizio Comando Aggiungi Evento Click
Se k<=10 allora
tb(k).cognome = contenuto casella testo cognome
tb(k).nome = contenuto casella testo nome
tb(k).indirizzo = contenuto casella testo indirizzo
tb(k).telefono = contenuto casella testo telefono
K=k+1
Fine Se
Fine
Chiusura del Form o Interfaccia
Inizio Chiudi Form
Chiudi Form o Interfaccia
Fine
In Visual Studio seleziono progetto “Window Forms Visual Basic per Desktop” poi dal menù progetto inserisci modulo e nel modulo inserisco il seguente codice
Option Explicit On
Module Module1
Public Structure Persona
Public cognome As String
Public nome As String
Public telefono As String
Public indirizzo As String
End Structure
Public tb(100) as Persona
Public k As Integer
End Module
E' stato creato un modulo nel nostro progetto App Windows Forms di Visual Studio 2019. Fate molta attenzione per creare un progetto in Visual Basic come linguaggio di sviluppo che supporti tutte le funzionalità di VB, dove scegliere come implementazione .Net Framework e non .Net Core che è un framework più interoperabile con altri sistemi operativi, ma non supporta a pieno tutte le funzionalità di Visual Basic in modo nativo.
Adesso sui deve progettare il form la tabella dei controlli con le loro proprietà e valori è:
Classe di controllo | Proprietà | Valore |
Casella testo | Name | txt_cognome, txt_nome, txt_telefono |
— | Text | “” |
Pulsanti | Name | cmd_aggiungi, cmd_fine, cmd_cerca |
— | Caption | Aggiungi, Fine. Cerca |
Form | Caption | Rubrica |
La struttura grafica dell’interfaccia vista sopra è composta da alcuni controlli standard le “Label” che sono controlli di Output, le TextBox che sono controlli di Input/Output e i Button che sono pulsanti di comando che eseguono codice in risposta ad eventi come ad esempio il clic del pulsante.
E’ stato aggiunto anche il bottone “cerca” per un’aggiunta che sarà fatta all’esercizio in seguito. Ora in base a quanto detta la codifica completo dell’applicazione è:
Public Class Form1
Private k As Integer
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
k = 1
End Sub
Private Sub cmd_aggiungi_Click(sender As Object, e As EventArgs) Handles cmd_aggiungi.Click
tb(k).cognome = txtcognome.Text
tb(k).nome = txtnome.Text
tb(k).telefono = txtnumero.Text
tb(k).indirizzo = txtindirizzo.Text
k = k + 1
txtnome.Text = ""
txtcognome.Text = ""
txtnumero.Text = ""
txtindirizzo.Text = ""
End Sub
Private Sub cmd_fine_Click(sender As Object, e As EventArgs) Handles cmd_fine.Click
MsgBox("Arrivederci !", vbOKOnly, "Uscita dal programma")
Application.Exit()
End Sub
Private Sub cmd_cerca_Click(sender As Object, e As EventArgs) Handles cmd_cerca.Click
k = 1
Dim trovato As Boolean
Dim nominativo As Persona
trovato = False
Dim cognome1 As String
cognome1 = InputBox("Richiesta dati", "Inserimento cognome da ricercare", 1)
While (tb(k).cognome <> "")
If cognome1 = tb(k).cognome Then
trovato = True
nominativo.cognome = tb(k).cognome
nominativo.indirizzo = tb(k).indirizzo
nominativo.telefono = tb(k).telefono
txtcognome.Text = nominativo.cognome
nominativo.nome = tb(k).nome
txtnome.Text = nominativo.nome
txtnumero.Text = nominativo.telefono
txtindirizzo.Text = nominativo.indirizzo
End If
k = k + 1
End While
If trovato = 0 Then
MessageBox.Show("Avviso", "Nominativo non trovato")
End If
End Sub
End Class
Come puoi notare nel codice abbiamo la definizione di classe, poi la “MessageBox” è la finestra di avviso che visualizza il pulsante “Ok”. In realtà la “MessagBox” con il metodo “Show” è la nuova sintassi adottata in .NET, e ti conviene abituarti per realizzare programmi più aderenti ai nuovi standard. Nel codice io ti ho messo anche la “MsgBox” che prevede almeno tre informazioni testo del messaggio, titolo della finestra e stile “VbOkOnly” ovvero mostra solo il pulsante “Ok”. Questo secondo caso utilizza la nomenclatura e sintassi di Visual Basic. Nel codice sempre esposto ho inserito anche la “Inputbox” che in :Net non è supportata in modo nativo. Essa prevede una variabile che cattura l’input da tastiera che genericamente è una stringa ma può essere convertito con il “Casting” ad altro tipo. Anche la “InputBox” prevede tre informazioni obbligatorie testo del messaggio, testo del titolo della finestra, e testo di “default” nella casella di testo che può essere anche vuoto.
Un’altra differenza sta nel ciclo “While” che ora si chiude con “End While”. In questo codice sono gestiti tre eventi ovvero:
- Il clic sul pulsante “Aggiungi” che attiva il codice per aggiungere un record alla tabella
- il clc sul pulsante “Cerca” per attivare una ricerca sequenziale sulla tabella e proporre in Output nelle caselle di testo il risultato in caso positivo, in caso contrario un messaggio che indica che l’elemento richiesto non è stato individuato.
- il clic sul pulsante “Fine” che attraverso l’istruzione “Application.exit()” metodo dell’oggetto della classe “Applciation”, termina il programma.
Iscrivi al Corso Udemy dal titolo “Dall’Algoritmo al C++ Base” che ti aiuto a imparare a programmare in linguaggio C++ partendo dalle basi. Il corso ti insegna a creare algoritmi e a scrivere codice C++ con l’approccio procedurale. Iscriviti subito in promozione