01: #include<stdio.h>
02: #include<stdlib.h>
03: 
04: // prototipi delle funzioni chieste al punto #3
05: int   cerchio(int, int);
06: void  rettangolo(int, int, char, int, int*, int*);
07: 
08: int main(int argc, char **argv){
09: 
10:   FILE *fp=fopen("figure.txt", "r"); // nel testo non specifica il nome del file, assumo sia sempre quello
11:   if(!fp)
12:   {
13:     perror("");
14:     exit(EXIT_FAILURE);
15:   }
16: 
17:   int xlastra, ylastra;
18:   char figura;
19: 
20:   while(fscanf(fp, "%d%d %c", &xlastra, &ylastra, &figura) == 3) // leggo i primi due numeri e la lettera che ci sono in tutte le righe, se non riesco a leggere 3 elementi si assume si sia a fine file e si
21:                  // termina
22:   {
23: 
24:     switch(figura)
25:     {
26:       case 'C': // se la figura da lavorare e' un cerchio non devo leggere altro
27:   {
28:     int raggio = cerchio(xlastra, ylastra);
29:     printf("Dimensioni lastra: %d x %d, massimo raggio cerchio: %d\n", xlastra, ylastra, raggio);
30:   }
31:   break;
32:       case 'R': // se la figura da lavorare e' un rettangolo devo leggere sia il tipo di lavorazione che il valore intero K
33:   {
34:     char lavorazione;
35:     int k;
36:     fscanf(fp, " %c %d", &lavorazione, &k);
37: 
38:     int l2, l1; // le uso per avere come valori di ritorno i lati calcolati dalla funzione rettangolo()
39:     rettangolo(xlastra, ylastra, lavorazione, k, &l1, &l2);
40:     if(l1 == -1 || l2 == -1) // non ho trovato
41:       printf("Dimensioni lastra: %3d x %3d, dimensioni rettangolo non determinabili con i dati in ingresso\n", xlastra, ylastra);
42:     else if(lavorazione == 'P')
43:       printf("Dimensioni lastra: %3d x %d, dimensioni rettangolo con perimetro massimo: %3d x %3d\n", xlastra, ylastra, l1, l2);
44:     else
45:       printf("Dimensioni lastra: %3d x %3d, dimensioni rettangolo con area massima:      %3d x %3d\n", xlastra, ylastra, l1, l2);
46:   }
47:     }
48:   }
49: 
50: 
51:   return 0;
52: }
53: 
54: // per il cerchio il calcolo e' semplice
55: // il cerchio massimo che riesco a farci stare ha in pratica come diametro 
56: // il lato piu' corto della lastra diminuito del margine di 1 mm in alto e in basso
57: int   cerchio(int x, int y)
58: {
59:   return (x > y)? (y - 2)/2 : (x - 2)/2; // uso if in linea in quanto piu' semplice
60: }
61: 
62: // per il rettangolo le cose si complicano
63: // uso approccio a forza bruta
64: void  rettangolo(int x, int y, char lavorazione, int k, int *a, int *b)
65: {
66:   *a = -1;
67:   *b = -1;
68:   // uso approccio forza bruta ovvero provo tutti
69:   // i valori (interi) possibili
70:   int massimo = 0; // la uso per capire quando ottengo area/perimetro massimo
71:   int parametro;   // contiene perimetro o area a seconda della lavorazione richiesta
72:   for(int ix = 1; ix <= (x-2); ++ix)
73:     for(int iy = 1; iy <= (y-2); ++iy)
74:     {
75:       if((ix*iy + ix +iy) != k) // verifico se dimensioni lati soddisfino la condizione  che la somma dell'area e dei due lati sia pari a K
76:   continue;
77:       //printf("Esamino possibile rettangolo %dx%d\n", ix, iy); //DEBUG
78: 
79:       if(lavorazione == 'A') // devo massimizzare area
80:   parametro = ix*iy;
81:       else                   // devo massimizzare perimetro
82:   parametro = ix+iy;   // inutile il *2 per stabilire un massimo
83: 
84:       if(massimo < parametro) // guardo se ho un nuovo massimo e in tal caso memorizzo i valori opportuni
85:       {
86:   massimo = parametro;
87:   *a = ix;
88:   *b = iy;
89:       }
90: 
91:       
92:     }
93: }
94: