IL TIPO DI DATO ARRAY

Gli array considerati nei linguaggi di programmazione sono una forma generalizzata di vettori e matrici;
i vettori sono aggregati di elementi dello stesso tipo individuati da 1 indice,
le matrici sono aggregati di elementi dello stesso tipo individuati da 2 indici;
gli array sono aggregati di elementi dello stesso tipo individuati da K indici, con K maggiore o uguale a 1.

La dichiarazione generica di una variabile X di tipo array è come segue:
X: array [ IND1, ..., INDk] of TYPE

k
maggiore o uguale a 1
IND1, ..., INDk
sono tipi con un numero finito di elementi, in genere isomorfi a {1, ..., n} per un qualche n
TYPE
un qualunque tipo del linguaggio
Il modello matematico dei valori di un tipo array generico come quello sopra è
insieme delle funzioni totali da {1,...,n1} X ... X {1,...,nk} in TYPE,
dove nj è il numero di elementi di INDj.

La metafora variabile = scatola si estende a questo caso considerando scatole con scomparti,
es. le cassette della posta o quelle dei tipografi.

Ogni linguaggio provvede poi dei costrutti per dichiarare variabili di questi tipi e per esaminare e modificare gli elementi di tali variabili.

esaminare una componente di X
X[EXPR1,...,EXPRk]
dove X ha il tipo array come indicato sopra e le espressioni EXPR1, ..., EXPRk hanno rispettivamente tipo IND1, ..., INDk,
è un'espressione di tipo TYPE il cui valore è il valore della componente di X individuata dai valori di EXPR1, ..., EXPRk
modificare una componente di X
X[EXPR1,...,EXPRk] <- EXPR
dove EXPR1, ..., EXPRk sono come sopra, è un'assegnazione (quindi uno statement) che richiede che il valore di EXPR sia assegnato alla componente di X individuata dai valori delle espressioni EXPR1, ..., EXPRk.
Importante, anche in questo caso occorre distinguere tra scatola e contenuto:
X[EXPR1,...,EXPRk] nel primo caso denota il contenuto di una scatola/cella di memoria, mentre nel secondo denota la scatola/cella di memoria stessa.

In genere i linguaggi forniscono anche un modo per rappresentare costanti di tipo array, per esempio elencando in ordine i loro elementi usando opportuni separatori.

ESERCIZI

  1. Definire precisamente un tipo di dato array, elencandone i valori, le costanti e le possibili operazioni.

IL TIPO DI DATO ARRAY IN C

Il C fornisce solamente array in cui i tipi degli indici sono della forma
{0, 1, ..., n}, con n > 0
e le dichiarazioni di variabile di tipo array hanno la forma
TYPE X [ STAT-EXP1][ ...][ STAT-EXPk ];
STAT-EXP1, ..., STAT-EXPk
sono espressioni costanti (cioè in cui non appaiono variabili) di tipo intero il cui valore è maggiore di 0
TYPE
un qualunque tipo del linguaggio
dichiara un array con elementi di tipo TYPE, e con indici {0, ..., v1-1} X ... X {0, ..., vk-1},
dove v1, ..., v k sono rispettivamente i valori di STAT-EXP1, ..., STAT-EXPk

In C la sintassi per la selezione di una componente è
X[i1][ ...][ ik];

Il C non offre costanti di tipo array da utilizzare in ogni punto del programma, vedremo poi un uso ridotto per le inizializzazioni delle variabili.

Il seguente programma presenta alcuni semplici usi di questi costrutti.

#include <stdio.h>

main(){
int I;
int  M[3][3]; /*matrice quadrata di interi 3 X 3*/
float V[100], W[100]; /*vettori di reali di lunghezza 100*/

/*inizializzazioni*/
for(I=0; I< 2; I=I+1){
     M[I][0]=1;
     M[I][1]=2;
     M[I][2]=3;}

for(I=0; I< 100; I=I+1)
    V[I]=0.0;
/* ricordare che gli indici partono da 0, non da 1 */


/* W = V; non e' permessa occorre fare*/
for(I=0; I< 100; I=I+1)
    W[I]=V[I];

W[33] = 3;
W[55] = 5;

printf("il valore di M[1][1] e\': %d\n",M[1][1]);
printf("i valori di W sono:\n");
for(I=0; I< 100; I=I+1)
printf("%f ",W[I]);
printf("\n");
}

