Suddividere matrice in arrays di dimensioni variabili

di Anonimizzato10244 il
2 risposte
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

  • 
    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
    
  • 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