Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
Help programma c per la gestione itinerari viaggi...
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
filippofff
Mortale devoto
Mortale devoto


Registrato: 02/09/09 17:16
Messaggi: 6

MessaggioInviato: 02 Set 2009 17:28    Oggetto: Help programma c per la gestione itinerari viaggi... Rispondi citando

Salve, sono nuovo del forum, ho letto velocemente le regole quindi spero di non infrangerle subito alla prima, comunque ho un problema, devo gestire un file.txt che contiene le informazioni relative ad una tratta coperta da un servizio pubblico di trasporto :
FR 3595|1357
-|Pisa|10:15
12:20|Amburgo (Lubecca)|-

FR 3595|26
-|Pisa|09:35
11:40|Amburgo (Lubecca)|-

con tale codifica :

nome servizio | giorni di effettuazione (1 = lunedi)
-| nome stazione | ora partenza
ora arrivo | nome stazione | ora parenza
.......
vorrei sapere come effettuare una lettura precisa da tale file, e che struttura mi consigliate di usare per contenere tali informazioni...

io stò provando a creare una struct apposita ma necessito di un aiuto...

vi ringrazio anticipatamente x il vostro aiuto..
Top
Profilo Invia messaggio privato MSN
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 02 Set 2009 20:37    Oggetto: Rispondi citando

Ciao e benvenuto sul forum!
Potresti per favore precisare che cosa vorresti farci di preciso con i dati?
Mi spiego: se il tuo scopo è arrivare a stampare a video una specie di tabella, tipo quelle degli orari alle fermate dell'autobus, potrebbe essere necessaria una certa struttura mentre se vuoi avere in memoria una struttura meno legata allo scopo finale è probabile che ne occorra un'altra.

Se ci fornissi queste informazioni insieme a quello che hai provato fino ad ora credo che ci sarà d'aiuto per aiutare te!

ciao
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11806
Residenza: Tokelau

MessaggioInviato: 03 Set 2009 10:39    Oggetto: Re: Help programma c per la gestione itinerari viaggi... Rispondi citando

filippofff ha scritto:
vorrei sapere come effettuare una lettura precisa da tale file, e che struttura mi consigliate di usare per contenere tali informazioni


Essendo un file di testo, dovrai leggere il tutto 'per righe', ovviamente, e non con una lettura 'binaria'. Del testo letto dovrai effettuare un 'parse' per trovare i separatori ( il carattere | ) e quindi, isolate le stringhe, dovrai caricare la tua struttura.

Per le stringhe userai un char* (o un char[] se vuoi farla più semplice), per le 'ore' potresti usare un intero 'minuto del giorno' (ore * 60 + minuti) e per i giorni della settimana un byte gestito un bit per volta va benissimo, ne avanzi addirittura uno Wink

Ciao
Top
Profilo Invia messaggio privato HomePage
filippofff
Mortale devoto
Mortale devoto


Registrato: 02/09/09 17:16
Messaggi: 6

MessaggioInviato: 05 Set 2009 15:23    Oggetto: Rispondi citando

Grazie per il benvenuto e scusate se risp solo adesso...cmq x rispondere a freemind, il mio scopro preciso e' questo...ti riporto il testo del mio progetto :

Il problema
Come parte di un sistema di servizi di supporto al turismo, dovete realizzare un modulo che offra delle funzioni
per la pianificazione di viaggi intermodali basati sul trasporto pubblico. Il sistema deve consentire di specificare
un punto di partenza, un punto di destinazione, e proporre uno o più tragitti, sfruttando tutti i mezzi disponibili
(autobus urbani ed extraurbani, ferrovie, traghetti, metropolitane, aerolinee, ecc.) per effettuare il viaggio
richiesto.

Implementazione

Il modulo sarà costituito da un programma in C, destinato a essere eseguito all'interno di un sistema complesso;
quest'ultimo sarà dotato di interfacce diversificate (totem, web, cellulari, ecc.). Il sistema di interfaccia fornisce al
modulo di panificazione la richiesta di un tragitto da effettuare, sotto forma di una singola riga di testo per ogni
richiesta (che il modulo riceve sul suo stdin) nel formato:
data (gg/mm/aaaa)|ora partenza (hh:mm)|origine|destinazione
e deve restituire sul suo stdout una serie di opzioni (si adottino criteri di ragionevolezza per decidere quante e
quali opzioni offrire). Ogni opzione di viaggio avrà il formato
id_opzione|durata_totale
nome_servizio|origine|ora_partenza|destinazione|ora_arrivo
nome_servizio|origine|ora_partenza|destinazione|ora_arrivo
nome_servizio|origine|ora_partenza|destinazione|ora_arrivo
<riga bianca>

Ogni soluzione di viaggio deve essere tale da garantire che i cambi (differenza fra ora di arrivo di un mezzo e ora
di partenza del mezzo successivo) siano di almeno 10 minuti.1 La fine delle opzioni è indicata da una riga
contenente soltanto la stringa ?END? (che appare al posto del nome di una opzione).

