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