#include /* Per IO */ #include /* Per fabs */ #include /* Per islower */ /* Stutture e definizioni di tipi */ typedef struct { double x; double y; } P; // Punto del piano typedef struct { P a; P b; P c; } T; // Triangolo nel piano /* Prototipi */ double det(double M[][3]); /* Determinante di una matrice 3 x 3 */ double area(T* tr); /* Area del triangolo */ int affind(T*); /* Determina se T ha vertici affinemente indipendenti */ void legge_tr(T *, FILE*); /* Inizializza i valori del triangolo leggendoli da file */ void visualizza_ar(int n, T* tr); /* Visualizza array di triangoli */ void visualizza(T* tr); /* Visualizza un triangolo */ int opvalida(char *); /* Controlla che l'opzione specificata sia valida */ double media(double*, int n); /* Media aritmetica di un array di n double */ int max(double*, int n); /* Indice di un elemento massimale di un array di double */ /* Main */ int main(int argc, char* argv[]) { /* Analisi argomenti sulla riga di comando */ if (argc<2) { printf("Errore: Nome del file mancante.\n"); return -1; } /* Apertura del file in lettura */ FILE *f=NULL; if ( (f = fopen(argv[1],"r")) == NULL) { printf("Errore: Non riesco ad aprire in lettura il file specificato.\n"); return -1; } /* Lettura dei dati */ /* Legge numero dei triangoli */ int n = 0; fscanf(f, "%d", &n); getc(f); /* Newline */ /* In alternativa, per trattare il newline: fscanf(f, "%d%*c", &n); L'asterisco in %*c richiede che il dato di tipo char (%c) sia letto da fscanf, ma non assegnato ad una variabile. */ /* Dichiara array di triangoli */ T tr[n]; /* Inizializza array di triangoli */ for (int i=0; i=3 && opvalida(argv[2]))) return 0; double a[n]; /* aree dei triangoli */ for (int i=0; ia).x, (t->a).y, 1}, {(t->b).x, (t->b).y, 1}, {(t->c).x, (t->c).y, 1} }; return 0.5*fabs(det(M)); } /* affind */ int affind(T* t) { if (area(t)) return 1; return 0; } /* legge_tr */ void legge_tr(T* t, FILE* f) { fscanf(f, "(%lf,%lf)", &((t->a).x), &((t->a).y)); getc(f); /* Newline */ fscanf(f, "(%lf,%lf)", &((t->b).x), &((t->b).y)); getc(f); /* Newline */ fscanf(f, "(%lf,%lf)", &((t->c).x), &((t->c).y)); getc(f); /* Newline */ } /* visualizza_ar */ void visualizza_ar(int n, T* t) { for(int i=0; ia.x, t->a.y, t->b.x, t->b.y, t->c.x, t->c.y); } /* media */ double media(double* a, int n) /* Media aritmetica di un array di n double */ { double s=0; for (int i=0; i