Esempio
Input:
1/8/2009|06:00|Pisa CPT Pratale 1|London Victoria Station

Output:

Opzione 1|8:07
Pisa CPT LAM Verde|Pisa CPT Pratale 1|06:18|Pisa Stazione FS|6:31
FS Regionale 5512|Pisa Stazione FS|6:55|Pisa Aeroporto|7:02
Volo FR5312|Pisa Aeroporto|9:00|London Stanstaed|10:50
Bus Express L1|London Stanstaed|11:30|London Victoria Station|14:25

Opzione 2|7:02
Pisa CPT LAM Verde|Pisa CPT Pratale 1|06:18|Pisa Stazione FS|6:31
FS Regionale 4120|Pisa Stazione FS|7:05|Firenze SMN|8:01
Autotrasporti Pirra FI|Firenze SMN|8:30|Firenze Aeroporto|9:20
Volo EZ51|Firenze Aeroporto|9:40|London Gatwick|11:50
Gatwick Express|London Gatwick|12:18|London Victoria Station|13:20
[...]
END

Configurazione
Il modulo leggerà le informazioni sui servizi disponibili da un certo numero di file di configurazione, tutti con lo
stesso formato, che legge in sequenza; i nomi di tali file vengono passati al modulo sulla riga di comando al
momento del lancio da parte del sistema. Ogni file descrive una serie di servizi di trasporto, con il seguente
formato:
nome_servizio|giorni di effettuazione
­|nome stazione|ora partenza
ora arrivo|nome_stazione|ora partenza
1 Questo intervallo è irrealistico nel caso di aeroporti e traghetti, e dovrebbe essere configurato a seconda della
tipologia di cambio, ma lo accettiamo come semplificazione.

ora arrivo|nome_stazione|ora partenza
...
ora arrivo|nome_stazione|ora partenza
ora arrivo|nome_stazione|­

in cui i capolinea di arrivo e destinazione non hanno, rispettivamente, un orario di arrivo e uno di partenza, mentre
le (eventuali) fermate intermedie dispongono di entrambi. I vari servizi sono separati da una riga bianca. Alcuni
file di esempio sono scaricabili dal sito del corso. I giorni di effettuazione del servizio sono espressi da una stringa
di cifre, che rappresenta i giorni in cui il servizio viene effettuato, con 1=lunedì. Per esempio, la stringa ?135?
rappresenta un servizio effettuato solo il lunedì, mercoledì e venerdì.
Poiché il sistema è destinato a servire un numero assai elevato di richieste, è fondamentale che le richieste
vengano servite in tempi brevi: si curi quindi in modo particolare l'efficienza dell'implementazione (sarà
opportuno valutare in questo senso sia le strutture dati che gli algoritmi sviluppati).


questo e' il testo..lungotto ma almeno vi do' tt le informazioni che possiedo....

invece per riposndere a sverx.. io x adesso ho implementato dei metordi di lettura da file....che utilizzano la libreria stdlib.h e il relativo tipo di dato FILE ..e per leggere le informazioni per riconoscere i separatori in vece potresti dirmi come effettuare un 'parse'... grazie milleeeee
Top
Profilo Invia messaggio privato MSN
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 05 Set 2009 15:28    Oggetto: Rispondi citando

Ciao,
mi riprometto di leggere il testo con calma e vedere cosa consigliarti.
Top
Profilo Invia messaggio privato
filippofff
Mortale devoto
Mortale devoto


Registrato: 02/09/09 17:16
Messaggi: 6

MessaggioInviato: 05 Set 2009 15:35    Oggetto: Rispondi citando

grazie mille x la tua disponibilita'....
Top
Profilo Invia messaggio privato MSN
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11806
Residenza: Tokelau

MessaggioInviato: 07 Set 2009 12:21    Oggetto: Rispondi citando

filippofff ha scritto:
per leggere le informazioni per riconoscere i separatori in vece potresti dirmi come effettuare un 'parse'... grazie milleeeee


Guarda le funzioni di ricerca all'interno delle stringhe... in pratica devi fare un ciclo e cercare il prossimo separatore e copiare dal separatore precedente a quello appena trovato in un'altro posto, finchè non è finita la stringa.
Top
Profilo Invia messaggio privato HomePage
filippofff
Mortale devoto
Mortale devoto


Registrato: 02/09/09 17:16
Messaggi: 6

MessaggioInviato: 07 Set 2009 12:32    Oggetto: Rispondi citando

capito adesso vedo che riesco a fare e poi vi faccio sapereeee...grazieee
Top
Profilo Invia messaggio privato MSN
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 09 Set 2009 22:26    Oggetto: Rispondi citando

Senti, mi sembra di capire che di fatto il tuo programma dato un certo input deve ritornare un tragitto fatto da mezzi pubblici.
Ad esempio:
"Devo andare da Milano a Roma partendo alle ore 10."
Tu butti fuori una serie di opzioni tipo:
1) Dalla Stazione centrale di Milano alla stazione di Bologna con partenza alle ora 10.15 e arrivo alle 12.00
2) Dalla stazione di Bologna con il pullman alla stazione dei treni di Qualche paese alle 12.20 e arrivo alle 16.00 (i 10 min minimi ci sono)
3) Dalla stazione dei treni di Qualche paese a Roma con partenza alle 16.11 e arrivo a Roma in treno alle 18.00.

