C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in...

17
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 x 1 ,x 2 ,…x m con m sufficientemente 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 ß 0 if conta<n: leggi(x1) else: x1 ß 0 conta ß conta +1 if conta<n: leggi(x2) else: x2 ß 0 ... conta ß conta +1 if conta<n: leggi(xm) else: xm ß 0 if xm ¹ 0: stampa(xm) ... if x1 ¹ 0: stampa(x1) Algoritmo

Transcript of C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in...

Page 1: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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

Page 2: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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

Page 3: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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

Page 4: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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)

Page 5: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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

Page 6: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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)

Page 7: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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.

Page 8: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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.

Page 9: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

C array

Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso

Page 10: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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;

}

Page 11: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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.

Page 12: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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

Page 13: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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.

Page 14: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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

Page 15: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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

Page 16: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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

Page 17: C array - unina.it · 2017. 10. 18. · C array Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso. – Non sappiamo

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