//Tema d'esame 22.II.17 #include #include //Strutture dati typedef struct { double x; double y; } punto; typedef struct { punto so; punto ne; } rett; //Prototipi funzioni void stampa(rett*); double base(rett*); double alt(rett*); double area(rett*); double per(rett*); void visualizza(int); //Visualizza primi n rettangoli dell'array dinamico puntata dalla //variabile globale Lista double mediaper(int); rett *areamax(int); //Variabili glovbali rett* lista=NULL; //elenco dei rettangolo int main(void) { char menu[]="1.\tAggiungi rettangolo.\n2.\tRimuovi rettangolo.\n3.\tVisualizza.\n4.\tMedia perimetri\n5.\tMax area.\n6.\tEsci.\n"; char c; int cont=1; //cont==0 esce, cont!=0 termina int n=0; //numero di rettangoli in memoria do { printf("%s",menu); c=getchar(); getchar(); switch(c) { case '1': { rett *tmp=realloc(lista, sizeof (rett)*(n+1)); if (tmp==NULL) { printf("Errore nell'allocazione della memoria.\n"); break; } lista=tmp; printf("Vertice sud-ovest in formato (x,y): "); scanf("(%lf,%lf)", &(lista[n].so.x), &(lista[n].so.y)); getchar(); printf("Vertice nord-est in formato (x,y): "); scanf("(%lf,%lf)", &(lista[n].ne.x), &(lista[n].ne.y)); getchar(); n++; } break; case '2': { if (lista==NULL) { printf("Nessun rettangolo in memoria.\n"); break; } rett *tmp=realloc(lista, sizeof (rett)*(n-1)); if (tmp==NULL) { printf("Errore nell'allocazione della memoria.\n"); break; } lista=tmp; n--; if (n==0) lista=NULL; } break; case '3': if (lista==NULL) { printf("Nessun rettangolo in memoria.\n"); break; } visualizza(n); break; case '6': printf ("Fine del programma.\n"); free(lista); cont=0; break; case '4': { if (lista==NULL) { printf("Nessun rettangolo in memoria.\n"); break; } printf("La media dei perimetri dei rettangoli e' %g.\n", mediaper(n)); } break; case '5': { if (lista==NULL) { printf("Nessun rettangolo in memoria.\n"); break; } rett* r=areamax(n); printf("Il rettangolo di area massima e' r="); stampa(r); printf(".\nLa sua area e' pari a %g.\n", area(r)); } break; default: printf("Scelta inesistente.\n"); break; } } while (cont); return 0; } void stampa(rett* r) { printf("{(%g,%g), (%g,%g)}", r->so.x,r->so.y,r->ne.x,r->ne.y); } double base(rett* r) { return (r->ne.x-r->so.x); } double alt(rett* r) { return (r->ne.y-r->so.y); } double area(rett* r) { return (base(r)*alt(r)); } double per(rett* r) { return (2*(base(r)+alt(r))); } void visualizza(int n) { for (int i=0;i