Elenco dei progetti per il corso di Laboratorio di Architettura degli

Elenco dei progetti per il corso di
Laboratorio di Architettura degli Elaboratori
Massimo Tivoli
8 Aprile 2010
Università degli Studi dell'Aquila, Dipartimento di Informatica
Identificativo del progetto: 000
Titolo del progetto: Scomposizione in fattori primi (gruppi da 1 persona).
Scrivere un programma che calcoli la scomposizione in fattori primi di un numero
naturale n (ovvero un numero intero >= 0); n va passato come parametro da console.
Pertanto, si cercano i naturali primi pi e i naturali ki tali che:
… L’output del programma dovrà essere la scrittura su console di ogni pi, seguito dal
proprio ki.
Identificativo del progetto: 001
Titolo del progetto: Quadrato Magico (gruppi da 1 persona).
Sia data, da console, una matrice quadrata (stesso numero di righe e di colonne) di
naturali (ovvero numeri interi >= 0); anche l’ordine della matrice (ovvero la sua
dimensione in termini di numero di righe e colonne) viene passato da console. Il
programma deve dire se tale matrice è un quadrato magico, ed in caso affermativo,
fornire anche la costante magica (il tutto deve essere stampato su console). Si ricorda
che una matrice quadrata A di ordine n (ovvero una matrice n x n), come la seguente:
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 (ovvero le due
diagonali con un numero di elementi pari ad n) vale sempre k.
Identificativo del progetto: 002
Titolo del progetto: Merge Sort (gruppi da 1 persona).
Sia dato, da console, un vettore V di naturali (ovvero numeri interi >= 0) e sia data,
sempre da console, anche la sua dimensione n (numero di elementi nel vettore). Si
ordino gli elementi di V, in senso crescente, utilizzando l’algoritmo di ordinamento
“Merge Sort”. Si ricorda che il Merge Sort è un algoritmo di ordinamento ricorsivo. Alla
base di questo metodo c’è il procedimento “divide et impera”, che consiste nella
divisione di un problema in problemi sempre più piccoli. Il Merge Sort opera, quindi,
dividendo il vettore da ordinare in 2 metà. Una volta ottenute le metà, si provvede ad
ordinarle e a fonderle insieme per riformare un solo vettore ordinato.
Più precisamente, il vettore viene diviso in due metà, V1 e V2. Per effetto della
ricorsione, si ordinano V1 e V2 separatamente. Per fondere due metà, l'algoritmo
confronta il minimo di una metà col minimo di un’altra. L’elemento più piccolo viene
tolto dalla metà in cui era memorizzato e viene memorizzato nel vettore risultato. Tutto
il processo prosegue re-iterando sulle metà modificate.
Per esempio, se si considera il vettore V = [7,4,10,6], alla prima iterazione V1=[7,4] e
V2=[10,6]. In generale, si procede ricorsivamente su V1 e V2 fin quando non si
ottengono vettori di due soli elementi. Dal momento in cui, per effetto della ricorsione,
si sono ottenute solo coppie, si ordinano in modo triviale le singole coppie. Ritornando
all’esempio di cui sopra, per effetto dell’ordinamento sulle coppie, si avrà che V1=[4,7]
e V2=[6,10]. Si passa poi a fondere le coppie confrontando i loro minimi e re-iterando il
processo. Quindi, continuando l’esempio, e considerando V12 il vettore risultante dalla
fusione di V1 e V2, si osserva che 4 è minore di 6 e perciò: V12=[4], V1=[7] e V2=[6,10].
Re-iterando si vede che 7 non è minore di 6, e quindi V12=[4,6], V1=[7] e V2=[10].
Continuando ad iterare il procedimento, alla fine si avrà che V12=[4,6,7,10].
Il programma, oltre a stampare sulla console il vettore ordinato, deve stampare (sempre
sulla console) anche i vari “vettori fusione” ottenuti nelle varie iterazioni dell’algoritmo.
Se necessitate di maggiori informazioni sul Merge Sort, potete consultare il libro
“Sistemi Software: Teoria e Progetto di Algoritmi Fondamentali” di Ausiello,
Marchetti-Spaccamela, Protasi (disponibile in biblioteca) oppure un qualsiasi testo su
algoritmi, oppure il web.
Identificativo del progetto: 003
Titolo del progetto: Ordinamento Dati Viaggio (gruppi da 2/3 persone).
Si realizzi un programma che legga dalla memoria (quindi i dati vengono direttamente
inseriti nel segmento dati del programma) un elenco di dati relativi ad hotel, ristoranti e
centri da visitare, e che visualizzi sulla console i dati letti ordinati in base a quanto
specificato dall’utente. Più in dettaglio, il programma deve essere chiamato da riga di
comando con i seguenti 2 parametri:
stringa1 stringa2
dove:
stringa1 è una stringa che specifica il campo in base al quale effettuare l’ordinamento.
Può assumere una coppia di valori (x,y) dove x ed y possono assumere i seguenti valori:
• x=H, restituisce informazioni su Hotel
• x=R, restituisce informazioni sui Ristoranti
• x=CC, restituisce informazioni sui Centri da visitare
• y=N/n, ordina in base al nome
• y=A/a, ordina in base al costo medio
• y=G/g, ordina in base al giorno di apertura
stringa2 è una stringa che specifica se effettuare l’ordinamento in modo crescente o
decrescente. Può assumere uno tra i valori di seguito elencati, con indicato a fianco il
relativo significato:
• C/c, ordinamento crescente
• D/d, ordinamento decrescente
Se non è possibile accedere ai dati in ingresso o produrre quelli in uscita il programma
deve interrompersi visualizzando, sulla console, un messaggio di errore. Viene lasciata
allo studente la definizione del comportamento del programma, qualora esso venga
chiamato con una quantità diversa di parametri, o qualora i parametri non rispettino le
regole sopra definite; tale definizione deve essere documentata nella relazione che
accompagna il progetto. Per l’algoritmo di ordinamento, lo studente è libero di utilizzare
un algoritmo a sua scelta (o di sua invenzione). Anche tale algoritmo va documentato
nella relazione associata al progetto.
Se necessitate di maggiori informazioni su possibili algoritmi di ordinamento, potete
consultare il libro “Sistemi Software: Teoria e Progetto di Algoritmi Fondamentali” di
Ausiello, Marchetti-Spaccamela, Protasi (disponibile in biblioteca) oppure un qualsiasi
testo su algoritmi, oppure il web.
Identificativo del progetto: 004
Titolo del progetto: Voting System (gruppi da 2/3 persone).
Si realizzi un programma che permetta ad un utente di votare. Un elenco di votanti e di
candidati deve essere salvato in memoria (tramite la direttiva .data, quindi direttamente
nel segmento dati del programma). Un votante, inserisce i propri dati da riga di comando
o console. Se il nominativo esiste, il sistema visualizza la lista dei candidati su console.
A questo punto il votante può esprimere il suo voto, che verrà memorizzato nel sistema.
Alla chiusura delle urne, il sistema deve permettere la visualizzazione della percentuale
dei votanti ed informazioni sui voti acquisiti da ciascun candidato. Deve quindi
permettere di ordinare i risultati della votazione in base al cognome dei candidati, ai voti
ottenuti dai candidati, alla percentuale di gradimento ottenuta. Tali informazioni vanno
mostrate sulla console. Per l’algoritmo di ordinamento, lo studente è libero di utilizzare
un algoritmo a sua scelta (o di sua invenzione). Tale algoritmo va documentato nella
relazione associata al progetto.
Se necessitate di maggiori informazioni possibili algoritmi di ordinamento, potete
consultare il libro “Sistemi Software: Teoria e Progetto di Algoritmi Fondamentali” di
Ausiello, Marchetti-Spaccamela, Protasi (disponibile in biblioteca) oppure un qualsiasi
testo su algoritmi, oppure il web.
Identificativo del progetto: 005
Titolo del progetto: Permutazioni di un insieme (gruppi da 2/3 persone).
Sia dato un vettore di caratteri V, da inserire da riga di comando; nel caso ciò non venga
fatto, occorre che il programma chieda di inserire da console 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 è il fattoriale di 3, ovvero
3*2*1=6 ed è dato da: V1=[a, g, f], V2=[a, f, g], V3 =[g, a, f], V4=[g, f, a], V5=[f, g, a],
V6=[f, a, g].
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 (disponibile in biblioteca) oppure un qualsiasi testo su
algoritmi, oppure il web.
Identificativo del progetto: 006
Titolo del progetto: Genera sottoinsiemi con somma uguale a k (gruppi da 2/3
persone).
Sia dato un vettore di numeri interi V (possono esserci sia numeri positivi o uguali a 0
che negativi) ed un numero k, entrambi da inserire da riga di comando; nel caso ciò non
venga fatto, occorre che il programma chieda di inserire da console sia V che k. Si
scriva un programma che trovi tutti i sottoinsiemi di V la cui somma è pari a K. Tale
programma deve restituire in output tutti tali sottoinsiemi.
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 (disponibile in biblioteca) oppure un qualsiasi testo su
algoritmi, oppure il web.
Identificativo del progetto: 007
Titolo del progetto: Comparazione tra due vettori (gruppi da 2/3 persone).
Siano dati due vettori di stringhe V1 e V2. Siano tali vettori composti da k stringhe.
Siano i vettori immessi da console o da riga di comando. Sia k immesso da console o da
riga di comando. Qualora gli input da immettere da riga di comando non siano inseriti,
occorre che il programma chieda di inserirli da console. Si scriva un programma che,
dati V1 e V2, restituisca (in un vettore di stringhe V3) tutte le stringhe di V1 che
contengono almeno una stringa di V2 come sottostringa.
Esempio: V1=[“storione”, “pippo”, “ciao”, “storia”] e V2=[“ori”, “iao”, “miao”,
“vedo”]; il programma restituisce V3=[“storione”, “ciao”, “storia”] dato che
“storione” e “storia” contengono “ori”, e “ciao” contiene “iao”.
Identificativo del progetto: 008
Titolo del progetto: Somma di tre elementi (gruppi da 2/3 persone).
Sia dato un vettore V1 di numeri interi (positivi, negativi o uguali a 0). Il vettore sia
immesso da riga di comando (nel caso ciò non venga fatto, occorre che il programma
chieda di inserire da console i vari numeri). Scrivere un programma che, dato V1
restituisce il numero di elementi distinti in V1 che possono essere scritti come somma di
esattamente altri tre elementi del vettore.
Esempio: V1=[1,3,4,2,6,1]. Il programma restituisce 2 dato che solo 4 e 6 possono
essere scritti come somma di altri tre elementi di V1 (4=1+2+1 e 6=1+3+2 o 6=1+1+4).