Archiviazione dati

Diciamo che hai sviluppato un gioco per computer chiamato "User Hostile" in cui i giocatori competono contro un'interfaccia computer intricata e ostile. Ora devi scrivere un programma che tenga traccia delle vendite mensili di questo gioco per un periodo di cinque anni. Oppure diciamo che devi fare l'inventario delle carte collezionabili di Hacker Hero.
Molto presto arriverai alla conclusione che hai bisogno di qualcosa di più dei semplici tipi di dati di base per archiviare ed elaborare le informazioni.
 

Array (elenchi). Introduzione

Per facilitare il lavoro con una grande quantità di dati, a un gruppo di celle viene assegnato un nome comune. Tale gruppo di celle è chiamato array
Array – è un gruppo di celle di memoria dello stesso tipo, poste una accanto all'altra e aventi un nome comune. Ogni cella del gruppo ha un numero univoco.

Quando lavori con gli array, devi imparare a risolvere tre compiti:
X allocare memoria della dimensione richiesta per un array
X scrivere i dati nella cella desiderata
X leggere i dati dalla cella


Array in Pascal


Tradizionalmente Pascal utilizza array statici come

var a: array [1..10] di intero;

I limiti di un array devono essere impostati da costanti e non è possibile modificare la dimensione di un array durante l'esecuzione del programma. Ma puoi creare un indice non solo di un numero intero, ma anche, diciamo, di un carattere o di un tipo enumerato. Ad esempio, per contare l'occorrenza di ogni lettera, puoi utilizzare un array

var LettersCount: array ['a'..'z'] di intero;

e lavoraci a tuo piacimento:

LettersCount['z'] := 1;
LettersCount['d'] := LettersCount['d'] + 1;

Gli svantaggi di tali array sono noti: se non si sa in anticipo quanti elementi dovranno essere utilizzati, allora viene allocata la dimensione massima della memoria per l'array. Di conseguenza, nella maggior parte dei casi "facciamo scorta per il futuro" e talvolta questa "riserva" risulta non essere sufficiente. Ecco perché tali array sono chiamati  statici: la loro dimensione è statica e deve essere impostata in fase di compilazione del programma. Tuttavia, in Pascal ci sono  array dinamici, la cui dimensione non solo può essere impostata, ma anche modificata nel corso del programma. Sono questi array e i vantaggi del loro utilizzo che verranno discussi ulteriormente.

Creazione di un array

Quando si crea un array, lo spazio viene allocato in memoria (un certo numero di celle)
1) Gli array possono essere creato semplicemente elencando gli elementi:
var a: matrice di numeri interi;
ImpostaLunghezza(a, 3);
a[0] := 1;
a[1] := 2;
a[2] := 3;

2) Gli array possono essere composti da dati di qualsiasi tipo: numeri interi o reali, stringhe di caratteri 
var a: matrice di char;
ImpostaLunghezza(a, 3);
a[0] := 'a';
a[1] := 'b';
a[2] := 'c';
3) Un array "sa" sempre la tua taglia. La funzione  length viene utilizzata per determinare la dimensione di un array. Spesso la dimensione dell'array è memorizzata in una variabile separata in modo che il programma possa essere facilmente modificato per lavorare con una diversa dimensione dell'array. Esempio:
N := 10; // nella variabile N memorizziamo la dimensione dell'array
ImpostaLunghezza(a, N); // imposta l'array e la dimensione N
writeln(lunghezza(a)); //visualizza la dimensione dell'array
La dimensione di un array può essere impostata dalla tastiera.

Riferimento a un elemento dell'array

Gran parte dell'utilità degli array deriva dal fatto che è possibile accedere individualmente ai suoi elementi.
Il modo per farlo è usare un indice per numerare gli elementi.
L'indice è un valore che punta a uno specifico elemento dell'array div>

RICORDA!
LA NUMERAZIONE DEGLI ARRAY IN PASCAL PARTE DA ZERO!

(Questo è obbligatorio — devi iniziare da zero. Questo è particolarmente importante da ricordare)

Esempi di accesso all'array A:
x := (A[3] + 5) * A[1] // legge i valori di A[3] e A[1]
A[0] := x + 6 // scrive un nuovo valore in A[0]
Analizziamo il programma per lavorare con gli elementi dell'array.
var i: numero intero;
a: matrice di numeri interi;

inizio
    io := 1;
    setlunghezza(a, 5); //crea un array di 5 elementi 
    a[0] := 23; // a ciascuno dei 5 elementi dell'array (indici da 0 a 4)
    a[1] := 12; // scrive un valore specifico
    a[2] := 7;
    a[3] := 43;
    a[4] := 51;
    a[2] := a[i] + 2 * a[i - 1] + a[2 * i]; // cambia il valore dell'elemento con indice 2 nel risultato dell'espressione
    // perché i=1, quindi sostituendo il valore della variabile i nell'espressione che otteniamo
    // espressione successiva  a[2] := a[1] + 2*a[0] + a[2];
    writeln(a[2] + a[4]);
FINE.


Come risultato della corsa questo programma apparirà sullo schermo il valore della somma degli elementi dell'array con indice 2 e con indice 4 pari a 116. Come puoi vedere dall'esempio, possiamo accedere a qualsiasi elemento dell'array . E calcolare anche il numero richiesto dell'elemento utilizzando varie formule (ad esempio, come nel programma A[i-1] o A[2*i], in questi casi verranno calcolati gli indici degli elementi e dipenderanno dal valore di i.)

Osserviamo un programma di esempio
var a: matrice di numeri interi;

inizio
    setlunghezza(a, 5);
    a[5] := 5;
    a[-1] := 0;
FINE.

Perché l'array è dichiarato con 5 elementi, quindi gli elementi saranno numerati da 0 a 4. Vediamo che il programma nella sesta riga fa riferimento a un elemento inesistente а [5] e sulla settima riga fino all'inesistente a[-1].

Si scopre che il programma è andato oltre i limiti dell'array
L'array fuori dai limiti sta accedendo a un elemento con un indice che non esiste nell'array.
In tali casi, il programma di solito si arresta in modo anomalo con errore di runtime


 
 

Quando lavori con gli array, di solito devi lavorare con tutti gli elementi dell'array contemporaneamente.
Iterazione tra gli elementi: esaminiamo tutti gli elementi dell'array e, se necessario, eseguiamo qualche operazione su ciascuno di essi.
Per questo, viene spesso utilizzato un ciclo con una variabile, che cambia da 0 a N-1, dove N è il numero di elementi dell'array.
Sotto N considereremo la dimensione attuale dell'array, cioè
N := lunghezza(A)
...
per i := da 0 a n - 1 iniziano
     // qui lavoriamo con a[i]
FINE;
...
Nel ciclo specificato, la variabile i assumerà i valori 0, 1, 2, ..., N-1.  Pertanto, ad ogni passo del ciclo, accediamo a un elemento specifico dell'array con il numero i.
Pertanto, è sufficiente descrivere ciò che deve essere fatto con un elemento dell'array a[i] e collocare queste azioni all'interno di tale ciclo.

Scriviamo un programma che riempia l'array con i primi N  numeri naturali, cioè alla fine del programma gli elementi dell'array dovrebbero diventare uguali
a[0] = 1
a[1] = 2
a[2] = 3
...
a[N - 1] = N
È facile vedere lo schema: il valore di un elemento dell'array deve essere maggiore di 1 dell'indice dell'elemento.
Il ciclo sarà simile a questo
for i := 1 to n - 1 do
    a[i] := i + 1;

Completa l'attività.