[c] problema con un esercizio
ciao a tutti.
il problema a grandi linee è questo:
ho 1 file in cui ogni riga è del tipo
e un 2° file in cui il formato è .
a partire da questi due file, devo STAMPARE A VIDEO nel formato in base alla .
nel senso che in ogni ci potranno salire solo certi tipi di animali
esempio
FILE1
cane 0fj3 onnivoro
oca 5tg7 erbivoro
edera 6fy7 vegetale
FILE2
onnivoro cargo1
vegetale cargo2
erbivoro cargo1
OUTPUT
cargo1
cane 0fj3
edera 6fy7
cargo2
oca 5tg7
ecc...
io ero arrivato a questa conclusione.
il punto è che non funziona!!! ma a me sembra la soluzione giusta...
codice:
cosa ne pensate?
grazie
il problema a grandi linee è questo:
ho 1 file in cui ogni riga è del tipo
e un 2° file in cui il formato è
a partire da questi due file, devo STAMPARE A VIDEO nel formato
nel senso che in ogni
esempio
FILE1
cane 0fj3 onnivoro
oca 5tg7 erbivoro
edera 6fy7 vegetale
FILE2
onnivoro cargo1
vegetale cargo2
erbivoro cargo1
OUTPUT
cargo1
cane 0fj3
edera 6fy7
cargo2
oca 5tg7
ecc...
io ero arrivato a questa conclusione.
il punto è che non funziona!!! ma a me sembra la soluzione giusta...
codice:
#include <stdio.h> #include <string.h> int main() { int i; char snome[37],scode[5],stipo1[49],stipol2[49], scargo[25]; FILE *f1; FILE *f2; if( (f1=fopen("f1.txt","r"))==NULL || (f2=fopen("f2.txt","r"))==NULL) printf("nn se po' fa"); else { do{ fscanf(f1,"%s%s%s",snome[37],scode[5],stipo1[49]); do{ fscanf(f2,"%s%s", stipol2[49],scargo[25]); if(strcmp(stipo1,stipol2)==0) printf("%s\n",scargo); printf("%s %s", snome, scode); }while(!feof(f2)); }while(!feof(f1)); } return 0; }
cosa ne pensate?
grazie
Risposte
Il primo problema è qui:
Non serve più dichiarare la grandezza delle stringhe, già l'hai fatto precedentemente.
Ora gli devi passare semplicemente il puntatore di ogni stringa, cioè:
fscanf(f1,"%s%s%s",snome[37],scode[5],stipo1[49]);
Non serve più dichiarare la grandezza delle stringhe, già l'hai fatto precedentemente.
Ora gli devi passare semplicemente il puntatore di ogni stringa, cioè:
fscanf(f1,"%s%s%s",snome,scode,stipo1);
"leena":
Il primo problema è qui:
fscanf(f1,"%s%s%s",snome[37],scode[5],stipo1[49]);
Non serve più dichiarare la grandezza delle stringhe, già l'hai fatto precedentemente.
Ora gli devi passare semplicemente il puntatore di ogni stringa, cioè:
fscanf(f1,"%s%s%s",snome,scode,stipo1);
grazie
Figurati, fammi sapere se va per il resto, o hai bisogno ancora di una mano 
Ciaoo

