Progetti per il corso di Laboratorio di Architettura 1

annuncio pubblicitario
Progetti per il corso di Laboratorio di
Architettura 1
Henry Muccini
Aprile 2003
Università degli Studi di L’Aquila, Dipartimento di Informatica
Progetto 1: Ordinamento + ricerca binaria
Dato un vettore non ordinato di numeri in virgola mobile in doppia precisione
residente in RAM, ordinarlo crescentemente in loco, senza usare altra memoria
RAM oltre quella dove sono memorizzati i dati di partenza (e che quindi, alla fine
del programma, conterra’ i double riordinati). Dopo averlo ordinato, si permetta
una ricerca binaria su tale vettore ordinato. Stampare, a video, la posizione
occupata nel vettore dall’elemento cercato.
La dimensione (n) del vettore va passata come parametro da riga di comando; qualora non sia stata passata, il programma deve chiedere di immetterla
da tastiera. Il valore che si vuole ricercare (k) deve essere passato tramite riga
di comando.
NOTA: I gruppi da 3 e 4 studenti potranno scegliere tra tutti gli algoritmi di
ordinamento + ricerca binaria. I gruppi da 5 studenti dovranno implementare
QuickSort + Ricerca binaria. I gruppi da 2 studenti potranno implementare uno
a scelta degli algoritmi di ordinamento (senza la ricerca binaria).
Algoritmi di ordinamento:
Selection Sort: Sia V il vettore in questione, ed N la sua lunghezza.
Per i che va da 0 ad N-1
Per j che va da i+1 ad N-1
Se (V[j] < V[i])
scambia V[i] e V[j]
Fine Se
Fine Per
Fine Per
Bubble Sort: Sia V il vettore in questione, ed N la sua lunghezza.
lim :=n;
While (lim > 1)
Per i che va’ da 1 a lim-1
Se V[i] > V[i+1]
scambia V[i+1] e V[i];
j := i;
Fine Se
lim := j;
Fine Per
Fine While
Insertion Sort: Sia V il vettore in questione, ed N la sua lunghezza.
Per i che va da 1 ad N-1
tmp = V[i];
Per j che va da 0 ad i-1
Se (V[j] >= tmp)
Per k che va decrescendo da i a j+1
V[k] = V[k-1];
Fine Per;
V[j] = tmp;
Esci dal Per su j;
Fine Se
Fine Per
Fine Per
QuickSort(m,n): Sia V il vettore in questione, N la sua lunghezza ed M inizialmente uguale ad 1.
i := m;
j := n + 1;
While (i < j)
Ripeti un decremento unitario di j (j =
finche’ non si avvera che
Ripeti un incremento unitario di i (i =
finche’ non si avvera che
Se (i < i)
scambia V[i] e V[j];
Fine While
Se (m != j)
scambia V[m] e V[j]
Fine Se
Se (m < j-1)
QuickSort(m,j-1)
Fine Se
Se (n > j+1)
QuickSort (j+1,n)
Fine Se
Algoritmo per la ricerca binaria:
j-1)
V[j] <= V[m];
i+1)
(V[i] > V[m]) oppure (i = j);
Ricerca binaria: Sia V’ il vettore precedentemente ordinato, N la sua lunghezza
e K l’elemento da ricercare.
max := n;
min := 1;
While (max >= min)
calcola l’elemento mediano del vettore med = (max+min)/2;
Se V’[med] = k
Allora #hai trovato l’elemento k
stampa il valore di med;
esci dal programma;
Altrimenti #non hai ancora trovato l’elemento k
Se V’[med] > k
Allora max := med - 1
Altrimenti min := med + 1
Fine Se
Fine Se
Fine While
Includere nel programma un esempio di vettore con almeno 10 elementi.
Se necessitate di maggiori informazioni su tali algoritmi, potete consultare il libro ”Sistemi Software: Teoria e Progetto di Algoritmi Fondamentali” di Ausiello,
Marchetti-Spaccamela, Protasi oppure un qualsiasi testo su algoritmi.
Progetto 2: Quadrato Magico
Sia data una matrice quadrata di naturali residente in RAM. Potete usare le
normali direttive di codifica della sezione dati, ed assumere di conoscere l’ordine
della matrice.
Il programma deve dire se tale matrice e’ un quadrato magico, ed in caso
affermativo, fornire anche la costante magica (su terminale).
Si ricorda che una matrice n × n


a11 a12 · · · a1n


