Homework 2
Si vuol ruotare una matrice
NxN per
X volte di
1/4 in senso orario.
Ad esempio se
N=3 e la matrice iniziale e le tre matrici ruotate sono
Matrice iniziale oppure X%4=0
|
Dopo una rotazione o se X%4=1 diventerà
|
Dopo due rotazioni o se X%4=2 diventerà
|
Dopo tre rotazioni o se X%4=3 diventerà
|
Se
N=4
Matrice iniziale oppure X%4=0
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
|
con 1 rotazione di 1/4 passa a
12 |
8 |
4 |
0 |
13 |
9 |
5 |
1 |
14 |
10 |
6 |
2 |
15 |
11 |
7 |
3 |
|
dopo 2 si ha
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
e quindi dopo 3 rotazioni si arriva a
3 |
7 |
11 |
15 |
2 |
6 |
10 |
14 |
1 |
5 |
9 |
13 |
0 |
4 |
8 |
12 |
|
Scrivete un programma ASM MIPS che:
- definisce una funzione leggi(Matrice, N) che legge una matrice di interi di dimensione 0<N<11 mettendoli in memoria per righe a partire dall'indirizzo Matrice
- definisce una funzione ruota(Matrice, N) che ruota la matrice di un quarto in senso orario (potete usare una matrice uguale di appoggio)
- definisce una funzione stampa(Matrice, N) che stampa la matrice per righe
- e nel programma principale:
- allocate staticamente lo spazio per la matrice e per la matrice di appoggio (max 10x10 words ciascuna) e per le altre strutture o stringhe necessarie
- leggete il valore 0<N<11
- usate la funzione leggi per leggere gli NxN valori interi e metterli in memoria
- leggete il valore intero X che indica quante rotazioni applicare
- applicate X%4 rotazioni alla matrice usando la funzione ruota
- usate la funzione stampa per stampare la matrice
ATTENZIONE: visto che esistono solo 4 tipi di rotazioni a qualcuno potrebbe venire in mente che non è necessario ruotare veramente la matrice ma basta prevedere 4 diverse funzioni di stampa ... NON E' COSI' ... realizzate le funzioni richieste o il compito varrà 1/10 invece di 1 (sempre che funzioni

)
NOTE:
- Potete assumere che l'input sarà corretto (non c'è bisogno di controllare i dati)
- NON INSERITE PROMPT DI NESSUN TIPO (o almeno toglieteli prima di consegnare)
- i dati possono essere letti da file tramite redirezione, ciascuno su una riga seguito da accapo (vedi file di esempio)
- HW2-dati-3x3-5.txt: Esempio di matrice 3x3 che viene fatta ruotare di 5/4
- Formato del file:
N (dimensione della matrice, tra 1 e 10 compresi)
1° valore
2° valore
...
NxN° valore
X (numero di rotazioni di 1/4 in senso orario da applicare)
-
- Comando: java -jar Mars4_4.jar sm nc mioprogramma.asm < HW2-dati-3x3-5.txt
- output atteso:
7 4 1
8 5 2
9 6 3
Risultati dei test
Ho testato 10 casi, ovvero le 10 matrici da dimensione 1 a dimensione 10, con un numero di rotazioni generato a caso tra 0 e 49 compresi.
Ve la siete cavata abbastanza bene, bravi!
- per un paio di voi il programma si è bloccato sul test 1,3,8 ovvero i casi in cui K (numero di rotazioni di 1/4) era multiplo di 4
- l'errore più comune è non formattare la matrice correttamente (con spazi ed accapi)
- oppure sbagliare il numero di rotazioni da applicare
- Ecco i risultati dei test su 10 set di dati generati a caso
- come interpretare le differenze:
- le righe che iniziano con il carattere '-' sono le righe "giuste" che non sono presenti nel vostro output
- le righe che iniziano con il carattere '+' sono le righe "sbagliate" che sono presenti nel vostro output
- come al solito il punteggio che prendete sul compito è PASSED/10
- chi non ha ruotato la matrice ma realizzato 4 funzioni di stampa becca solo 1/4 del punteggio
- Io ho implementato l'esercizio così
--
AndreaSterbini - 10 Apr 2014