[c] problema con un esercizio

gtsolid
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:

#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
leena1
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);

gtsolid
"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

leena1
Figurati, fammi sapere se va per il resto, o hai bisogno ancora di una mano ;)
Ciaoo

apatriarca
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:
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".

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.