ESEMPI

Prodotto scalare
#include <stdio.h>

/*prodotto scalare per vettori*/
main(){
    int s,  /*lo scalare*/ i, x;
    float v[5]; /*il vettore di lunghezza 5*/

    /*leggere lo scalare*/
    printf("dare lo scalare\n");
    scanf("%d",&s);

    /*leggere il vettore*/
    printf("dare il vettore\n");
    for(i=0; i<= 4; i=i+1){
    scanf("%d",&x); v[i]=x;};
    /*l'uso di s sara' chiarito  in seguito assieme a quello di &*/

    for(i=0; i<= 4; i=i+1)
        v[i]= v[i] * s;
    
    /*stampare il vettore*/
    for(i=0; i<= 4; i=i+1)
         printf("%f ",v[i]);
    printf("\n");
}
somma di matrici
#include <stdio.h>

/*somma di matrici*/

main(){
    int a[3][3], b[3][3], res[3][3], i, j, s; 

    /*leggere le matrici*/
    printf("dare la prima matrice\n");
    for(i=0; i<= 2; i=i+1)
        for(j=0; j<= 2; j=j+1){
            scanf("%d",&s);
            a[i][j] = s;
        };

    printf("dare la seconda matrice\n");
    for(i=0; i<= 2; i=i+1)
        for(j=0; j<= 2; j=j+1){
            scanf("%d",&s);
            b[i][j] = s;
        };

    for(i=0; i<= 2; i=i+1)
        for(j=0; j<= 2; j=j+1)
            res[i][j] = a[i][j] + b[i][j];
    
    /*stampare il risultato*/
    for(i=0; i<= 2; i=i+1){
        for(j=0; j<= 2; j=j+1)
            printf("%d ",res[i][j]);
        printf("\n");
    }
}
Ricordiamo comunque che in C gli array sono realizzati in modo molto particolare, infatti sono essenzialmente dei puntatori; le consequenze di ciò sono presentate in array VS puntatori.

IL TIPO DI DATO STRINGHE

Il C, come anche altri linguaggi offre delle facilitazioni per trattare il tipo di dato stringhe (sequenze ordinate di caratteri) realizzato come una variante di array di caratteri.

Precisamente in C le stringhe sono array di caratteri dove la fine della stringa è segnalata dal carattere nullo ('\0'), cioè quello con codice 0.

Inoltre il C provvede un modo per rappresentare i valori di tipo stringa (cioè array di caratteri), scrivendo gli elementi della stringa racchiusi tra doppi apici (come per i parametri della funzione printf). Tali costanti si possono utilizzare per inizializzare variabili di tipo 'stringa'.
Per esempio, una variabile dichiarata da char st[5] = "casa";, (dichiarazione con inizializzazione vedi INIZIALIZZAZIONE DELLE VARIABILI)
corrisponde alla dichiarazione char st[5]; seguita dalle assegnazioni
st[0] = 'c'; st[1] = 'a'; st[2] = 's'; st[3] = 'a'; st[4] = '\0';

ESEMPIO

#include <stdio.h>

main(){
    
    int i;
    char c;
    char string1[100], string2[20];

    string2 = "casa";
     
 /*stampare string2*/
 
   printf("\"");
   for(i=0; s[i] != '\0'; i =i+1)
      printf("%c",string2[i]);
  printf("\"\ ");


/* leggere string1
   che termina quando si va a capo */

   
   scanf("%c",&c);
   for( i=0; c != '\n';  i= i+1)
   {string1[i]=c; scanf("%c",&c);}
   string1[i]='\0';
}