da inginfoaria » 11/01/2005, 11:59
inolte qlc mi sa dire cm smistare le persone tra le varie categorie senza usare il random in qst prog
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<strings.h>
#include<time.h>
/*dichiarazione delle struct tipo_t, client_t, cat_t e cmp_t che mi servirà per la
funzione cmp (=compare) che riordinerà i risultati ottenuti, stilando una classifica*/
typedef struct {
char *tipoveicolo;
char *categoria;
}tipo_t;
typedef struct prezzotype{
float costoveicolo;
float prezzocategoria;
}prezzo_t;
typedef struct clientype {
tipo_t type;
int maxpersone;
int totalepersone;
int npersone;
prezzo_t preis;
int nposti;
int totaleposti;
int prob;
} client_t;
typedef struct cmptype{
float incasso;
int perstot, ni, pni;
int maxcategoria;
}cmp_t;
/*le funzioni cmppers e cmpinc servono per fare una classifica in base al giorno che ha
trasportato più persone e ha incassato di più*/
void printclient(client_t *t, int n){
int i;
for(i=0; i<n; i++){
printf("%s -%s\n", t[i].type.tipoveicolo, t[i].type.categoria);
printf("%d\n", t[i].totalepersone);
printf("%d\n", t[i].npersone);
printf("%f - %f\n", t[i].preis.costoveicolo, t[i].preis.prezzocategoria);
printf("%d\n", t[i].totaleposti);
printf("%d\n", t[i].prob);
}
}
int cmppers(const void *a,const void *b){
cmp_t*pa=(cmp_t*)a;
cmp_t*pb=(cmp_t*)b;
if(pa->ni> pb->ni)return 1;
if(pa->ni< pb->ni)return -1;
return 0;
}
int cmpinc(const void *a, const void *b){
cmp_t*pa=(cmp_t*)a;
cmp_t*pb=(cmp_t*)b;
if(pa->incasso> pb->incasso)return 1;
if(pa->incasso< pb->incasso)return -1;
return 0;
}
int cmptipoveicolo(const void *a, const void *b){
client_t*pa=(client_t*)a;
client_t*pb=(client_t*)b;
if(pa->type.tipoveicolo>pb ->type.tipoveicolo )return 1;
if(pa->type.tipoveicolo< pb->type.tipoveicolo)return -1;
return 0;
}
int main(int argc, char *argv[]){
// Dichiarazione delle variabili
FILE *fpi;/*fpi è un puntatore a FILE e p è un puntatore a una variabile di
tipo char che mi servirà per far leggere dal programma il file di
testo .txt*/
char *p, b[BUFSIZ];
client_t *traghetto;
cmp_t *classifica;
int n, i, g; /*i e g sono indici, contatori*/
int ni, pni; /*ni è il numero delle persone imbarcate e pni è il numero delle
persone non imbarcate*/
int ngiorni, totpostimezzi, veicolo, posticat;
int nnsaliti,pers, people;
ngiorni=atoi(argv[2]);
fpi=fopen(argv[1], "r"); /*apro il file in sola lettura*/
/*Questo if contolla che il programma sia lanciato nel modo corretto*/
if(argc!=3){
printf("\nIl programma deve essere lanciato in questo modo:\n");
printf("\t>traghetto traghetto.txt <Giorni della simulazione>\n\n");
exit(1);
}
/*contollo inoltre che il puntatore a file non sia nullo*/
if(fpi==NULL){
perror(argv[1]);
exit(1);
}
/*Questo if controlla che il numero di giorni della simulazione sia 10*/
if(ngiorni<10){
printf("i giorni della simulazione devono essere almeno 10\n");
exit(1);
}
p=(fgets(b,sizeof(b),fpi));
n=atoi(b);
traghetto=(client_t*)malloc(n*sizeof(client_t));
/*Allocazione dinamica dello spazio per le struct e ciclo di apertura dell file
e memorizzazione, per l'inserimento die dati nella struct*/
if(traghetto==NULL){
perror(argv[1]);
exit(1);
}
i=0;
while(n>i){
p=strtok(b,"|");
traghetto[i].type.tipoveicolo=(char*)malloc(strlen(p)+1);
strcpy(traghetto[i].type.tipoveicolo,p);
p=strtok(b,"|");
traghetto[i].type.categoria=(char*)malloc(strlen(p)+1);
strcpy(traghetto[i].type.categoria,p);
p=strtok(NULL,"|");
traghetto[i].totalepersone=atoi(p);
p=strtok(NULL,"|");
traghetto[i].npersone=atoi(p);
p=strtok(NULL,"|");
traghetto[i].preis.costoveicolo=atof(p);
p=strtok(NULL,"|");
traghetto[i].preis.prezzocategoria=atof(p);
p=strtok(NULL,"|");
traghetto[i].totaleposti=atoi(p);
p=strtok(NULL,"|");
traghetto[i].prob=atoi(p);
i++;
}
for(i=0; i<n; i++){
float a;
classifica[i].incasso=traghetto[i].preis.costoveicolo+traghetto[i].preis.prezzocategoria;
a=a+classifica[i].incasso;
}
fclose(fpi);
classifica=(cmp_t*)malloc(n*sizeof(cmp_t));
if(classifica==NULL){
perror(argv[1]);
exit(1);
}
/*iniziallizzo random per evitare che i valori vengano ripetuti*/
srand(time(NULL));
/*ciclo dei giorni*/
for(g=0; g<ngiorni; g++){
/*per ogni giornata il numero delle persone in colonna, dei mezzi e il tipo di qst ultimi è casuale*/
posticat=(rand()%1000)+500;
pers=(rand()%2000)+1000;
/*stabilisco quanti sono i posti disponibili per le persone e per i mezzi*/
for(i=0; i<n; i++){
veicolo= rand()%7;
switch(veicolo){
case 0:
traghetto[veicolo].nposti=100;
break;
case 1:
traghetto[veicolo].nposti=150;
break;
case 2:
traghetto[veicolo].nposti=15;
break;
case 3:
traghetto[veicolo].nposti=25;
break;
case 4:
traghetto[veicolo].nposti=200;
break;
case 5:
traghetto[veicolo].nposti=100;
break;
case 6:
traghetto[veicolo].nposti=10;
break;
}
for(veicolo=0; veicolo<7; veicolo++){
traghetto[veicolo].nposti=traghetto[veicolo].nposti+traghetto[veicolo++].nposti;
}
}
for (i=0; i<n; i++){
people=rand()%3;
switch(people){
case 0:
traghetto[people].maxpersone=150;
break;
case 1:
traghetto[people].maxpersone=250;
break;
case 2:
traghetto[people].maxpersone=600;
break;
}
for(people=0; people<3; people++){
traghetto[people].maxpersone=traghetto[people].maxpersone + traghetto[people++].maxpersone;
classifica[people].maxcategoria=pers-traghetto[people].maxpersone;
classifica[people].perstot=classifica[people].perstot+classifica[people].maxcategoria;
classifica[people].pni=pers-classifica[people].perstot;
classifica[people].ni= pers-classifica[people].pni;
}
}
printf("Le persone salite oggi sono %d, mentre quelle non salite %d\n", classifica[people].ni,classifica[people].pni);
printf("L'incasso quotidiano e di %f euro\n", classifica[i].incasso*classifica[people].ni);
}
qsort(traghetto, n, sizeof(client_t), cmptipoveicolo);
printclient(traghetto, n);
printf("CLASSIFICA DEL TIPO DI MEZZI PER GIORNATA\n");
for(i=0; i<n; i++){
printf("%s\n", traghetto[i].type.tipoveicolo);
}
qsort(classifica, n, sizeof(cmp_t), cmppers);
printf("\nCLASSIFICA DEL NUMERO DELLE PERSONE IMBARCATE\n");
for(i=0; i<n; i++){
printf("%d\n",classifica[i].ni);
}
qsort(classifica, n, sizeof(cmp_t), cmpinc);
printf("\nCLASSIFICA DEGLI INCASSI\n");
for(i=0; i<n; i++){
printf("%f\n", classifica[i].incasso);
}
}