PDA

Visualizza la versione completa : confrontare due struct in [C]


varehol
28-01-2009, 12:22
come da titolo vorrei confrontare due struct che devono restituirmi un valore di tempo massimo di consegna da parte di un pony express in C

oregon
28-01-2009, 12:25
E quindi?

Mostra le struct e indica secondo quali elementi effettuare il confronto ...

varehol
28-01-2009, 12:29
typedef struct pacchi
{
char ordinicons;
char ordinaconseff;
}conseseguite;



typedef struct datigiornata

{

float G;/*indica la durata dell' orario di lavoro*/

int tot_dist;//totale distanza percorsa durante la giornata lavorativa

char inizio[20];//luogo di partenza della prima consegna e dove finira' l' ultima consegna

struct tm oraentrata;

struct tm orauscita;

}datiG;

vorrei fare il confronto con degli if che mi consentano di dire se ha raggiunto il tempo massimo allora x nn sforare passa a consegnare i pacchi a bassa prioritÓ, altrimenti se nn ha sforato continua cn quelli ad alta prioritÓ

oregon
28-01-2009, 12:34
Originariamente inviato da varehol

typedef struct pacchi
{
char ordinicons;
char ordinaconseff;
}conseseguite;



typedef struct datigiornata

{

float G;/*indica la durata dell' orario di lavoro*/

int tot_dist;//totale distanza percorsa durante la giornata lavorativa

char inizio[20];//luogo di partenza della prima consegna e dove finira' l' ultima consegna

struct tm oraentrata;

struct tm orauscita;

}datiG;

vorrei fare il confronto con degli if che mi consentano di dire se ha raggiunto il tempo massimo allora x nn sforare passa a consegnare i pacchi a bassa prioritÓ, altrimenti se nn ha sforato continua cn quelli ad alta prioritÓ

Tutto molto bello, ma tutte queste informazioni dove sono? Tu hai chiare tutte le sfumature del tuo programma dato che lo stai scrivendo ... da questa parte, chi ti risponde nel forum non ne sa proprio nulla ...

Quindi, per riassumere e poterti dare una risposta, quali elementi delle strutture indicate sono significativi per il tuo problema e come dovrebbero essere confrontati?

varehol
28-01-2009, 12:36
si devono confrontare datiG e consegneseguite perchŔ in datiG c'Ŕ l' orario di lavoro che mi interessa e poi in consegneseguite c'Ŕ i pacchi che riesce a consegnare quindi Ŕ quello che voglio confrontare tra queste due strutture

varehol
28-01-2009, 15:19
allora chiedo scusa per nn essere stato chiaro e posto il codice sorgente di 2 file distinti


/*PONYEXPRESS.C*/
#include<stdio.h>

#include<time.h>

#include"tempoedistanza.h"

#include<stdlib.h>

/*the rive*/

#define max 40

//#define distance 20

struct tm T;

struct tm Time(char* startPlace, char* endPlace, struct tm ora){return ora;};



typedef struct consegna

{

char partenza[20];/*dove carico il pacco x la prima destinazione*/

char arrivo[20];/*dove scarico il pacco x poi riprendere la corsa*/

int priorita;// priorit� della consegna 0 oppure 1

int distanza;// distanza tra il luogo della partenza e del arrivo

struct tm tempoConsegna;//tempo x la consegna

struct tm caricamento;// ora di caricamento

struct tm consegna; // ora di consegna

}Consegne;



typedef struct datigiornata

{

float G;/*indica la durata dell' orario di lavoro*/

int tot_dist;//totale distanza percorsa durante la giornata lavorativa

char inizio[20];//luogo di partenza della prima consegna e dove finira' l' ultima consegna

struct tm oraentrata;

struct tm orauscita;

}datiG;

typedef struct pacchi{


char ordinicons;
char ordinaconseff;

}conseseguite;


int main(int argc, char **argv)



{

//float distance;



Consegne p[max]={"","", 0}; // Array di Max elementi dove salvera' tutte le tripple lette da file

FILE *in,*out1,*out2;//streams in= File con tutti i dati out1= file con tutte le consegne fatte , out2 : file con le consegne ad alta priorita'

int i=0;//indice x scorrere l' array p

datiG d;

d.tot_dist=0;


/* if(p[i].consegneseguite!=datiG){
printf("il valore e':%c\n",consegneseguite);

}*/
/* else(consegneseguite<=datiG){

printf("il valore e' :%c\n",consegneseguite);
printf("il valore inserito e':%d",datiG);
} */


if((in = fopen(argv[1], "r"))==NULL) {

printf("Can't read file!\n");

}

if((out1 = fopen(argv[2], "w"))==NULL) {

printf("Can't read file!\n");

}

if((out2 = fopen(argv[3], "w"))==NULL) {

printf("Can't read file!\n");

exit(0);

}



fscanf(in,"%f\n",&d.G);

fscanf(in,"%s\n",&d.inizio);

fscanf(in,"%d\n",&d.oraentrata.tm_hour);

fgetc(in);

fscanf(in,"%d\n",&d.oraentrata.tm_min);

printf("\nsono qui %.1f , %s , %d:%d\n ",d.G,d.inizio,d.oraentrata.tm_hour,d.oraentrata.tm _min);



while(!feof(in)){

fscanf(in,"%s %s %d\n",p[i].partenza,p[i].arrivo,&p[i].priorita);



if(p[i].priorita==1) {

printf("Pacco ad alta priorita' processato\n");
fprintf(out1,"%s %s %d\n",p[i].partenza,p[i].arrivo,p[i].priorita);
}


if(p[i].priorita==0)
{
printf("pacco a bassa prioritÓ processato\n");
fprintf(out2,"%s %s %d\n",p[i].partenza,p[i].arrivo,p[i].priorita);

}


p[i].distanza=distance(p[i].partenza, p[i].arrivo);

i++;




}

fclose(in);

fclose(out1);

fclose(out2);





return 0;

}



/*================================================= =========================== timeAndDistance.c ================================================== ============================*/
#include <time.h>
#include "tempoedistanza.h"
struct tm startRush[2], endRush[2];
int sumChars (char *string)
{
int sum = 0;
int i = 0;
while (string[i] != '\0')
{ sum = sum + string[i++];
}
return sum;
}
int distance (char *startPlace, char *endPlace)
{ return ((sumChars (startPlace) + sumChars (endPlace)) * MAGIC1) % MAGIC2; }
int numtime (struct tm t) { return t.tm_min + 60 * t.tm_hour; }
int minTime (char *startPlace, char *endPlace)
{ int hour, min; int dist = distance (startPlace, endPlace) + MAGIC3; hour = (int) (dist / KMpH_MAX); min = ((int) (dist * 60 / KMpH_MAX)) % 60;
return (hour * 60 + min);
}
int maxTime (char *startPlace, char *endPlace)

{ int hour, min; int dist = distance (startPlace, endPlace) + MAGIC4; hour = (int) (dist / KMpH_MIN); min = ((int) (dist * 60 / KMpH_MIN)) % 60; return (hour * 60 + min); }
travelTime (char *startPlace, char *endPlace, struct tm currentTime)
{ if ((numtime (currentTime) >= numtime (startRush[0]) && numtime (currentTime) < numtime (endRush[0])) || (numtime (currentTime) >= numtime (startRush[1]) && numtime (currentTime) < numtime (endRush[1]))) return maxTime (startPlace, endPlace);
else return minTime (startPlace, endPlace); }
int setRushTime (struct tm startTime, struct tm endTime, int which)
{ /* which = 1 se mattina, 2 se pomeriggio */
if (which < 1 || which > 2)
return 0; startRush[which - 1] = startTime;
endRush[which - 1] = endTime;
return which;
}

C-man
28-01-2009, 15:20
Ma.. hai ben chiaro come funzionano le struct in C?
non sono dei contenitori magici che tiran fuori quello che ti serve, devi dichiararle, inizializzarle e poi puoi usale. (spero tu lo abbia fatto)
in questo caso non capisco come tu voglia confrontarle


EDIT


if(p[i].consegneseguite!=datiG)
{
printf("il valore e':%c\n",consegneseguite); }
else(consegneseguite<=datiG){
printf("il valore e' :%c\n",consegneseguite);
printf("il valore inserito e':%d",datiG); }

ecco... credo che un utilizzo simile ottenga come risultato un evocazione demoniaca puittosto che un confronto.

Sarebbe incorretto confrontare due struct direttamente, ma qui fai un passo in piu' confrontando direttamente i tipi di dato...
come dicevo sopra dovresti dichiararle e inizializzarle prima di usarle..
in secondo luogo le struct son formate da piu' variabili, quindi devi confrontarle singolarmente

varehol
28-01-2009, 15:26
Originariamente inviato da C-man
Ma.. hai ben chiaro come funzionano le struct in C?
non sono dei contenitori magici che tiran fuori quello che ti serve, devi dichiararle, inizializzarle e poi puoi usale. (spero tu lo abbia fatto)
in questo caso non capisco come tu voglia confrontarle

le ho dichiarate le struct e le ho anche inizializzate cm si pu˛ vedere dal codice che ho messo .... quello che vorrei fare Ŕ dire che se i datiG si avvicina alla fine della giornata di fare qualche consegna a bassa prioritÓ e di tenere conto anche di quanto tempo ci vuole e di quale strada Ŕ la pi¨ breve x giungere alla prossima destinazione

C-man
28-01-2009, 15:30
vedi l'edit sopra...
il c e' logica, niente di piu', niente di meno.
e come tale non puoi aspettarti di ottenere niente di piu', ne niente di meno di quello che stai scrivendo.
Insomma, non ti vedo ferratissimo, come mai ti sei lanciato in un progetto simile?

varehol
28-01-2009, 15:32
x colpa dell' universitÓ che richiede appunto questo progetto

Loading