Cerchi
Un file contiene le specifiche di un insieme di cerchi descritti nel piano cartesiano, un cerchio per riga.
Ciascun cerchio è specificato da una stringa, che ne definisce il nome (max 127 caratteri senza spazi) e da 3 valori interi (x, y, r)
, dove (x, y)
sono le coordinate del centro (interi con segno) e r
è il raggio (intero maggiore di zero).
I valori sono separati da spazi.
Per esempio:
C0 -1 -3 9
C1 0 0 10
C2 0 0 10
C3 -100 10 10
C4 -101 10 9
C5 1 1 1
Il nome del file viene passato al programma da linea di comando.
Suggerimenti generali
Definire una struttura dati struct cerchio
al fine di rappresentare i dati letti da file.
1) Elenco
Si stampi a video l'elenco dei cerchi nello stesso ordine con il quale sono stati letti da file. Si usi il seguente formato:
[CERCHI]
C0 -1 -3 9
C1 0 0 10
C2 0 0 10
C3 -100 10 10
C4 -101 10 9
C5 1 1 1
Suggerimenti
Definire una funzione carica_elenco
come la seguente:
struct cerchio *carica_elenco(FILE *infile, int *n);
Riceve come parametro il nome del file contenente l'elenco dei cerchi e carica un array di strutture struct cerchio
, allocato dinamicamente tramite malloc
e realloc
al suo interno.
La funzione deve ritornare al programma chiamante il vettore così allocato e il numero di elementi caricati, quest'ultima cosa può essere fatta con il passaggio per riferimento di n
.
2) Ordinamento
Definire la funzione ordina
che ordini i cerchi in ordine crescente di area.
Si stampi a video l'elenco ordinato usando il formato:
[ORDINAMENTO]
C5 1 1 1
C0 -1 -3 9
C4 -101 10 9
C1 0 0 10
C2 0 0 10
C3 -100 10 10
Suggerimenti
Avendo caricato tutti i dati in memoria, è possibile utilizzare la qsort
.
L'unica cosa da definire è la funzione che confronta delle strutture struct cerchio
sulla base della loro area.
Per semplificare i calcoli (e renderli più veloci) si tenga presente che il confronto delle aree equivale al confronto dei raggi.
In altre parole, il cerchio con il raggio maggiore è anche quello con l'area maggiore.
Alternativamente, si può implementare la propria funzione di ordinamento, per esempio utilizzando il metodo bubblesort.
3) Relazioni
Individuare le relazioni tra tutte le coppie di cerchi presenti nel file.
Considerati due generici cerchi c1
e c2
, le relazioni di interesse sono tre:
c1
ec2
possono essere coincidentic1
ec2
possono intersecarsi (si considera che non siano coincidenti)- il cerchio
c1
contiene il cerchioc2
Stampare a video i nomi delle coppie di cerchi che presentano una delle relazioni indicate, usando il seguente formato:
[RELAZIONI]
C0 INTERSECA C1
C0 INTERSECA C2
C0 CONTIENE C5
C1 INTERSECA C0
C1 COINCIDE C2
C1 CONTIENE C5
C2 INTERSECA C0
C2 COINCIDE C1
C2 CONTIENE C5
C3 INTERSECA C4
C4 INTERSECA C3
Suggerimenti
Definire la funzione relazione
che, ricevendo come parametri due strutture di tipo struct cerchio
, restituisca un codice che indica le seguenti relazioni tra coppie di cerchi: INTERSECA, CONTIENE, COINCIDE.
Il "codice" che identifica la relazione può essere definito tramite delle #define
(vedi S3.1 per una spiegazione di queste direttive del preprocessore).
Un esempio è il seguente:
#define NESSUNA (0)
#define INTERSECA (1)
#define CONTIENE (2)
#define COINCIDE (3)
int relazione(struct cerchio *c1, struct cerchio *c2);
Le relazioni tra i cerchi possono essere determinate semplicemente verificando delle relazioni sulla lunghezza dei raggi e le distanze tra i centri.
Disponendo della funzione relazione
si può realizzare un ciclo for
che itera su tutti i cerchi, con all'interno un altro ciclo for
che confronta il cerchio di indice i
con quello di indice j
se i != j
.
Verifica automatica
Si utilizzi il tool pvcheck
di verifica automatica per testare il corretto funzionamento del programma (maggiori informazioni circa l'uso di pvcheck
sono disponibili qui).
Il file contenente i test è cerchi.test. Per eseguire i test è necessario scaricare anche il seguente file di dati che è da salvare nella medesima directory del file di test:
Il comando da eseguire per il test è il seguente:
pvcheck -f cerchi.test ./a.out
Il programma può anche essere verificato manualmente eseguendo:
./a.out cerchi.txt
Nella prossima pagina potrai esaminare un esempio di soluzione dell'esercizio.