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: