ARRAY
Ivan Lanese
Argomenti
• Array
• Stringhe
• Merge sort
Array
• E' una struttura dati che contiene più elementi dello stesso tipo
• Normalmente su elementi diversi di uno stesso array si fanno operazioni simili
–
–
Si usa un ciclo o una funzione ricorsiva
Si usa un indice per individuare l'elemento specifico
• Gli array hanno dimensione costante
–
Se la dimensione dell'array non è nota si usa una sovrastima
•
L'array dei voti di uno studente non supererà i 50 elementi
Array: sintassi
• Gli array vengono dichiarati come le altre variabili, specificando il numero di elementi (costante)
–
–
int array[20];
const int n=30; int voti[n];
• Si accede ad un elemento di un array specificando l'indice dell'elemento
–
–
–
array[2]=5;
voto[i]=27;
cout << voto[i];
• Un array viene passato ad una funzione senza specificare il numero di elementi, che spesso è passato come parametro addizionale
–
–
stampa(array, n);
m=media(voti, n);
Array: esercizi
• Prendere in input numeri interi fino a quando l'utente non inserisce uno 0. Stampare la sequenza inserita al contrario.
• Prendere in input 10 numeri e stampare i prodotti di tutte le coppie
–
Se i numeri fossero 1, 2, ... 10 si otterrebbe la tabella delle tabelline
• Scrivere una funzione che dato un numero binario lo converte in decimale
• Scrivere una funzione che elimina tutti i duplicati da un array di interi
Stringhe
• Le stringhe sono particolari array di caratteri
• La lunghezza effettiva di una stringa è uno più del numero di caratteri significativi che contiene
– Dopo l'ultimo carattere significativo, c'è il carattere speciale '\0' usato come terminatore
– La stringa “CIAO” è composta da 5 caratteri: 'C' 'I' 'A' 'O' '\0'
• Una stringa deve essere contenuta in un array di caratteri di dimensione sufficiente
–
–
Si usa una sovrastima, come per gli altri array
Fare attenzione a non uscire dalla dimensione dell'array, in particolare effettuando l'input
•
Il buffer overflow è una nota tecnica di attacco hacker
Lavorare con le stringhe
• Ci sono 2 modi per lavorare con le stringhe
– A basso livello, trattandole come array di caratteri
– Ad alto livello, usando le funzioni predefinite che lavorano sulle stringhe
• A basso livello
– Si elaborano i caratteri uno alla volta
– Quando si passa una stringa a una funzione, spesso non è necessario passarne la lunghezza
• E' sufficiente usare la posizione del '\0'
• Questo non vale quando è necessario estendere la stringa
Stringhe viste come array di caratteri: esercizi
• Scrivere una funzione che verifica se una stringa è palindroma
• Scrivere una funzione che calcola la lunghezza di una stringa
• Scrivere una funzione che copia una stringa in un array di caratteri dato
• Scrivere una funzione che concatena due stringhe
• Scrivere una funzione che elimina da una stringa tutti i caratteri dopo l'ennesimo
Stringhe: funzioni di libreria
• E' possibile prendere in input stringhe con >> e stamparle con <<
• Il c++ fornisce diverse funzioni di libreria per manipolare le stringhe
–
Occorre includere <cstring>
• Gli esercizi 2, 3, 4 di prima corrispondono alle funzioni strlen, strcpy e strcat
–
–
–
int strlen(char []);
void strcpy(char [], char []);
void strcat(char [], char []);
• Gli operatori relazionali non funzionano sulle stringhe, per scrivere s1<s2 devo scrivere strcmp(s1,s2)<0
–
int strcmp(char [], char []);
Stringhe: esercizi
• Scrivere un programma che date tre stringhe stampa la più lunga
• Scrivere un programma che dati due nomi stampa il primo in ordine alfabetico
Ordinamenti
• Gli ordinamenti sono una parte fondamentale di molti programmi
–
–
Perchè richiesto dalla specifica
Per migliorarne la complessità
•
Cfr. esercizio sull'eliminazione dei duplicati
• Esistono molti algoritmi di ordinamento, con caratteristiche diverse
–
–
E' molto interessante la complessità, cioè come cambia il tempo di esecuzione alla variazione della dimensione dell'input
Ordinamentio buoni hanno complessità che cresce come n log n
Merge sort
• E' un algoritmo di ordinamento ricorsivo, con complessità n log n
• Casi base: un array di 0 o 1 elemento è ordinato
• Caso induttivo: dividere l'array in 2 metà, ordinarle tramite chiamate ricorsive e poi farne la fusione ordinata
Mergesort
void mergesort(int a[],int p,int r)
{
int q;
if (p<r)
{
q=(p+r)/2;
mergesort(a,p,q);
mergesort(a,q+1,r);
merge(a,p,q,r);
}
}
Merge
void merge(int a[], int p, int q, int r)
{ int i, j, k, h, b[length];
i=p; k=p; j=q+1;
while(i<=q && j<=r)
{ if(a[i]<=a[j])
{ b[k]=a[i];
i=i+1; }
else
{ b[k]=a[j];
j=j+1; }
k=k+1;
}
if (i<=q)
{ for(h=q;h>=i;h=h­1)
a[h+r­q]=a[h]; }
for(j=p;j<k;j=j+1)
a[j]=b[j];
}