Se così a me più che a dei grafi non viene in mente nulla.
Ogni nodo rappresenterà un luogo di partenza e/o arrivo e tu dovrai ricostruire i vari percorsi possibili.
Non è proprio una robina da nulla tenendo conto che non hai un db e quindi ciao ciao alle query secche che ti tirano fuori le info al volo.

Sbaglio?

P.S.
Ovviamente ho scritto la logica in italiano senza seguire lo standard dichiarato nel progetto per far prima.
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11806
Residenza: Tokelau

MessaggioInviato: 10 Set 2009 10:24    Oggetto: Rispondi citando

freemind ha scritto:
Se così a me più che a dei grafi non viene in mente nulla.


E cosa altro dovrebbe venirti in mente? Un grafo con gli archi pesati ('uno o più valori' associati alle relazioni tra i nodi). I valori potrebbero essere, ad esempio ma non solo questi, prezzo, distanza, tempo di percorrenza.

Poi si tratta di utilizzare degli algoritmi di 'visita' dei grafi. Non sono semplicissimi ma neanche così complicati... alla fine si presentano i percorsi completi 'migliori' rispetto ai pesi che si è scelto di utilizzare per l'ordinamento (prezzo? tempo? distanza?)

Cerca su google 'visite grafi' per farti un'idea...

Ciao
Top
Profilo Invia messaggio privato HomePage
filippofff
Mortale devoto
Mortale devoto


Registrato: 02/09/09 17:16
Messaggi: 6

MessaggioInviato: 10 Set 2009 10:51    Oggetto: Rispondi citando

ok..vediamo...

io praticamente avrei strutturato il problema cosi :

typedef struct _step{
char *nameStartStation;
struct tm hourStar;
char *nameArriveStation;
struct tm hourArrive;
}step ;

typedef step* STEP;
/* Struttura contenente :
* - una tratta,
* - il riferimento alla tratta successiva.
* */
struct _list{
STEP elem;
struct _list *next;
};

typedef struct _list list;
typedef list* LIST;

typedef struct _servizi {
char *nomeServizio;
int giorni[7];
LIST head;
}servizi;

typedef servizi* SERVIZI;

in modo tale da caricare ogni informazione che ricevo in input da file dividendola per tipo di trasporto e caricando le varie tratte in una lista...

che ve ne pare??

ah una domanda, mi sto' rompendo la testa sulle funzioni di lettura da file ad esempio :

1) per leggere una stringa fino a che non incontro '|' io ho usato :

fscanf(dati,"%[^|]",newstep->nameStartStation)

ma avvolte / sempre non si ferma a tale carattere...sapete dirmi il xke??

2) come devo comportarmi con le ore???

ho usato time.h

ma quando in fase di caricamento/lettura provo a salvare i dati nella struttura ottengo un segm fault...
FILE* dati;
aperto correttamente..


int stepStartHour(STEP newstep){
char word;
int i;

fscanf(dati,"%c",&word);

if(fscanf(dati,"%d",newstep->hourStart.tm_hour) == 1)
printf("ok lett ora----> %d\n", newstep->hourStart.tm_hour);
else
printf("errore lett ora----> %d\n",newstep->hourStart.tm_hour);

if(fscanf(dati,"%d",newstep->hourStart.tm_min) == 3)
printf("ok lett ora----> %d\n",min);
else
printf("errore lett ora----> %d\n",newstep->hourStart.tm_min);
return 0;
}

cmq non e' proprio una passeggiata...sono gg che ci lavoro e incontro errori su errori...

3)per quanto riguarda i grafi, avevo pensato ankio di usare i grafi pesati e poi applicarvi dijkstra...ma x adesso sono fermo alla lettura da file....

Vi ringrazio per l'aiuto
Top
Profilo Invia messaggio privato MSN
filippofff
Mortale devoto
Mortale devoto


Registrato: 02/09/09 17:16
Messaggi: 6

MessaggioInviato: 10 Set 2009 12:12    Oggetto: Rispondi citando

Ragazzi perche questo ciclio va in loop infinito??

while((c = fgetc(dati)) != '|'){

newstep->nameStartStation[i] = c;
printf("%c\n",c);
i++;
}

la stringa che deve leggere e' :

Pisa|
Top
Profilo Invia messaggio privato MSN
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11806
Residenza: Tokelau

MessaggioInviato: 10 Set 2009 17:06    Oggetto: Rispondi

secondo me non ti conviene leggere un carattere alla volta o cercare il successivo carattere | nel file, ti conviene leggere una riga intera per volta e poi fare il parsing (magari prima controllandone la validità... ci sono tutti i separatori? Le ore sono valide?)
Top
Profilo Invia messaggio privato HomePage
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 2 ore
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi