Prodotto righe per colonne tra due matrici

di Anonimizzato6881 il
2 risposte
Salve,

ho da fare un piccolo programma dove devo effettuare il prodotto righe per colonne tra due matrici allocate dinamicamente..

Il codice che ho scritto funziona a metà e non riesco a capire il perchè visto che ho seguito passo passo quello che mi era stato detto di fare..

Ecco il codice:
#include <stdio.h>
#include <stdlib.h>

void prodRC (short *a, short *b, short *c, int R, int C, int P);
void main()
{
     short *a,*b,*c;
     short x=1,y=1,i,j;
     int R,C,RR,CC,P;
     
     printf("Inserisci numero righe prima matrice: "); scanf("%d",&R);
     printf("Inserisci numero colonne prima prima matrice: "); scanf("%d",&C);
     RR=C;
     P=C;
     printf("Inserisci numero colonne seconda matrice: "); scanf("%d",&CC);
     printf("\n\n");
     
     a=malloc(R*C*sizeof(short));
     b=malloc(RR*CC*sizeof(short));
     c=malloc(R*CC*sizeof(short));
     
     for(i=0;i<R;i++) //inserisco elementi nella prima matrice
     {
       for(j=0;j<C;j++)
       {
           *(a+i*C+j)=x;
           x=x+1;
       }
     }
     
     for(i=0;i<RR;i++) //inserisco elementi nella seconda matrice
     {
       for(j=0;j<CC;j++)
       {
           *(b+i*CC+j)=y;
           y=y+1;
       }
     }
     
     printf("Prima matrice: \n\n");
     for(i=0;i<R;i++) //visualizzo la prima matrice
     {
       for(j=0;j<C;j++)
       {
           printf("\t%d ",*(a+i*C+j));
       }
       printf("\n\n");
     }
     
     printf("\n\nSeconda matrice: \n\n");
     for(i=0;i<RR;i++) //visualizzo la seconda matrice
     {
       for(j=0;j<CC;j++)
       {
           printf("\t%d ",*(b+i*CC+j));
       }
       printf("\n\n");
     }
     
     prodRC (a,b,c,R,CC,P);
     
     printf("\n\nMatrice prodotto: \n\n");
     for(i=0;i<R;i++) //visualizzo la prima matrice
     {
       for(j=0;j<CC;j++)
       {
           printf("\t%d ",*(c+i*CC+j));
       }
       printf("\n\n");
     }
     
     printf("\n\n\n"); system("pause");     
          
}

void prodRC (short *a, short *b, short *c, int R, int C, int P)
{
     short i,j,k;
     
     for(i=0;i<R;i++) //inserisco tutti 0 nella matrice prodotto
     {
       for(j=0;j<C;j++)
       {
           *(c+i*C+j)=0;
       }
     }
     
     for(i=0;i<R;i++) //inserisco elementi nella prima matrice
     {
       for(j=0;j<C;j++)
       {
         for(k=0;k<P;k++)
         {
            *(c+i*C+j)=*(c+i*C+j)+(*(a+i*C+k))*(*(b+k*C+j));
         }
       }
     }
}
Ecco invece l'output errato :



Ci sbatto la testa ma non riesco a capire dove sbaglio..

Grazie per eventuali consigli.

2 Risposte

  • Impara ad utilizzare il debug o in sua assenza i printf
    
    #include <stdio.h>
    #include <stdlib.h>
    
    void prodRC (short *a, short *b, short *c, short R, short C, short P);
    void main()
    {
    	short *a,*b,*c;
    	short x=1,y=1,i,j;
    	short R,C,RR,CC,P;
    
    	printf("Inserisci numero righe prima matrice: "); scanf("%d",&R);
    	printf("Inserisci numero colonne prima prima matrice: "); scanf("%d",&C);
    	RR=C;
    	P=C;
    	printf("Inserisci numero colonne seconda matrice: "); scanf("%d",&CC);
    	printf("\n\n");
    
    	
    
    	a=malloc(R*C*sizeof(short));
    	b=malloc(RR*CC*sizeof(short));
    	c=malloc(R*CC*sizeof(short));
    
    	for(i=0;i<R;i++) //inserisco elementi nella prima matrice
    	{
    		for(j=0;j<C;j++)
    		{
    			*(a+(i*C)+j)=x;
    			x=x+1;
    		}
    	}
    
    	for(i=0;i<RR;i++) //inserisco elementi nella seconda matrice
    	{
    		for(j=0;j<CC;j++)
    		{
    			*(b+(i*CC)+j)=y;
    			y=y+1;
    		}
    	}
    
    	printf("Prima matrice: \n\n");
    	for(i=0;i<R;i++) //visualizzo la prima matrice
    	{
    		for(j=0;j<C;j++)
    		{
    			printf("\t%d ",*(a+(i*C)+j));
    		}
    		printf("\n\n");
    	}
    
    	printf("\n\nSeconda matrice: \n\n");
    	for(i=0;i<RR;i++) //visualizzo la seconda matrice
    	{
    		for(j=0;j<CC;j++)
    		{
    			printf("\t%d ",*(b+(i*CC)+j));
    		}
    		printf("\n\n");
    	}
    
    	prodRC (a,b,c,R,CC,P);
    
    	printf("\n\nMatrice prodotto: \n\n");
    	for(i=0;i<R;i++) //visualizzo la prima matrice
    	{
    		for(j=0;j<CC;j++)
    		{
    			printf("\t%d ",*(c+(i*CC)+j));
    		}
    		printf("\n\n");
    	}
    
    	printf("\n\n\n"); system("pause");     
    
    }
    
    void prodRC (short *a, short *b, short *c, short R, short C, short P)
    {
    	short i,j,k;
    
    	for(i=0;i<R;i++) //inserisco tutti 0 nella matrice prodotto
    	{
    		for(j=0;j<C;j++)
    		{
    			*(c+(i*C)+j)=0;
    		}
    	}
    
    	for(i=0;i<R;i++) //inserisco elementi nella prima matrice
    	{
    		for(j=0;j<C;j++)
    		{
    			for(k=0;k<P;k++)
    			{
    				printf("%d,%d,%d\t%d * %d = %d\n",i,j,k, *(a+(i*P)+k), *(b+(k*C)+j), *(a+(i*P)+k)*(*(b+(k*C)+j)));
    
    				*(c+(i*C)+j)=*(c+(i*C)+j)+(*(a+(i*P)+k))*(*(b+(k*C)+j));
    			}
    			printf("c[%d][%d] = somma dei 3 numeri sopra\n\n", i, j);
    		}
    	}
    }
    
    solo così puoi trovare gli errori. Ma utilizzare le matrici in forma canonica a[j] ecc non era meglio?
  • Eh lo so.. La prof sta rendendo difficili esercizi semplicissimi.. Forse per farci capire come lavora il computer.. Fatto sta che sto impazzendo xD

    Comunque grazie mille!
Devi accedere o registrarti per scrivere nel forum
2 risposte