Agli abbonati di un parco divertimenti è stato assegnato un numero identificativo univoco per gestire l'accesso al parco... Gli accessi vengono memorizzati in un file che contiene righe del tipo:
hh:mm:ss C numero
dove hh è un numero tra [0, 23], mm tra [0, 59] e ss tra [0, 59], C è un carattere che vale "I" in caso di ingresso e "U" in caso di uscita e numero è il codice identificativo di ogni cliente.
I dati sono memorizzati in ordine cronologico crescente.
Il file memorizza gli accessi di un solo giorno.
Si scriva un programma che:
a) definisca una struttura struct accesso utile a memorizzare i dati relativi all'accesso di ciascun utente (dovrà contenere sia l'ora di ingresso che quella di uscita);
b) definisca una funzione carica_dati che carichi i dati contenuti in un file avente la struttura descritta;
c)definisca una funzione permanenza che riceve come argomento una struttura di tipo struct accesso e ristituisca il tempo di permanenza nel parco in secondi; questo dato può a sua volta essere memorizzato in un campo della struttura stessa;
d)definisca una funzione media_accesso che restituisca il tempo medio di accesso calcolato su tutti gli accessi della giornata;
e) definisca la funzione tariffa che calcoli quanto dovuto da ciascun cliente, secondo il seguente piano tariffario:
-fino a 3 ore si paga 1€ ogni 15 minuti, arrotondando il tempo al quarto d'ora per eccesso;
-oltre le 3 ore si paga un costo fisso aggiuntivo di 5€;
f) si crei un file output.txt che contenga un riepilogo del tempo di accesso e del prezzo dovuto da ogni utente che è entrato nel parco, ciascuna riga abbia il formato:
numero_utente durata tariffa
(ordinare i dati in senso crescente di durata)
Questo è il file accessi.txt che ho creato usando la funzione rand():
codice HTML:
00:05:07 I 03135
00:24:06 U 21530
00:55:23 I 34022
01:00:10 I 97763
01:07:15 U 55736
01:13:23 U 02567
01:35:25 U 84421
01:38:23 U 79802
01:54:04 U 18456
01:58:42 I 33069
02:13:25 I 47793
02:13:45 I 13929
02:14:18 U 66413
02:16:05 U 30886
02:23:27 I 16649
03:23:24 I 83426
03:25:53 U 36915
03:36:29 I 36915
04:02:36 U 34022
04:26:53 U 76229
04:33:04 I 79802
04:45:07 I 84421
04:52:45 U 22862
05:02:50 U 13929
05:29:56 I 44919
05:34:49 I 22862
06:34:45 I 74067
06:47:39 U 23058
06:55:09 I 30886
07:04:32 U 95368
07:20:07 I 05211
07:27:14 I 56429
07:37:07 U 75011
07:42:37 I 64370
08:10:43 I 23058
08:12:03 U 05211
08:21:46 U 98315
08:54:05 U 77373
09:20:32 U 65123
09:51:26 I 89172
10:02:24 U 80540
10:16:41 U 56429
10:20:03 U 64370
10:36:42 I 66413
10:38:44 I 98167
10:43:14 U 89172
10:52:20 I 90027
10:53:52 U 03135
11:03:57 I 75198
11:14:38 I 98315
11:22:22 U 60492
11:24:27 U 83426
11:40:03 U 20059
11:45:04 U 68690
12:13:10 U 94324
12:13:52 I 13926
12:39:51 U 90027
12:41:16 I 95368
13:02:11 U 38335
13:02:16 I 98537
13:23:09 I 38335
13:33:05 I 20059
13:38:48 U 13784
14:27:02 U 92777
14:32:52 U 98167
14:42:23 U 41421
14:45:35 U 97763
15:16:15 I 13784
15:30:01 U 02362
15:38:38 U 74067
15:44:01 U 47793
15:49:05 I 60492
16:21:23 U 33069
16:43:00 I 85386
16:47:07 I 92777
16:55:33 U 65782
16:57:28 U 13926
17:04:52 I 65123
17:13:49 I 76229
17:14:54 I 80540
17:26:26 I 55736
18:04:00 U 85386
18:04:32 I 68690
18:13:30 I 41421
18:21:39 I 77373
18:31:54 U 78042
19:15:58 U 44919
19:23:28 I 78042
19:42:47 I 65782
20:18:21 I 02567
20:26:31 I 18456
20:43:49 I 02362
21:01:14 U 16649
21:22:29 U 61393
21:32:01 I 61393
21:35:35 I 21530
21:39:14 I 94324
22:05:57 U 75198
22:16:34 I 75011
22:35:38 U 98537
Ora stavo cercando di fare il punto b e già mi ritrovo problemi nel procedere... questo è quello che ho scritto:
codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct{
int hh, mm, ss;
char *C;
int user;
}accesso;
void carica_dati(char filename[]){
FILE *f;
char buffer[128];
f = fopen(filename, "r");
if(f==NULL)
{
perror("Errore apertura file");
exit(1);
}
else
{
int z = 0;
while((fgets(buffer, sizeof(buffer), f))!=NULL)
z++;
accesso db[z];
int d;
for(d=0; d<z; d++) {
sscanf(buffer, "%d:%d:%d %s %d", &db[d].hh, &db[d].mm, &db[d].ss, db[d].C, &db[d].user);
}
fclose(f);
}
}
int main(int argc, char *argv[])
{
carica_dati(argv[1]);
return 0;
}
Non da nessun errore nella compilazione ma quando lo eseguo mi salta fuori il famoso segmentation fault