Suddividere matrice in arrays di dimensioni variabili

di il
2 risposte

Suddividere matrice in arrays di dimensioni variabili

Salve. Sono nuovo del forum quindi piacere di conoscervi ^^

Ho un problema come da titolo; ve lo espongo:

ho una matrice di adiacenza quadrata (di cui conosco già le dimensioni) siffatta:

0 1 0 1 0
1 0 1 1 1
0 1 0 0 1
1 1 0 0 1
0 1 1 1 0
e risiede su file. Ciò che dovrei fare (e non ci riesco proprio) è, a seguito di un'aquisizione dati dal file, suddividere le 5 righe della matrice in 5 arrays diversi, ciascuno dei quali ha dimensione pari al numero di 1 che sono nella riga. Ad esempio, la prima riga, deve essere posta in un vettore diciamo vett0=[1,3] la seconda vett1=[0,2,3,4]. In pratica dove ci sono gli uno devo inserire nel vettore il valore dell'indice. cosa devo fare?

2 Risposte

  • Re: Suddividere matrice in arrays di dimensioni variabili

    
    Per ogni riga della matrice
        prendo per riferimento il vettore i-esimo che corrisponde alla riga corrente
        per ogni colonna della matrice
             se il valore nell'indice corrente è uguale a 1
                    il vettore della riga i-esima avrà nella prima posizione vuota l'indice 
                            della colonna corrente.
                    incremento la posizione vuota del vettore i-esimo
    
  • Re: Suddividere matrice in arrays di dimensioni variabili

    Ho risolto così...è un pò bovino ma funziona (basta creare un file txt di nome matrice con dentro la matrice come l'ho scritta sopra).
    
    #include<stdlib.h>
    #include<stdio.h>
    
    int* converti(){
      int vett[100];
      FILE *fd;
      int a;
      int j=0;
      int *p;
      int *q;
      int *r;
      int *s;
      int *t;
      p=(int*)malloc(5*sizeof(int));
      q=(int*)malloc(5*sizeof(int));
      r=(int*)malloc(5*sizeof(int));
      s=(int*)malloc(5*sizeof(int));
      t=(int*)malloc(5*sizeof(int));
        	/* apre il file */
      fd=fopen("matrice.txt", "r"); 
    
    		/* verifica errori in apertura */
      if( fd==NULL ) {
        perror("Errore in apertura del file");
        exit(1);
      } 
    
    
    		
    /* legge l'array */
      //if(n>=100) 
        //printf("Troppi elementi da leggere\n");
      //else
        printf("lista adiacenza vertice 0:\n");
        for(a=0; a<=4; a++){
                 fscanf(fd, "%d", &vett[a]);
                           if (vett[a]==1){
                                           p[j]=a;
                                           //printf("lista adiacenza vertice 0:\n");
                                           printf("%d ", p[j]);
                                           j++;
                                           
                                           }
                                           
                                           }
    j=0;
    printf("\n");
    printf("lista adiacenza vertice 1:\n");
    for(a=5; a<=9; a++){
                 fscanf(fd, "%d", &vett[a]);
                           if (vett[a]==1){
                                           q[j]=a-5;
                                           //printf("lista adiacenza vertice 1:\n");
                                           printf("%d ", q[j]);
                                           j++;
                                           
                                           }
                                           
                                           }   
    j=0;
    printf("\n");
    printf("lista adiacenza vertice 2:\n");
    for(a=10; a<=14; a++){
                 fscanf(fd, "%d", &vett[a]);
                           if (vett[a]==1){
                                           r[j]=a-10;
                                           //printf("lista adiacenza vertice 2:\n");
                                           printf("%d ", r[j]);
                                           j++;
                                           
                                           }
                                           
                                           } 
    j=0;
    printf("\n");
    printf("lista adiacenza vertice 3:\n");
    for(a=15; a<=19; a++){
                 fscanf(fd, "%d", &vett[a]);
                           if (vett[a]==1){
                                           s[j]=a-15;
                                           //printf("lista adiacenza vertice 3:\n");
                                           printf("%d ", s[j]);
                                           j++;
                                           
                                           }
                                           
                                           }                                            
    j=0;
    printf("\n");
    printf("lista adiacenza vertice 4:\n");
    for(a=20; a<=24; a++){
                 fscanf(fd, "%d", &vett[a]);
                           if (vett[a]==1){
                                           t[j]=a-20;
                                           //printf("lista adiacenza vertice 4:\n");
                                           printf("%d ", t[j]);
                                           j++;
                                           
                                           }
                                           
                                           }   
    
    /* chiude il file */
      
      fclose(fd);
      printf("\n");
      return (p);
    }
    
    int main() {
        converti();
        system("pause");  
        //vorrei stampare la lista 0 che calcolo in converti()
    }
    
    
    ora però ho un altro problema. Devo recuperare i valori dei 5 vettori che ho allocato nella funzione nel main...mi sto un pò incasinando. Ad esempio se volessi stampare il vettore corrispondente alla lista 0 che calcolo in converti come potrei fare??
    Spero di essere stato comprensibile e che qualcuno possa aiutarmi

    p.s. grazie per i suggerimenti
Devi accedere o registrarti per scrivere nel forum
2 risposte