Tioz90
23-11-2012, 18:12
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 :fagiano:
#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;
}
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 :fagiano:
#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;
}