#Elaborazione dati file in C

di il
5 risposte

#Elaborazione dati file in C

Salve, stavo provando a risolvere un tema d'esame di informatica.
Implementare un programma in C per gestire il database di un centro di trasporti pubblici di una città. Le informazioni sono salvate in un file il cui nome è passato come primo argomento della command line. Ogni linea del file contiene: il numero ID del bus, il numero della corsa che serve, le coordinate geometriche in metri (ascissa e ordinata) e il tempo in secondi(tutte riferite allo stesso giorno)quando il bus fa il check.

Si sa che: il numero di righe del file non si conosce a priori e i campi sono separati da spazi; il bus ID ha sempre 4 numeri; il numero di corsa massimo 2; le coordinate sono numeri positivi che possono avere un massimo di cinque cifre; il tempo è rappresentato dai secondi contati dall'inizio della giornata(Max 5 digits); le linee sono ordinate secondo il tempo; i bus si muovono sempre, dal primo all'ultimo check; Ci sono al massimo 100 bus. Più linee possono rappresentare tempi differenti.
Inoltre, come secondo argomento della command line è passata una flag:
se questa è '-d': si deve calcolare la distanza percorsa dal bus e stampare in hh:mm:ss il tempo del primo e ultimo check;
se è '-v': si deve calcolare la velocità in km/h (distanza/tempo tra ultimo e primo check).



Ringrazio chi mi risponderà ed aiuterà a risolvere il problema!

Qui il codice che avevo iniziato a fare per il primo caso di flag che già mi dava problemi:




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define M 100


int findmax (int, int);
int findmin (int, int);


typedef struct bus{
int ID;
int route;
int x,y;
int time;
} BUS;

int main(int argc, char* argv[])
{
 FILE * fp;
 BUS transport[M];


 if(argc!=3) return -1;

 fp=fopen(argv[1], "r");
 if(fp==NULL) return -2;


while(!feof(fp)){

    fscanf(fp, "%d %d %d %d %d", &transport.ID, &transport.route, &transport.x, &transport.y, &transport.time);
    
}
fclose(fp);


    if(argv[2]=='-d'){
        for(i=0;i<M;i++){
                for(j=i+1;j<M;j++){
        if(transport[i].ID==transport[j].ID){
            xmin=findmin(transport[i].x, transport[j].x);
            xmax=findmax(transport[i].x, transport[j].x);
            ymax=findmax(transport[i].y, transport[j].y);
            ymin=findmin(transport[i].y, transport[j].y);
            tmin=findmin(transport[i].time,transport[j].time);
            tmax=findmax(transport[i].time,transport[j].time);

            dist += (sqrt(pow(xmax-xmin,2)+pow(ymax-ymin,2)));

                      h1=tmin/3600;
                      m1=(tmin-(3600*h1))/60;
                      s1=(tmin-(3600*h1))-(60*m1);
                      h2=tmax/3600;
                      m2=(tmax-(3600*h2))/60;
                      s2=(tmax-(3600*h2))-(60*m2);
            }
        }
}


 }



for(i=0;i<M;i++)
     printf("%s: %d m. -First Check: %d:%d:%d - Last Check: %d:%d:%d\n", transport[i].ID, dist, h1,m1,s1,h2,m2,s2);

return 0;
}




int findmax (int num1, int num2){
    int max;
     if(num1>num2)
        max=num1;
     else max=num2;
return max;
}

int findmin (int num1, int num2){
    int min;
     if(num1<num2)
        min=num1;
     else min=num2;
return min;
}

5 Risposte

  • Re: #Elaborazione dati file in C

    Se l'hai copiata come si deve non è colpa tua, ma la traccia è comprensibile solo in parte. Non è un problema di predisporre il codice, è proprio questione di capire cosa ti sta chiedendo di fare chi ha scritto il testo. Ad esempio, "i bus si muovono sempre, dal primo all'ultimo check" cosa vuol dire? che gli autobus non fanno mai fermate (con la virgola)? oppure che i bus seguono sempre una direzione, senza mai invertirla (e allora la virgola c'entra come i cavoli a merenda)? Altro esempio: "più linee possono rappresentare tempi differenti"... si parla delle linee dei bus o delle linee del file? Basandosi sul contesto, apparentemente si tratta delle linee (cioè "righe") del file, ma allora perché sottolineare l'ovvietà che più "linee" POSSONO rappresentare tempi differenti? E così via.

    Mah...
  • Re: #Elaborazione dati file in C

    La traccia l'ho copiata così com'era…
    Per questo sono abbastanza confusa, anche se ho capito cosa vuole come esecuzione del programma
  • Re: #Elaborazione dati file in C

    La traccia e' chiara, non serve fare strane elucubrazioni mentali:

    i check sono semplicemente punti a casaccio sun un piano, e si possono immaginare tutti distinti.
    Il bus passa da un check all'altro SEMPRE nella stessa sequenza.
    si puo' anche immaginare che il primo check e l'ultimo siano coincidenti (parte dal deposito, arriva al deposito).

    piu' linee possno rappresentare tempi differenti effettivamente e' un po' criptica MA, se sono autobus, si puo' ben immaginare che l'autobus faccia piu' volte, all'interno della stessa giornata, lo stesso giro
  • Re: #Elaborazione dati file in C

    Io ho pensato che, essendo ordinata secondo i tempi, il tempo alla posizione i=0 di ogni bus che compare nella lista per la prima volta rappresenta il primo check, quindi le coordinate x e y sono quelle di partenza. Il tempo massimo che si trova, invece, l'ultimo check. E questo vale anche per le coordinate (x,y).
    Il mio dubbio è: dopo aver memorizzato i dati dal file, come faccio a controllare la lista non avendo, ad esempio, l'ID del bus come parametro?
  • Re: #Elaborazione dati file in C

    Il tuo record e':

    - ID del bus
    - Numero/ID corsa
    - coordinate x,y del check
    - secondi passati dalle ore 00:00:00 del check

    Puoi considerare il passaggio di giornata quando da numeri vicini a 86400, passi a numeri vicini allo 0 (zero)
    Oppure puoi considerare SOLO una giornata.

    Poiche' il bus fa il check SEMPRE negli stessi punti (non avrebbe senso altrimenti), il numero di punti e' pari al numero di check, al limite MENU UNO se il primo punto e' uguale anche all'ultimo

    HAI l'ID del bus!!!!
Devi accedere o registrarti per scrivere nel forum
5 risposte