/* 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; }