|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Como
Messaggi: 2551
|
[MIPS] Aiuto nel realizzare un programma
Ciao ragazzi, vi posto il codice C che ho scritto come guida per aiutarmi a realizzare lo stesso programma in Assembly MIPS.
In pratica voglio fare in modo che l'utente possa inserire un numero N e che venga creata una matrice di dimensione (N,N), che successivamente gli venga richiesto che valore inserire in ogni cella della matrice e infine che venga visualizzato il determinante. In C funziona perfettamente ma sto avendo problemi a capire come allocare runtime la memoria per memorizzare l'array in Assembly. Grazie mille a chi ha voglia di darci un'occhiata ![]() Codice:
#include <stdio.h>
void matrix(int d);
int determinante(int dim,int matrix[dim][dim]);
int indice(int ind);
int main(void)
{
int d; //dimensione matrice
printf("Dimensione matrice?: ");
scanf("%d",&d); //memorizza la dimensione in d
matrix(d); //chiama la funz matrix
system("pause");
return 0;
}
void matrix(int dim) //funz matrix
{
int i,j;
int m[dim][dim]; //crea matrice d*d (dim*dim)
//creazione matrice
printf("Inserire gli elementi della matrice %dx%d :\n",dim,dim); //inserisce i dati nella matrice uno per uno
for(i=0;i<dim;++i) //scorre la linea
{
for(j=0;j<dim;++j) //scorre la colonna
{
printf("Inserire l'elemento della posizione (%d,%d): ", i+1,j+1);
scanf("%d",&m[i][j]); //inserisce il dato nella matrice
}
}
printf("\n\nMatrice creata:\n\n");
for(i=0;i<dim;++i) //scorre la linea
{
for(j=0;j<dim;++j) //scorre la colonna
{
printf("%d\t", m[i][j]);
}
printf("\n");
}
//stampa determinante
printf("\n\nIl determinante della matrice e': %d\n",determinante(dim,m));
}
int determinante(int dim,int matrix[dim][dim])
{
int i,j,k;
int D=0;
//se la matrice e' una 1x1
if(dim==1)
D=matrix[0][0];
for(i=0;i<dim&&dim>1;++i) //scorre righe
{
int mattemp[dim-1][dim-1]; //crea una matrice delle stesse dimensioni di prima (dim-1 perchè se creo una matrice d=3 se comincio a contare da i=0 ne creerebbe una 4x4)
for(j=0;j<dim;++j) //scorre colonne
{
for(k=1;k<dim&&j!=i;++k) //controllo sugli indici, controlla se il contatore è minore della dimensione della matrice e controlla che non sia sulla diagonale
{
if(j<i) //se l'indice j delle colonne è minore dell'indice i delle righe mette nella matrice temporanea mattemp il valore che si torva in quella posizione
mattemp[j][k-1]=matrix[j][k];
if(j>i)
mattemp[j-1][k-1]=matrix[j][k];
}
}
D=D+indice(i)/*passa i alla funz indice che ritorna 1,-1*/*matrix[i][0]/*considera una matrice di un elemento*/*determinante(dim-1,mattemp)/*passa alla funz determinante la dimensione della sottomatrice e la matrice stessa e ne restituisce il determinante*/
; //calcola il determinante
}
return D;
}
//indice 1,-1 a seconda della posizione considerata
int indice(int ind) //funzione indice
{
if(ind%2==0)
return 1; //controlla se la divisione tra indice colonna e indice riga è pari o dispari
else
return -1;
}
__________________
DFI Blood Iron; Intel E6400 (FSB wall>600Mhz
Tagan Piperock Series 600W, Acer AL2216W Ultima modifica di Tioz90 : 23-11-2012 alle 19:33. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Como
Messaggi: 2551
|
Credo di esserci riuscito
Posto qui per referenza futura Codice:
######## Questa sezione legge i dati da mettere nella cella della matrice ######## move $s1,$s0 li $t1,0 forriga: #ciclo for per visualizzare l'indice di riga li $t2,0 forcolonna: #ciclo for per visualizzare l'indice di colonna li $v0,4 #stampa messaggio inserisci la $a0,inserisci syscall li $v0,1 #stampa l'indice di riga move $a0,$t1 syscall li $v0,4 #stampa separatore la $a0,virgola syscall li $v0,1 #stampa l'indice di colonna move $a0,$t2 syscall li $v0,4 #stampa la parentesi di chiusura la $a0,parentesi syscall li $v0,5 #legge il dato da mettere nella cella syscall sw $v0,0($s0) #salva il dato letto nell'array addi $s0,4 #punta al prossimo elemento dell'array li $v0,4 #va a capo la $a0,capo syscall addi $t2,1 #incrementa il contatore di colonna blt $t2,$t0,forcolonna #controllo del for interno (colonna) addi $t1,1 #incrementa il contatore di riga blt $t1,$t0,forriga #controllo del for esterno (riga) ##################################################################################
__________________
DFI Blood Iron; Intel E6400 (FSB wall>600Mhz
Tagan Piperock Series 600W, Acer AL2216W |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:30.




















