Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500

    [C] esercizio su matrice e ricorsione

    ciao a tutti, ho provato a fare questo esercizio di programmazione C...ho scritto un pò di codice ma l'ho provato al compilatore e mi da un segmentation falut nella funzione percorso() (la funzione che dovrebbe ricorrere)...non sono molto pratico sulla recursione..anzi quasi per niente...però ho letto un pò di cose sul mio deite&deitel e sul kernigha e ritchie...ho provato a fare i primi esercizietti tipo fattoriale o potenza...poi mi è capitato sotto mano questo e ho provato a cimentarmi...

    link_esercizio

    si noti comunque che non ho risolto tutte le richeste dell'esercizio...ma mi sono limitato a trovare il percorso per arrivare dal punto di start a quello di destinazione...senza cercare il minimo percorso

    comunque posto qua il codice...se magari qualcuno ha voglia e tempo per dargli un attimo un'occhiata...thanks
    l'errore è nella funzione ricorsiva "persorso()" (segmentation fault)
    inoltre lavoro su win XP con devC++
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define OK 1
    #define KO -1
    #define N 20
    #define M 10
    
    //prototipi funzioni
    char** alloco_matrice ( char**, int*, int* );
    void print_matrice ( char**, int );
    int check_app ( int, int, int, int, int, int );
    int percorso ( char**, int, int, int, int, int, int, int f[M][N] );
    int dentro ( int x, int y, int nr, int nc );
    
    /* MAIN */
    
    int main ()
    {
        char** mat;     //MATRICE DA ALLOCARE E COPIARE LA MAPPA
        int f[M][N];    //MATRICE DI FLAG UTILIZZATA PER GESTIRE I MOVIMENTI SULLA MAPPA
        int nr, nc;     
        int xS, yS;
        int xA, yA;
        int i, j;
        
        mat = alloco_matrice ( mat, &nr, &nc );
        
        for ( i=0; i<nr; i++ ) {
            for ( j=0; j<nc; j++ ) {
                f[i][j]=0;
            }
        }
        print_matrice ( mat, nr );
        
        printf ("Inserire coordinate partenza [x,y]: ");
        scanf  ("%d%d", &xS, &yS);
        printf ("Inserire coordinate arrivo [x,y]: ");
        scanf  ("%d%d", &xA, &yA);
        
        if ( check_app ( xS, yS, xA, yA, nr, nc ) == OK ) {
             printf ("Coordinate corrette\n");
        }
        else {
             printf ("Coordinate errate\n");
             system("pause");
             exit(1);
        }
        if ( percorso ( mat, xS, yS, xA, yA, nr, nc, f )== OK ) {
             printf ("Percorso trovato\n");
        }
        else {
             printf ("Percorso NON trovato\n");
        }
        system("pause");
        return(1);
    }
    char** alloco_matrice ( char** m, int* nr, int* nc )
    {
           FILE *aptr;
           char n_file[N], tmp[N];
           int i;
           
           printf ("Inserire nome file: ");
           scanf  ("%s", n_file);
           
           aptr = fopen(n_file,"r");
           
           if ( aptr == NULL ) {
                printf ("Errore apertura file\n");
                system("pause");
                exit(1);
           }
           *nr=0;
           while ( fscanf (aptr,"%s", tmp) != EOF ) {
                 (*nr)++;
           }
           
           m = (char**)malloc((*nr)*sizeof(char*));
           
           *nc=strlen(tmp);
           
           for ( i=0; i<(*nr); i++ ) {
               m[i] = (char*)malloc( ((*nr)+1)*sizeof(char) );
           }
           i=0;
           rewind(aptr);
           while ( fscanf (aptr,"%s", m[i]) != EOF && i<(*nr) ) {
                 i++;
           }
           fclose(aptr);
           return(m);
    }
    void print_matrice ( char** m, int nr ) 
    {
         int i;
         
         for ( i=0; i<nr; i++ ) {
             printf ("%s\n", m[i]);
         }
    }
    /* FUNZIONE CONTROLLO INSERIMENTO COORDINATE CORRETTE */
    int check_app ( int xS, int yS, int xA, int yA, int nr, int nc ) 
    {
         if ( (xS>=0) && (xS<nr && xS<nc ) ) {
              if ( (yS>=0) && (yS<nr && yS<nc ) ) {
                   if ( (xA>=0) && (xA<nr && xA<nc ) ) {
                        if ( (yA>=0) && (yA<nr && yA<nc ) ) {
                             return(OK);
                        }
                        else return(KO);
                   }
                   else return (KO);
              }
              else return (KO);
         }
         else return (KO);
    }
    /* FUNZIONE RICORSIVA CHE CALCOLA IL PERCORSO */
    int percorso ( char** m, int xS, int yS, int xA, int yA, int nr, int nc, int f[M][N] )
    {
        int x, y, i, j;
        
        f[xS][yS] = 1;
        for ( x=-1; x<=1; x++ ) {        //CICLI PER MUOVERSI NELLE 8
            for ( y=-1; y<=1; y++ ) {    //CASELLE ADIACENTI AL PUNTO DI PARTENZA
                if ( dentro ( xS+x, yS+y, nr, nc ) == OK ) {
                   if ( xS+x == xA && yS+y == yA ) {
                      return (OK);
                   }
                   else if ( m[xS+x][yS+y] == '.' && f[xS+x][yS+y] == 0 ) {
                     if ( percorso ( m, xS, yS, xA, yA, nr, nc, f ) == OK ) {
                          return(OK);
                     }
                     xS = xS + x;
                     yS = yS + y;
                   }
                }
            }
        }
        return (KO);
    }
    int dentro ( int x, int y, int nr, int nc )
    {
        if ( x<0 || x>=nr ) {
             return (KO);
        }
        else if ( y<0 || y>=nc ) {
             return (KO); 
        }
        else {
             return (OK);
        } 
    }

  2. #2
    codice:
    int percorso ( char** m, int xS, int yS, int xA, int yA, int nr, int nc, int f[][N] )
    Sia sul portotipo che sull'implementazione della funzione
    printf("Programmazione in C!");
    cout<<"Programmazione in C++!";

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.