feat: Initial commit
This commit is contained in:
220
Laboratorio 4/Esercizio 2/main.c
Normal file
220
Laboratorio 4/Esercizio 2/main.c
Normal file
@@ -0,0 +1,220 @@
|
||||
// Laboratorio 4 - Esercizio 2 - main.c
|
||||
// Matteo Schiff - s295565
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include "item.h"
|
||||
#define MAX_LEN 30
|
||||
|
||||
const int MAXL = 100;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
k_codice_tratta,
|
||||
k_partenza,
|
||||
k_destinazione,
|
||||
k_data
|
||||
} corsa_keys;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
r_leggi_file,
|
||||
r_leggi_tastiera,
|
||||
r_ricerca_codice,
|
||||
r_cancella_codice,
|
||||
r_cancella_date,
|
||||
r_stampa,
|
||||
r_fine
|
||||
} t_comandi;
|
||||
|
||||
// Trasforma in lowercase tutti i caratteri di una stringa
|
||||
char *toLower(char *s)
|
||||
{
|
||||
for (char *p = s; *p; p++)
|
||||
*p = tolower(*p);
|
||||
return s;
|
||||
}
|
||||
|
||||
t_comandi leggiComando()
|
||||
{
|
||||
t_comandi c;
|
||||
char cmd[MAXL];
|
||||
char tabella[7][20] = {
|
||||
"leggi_file", "leggi_tastiera", "ricerca_codice", "cancella_codice", "cancella_date", "stampa", "fine"};
|
||||
printf("comando (leggi_file/leggi_tastiera/ricerca_codice");
|
||||
printf("/cancella_codice/cancella_date/stampa/fine): ");
|
||||
scanf("%s", cmd);
|
||||
toLower(cmd);
|
||||
c = r_leggi_file;
|
||||
while (c < 8 && strcmp(cmd, tabella[c]) != 0)
|
||||
c++;
|
||||
return (c);
|
||||
}
|
||||
|
||||
void carica_file(char *argomenti, Link * head)
|
||||
{
|
||||
char filename[MAX_LEN+1];
|
||||
FILE *fp_read;
|
||||
if (sscanf(argomenti, " %30s", filename) != 1)
|
||||
{
|
||||
puts("Sintassi non valida. La sintassi è 'carica <nome file>'");
|
||||
return;
|
||||
}
|
||||
|
||||
puts("Carico il nuovo file...");
|
||||
|
||||
if ((fp_read = fopen(filename, "r")) == NULL)
|
||||
{
|
||||
puts("Impossibile aprire il file");
|
||||
return;
|
||||
}
|
||||
|
||||
while(!feof(fp_read)) {
|
||||
Item nuovo = ItemRead(fp_read);
|
||||
// skip invalid entries
|
||||
if (nuovo != NULL)
|
||||
*head = insertOrderedByDate(nuovo, *head);
|
||||
}
|
||||
|
||||
fclose(fp_read);
|
||||
}
|
||||
|
||||
void carica_tastiera(char *argomenti, Link * head)
|
||||
{
|
||||
Item new = ItemFromString(argomenti);
|
||||
|
||||
if (new == NULL) {
|
||||
puts("Anagrafica non valida");
|
||||
return;
|
||||
}
|
||||
|
||||
*head = insertOrderedByDate(new, *head);
|
||||
}
|
||||
|
||||
void ricerca_codice(char *argomenti, Link * head)
|
||||
{
|
||||
char codice[CODE_LEN+1];
|
||||
if (sscanf(argomenti, " %5s", codice) != 1)
|
||||
{
|
||||
puts("Sintassi non valida. La sintassi è 'ricerca_codice <codice>'");
|
||||
return;
|
||||
}
|
||||
|
||||
Item found = getItemByCode(*head, codice);
|
||||
|
||||
if (found == NULL) {
|
||||
puts("Non è stato trovato nessun elemento");
|
||||
return;
|
||||
}
|
||||
|
||||
ItemPrint(stdout, found);
|
||||
}
|
||||
|
||||
void cancella_codice(char *argomenti, Link * head)
|
||||
{
|
||||
char codice[CODE_LEN+1];
|
||||
if (sscanf(argomenti, " %5s", codice) != 1)
|
||||
{
|
||||
puts("Sintassi non valida. La sintassi è 'cancella_codice <codice>'");
|
||||
return;
|
||||
}
|
||||
|
||||
Item found = extractCode(head, codice);
|
||||
|
||||
if (found == NULL) {
|
||||
puts("Non è stato trovato nessun elemento");
|
||||
return;
|
||||
}
|
||||
|
||||
ItemPrint(stdout, found);
|
||||
free(found);
|
||||
}
|
||||
|
||||
void cancella_date(char *argomenti, Link * head)
|
||||
{
|
||||
Date start, end;
|
||||
if (sscanf(argomenti, " %d/%d/%d %d/%d/%d", &(start.day), &(start.month), &(start.year), &(end.day), &(end.month), &(end.year)) != 6)
|
||||
{
|
||||
puts("Sintassi non valida. La sintassi è 'cancella_date <data inizio> <data fine>'");
|
||||
return;
|
||||
}
|
||||
|
||||
Item found;
|
||||
|
||||
while (found = extractDates(head, start, end), found != NULL) {
|
||||
ItemPrint(stdout, found);
|
||||
free(found);
|
||||
}
|
||||
}
|
||||
|
||||
void stampa_file(char *argomenti, Link * head)
|
||||
{
|
||||
FILE *fp_write;
|
||||
char filename[MAX_LEN+1];
|
||||
if (sscanf(argomenti, " %30s", filename) != 1)
|
||||
{
|
||||
puts("Sintassi non valida. La sintassi è 'stampa <nome file>'");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if ((fp_write = fopen(filename, "w")) == NULL)
|
||||
{
|
||||
puts("Impossibile aprire il file");
|
||||
return;
|
||||
}
|
||||
|
||||
printList(fp_write, *head);
|
||||
fclose(fp_write);
|
||||
}
|
||||
|
||||
void menuParola(Link * head)
|
||||
{
|
||||
t_comandi comando;
|
||||
char argomenti[MAXL];
|
||||
int i, continua = 1;
|
||||
while (continua)
|
||||
{
|
||||
comando = leggiComando();
|
||||
fgets(argomenti, MAXL, stdin); /* resto della riga */
|
||||
switch (comando)
|
||||
{
|
||||
case r_leggi_file:
|
||||
carica_file(argomenti, head);
|
||||
break;
|
||||
case r_leggi_tastiera:
|
||||
carica_tastiera(argomenti, head);
|
||||
break;
|
||||
case r_ricerca_codice:
|
||||
ricerca_codice(argomenti, head);
|
||||
break;
|
||||
case r_cancella_codice:
|
||||
cancella_codice(argomenti, head);
|
||||
break;
|
||||
case r_cancella_date:
|
||||
cancella_date(argomenti, head);
|
||||
break;
|
||||
case r_stampa:
|
||||
stampa_file(argomenti, head);
|
||||
break;
|
||||
case r_fine:
|
||||
continua = 0;
|
||||
break;
|
||||
default:
|
||||
puts("Comando non valido\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
Link head = NULL;
|
||||
|
||||
menuParola(&head);
|
||||
freeList(head);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user