Newsgroup: it.comp.lang.c
Titolo: Calcolo area poligono

Salve a tutti ho scritto questo programma, che calcola l'area di un 
poligono partendo dalle coordinate.
ad esemio:
x       y
--------------
4	  0	
4	  7.5
7 	  7.5
7	  3
9      	  0
7	  0
4	  0
l'area deve essere di 25.5, mentre a me viene -1#QNAN0,
deduco che sbaglio nel calcolo dell'area.
grazie in anticipo.
ciao
#include<stdio.h>
#include<stdlib.h>
#define SIZE 15
void salva_angoli(FILE *coord,
                   double vettore_x[],
                   double vettore_y[],
                   int dimensione);
int carica_angoli(FILE *coord,
                   double vettore_x[],
                   double vettore_y[]);
void visuallizza_angoli(double vettore_x[],
                         double vettore_y[],
                         int dimensione);
double area_poligono(double vettore_x[],
                      double vettore_y[],
                      int dimensione);
int main(void){
     double x[SIZE];
     double y[SIZE];
     int n_angoli;
     int risposta;
     double area_p;
     FILE *coordinate;
     /* Inizio menu */
     do{
         printf("1. Inserisci le coordinate degli angoli del poligono\n");
         printf("2. Carica le coordinate degli angoli del poligono\n");
         printf("3. Visualizza i punti inseriti\n");
         printf("4. Calcola l'area del poligono\n");
         printf("5. Esci\n");
         printf("\nInserisci la tua scelta: ");
         scanf("%d", &risposta);
         switch(risposta){
             case 1:
                  printf("Inserisci il numero dei punti che formano il 
poligono: ");
                  scanf("%d", &n_angoli);
                  salva_angoli(coordinate, x, y, n_angoli);
                  break;
             case 2:
                  n_angoli = carica_angoli(coordinate, x, y );
                  break;
             case 3:
                  visuallizza_angoli(x,y, n_angoli);
                  break;
             case 4:
                  area_p = area_poligono(x, y, n_angoli);
                  printf("\nL'area del poligono e': %.2lf", area_p);
                  printf("\n");
                  break;
         }//fine switch
     }//fine do
     while(risposta != 5);
     system("PAUSE");
     return 0;
}
void salva_angoli(FILE *coord,
                   double vettore_x[],
                   double vettore_y[],
                   int dimensione)
{
     int i;
     coord = fopen("coordinate.dat", "w");
     if(coord == NULL){
         printf("\nErrore apertura file in scrittura\n");
     }
     else
         for(i = 0; i < dimensione; i++){
               fflush(stdin);
               printf("x[ %d ] = ", i);
               scanf("%lf", &vettore_x[i]);
               fflush(stdin);
               printf("y[ %d ] = ", i);
               scanf("%lf", &vettore_y[i]);
               fflush(stdin);
               fprintf(coord, "%lf %lf\n", vettore_x[i], vettore_y[i]);
         }//fine for
     fclose(coord);
}
int carica_angoli(FILE *coord,
                   double vettore_x[],
                   double vettore_y[])
{
     int n = 0;
     int status = 0;
     coord = fopen("coordinate.dat", "r");
     if(coord != NULL){
         while(status != EOF)
     {
         status = fscanf(coord, "%lf %lf", &vettore_x[n], &vettore_y[n]);
         n++;
     }
     fclose(coord);
     printf("\nFile letto\n");
}
    return (n);
}
void visuallizza_angoli(double vettore_x[],
                         double vettore_y[],
                         int dimensione)
{
     int i;
     printf("\nCoordinate Poligono\n");
     printf("( x  ,  y )\n");
     printf("-----------\n");
     for(i = 0; i < dimensione - 1; i++){
         printf("(%.1lf , %.1lf)\n", vettore_x[i], vettore_y[i]);
     }
     printf("-----------\n");
     printf("\n");
}
double area_poligono(double vettore_x[],
                      double vettore_y[],
                      int dimensione)
{
     double area = 0;
     int i;
     for(i = 0; i < dimensione - 1; i++){
         area = (area + ((vettore_x[i + 1] + vettore_x[i]) *
                         (vettore_y[i + 1] - vettore_y[i])));
     }
     area = area / 2;
     return(area);
}

 deduco che sbaglio nel calcolo dell'area.
uno sbaglio che potresti commettere nel calcolo dell'area sta nel fatto
che non calcoli il valore assoluto (anche se non penso che possa spiegare il NAN).
Infatti perche' la formula funzioni  punti devono essere dati
in ordine orario o antiorario (e in uno dei due casi, non ricordo)
il risultato avra' segno negativo.
(nel caso sopra a me il programma stampa -25.50)
Una cosa che ho notato e' che usi %lf per stampare i double.
A me sembra che per stampare i double si debba usare %f mentre %lf serve
per leggere i double.
Controlla.
Vedo inoltre che usi fflush(stdin), ma fflush non e' definita per
gli stream di input. Ci sono altri metodi per svuotare il buffer di ingresso.
ciao,
g.

 g.
continuo cmq ad avere quel tipo di errore, mah.
ciao.

continuo cmq ad avere quel tipo di errore, mah.
Codice corretto:
==================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define SIZE 15
void salva_angoli(FILE **coord,double vettore_x[],double
vettore_y[],int dimensione)
{
int i;
FILE *fp = *coord;
fp = fopen("coordinate.dat","w");
if(fp == NULL)
   printf("\nErrore apertura file in scrittura\n");
else
   for(i = 0; i < dimensione; i++)
      {
      printf("x[ %d ] = ",i);
      scanf("%lf",&vettore_x[i]);
      printf("y[ %d ] = ",i);
      scanf("%lf",&vettore_y[i]);
      fprintf(fp,"%lf %lf\n",vettore_x[i],vettore_y[i]);
      }
fclose(fp);
}
int carica_angoli(FILE **coord,double vettore_x[],double
vettore_y[])
{
int n = 0;
int status = 0;
FILE *fp = *coord;
double x,y;
fp = fopen ("coordinate.dat","r");
if(fp != NULL)
   {
   while (1)
      {
      status = fscanf(fp,"%lf %lf",&x,&y);
      if (status == EOF)
         break;
      vettore_x[n] = x;
      vettore_y[n] = y;
      n++;
      }
   fclose(fp);
   printf("\nFile letto\n");
   }
return (n);
}
void visuallizza_angoli(double vettore_x[],double vettore_y[],int
dimensione)
{
int i;
printf("\nCoordinate Poligono\n");
printf("( x  ,  y )\n");
printf("-----------\n");
for(i=0;i<dimensione;i++)
   printf("(%.1f , %.1f)\n",vettore_x[i],vettore_y[i]);
printf("-----------\n\n");
}
double area_poligono(double vettore_x[],double vettore_y[],int
dimensione)
{
double area = 0.0;
int i;
for(i=0;i<dimensione-1;i++)
   area += (vettore_x [i+1] * vettore_y [i]) - (vettore_y [i+1] *
vettore_x [i]);
area += (vettore_x [0] * vettore_y [i]) - (vettore_y [0] *
vettore_x [i]);
area = fabs (area / 2);
return(area);
}
int main (int argc,char *argv [])
{
double x[SIZE],y[SIZE];
int n_angoli;
int risposta;
double area_p;
FILE *coordinate;
do   {
   printf("1. Inserisci le coordinate degli angoli del
poligono\n");
   printf("2. Carica le coordinate degli angoli del poligono\n");
   printf("3. Visualizza i punti inseriti\n");
   printf("4. Calcola l'area del poligono\n");
   printf("5. Esci\n");
   printf("\nInserisci la tua scelta: ");
   scanf("%d",&risposta);
   switch(risposta)
      {
      case 1:
         printf("Inserisci il numero dei punti che formano il
poligono: ");
         scanf("%d",&n_angoli);
         salva_angoli(&coordinate,x,y,n_angoli);
         break;
      case 2:
         n_angoli = carica_angoli(&coordinate,x,y);
         break;
      case 3:
         visuallizza_angoli(x,y,n_angoli);
         break;
      case 4:
         area_p = area_poligono(x,y,n_angoli);
         printf("\nL'area del poligono e': %.2f\n",area_p);
         break;
      }
   } while (risposta != 5);
return 0;
}
==================================
Errori:
- FILE *fp si passa come indirizzo per aver indietro dalla
funzione un valore corretto. FILE e' una struttura, controlla
negli header.
- Il formula dell'area era sbagliata, inoltre deve essere anche
calcolato il valore dell'ultimo punto con il primo. Occorre usare
fabs per ottenerne il valore assoluto fregandosene del senso
orario o antiorario). Se i lati del poligono si intersecano e'
possibile che questa formula non dia un valore corretto.
- In carica_angoli ho cambiato il controllo sulla fine del file.
Leggevi un valore in piu' (e lo sai bene!!!) infatti in
visuallizza_angoli il for era decrementato di 1.

 ......
Ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

         scanf("%d",&n_angoli);
if ((n_angoli > SIZE) || (n_angoli <= 0))
   {
   printf ("Inserito un valore errato.");
   break;
   }