• Non ci sono risultati.

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
17
0
0

Testo completo

(1)

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

(2)

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 posizioni consecutive di memoria

L'intero array é identificato da un nome

– specificato secondo le regole generali degli identificatori

(3)

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

(4)

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)

(5)

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

(6)

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 23

0 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)

(7)

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.

(8)

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.

(9)

C array

Problema: scrivere un programma che, ricevuto in input un intero n ed

n interi positivi, li stampi in ordine inverso

(10)

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;

}

(11)

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.

(12)

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

(13)

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.

(14)

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

(15)

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

(16)

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

(17)

C array

Esercizi:

1. Assegnato un vettore a di n interi, verificare che tutti i suoi elementi sono positivi

2. Assegnato un vettore a di n interi, verificare che tutti i suoi elementi sono nulli

3. 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

Riferimenti

Documenti correlati

12.13 Un anello a fattorizzazione unica ` e un anello con la propriet` a che ogni elemento si pu` o scrivere in modo unico come prodotto di elementi irriducibili.. Per trattare

Se possibile scrivere n come somma di tre quadrati.. Se possibile scrivere n come somma di

%vettore binario Buguali= vettore==x Bmaggiori= vettore&gt;x Bminori= vettore&lt;x. %valore

Sottogruppi normali,

[r]

Una funzione si dice discontinua se esiste almeno un punto del suo dominio dove la funzione non ` e continua.. Tipiche funzioni discontinue sono le funzioni che presentano dei

[r]

La dimostrazione precedente fornisce anche un algoritmo per il calcolo di una soluzione x (se essa esiste cioè se db): basta moltiplicare t (ottenuto dividendo b per d) per