C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in...
Transcript of C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in...
C array
Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo a priori quante variabili
dobbiamo definire per contenere gli interi. – Una soluzione (non scalabile)
consiste nel dichiarare un numero m di variabli x1,x2,…xm con msufficientemente grande.
Per risolvere un problema molto semplice occorrerebbe scrivere un programma lunghissimo anche nel caso che n fosse dell’ordine delle centinaia.
leggi(n)conta ß 0if conta<n:
leggi(x1)else:
x1 ß 0conta ß conta +1if conta<n:
leggi(x2)else:
x2 ß 0...conta ß conta +1if conta<n:
leggi(xm)else:
xm ß 0if xm ¹ 0:
stampa(xm)...if x1 ¹ 0:
stampa(x1)
Algoritmo
C array
Per manipolare molti elementi dello stesso tipo, linguaggi imperativi permettono l’uso della struttura dati array (o vettore)
Un array è un insieme ordinato di elementi dello stesso tipo
Gli elementi di un array sono detti componenti ed il loro tipo è chiamato componente-tipo dell’array.
I componenti di un array sono immagazzinati in posizioniconsecutive di memoria
L'intero array é identificato da un nome– specificato secondo le regole generali degli identificatori
C array
La definizione di una variabile array monodimensionale è:
tipo-componente identificatore[espressione]
Dove:
– tipo-componente è il tipo dei componenti,
– identificatore è il nome dell’array e
– il valore dell’espressione racchiusa tra parentesi quadre ne rappresenta la dimensione (numero massimo di componenti)
– Si noti che la dimensione dell’array deve essere calcolata durante la fase di compilazione …
– … pertanto in espressione possono essere presenti solo valori letterali o costanti
C array
• Un array (o vettore) può anche essere inizializzato in fase di definizione, nel qual caso la dimensione può essere omessa perché calcolata implicitamente dal compilatore.
• Indice dell’array è una variabile o una espressione intera
• Esempio:
int valori[] = {32, 53, 28, 85, 21}; (array di 5 numeri interi)float b[]={1.5,0.4,15}; (array di 3 numeri reali)const int max=30;
int Vet[10], vet[max]; (Vet contiene max 10 interi,vet contiene max 30 interi)
int zeri[10] = {0}; (tutti i valori posti a zero)
C array
• Per accedere ai componenti dell’array si usa l’operatore binario []:
nome[espressione]
• Dove:– nome è il nome di un array (operando sinistro) e – espressione (operando destro) è una qualunque espressione
con risultato intero (indice dell'array)• L’operatore [] applicato ad un nome e un indice, definisce
una variabile (r-value)– il cui indirizzo è dato dalla somma dell’indirizzo della variabile
nome dell’array, sommato all’indice posto tra parentesi quadre
float b[]={1.5,0.4,15};b[0], b[1] e b[2] sono tre variabili reali
C array
• Come variabile nome[espressione] può essere usato:– per assegnare un valore ad un componente dell’array
• nel lato sinistro di un’istruzione di assegnazione
– per ricavare il valore di un componente dell’array • lato destro di un’assegnazione o come operando di espressione
• Esempio:
Vet[3] = 45;
int i = 4;
a = Vet[i*2] + Vet[i+1];
Vect[10] = 3;a = Vect[22];
4 -2 8 45 -6 15 12 -4 0 230 1 2 3 4 5 6 7 8 9
(il numero 45 viene assegnato alla variabile identificata dall'indice 3)
(a conterrà il valore del componente identificata dall'indice 8 dell’array sommato al valore del componente identificato dall’indice 5)
(l’accesso a componenti oltre la dimensione dell’array è spesso causa di errori di programmazione – non segnalata dal compilatore)
C array
• In generale dunque se la variabile A è stata definita come un array, A[espressione] è a tutti gli effetti una variabile il cui tipo è quello dei componenti dell’array.
C array
Se il valore dell’espressione è maggiore o uguale alla dimensione dell’array si ha un errore logico.
• L’istruzione Vet[10]=2 non ha senso poiché si attribuisce un valore ad una variabile che non rappresenta una componente dell’array Vet.
• Lo stesso può accadere se l’espressione risulta maggiore o uguale al numero di elementi effettivamente presenti nell’array.
• E’ pertanto compito del programmatore assicurarsi che situazioni di questo genere non si verifichino perché esse possono dar luogo ad errori difficilmente rintracciabili.
C array
Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso
C array
Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso
//Riempimento e stampa inversa di un array
int main () {
int const m=300;int a[m],i, n;printf("Quanti elementi? \n”);scanf(“%d”,&n); printf("Dammi gli elementi separati da uno spazio \n”);for (i=0;i<n;i++)
scanf(“%d”,&a[i]);
printf("Lista inversa \n”); for (i=n-1; i>=0;i--)
printf(“%d”,a[i]);return 0;
}
C array
A è stato definito come un array di interi di dimensione 300
Non è detto che questo array sia sempre pieno n<m
Non bisogna dunque confondere tra la dimensione dell’array ed il numero di elementi effettivamente presenti nell’array.
C array
• Si osservi inoltre che se A e B sono due array è errato scrivere A=B.
• Per copiare un array in un altro occorre scrivere un for che copi ogni elemento di B in A. Cioè:
for(i=0;i<n;i++)A[i]=B[i];
• Una variabile di tipo array non può comparire da sola in un enunciato di assegnazione o in una espressione booleana
C array
Esercizi.
• Calcolo della Conversione da decimale a Binario
• Letti da tastiera n numeri reali positivi, stampare il piu’ grande e il piu’ piccolo.
C array
i= 0;
while ( i < 8 ) {
if (V[i]> 5 ) {
printf(”V[%d]= %d \n”,i,V[i]);
}
i++;
}
Sia V=[3,5,10,34,2,12,23,5] un vettore di interi.Tenendo presente l’esempio, scrivere ciò che si ritiene che apparirà sul monitor
i= 0;
while ( i < 8 ) {
if (V[i]>= 5) {
printf(”V[%d]=%d\n”,i,V[i];
}
i+=2;
}
Sia V=[3,5,10,34,2,12,23,5] un vettore di interi. Tenendo presente l’esempio, scrivere ciò che si ritiene che apparirà sul monitor
C array
i= ____;
while (______ ) {
if (V[i]_____) {
printf(”V[%d]=%d\n”,i,V[i]);
}
i+=____;
}
Sia V=[3, 5, -10, -34, 2, 12 , 23, 5] un vettore di interi. Inserire dei termini opportuni affinché sul monitor siano stampati solo i valori positivi
i= ____;
while (______ ) {
printf(”V[%d]=%d \n”,i,V[i]);
i___;
}
Sia V=[3,5,-10,-34,2,12,23,5] un vettore di interi. Inserire dei termini opportuni affinché sul monitor siano stampati in ordine inverso solo gli
elementi di posto pari
C array
i= ____;
while (______ ) {
if (V[i]_______ ) {
printf(”V[%d]=%d\n”,i,V[i]);
}
i____;
}
Sia V=[3,5,-10,-34,2,12,23,5] un vettore di interi. Inserire dei valori opportuni affinché sul monitor siano stampati solo i valori
negativi scritti in ordine inverso
C array
Esercizi:1. Assegnato un vettore a di n interi, verificare che tutti i suoi
elementi sono positivi2. Assegnato un vettore a di n interi, verificare che tutti i suoi
elementi sono nulli3. Scrivere un programma che scriva tutti i numeri interi multipli di
3 e non di 7 inclusi tra 15 e 100 (utilizzare il ciclo while)4. Scrivere un programma che calcoli la somma di tutti i numeri
interi pari inclusi tra 5 e 100 escludendo i multipli di 3 e 5 (utilizzare il ciclo while)
5. Scrivere un programma che esegua la somma di tutti i numeri interi inseriti da tastiera finché tale somma non superi il valore di 150; dalla somma vanno esclusi i numeri che contengono la cifra 1
6. Scrivere un programma che esegua il prodotto di tutti i numeri interi inseriti da tastiera finché tale prodotto non superi il valore di 15000; dal prodotto vanno esclusi i numeri che sono multipli di 3