Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [C] Recursione

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1

    [C] Recursione

    Non riesco a far andare questo programma:

    Ho un file di ingresso (file_di_ingresso.txt) di questo tipo:

    1 file_giro_1.txt
    2 file_giro_2.txt

    Dove 1 e' il numero del giro, file_giro_1 il nome, ed a sua volta file_giro_1 conterra'

    1 Raikkonen Ferrari 62
    2 Massa Ferrari 61
    3 Heidfeld BMW 74

    Mentre il secondo per esempio

    1 Raikkonen Ferrari 63
    2 Massa Ferrari 60
    3 Heidfeld BMW 78

    Il mio problema e' soprattutto in lettura, voglio fare una lista di liste, ed una funzione apri_file recursiva che alla prima chiamata passandole come filename "fake" capisca che e' all'inizio e che quindi deve chiedere il primo nome file (quello che contiene poi tutti gli altri dei giri)

    Son quasi sicuro che il problema e' nell'uso dei puntatori, cosa sbaglio?

    Questo il mio main.c

    Ringrazio in anticipo qualsiasi anima pia mi vorra' aiutare


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #define MAX 100
    #define DIM 21

    typedef struct BASE_t
    {
    int numero;
    char nome[DIM];
    char scuderia[DIM];
    int tempo_sul_giro;
    struct BASE_t *next;
    }BASE;

    typedef BASE *base;

    typedef struct giro_t
    {
    int numero_giro;
    char nome_file_giro[DIM];
    BASE info;
    struct giro_t *next;
    }giro;

    typedef giro *list;

    list apri_file(char *filename, int numero_giro, list *tmp);

    void carica_giro(base *piloti, FILE *stream);

    void stampa(list P_testa);



    int main()

    {

    list P_testa = NULL;
    char filename[DIM];

    strcpy(filename, "fake");

    P_testa = apri_file(filename, 0, &P_testa);

    stampa(P_testa);

    return 0;

    }


    list apri_file(char *filename, int numero_giro, list *tmp2)
    {
    FILE *stream;
    list tmp, sentinella, P_coda;

    if(strcmp(filename, "fake") == 0)
    {
    printf("\nInserisci il nome del file da aprire:\t");
    scanf("%s", filename);

    if( (stream = fopen(filename, "r") ) == NULL)
    printf("\nErrore nell'apertura del file '%s'!\n", filename);
    else
    {
    sentinella = calloc(1, sizeof(giro) );
    P_coda = sentinella;

    while(fscanf(stream, "%d%s", &numero_giro, filename) != EOF)
    {
    tmp = calloc(1, sizeof(giro) );

    tmp -> numero_giro = numero_giro;
    strcpy(tmp -> nome_file_giro, filename);

    apri_file(filename, numero_giro, &tmp);

    P_coda -> next = tmp;
    P_coda = tmp;
    }
    }
    }
    else
    {
    if( (stream = fopen(filename, "r") ) == NULL)
    printf("\nErrore nell'apertura del file '%s'\n", filename);
    else
    carica_giro(&( (*tmp2) -> info), stream);
    }

    return sentinella -> next;
    }

    void carica_giro(base *piloti, FILE *stream)
    {
    int numero_pilota, tempo_sul_giro;
    char nome_pilota[DIM], scuderia_pilota[DIM];
    base tmp;

    piloti = calloc(1, sizeof(BASE) ); //sentinella

    while(fscanf(stream, "%i%s%s%i", &numero_pilota, nome_pilota, scuderia_pilota, &tempo_sul_giro)
    != EOF)
    {
    tmp = calloc(1, sizeof(BASE) );

    tmp -> numero = numero_pilota;
    strcpy(tmp -> nome, nome_pilota);
    strcpy(tmp -> scuderia, scuderia_pilota);
    tmp -> tempo_sul_giro = tempo_sul_giro;

    *piloti -> next = tmp;
    *piloti = tmp;
    }

    return;
    }


    void stampa(list P_testa)
    {
    list i;
    base j;

    for(i = P_testa; i != NULL; i = i -> next)
    for(j = i -> info.next; j != NULL; j = j -> next)
    {
    printf("\n%d\t%s:\n", i -> numero_giro, i -> nome_file_giro);
    printf("\n%d\t%s\t%s\t%d\n", j -> numero, j -> nome, j -> scuderia, j -> tempo_sul_giro);
    }

    return;
    }

  2. #2
    a mio avviso dovresti riprogettare la funzione perchè la sua natura non è ricorsiva.
    Per natura ricorsiva intendo una funzione del tipo
    somma(n)=n+somma(n-1).
    Se riesci a scrivere qualcosa del genere allora la tua funzione ha natura ricorsiva e la puoi implementare, se lo desideri e lo ritieni opportuno, in maniera ricorsiva.
    Nel tuo caso ti consiglio di scrivere due funzioni, una che ha lo scopo di aprire il file principale, che contiene l'elenco dei tuoi file, e la seconda che legge i singoli file e li analizza.
    ciao
    sergio

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Quando posti il codice, utilizza i tag [code] e [/code] così rimane leggibile e indentato.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    RICORSIONE
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

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 © 2025 vBulletin Solutions, Inc. All rights reserved.