A =  ... ... ... ... 
an1 an2 · · · ann
si dice quadrato magico di ordine n e costante magica k se e solo se la somma
degli elementi su ogni riga, su ogni colonna e sulle due diagonali principali vale
sempre k.
Includere nel programma un esempio di una matrice di ordine almeno 4.
Progetto 3: Numeri di Fibonacci
Scrivere un programma che calcoli l’n-esimo numero di Fibonacci; n va dato
come parametro da riga di comando, e nel caso cio’ non venga fatto, occorre che
il programma richieda il valore e lo legga da terminale.
Si ricorda che la successione di Fibonacci e’ definita nel modo seguente:

0
se n = 0

1
se n = 1
fn =

fn−1 + fn−2 se n ≥ 2
Si vuole, inoltre, che il valore calcolato sia su 64 bit, e non su 32. Se tale valore
e’ rappresentabile su 32 bit, dovra’ essere stampato sul terminale; altrimenti, se il
risultato e’ rappresentabile su 64 bit, occorrera’ stampare i valori dei due registri
separatamente; se neanche 64 bit bastano, va stampato un messaggio d’errore.
Includere nel programma un esempio di risultato a 32, 64, ¿64 bit.
Progetto 4: Scomposizione in Fattori Primi
Scrivere un programma che calcoli la scomposizione in fattori primi di un
dato naturale n; n va dato come parametro da riga di comando, e nel caso
cio’ non venga fatto, occorre che il programma richieda il valore e lo legga da
terminale.
Pertanto, si cercano i naturali primi pi e i naturali ki tali che
n=
Qm
i=1
pki i = pk11 · pk22 · ... · pkmm .
L’output del programma dovra’ essere la scrittura su terminale di ogni pi ,
seguito dal proprio ki .
Includere nel programma alcuni esempi.
Progetto 5: Palindroma
Sia dato un vettore di caratteri V , da inserire da riga di comando; nel caso
cio’ non venga fatto, occorre che il programma chieda di inserire da terminale i
vari caratteri.
A questo punto, il programma deve verificare se la stringa rappresentata da
V sia palindroma o meno (ovvero che si possa leggere lo stesso contenuto indifferentemente da destra a sinistra e viceversa). Qualora cio’ sia vero, il programma
deve dare risposta affermativa; altrimenti, deve dire a quale indice la stringa si
e’ verificata non palindroma (ABCDBA e’ non palindroma all’indice 3).
Il programma deve inoltre verificare la palindromicita’ di V anche a livello
di bit, dando lo stesso tipo di output.
Includere nel programma un esempio di un vettore di 10 elementi.
Progetto 6: Genera Sottinsiemi con somma uguale a k
Sia dato un vettore di numeri V ed un numero k, da inserire da riga di
comando; nel caso cio’ non venga fatto, occorre che il programma chieda di
inserire da terminale i vari numeri.
Si scriva un programma che trovi tutti i sottinsiemi di V la cui somma e’ pari
a K. Tale programma deve restituire in output tutti tali sottinsiemi.
Includere nel programma un esempio di un vettore di 6 elementi.
Se necessitate di maggiori informazioni su tali algoritmi, potete consultare il libro ”Sistemi Software: Teoria e Progetto di Algoritmi Fondamentali” di Ausiello,
Marchetti-Spaccamela, Protasi oppure un qualsiasi testo su algoritmi.
Progetto 7: Permutazioni di un insieme
Sia dato un vettore di caratteri V , da inserire da riga di comando; nel caso
cio’ non venga fatto, occorre che il programma chieda di inserire da terminale i
vari caratteri.
Si scriva un programma che crei tutte le permutazioni di V. Ad esempio,
dato un vettore V = {a, g, f} con numero di elementi N = 3, l’insieme delle
permutazioni e’ 3! (3*2*1) ed e’ dato da: P1 = {a, g, f}, P2 = {a, f, g}, P3 =
{g, a, f}, P4 = {g, f, a}, P5 = {f, g, a}, P6 = {f, a, g}.
Includere nel programma un esempio di un vettore di almeno 5 elementi.
Se necessitate di maggiori informazioni su tale algoritmo, potete consultare il libro ”Sistemi Software: Teoria e Progetto di Algoritmi Fondamentali” di Ausiello,
Marchetti-Spaccamela, Protasi oppure un qualsiasi testo su algoritmi.
Progetto 8: Lettura con I/O mappato
Si scriva un programma che legga con l’I/O mappato in memoria dei caratteri
da tastiera, e si ferma quando legge la stringa ”STOP”, scrivendo a questo punto
tutto quanto immesso in precedenza.
Scarica