|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2003
Città: Hamburg/Torino
Messaggi: 2757
|
[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 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Codice:
printf("\nInserisci il nome del file da aprire:\t");
scanf("%s", filename);
Per il resto, usa il tag CODE (non ce la faccio a leggere codice così! ) e spezza in funzioni ausiliarie più piccole. Poi se ne potrà riparlare. ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Sep 2006
Città: ~
Messaggi: 146
|
Usa il tag CODE.
E comunque si chiama ricorsione (recursion in inglese).
__________________
Computers are like conditioned air: they work fine 'till you open windows.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:42.











) e spezza in funzioni ausiliarie più piccole. Poi se ne potrà riparlare.








