Programma in c

di il
11 risposte

Programma in c

Ho avuto un problela durante la scrittura di un programma che chiedeva di prendere una matrice da un file e salvarla in una matrice allocata dinamicamente, poi tramite un generi una rappresentazione compatta della matrice stessa, trascurando gli elementi nulli, in una struttura dati organizzata come segue:
- un vettore principale di R elementi, allocato dinamicamente
- ogni elemento del suddetto vettore contenga a sua volta un puntatore a un vettore,
allocato dinamicamente, adatto a contenere solamente gli elementi non nulli
- ogni cella dei vettori secondari sia una struct caratterizzata da due campi:
1. indice della colonna associata all'elemento memorizzato
2. valore dell'elemento memorizzato.
Inoltre richiede di accedere all'elemento in posizione <i,j>(riga,colonna) per entrambe le rappresentazioni della matrice.
Ho scritto questo codice solo che non riesco a salvare correttamente i valori non nulli nella struttura:
#include <stdio.h>
#include <stdlib.h>

typedef struct mat {

 int col;
 int val;

} Mmat;

int main(int argc, char *argv[]) {

Mmat **vett;
int **matrice;
FILE *a;
int R,C;
int i,j,k=0;
int riga,colonna;
int cont=0;

if ( argc != 2 ) 
 printf("Numero di argomenti immessi non valido\n");

else {
 
  if ( (a = fopen(argv[1],"r") ) == NULL ) 
   printf("Impossbile aprire il filen\n");
  
  else {
   fscanf(a, "%d %d", &R,&C);
   
   matrice = (int **)malloc(R*sizeof(int *));
   for( i=0; i<R; i++ ) 
    matrice[i] = (int *)malloc(C*sizeof(int));

    for( i=0; i<R; i++ ) {
     for( j=0; j<C; j++ ) {
      fscanf(a,"%d", &matrice[i][j]);
     }
    }
   
   fclose(a);

   vett = (Mmat **)malloc(R*sizeof(Mmat *));
   for( i=0; i<R; i++ ) 
    vett[i] = (Mmat *)malloc(R*sizeof(Mmat));
   

   for( i=0; j<R; i++ ) {
    k=0;
    for( j=0; j<C; j++ ) {
     if ( matrice[i][j] != 0 ) {
      vett[i][k].col = j;
      vett[i][k].val = matrice[i][j];
      k++;
     }
    }
    }
    
   printf("Inserire il numero della riga e della colonna per accedere al dato\n");
   scanf("%d %d", &riga,&colonna);

   for( i=0; i<R; i++ ) {
    for( j=0; j<C; j++ ) {
     if ( (i==riga) && (j==colonna) ) {
      printf("Il valore cercato e allocato nella matrice è %d\n", matrice[i][j]);
     }
    }
   }

   for( i=0; i<R; i++ ) {
     for( j=0; j<C; j++ ) { 
      if ( vett[i][j].col == colonna  )
       printf("Il valore cercato e allocato nella struttura di vettori è %d\n", vett[i][j].val);
     }
    }

  }
}

if ( R == C ) {
 for ( i=0; i<R ; i++ ) {
  for ( j=0; j<R; j++ ) {
   if ( matrice[i][j] == matrice[j][i] ) 
   cont++;
  }
 }
}

if ( cont == R ) 
printf("Matrice simmetrica\n");

else
printf("Matrice non simmetrica\n");

for ( i=0; i<R ; i++ ) {
  for ( j=0; j<C; j++ ) {
   printf("%d %d", vett[i][j].col,vett[i][j].val);
}}


return 0;


}
qualcuno potrebbe dirmi come aggiustarlo?
Grazie!!