Ciaoo
Il cursore che indica la posizione all'interno del file non ritorna alla posizione iniziale una volta raggiunta la fine. Dopo che hai quindi letto una volta il secondo file dovresti resettare il cursore per poterne leggere nuovamente il contenuto. rewind(f2) dopo il ciclo dovrebbe correggere questo errore. Ti sei inoltre dimenticato di andare a capo nel secondo printf del ciclo interno. Quello in cui stampi il nome e il codice.
La logica del tuo programma è comunque sbagliata. Infatti potrebbe essere riscritta nel modo seguente:
Proviamo ad applicare la tua logica ai file di esempio. Per prima cosa leggi ("cane", "0fj3", "onnivoro"). A questo punto scorri il secondo file in cerca di "onnivoro" e lo trovi immediatamente. Stampi quindi il nome del cargo "cargo1" e poi i dati dell'animale "cane 0fj3". A questo punto passi all'animale seguente. Carichi ("oca", "5tg7", "erbivoro") e inizi a cercare "erbivoro" nel secondo file. Lo trovi nella terza riga e stampi nuovamente "cargo1" e poi "oca 5tg7". A questo punto passi alla terza riga e stampi anche "cargo2" e poi "edera 6fy7". In questo esempio non sarebbe neanche più di tanto sbagliato. Se però l'oca e l'edera fossero scambiati, allora avresti il seguente output:
Non è evidentemente quello che vuoi fare. Il modo con cui si risolvono solitamente problemi di questo tipo è quello di caricare le informazioni in una qualche struttura dati in memoria, iterare quindi sui cargo presenti e stampare i nomi e i codici degli animali con una tipologia uguale ad una di quelle presenti. Come mai hai bisogno di qualcosa di questo tipo? Si tratta di una specie di esercizio universitario?
EDIT: La soluzione "classica" proposta in precedenza richiede nel caso generale l'allocazione dinamica della memoria. Non mi viene in effetti in mente alcuna soluzione semplice che non ne faccia uso. È però probabilmente possibile farlo leggendo in continuazione entrambi i file, saltando da una posizione e l'altra. Quali sono le tue conoscenze? Quali sono le limitazione imposte? Sei costretto ad usare il C? Sono in grado di risolverlo in C, ma se avessi scelta ne utilizzerei sicuramente un altro per un problema come questo. La soluzione in C sarebbe infatti probabilmente almeno lunga il doppio di quella in C++ e forse anche 10 volte più lunga di una in qualche linguaggio più "esoterico".
La logica del tuo programma è comunque sbagliata. Infatti potrebbe essere riscritta nel modo seguente:
per ogni (animale, codice, tipo) cerca cargo corrispondente a tipo stampa nome del cargo trovato e nome e codice dell'animale
Proviamo ad applicare la tua logica ai file di esempio. Per prima cosa leggi ("cane", "0fj3", "onnivoro"). A questo punto scorri il secondo file in cerca di "onnivoro" e lo trovi immediatamente. Stampi quindi il nome del cargo "cargo1" e poi i dati dell'animale "cane 0fj3". A questo punto passi all'animale seguente. Carichi ("oca", "5tg7", "erbivoro") e inizi a cercare "erbivoro" nel secondo file. Lo trovi nella terza riga e stampi nuovamente "cargo1" e poi "oca 5tg7". A questo punto passi alla terza riga e stampi anche "cargo2" e poi "edera 6fy7". In questo esempio non sarebbe neanche più di tanto sbagliato. Se però l'oca e l'edera fossero scambiati, allora avresti il seguente output:
cargo1 cane 0fj3 cargo2 edera 6fy7 cargo1 oca 5tg7
Non è evidentemente quello che vuoi fare. Il modo con cui si risolvono solitamente problemi di questo tipo è quello di caricare le informazioni in una qualche struttura dati in memoria, iterare quindi sui cargo presenti e stampare i nomi e i codici degli animali con una tipologia uguale ad una di quelle presenti. Come mai hai bisogno di qualcosa di questo tipo? Si tratta di una specie di esercizio universitario?
EDIT: La soluzione "classica" proposta in precedenza richiede nel caso generale l'allocazione dinamica della memoria. Non mi viene in effetti in mente alcuna soluzione semplice che non ne faccia uso. È però probabilmente possibile farlo leggendo in continuazione entrambi i file, saltando da una posizione e l'altra. Quali sono le tue conoscenze? Quali sono le limitazione imposte? Sei costretto ad usare il C? Sono in grado di risolverlo in C, ma se avessi scelta ne utilizzerei sicuramente un altro per un problema come questo. La soluzione in C sarebbe infatti probabilmente almeno lunga il doppio di quella in C++ e forse anche 10 volte più lunga di una in qualche linguaggio più "esoterico".