Matrici

Stato
Discussione chiusa ad ulteriori risposte.

black_devil

Utente Silver
10 Giugno 2007
75
13
3
76
Scrivere un programma che, richiesti i valori di due vettori (dimensione vettore decisa dall'utente), a scelta dell'utente decida se mostrare le matrici generate, il prodotto delle due matrici o uscire.

(il testo l'ho scritto io XD ma leggetevi il codice per capire di cosa parlo... (mi spiego un po male :lol: )

Codice:
#include <stdio.h>

int main()
{
	int i,u,rm1,rm2,cm1,cm2,col,rig,h,uno,due,k,righe,colonne;
	int vet1[100][100];
	int vet2[100][100];
	int prod[100][100];
	printf("Prova per registrazione di due matrici con n righe e n colonne\n\n");
	printf("**********MATRICE 1**********\n\n");
	printf("Numero righe (tra 1 e 100): ");
	scanf("%d",&rm1);
	printf("Numero colonne (tra 1 e 100): ");
	scanf("%d",&cm1);
	printf("\n\n");
	printf("**********MATRICE 2**********\n\n");
	printf("Numero righe (tra 1 e 100): ");
	scanf("%d",&rm2);
	printf("Numero colonne (tra 1 e 100): ");
	scanf("%d",&cm2);
	printf("\n**********MATRICE 1**********\n");
	for (rig=0;rig<rm1;rig++) {
		for (col=0;col<cm1;col++) {
			printf("Inserisci linea %d colonna %d val: ",rig+1,col+1);
			scanf("%d",&vet1[rig][col]);
		}
	}
	printf("\n**********MATRICE 2**********\n");
	for (rig=0;rig<rm2;rig++) {
		for (col=0;col<cm2;col++) {
			printf("Inserisci linea %d colonna %d val: ",rig+1,col+1);
			scanf("%d",&vet2[rig][col]);
		}
	}
	printf("Ora decidi cosa fare:\n1\tMostra le matrici ed esce\n2\tMoltiplica le matrici\n0\tEsci\n: ");
	scanf("%d",&h);
	while (h<0 || h>2 ) {
		printf("Inserisci un numero valido!\nInserisci: ");
		scanf("%d",&h);
	}
		
	if (rm1 > rm2) {
		righe = rm1;
	}
	else {
		righe = rm2;
	}
	if (cm1 > cm2) {
		colonne = cm1;
	}
	else {
		colonne = cm2;
	}
	
	for (i=0;i<righe;i++) {
		for (u=0;u<colonne;u++) {
			prod[i][u] = 0;
			for (k=0;k<righe;k++) {
				prod[i][u] = prod[i][u] + vet1[i][k] * vet2[k][u];
			}
		}
	}
	switch (h) {
		case 1:
			printf("**********MOSTRA MATRICI**********\n**********MATRICE 1**********\n\n");
			for (i=0;i<rm1;i++) {
				printf("\n");
				for(u=0;u<cm1;u++) {
					printf("%5d",vet1[i][u]);
				}
			}
			printf("\n\n");
			printf("**********MATRICE 2**********\n\n");
			for (i=0;i<rm2;i++) {
				printf("\n");
				for(u=0;u<cm2;u++) {
					printf("%5d",vet2[i][u]);
				}
			}
			printf("\n\n");
			break;
		case 2:
			printf("**********MOLTIPLICA MATRICI**********\nLa matrice prodotto e:\n");
			for (i=0;i<righe;i++) {
				printf("\n");
				for (u=0;u<colonne;u++) {
					printf("%5d",prod[i][u]);
				}
			}
			printf("\n\n");
			break;
		case 0:
			return 0;
	}
}
http://pczen.ath.cx/matrici-t143.html

è un pò un obrobrio secondo me :lol: consigli per migliorarlo?
e poi ovviamente XD postate anche le vostre solizioni!
 
ecco un esempio un pò più OOP xD

Codice:
#include <iostream>

using namespace std;

class matrix 
{
private:
        int r;
        int c;
        float **matx; 
public:
       matrix (int, int);
       matrix operator+ (matrix&);
       matrix operator- (matrix&);
       matrix operator* (matrix&);
       matrix & operator= (const matrix&); 
       ~matrix ();
       friend void stamp (matrix&);
       friend void carica (matrix&);
};

matrix :: matrix (int a, int b)
{    // allocazione memoria           
     r = a;      c = b;  
     matx = new float* [r];
     for (int i=0;i<r;i++)
         matx[i] = new float[c];
     // inizializzazione memoria 
     for (int i=0;i<r;i++)
           for (int k=0;k<c;k++)
               matx [i][k] = 0.; 
}
matrix matrix :: operator+ (matrix& a)
{
     matrix temp(a.r, a.c);   
     for (int i=0;i<a.r;i++)
         for (int k=0;k<a.c;k++)
             temp.matx[i][k] = matx[i][k] + a.matx[i][k];
     return temp;
}  
matrix matrix :: operator- (matrix& a)
{
     matrix temp(a.r, a.c);   
     for (int i=0;i<a.r;i++)
         for (int k=0;k<a.c;k++)
             temp.matx[i][k] = matx[i][k] - a.matx[i][k];
     return temp;
} 
matrix matrix :: operator* (matrix& a)
{    // le matrici devono essere quadrate
     matrix temp(a.r,a.c);
     for (int i=0;i<a.r;i++)
         for (int k=0;k<a.c;k++)
             for (int t=0;t<a.c;t++)
                 temp.matx[i][k] = temp.matx[i][k] + matx[i][t] * a.matx[t][k];
     return temp;  
}
matrix & matrix :: operator= (const matrix& a)
{
       r = a.r;
       c = a.c;
       for (int i=0;i<r;i++)
           for (int k=0;k<c;k++)
               matx [i][k] = a.matx [i][k];
       return *this;
}
matrix :: ~matrix ()
{
      delete [] matx;
}

void stamp (matrix& a)
{
     for (int i=0;i<a.r;i++)
     {
         for (int k=0;k<a.c;k++)
             cout << a.matx[i][k] << "\t";
     cout << endl;
     }
}
void carica (matrix& a)
{        
     for (int i=0;i<a.r;i++)
         for (int k=0;k<a.c;k++)
         {
             cout << "Matrice (" << i+1 << "," << k+1 << ") = "; 
             cin >> a.matx [i][k];
         }
     cout << "---> Matrice caricata!" << endl << endl;       
}
main ()
{
     int n;
     cout << "Inserisci la dimensione delle matrici quadrate: ";
     cin >> n;  
     matrix foo1(n,n), foo2(n,n), foo3(n,n);
     carica (foo1);
     carica (foo2);
     cout << endl << "foo1: " << endl;
     stamp(foo1);
     cout << endl << "foo2: "<< endl;
     stamp(foo2);
     foo3 = foo1 + foo2;
     cout << endl << "(Somma) foo3: " << endl;
     stamp(foo3);
     foo3 = foo1 - foo2;
     cout << endl << "(Sottrazione) foo3: " << endl;
     stamp(foo3);
     foo3 = foo1 * foo2;
     cout << endl << "(Prodotto) foo3: " << endl;
     stamp(foo3);
     
     cin >> n;
}
 
Mmm ricordo che agli albori della mia esperienza da programmatore in C sapevo allocare dinamicamente gli array utilizzando i puntatori :asd:

Comunque chi lo fa in java? quasi quasi mi ci metto...
 
Senza alcun motivo, giusto per perdere un po'di tempo facendo un esercizietto :lol:

P.S. in realtà vorrei anche vedere quanto il codice che sto scrivendo si discosta dal codice fatto da uno un po'più bravo di me :)
 
metallus ha detto:
Mmm ricordo che agli albori della mia esperienza da programmatore in C sapevo allocare dinamicamente gli array utilizzando i puntatori :asd:

Comunque chi lo fa in java? quasi quasi mi ci metto...

sisi, ma il fatto è che con il mio libro non ci sono ancora arrivato XD duqnue seguo il libro 8D
 
io ci sono quasi...solo il prodotto delle due matrici mi esce un po' sfasato...appena finisco posto!comunque scrivete in quale linguaggio l'avete sviluppato e magari black posta un esempio di prodotto di due matrici!
 
caspio pure io mi sto rincitrullendo sull'algoritmo del prodotto...

comunque un esempio è:

2|2
0|1 (matrice 2x2)

PER

1|1|0
1|3|2 (matrice 2x3)

dà come risultato una matrice di dimensioni 2x3:

4|8|2
1|3|2

In pratica per calcolare il primo elemento (di pedici 1,1) bisogna prendere la prima riga della prima matrice e la prima colonna della seconda, moltiplicare gli elementi fra loro e sommare i valori; quindi in questo caso viene:
2*1 + 2*1 = 4;

Per calcolare l'elemento di pedice 1,2:
2*1 + 2*3

... e così via.
 
ecco il mio in java:
Codice:
import java.io.*;
public class Matrici{
    BufferedReader t=new BufferedReader(new InputStreamReader(System.in));
    int v1a,v1b,v2a,v2b;
    int[][] v1;
    int[][] v2;   
    public Matrici(){  
        try{
            for(int i=1;i<=2;i++){
                System.out.println("\tMatrice "+i);
                System.out.println("Numero di righe(tra 1 e 100):");
                int l1=Integer.parseInt(t.readLine());
                System.out.println("Numero di colonne(tra 1 e 100):");
                int l2=Integer.parseInt(t.readLine());
                if(i==1){v1=new int[l1][l2];v1a=l1;v1b=l2;}else if(i==2){v2=new int[l1][l2];v2a=l1;v2b=l2;}
                for(int k=0;k<l1;k++){
                    for(int j=0;j<l2;j++){
                        System.out.println((k+1)+","+(j+1)+":");
                        if(i==1){
                            v1[k][j]=Integer.parseInt(t.readLine());
                        }if(i==2){
                            v2[k][j]=Integer.parseInt(t.readLine());   
                        }
                    }
                }
            }
            while(true){
                System.out.println("\tMenu:\n1)Mostra Matrici ed esci\n2)Moltiplica Matrici\n3)Esci");
                int f=Integer.parseInt(t.readLine());
                if(f>=1 && f<=3){
                    if(f==1){
                        for(int i=0;i<2;i++){
                            System.out.println("\tMatrice "+(i+1));
                            int s1,s2;
                            if(i==0){
                                s1=v1a;
                                s2=v1b;
                            }else{
                                s1=v2a;
                                s2=v2b;
                            }
                            for(int k=0;k<s1;k++){
                                String a="";
                                for(int z=0;z<s2;z++){
                                    if(i==0){a+=""+v1[k][z]+" | ";}else if(i==1){a+=""+v2[k][z]+" | ";}
                                }System.out.println(a);
                            }
                        
                    }System.out.println("Programma terminato");
                    break;
                    }if(f==2){
                        String x="";
                        int[][] prodotto=new int[v1a][v2b];
                        for (int i=0;i<v1a;i++) {
                            for (int u=0;u<v2b;u++) {
                                int a=0;
                                for (int k=0;k<v1a;k++) {
                                    a=prodotto[i][u] = prodotto[i][u] + v1[i][k] * v2[k][u];   
                                }x+=a+" | ";
                            }System.out.println(x);
                            x="";
                        }

                    }if(f==3){
                        System.out.println("Programma terminato");
                        break;
                    }
                }else{System.out.println("Numero non valido.");}
            }
        }catch(Exception e){
            System.out.println("Valore non accetabile.");
        }   
  }
}

decisamente migliorabile però!
 
Finalmente ce l'ho fatta :asd: anche il mio è decisamente migliorabile, scritto sempre in java:
Codice:
import java.io.*;

public class Matrici {
    private int rows;
    private int cols;
    private int[][] matrice;
    
    public Matrici(){
        rows = 0;
        cols = 0;
    }
    
    public void setRows(int rows){
        this.rows = rows;
    }
    public void setCols(int cols){
        this.cols = cols;
    }
    public void setMatrice(int rows, int cols){
        matrice = new int[rows][cols];
        
    }
    
    public void getMatrice(){
        for(int i = 0; i < matrice[0].length; i++){
            System.out.println("\n");
            for(int j = 0; j < matrice.length; j++){
                System.out.print(matrice[j][i] + " ");
            }
        }
        System.out.println("\n");
    }
    
    public int getRows(){
        return rows;
    }
    
    public int getCols(){
        return cols;
    }
    
    public void reset(){
        for(int i = 0; i < this.rows; i++){
            for(int j = 0; j < this.cols; j++){
                matrice[i][j] = 0;
            }
        }
        
    }
    public static int showMenu(BufferedReader in){
        int request = 0;
        System.out.println("1. Inserisci matrice\n 2. Mostra matrici\n 3. Fai il prodotto fra le matrici\n 4. Vattene a fanculo\n");
        try{
            request = Integer.parseInt(in.readLine());
        }catch(IOException e){
            e.printStackTrace();
            System.exit(1);
        }
        return request;
    }
    
    
    
    public void insertValues(BufferedReader in){
        
        int righe, colonne;
        String request = null;
        System.out.println("Inserisci le dimensioni della matrice (formato: righe,colonne):\n");
        try{
            request = in.readLine();
            
        }catch(IOException e){
            e.printStackTrace();
            System.exit(1);
        }
        colonne = Integer.parseInt(request.substring(0, request.indexOf(",")));
        righe = Integer.parseInt(request.substring(request.indexOf(",") + 1));
        setCols(righe);
        setRows(colonne);
        setMatrice(righe, colonne);
        System.out.println("Inserisci un valore alla volta (inserisci colonna per colonna)\n");
        for(int i = 0; i< righe; i++){
            System.out.println("Riga " + i);
            for(int j = 0; j< colonne ; j++){
                System.out.println("Colonna " + j);
                try{
                   matrice[i][j] = Integer.parseInt(in.readLine());
                }catch(IOException e){
                    e.printStackTrace();
                    System.exit(1);
                }catch(NullPointerException e){
                    e.printStackTrace();
                    System.out.println("Errore nell'inserimento dei dati\n");
                    System.exit(1);
                }
            }
        }
        System.out.println("Colonne di m1: " + getCols());
        System.out.println("Righe di m1: " + getRows());
    }
    
    public static Matrici prodotto(Matrici m1, Matrici m2){
        Matrici prodotto = new Matrici();
        prodotto.reset();
        prodotto.setCols(m2.getCols());
        prodotto.setRows(m1.getRows());
        System.out.println("Il prodotto avrà " + prodotto.getRows() + "righe");
        System.out.println("Il prodotto avrà " + prodotto.getCols() + "colonne");
        prodotto.setMatrice(prodotto.getRows(), prodotto.getCols());
        prodotto.setRows(m1.getRows());
        for(int i = 0; i<prodotto.getCols(); i++){
            for(int j = 0; j <prodotto.getRows(); j++){
                for(int k = 0; k < m1.getCols(); k++){
                    prodotto.matrice[j][i] = prodotto.matrice[j][i] + m1.matrice[k][j]*m2.matrice[i][k];
                 }
            }
        }
        return prodotto;        
    }

    public static void main(String[] args) {
        int matrixCount = 0, request = 0, choose = 0;
        boolean run = true;
        Matrici m1 = new Matrici(), m2 = new Matrici(), prodotto = new Matrici();
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Benvenuto nel programma di gestione delle matrici\n");
        
        while(run)
        {
        System.out.println("Cosa vuoi fare?\n");
        request = showMenu(in);
        switch(request){
            case 1:
                System.out.println("Hai spinto 1");
                if(matrixCount == 0){
                    System.out.println("Inserisci i valori della matrice " + (matrixCount +1));
                    m1.insertValues(in);
                    matrixCount++;
                } else if(matrixCount == 1){
                    System.out.println("Inserisci i valori della matrice " + (matrixCount +1));
                    m2.insertValues(in);
                    matrixCount++;
                } else if(matrixCount == 2){
                    System.out.println("Scegli quale matrice vuoi sovrascrivere\n 1. Matrice 1; 2. Matrice 2; 3. Menu Principale\n");
                    try{
                        choose = Integer.parseInt(in.readLine());
                    }catch(IOException e ){
                        e.printStackTrace();
                        System.exit(1);
                    }if(choose == 1){
                        m1.insertValues(in);
                    }else if(choose == 2){
                        m2.insertValues(in);
                    }else if(choose == 3){
                        request = showMenu(in);
                    }
                }
                break;
            case 2:
                System.out.println("Hai spinto 2");
                
                    try{
                    System.out.println("Sono qui! Stampo la prima matrice!");
                    m1.getMatrice();
                    System.out.println("\n\n");
                    System.out.println("Sono qui! Stampo la seconda matrice");
                    m2.getMatrice();    
                }catch(NullPointerException e){
                    e.printStackTrace();
                    System.out.println("Eccezione NullPointerException lanciata\n");
                    System.out.println("Errore, non hai inserito almeno una delle matrici");
                }
                
                
                break;
            case 3:
                System.out.println("Hai spinto 3");
                if(m1 != null & m2 != null){
                    if(m1.getCols() == m2.getRows()){
                        //il prodotto fra due matrici si può fare solo se sono di dimensioni IxJ e JxK, e darà
                        //come risultato una matrice di dimensioni IxK
                        prodotto = prodotto(m1, m2);
                        prodotto.getMatrice();
                    } else {
                        System.out.println("Colonne di m1: " + m1.getCols());
                        System.out.println("Righe di m2: " + m2.getRows());
                        System.out.println("Impossibile fare il prodotto fra matrici, dimensioni incompatibili");
                    }
                    
                } else {
                    System.out.println("Inserisci entrambe le matrici per fare il prodotto!");
                }
                
                break;
            case 4: 
                System.out.println("Hai spinto 4");
                run = false;
                break;
            default:
                
                
            }
        
        }
        
    }

}
 
ho fatto una prova velocemente e inserendo una matrice 2x3 mi da l'errore quando la visualizzo...tuttavia 202 so troppe secondo me :D!provato il mio?
 
uh!? caspio, a me funzionava, ho provato con una matrice 2x3 e una 3x2... non vorrei aver eliminato righe di codice importanti mentre eliminavo le righe che ho usato per il debug! :censored::censored::censored:

ora verifico e provo il tuo :asd:

edit: ora che ci penso la visualizzazione delle matrici funziona correttamente solo se le matrici sono entrambe inserite, comunque vedo di fixare questo piccolo bug

ri-edit: fixato :asd: ho circondato il blocco che dava problemi con un try{} che lancia un'eccezione di classe NullPointerException, ora è a posto.
 
sia Black_Devil qui che Gallo nell'altro forum fanno riferimento allo stesso sito web http://pczen.ath.cx presumo quindi che siano lo stesso utente con due nick diversi...
 
[ot]perchè scusa..? uno non può avere quanti caxxo di nick gli pare?!

edit: tipo uomosteriman ha anche il nick di asterix[/ot]
 
io ho mandato un pm a black_devil, lui non mi ha ancora risposto. Lo so che non sono dello staff, non ti preoccupare v1r5 che il posto non te lo rubbo.
 
edo1493 ha detto:
io ho mandato un pm a black_devil, lui non mi ha ancora risposto. Lo so che non sono dello staff, non ti preoccupare v1r5 che il posto non te lo rubbo.

Tesoro bello, con i poteri conferitimi da Murdercore, Admin di Infernet X, io posso constatare ciò che tu ti domandi con un paio di click, è altresì lapalissiano dunque, che tu, non avendo i miei poteri non lo puoi fare.
Indi per cui, il compito che spetta a te, è denunciare i tuoi dubbi a chi di dovere, i queli, solvengo i loro compito di carabinieri del web (perchè di questo si tratta), penseranno al resto.
Ordunque, tu fai il tuo dovere e noi il nostro, perchè cosa non fosse, tanto varrebbe mettervi tutti moderatori.

Per quanto concerne le tue ultime parole, casomai tu mi ruBBasti (perchè è di cotanta importanza da poterlo rubare, no?) il posto, farei i salti di gioia, poichè il mio non è un privilegio ma una condanna, lo dimostra il fatto che sono qui a risponderti cordialmente quando spazzolandomene i globi poteri bannare il tuo internet protocol e non vederti mai più.

Torno allo studio dell'Illuminismo, che penso abbia influito non poco su questo mio ultimo reply.

Per chi non afferrasse il tutto:
[ot]
Edo: MI HAI ROTTO LE SFERE.
[/ot]

Grazie e buona permanenza : )
 
Stato
Discussione chiusa ad ulteriori risposte.