11 Risposte

  • Re: Programma in c

    Dopo aver memorizzato la matrice da file, fai una lettura per righe che ti consente di contare gli elementi non nulli. A questo punto allochi la riga della matrice compatta e quindi riscandisci la riga originaria memorizzando gli indici nella matrice compatta.

    P.s. per favore cerca di indentare il codice che pubblichi
  • Re: Programma in c

    Ho provato a leggerla per righe solo che durante la compilazione mi accorgo che il metodo utilizzato per la memorizzazione dei dati nella seconda struttura non funziona.
  • Re: Programma in c

    Nel codice che hai scrittura allochi la seconda struttura prima di contare quanti elementi deve contenere.
  • Re: Programma in c

    Si ma la struttura non dovrebbe contenere al massimo C*R elementi? Ossia la grandezza totale della seconda struttura? quindi tecnicamente non dovrebbero esserci problemi relativi allo spazio occupato. Non capisco perchè, nonostante questo, non salva correttamente i valori.
  • Re: Programma in c

    Non sto capendo. Devi allocare la seconda struttura delle dimensioni esatte. Cioè quanti sono i valori non nulli da inserire. Poi rileggere e inserire gli indici.
  • Re: Programma in c

    In realtà non è necessario che la seconda struttura abbia delle dimensioni opportune in quanto pensavo di riempirla e successivamente svuotarla completamente tramite la funzione free().
  • Re: Programma in c

    Ti consiglio di studiare meglio l'allocazione e la deallocazione della memoria.
  • Re: Programma in c

    Lo accetto grazie.
  • Re: Programma in c

    Adesso sono riuscito a risolvere il problema, volevo chiedere se qualcuno avesse un'idea su come verificare che la matrice compatta **vett sia simmetrica o meno.
    Grazie.
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct mat {
    
     int col;
     int val;
    
    } Mmat;
    
    int main(int argc, char *argv[]) {
    
    Mmat **vett;
    int **matrice;
    FILE *a;
    int R,C;
    int i,j,k=0;
    int riga,colonna;
    int cont=0;
    //int cont1=0;
    int *vett1;
    int cont2=0;
    
    if ( argc != 2 ) {
     printf("Numero di argomenti immessi non valido\n");
     exit(1);
    }
    
    else {
     
      if ( (a = fopen(argv[1],"r") ) == NULL )  {
       printf("Impossbile aprire il filen\n");
       exit(1);
      }
    
      else {
       fscanf(a, "%d %d", &R,&C);
       
       matrice = (int **)malloc(R*sizeof(int *));
       for( i=0; i<R; i++ ) 
        matrice[i] = (int *)malloc(C*sizeof(int));
    
        for( i=0; i<R; i++ ) {
         for( j=0; j<C; j++ ) {
          fscanf(a,"%d", &matrice[i][j]);
         }
        }
       
       fclose(a);  
      
     /*  for ( i=0; i<R; i++ ) {
        for ( j=0; j<C; j++ ) {
         if ( matrice[i][j] != 0 ) 
          cont1++;
        } 
       }*/
    
       vett1 = (int *)malloc(R*sizeof(int));  //cont1
    
       for( i=0; i<R; i++ ) { 
        cont2 =0;
        for( j=0; j<C; j++ ) {
         if ( matrice[i][j] != 0 ){
          cont2++;
          vett1[i] = cont2;
         }
        }
       } 
    
       vett = (Mmat **)malloc(R*sizeof(Mmat *));
       for( i=0; i<R; i++ ) 
        vett[i] = (Mmat *)malloc(vett1[i]*sizeof(Mmat));
    
        for ( i=0; i<R; i++ ) {
         k=0;
         for ( j=0; j<C; j++ ) {
          if ( matrice[i][j] != 0 )  {
           vett[i][k].col = j;
           vett[i][k].val = matrice[i][j];
           k++;
          }
        } 
       } 
        
       printf("Inserire il numero della riga e della colonna per accedere al dato\n");
       scanf("%d %d", &riga,&colonna);
    
       for( i=0; i<R; i++ ) {
        for( j=0; j<C; j++ ) {
         if ( (i==riga) && (j==colonna) ) {
          printf("Il valore cercato e allocato nella matrice è %d\n", matrice[i][j]);
         }
        }
       }
    
       for( i=0; i<R; i++ ) {
         for( j=0; j<vett1[i]; j++ ) { 
          if ( vett[i][j].col == colonna  )
           printf("Il valore cercato e allocato nella struttura di vettori è %d\n", vett[i][j].val);
         }
        }
      }
    }
    
    if ( R == C ) {
     for ( i=0; i<R ; i++ ) {
      for ( j=0; j<R; j++ ) {
       if ( matrice[i][j] == matrice[j][i] ) 
       cont++;
      }
     }
    }
    
    if ( cont == R ) 
    printf("Matrice simmetrica\n");
    
    else
    printf("Matrice non simmetrica\n");
    
    for(i=0; i<R; i++ ) {
    printf("%d ", vett1[i]);
    }
    
    return 0;
    
    
    }
    
    
  • Re: Programma in c

    Beh la trasponi, scambiando righe e colonne, e verifichi che sia uguale elemento per elemento altrimenti non è simmetrica
  • Re: Programma in c

    Il problema è che devo capire se la matrice è simmetrica da una matrice compatta costrutita a partire dai soli elementi non nulli della matrice originale. In questa nuova matrice vengono salvate solo i valori non nulli e la loro colonna.
Devi accedere o registrarti per scrivere nel forum
11 risposte