/* esame Informatica 3/7/2002 versione A
* In questo problema e' necessario accedere a tutti i dati due
* volte, una per trovare la distanza massima e una per selezionare
* sulla base della distanza del punto e della distanza massima
* Poiche' i dati derivano da input e' necessario memorizzarli
* Poiche' e' fornito un limite superiore al numero dei punti da
* trattare la memorizzazione puo' essere su array
* Anche la distanza del punto serve due volte, quindi si
* puo' scegliere se calcolarla due volte oppure calcolarla una
* volta sola e memorizzarla. In questo esempio si e' optato
* per la prima soluzione
* Algoritmo:
- acquisisci N controllando che non superi NMAX
- inizializza la distanza massima a 0
- ripeti N volte
- acquisisci la coppia di coordinate di un punto
- calcola la distanza dist
- se dist supera la distanza massima
- aggiorna la distanza massima
- ricorda il numero d'ordine del punto corrente
- visualizza il numero d'ordine del primo punto a distanza massima
- inizializza a 0 i conteggi dei punti a
distanza inferiore e superiore
- ripeti per ogni punto
- calcola la distanza del punto corrente
- se dist e' inferiore a 1/3 della massima
incrementa il conteggio corrispondente
- se dist e' superiore a 2/3 della massima
incrementa il conteggio corrispondente
- visualizza i conteggi
*/
#include <stdio.h>
#include <math.h>
#define NMAX 100
int main(){
int i, /* contatore punti */
iDM,/* numero d'ordine del punto a distanza massima */
nInf,nSup, /* numeri di punti a distanza
* inferiore e superiore */
N; /* numero totale punti */
typedef struct {
float x,y; /* coordinate del punto */
} punto;
punto p[NMAX]; /* array di punti */
float dist, /* distanza del punto corrente */
distMax;/* distanza massima */
do { /* acquisisce e controlla che N
* non sia troppo grande */
printf("Inserire numero di punti da leggere ");
scanf("%d",&N);
} while (N>NMAX);
distMax = 0; /* inizializza distanza massima */
for (i=0;i<N;i++){
printf("Coordinate punto n. %d ?",i+1);
scanf("%f %f",&p[i].x,&p[i].y);
dist = (float)sqrt(p[i].x*p[i].x + p[i].y*p[i].y);
if (dist>distMax){
distMax=dist;
iDM=i+1;
} /* in caso di piu' punti alla stessa
* distanza massima viene mantenuto il primo
*/
}
printf("Il numero d'ordine del punto a distanza");
printf(" massima e' %d\n", iDM);
nInf=0; nSup=0;
for (i=0;i<N;i++){
dist = (float)sqrt(p[i].x*p[i].x + p[i].y*p[i].y);
if (dist<distMax/3) nInf++;
if (dist>distMax*2/3) nSup++;
}
printf("Tra i punti acquisiti:\n");
printf(" %d sono a distanza inferiore a 1/3 della massima\n",nInf);
printf(" %d sono a distanza superiore a 2/3 della massima\n",nSup);
return 0;
}