// Programa que dados N puntos del espacio tridimensional,
// calcula la distancia máxima entre dos puntos cualesquiera.

#include <iostream>
#include <string>
#include <math.h>

using namespace std;

// Definición de constantes
const int N = 100;

// Definición de tipos
struct tPunto3D
{
  float x, y, z;
};
typedef tPunto3D tPuntos3D[N];


// Declaración de las acciones y funciones

// Se lee un sólo punto
void LeerUnPunto3D(tPunto3D &p);

// Se leen los N puntos
void LeerPuntos3D(tPuntos3D tp);

// Distancia entre dos puntos tridimensionales
float Distancia3D(tPunto3D a, tPunto3D b);

// Distancia máxima entre dos puntos tridimensionales cualesquiera
float MaxDistancia3D(const tPuntos3D tp);

// Programa principal
int main()
{
  // Declaracion de variables
  tPuntos3D tp;
  float     valmax;

  LeerPuntos3D(tp);

  valmax = MaxDistancia3D(tp);

  cout << "La distancia maxima entre dos puntos es " << valmax << endl;

  return 0;
}

// Definición de las acciones y funciones
void LeerUnPunto3D(tPunto3D &p)
{
  cout << "Introduce las 3 coordenadas de un vector:" << endl;
  cin >> p.x >> p.y >> p.z;
}
void LeerPuntos3D(tPuntos3D tp)
{
  int i;

  for ( i = 0; i < N; i++ ) LeerUnPunto3D(tp[i]);
}

float Distancia3D(tPunto3D a, tPunto3D b)
{
  return ( sqrt( powf(a.x - b.x, 2) +
                 powf(a.y - b.y, 2) +
                 powf(a.z - b.z, 2) ) );
}

// Se aplica el esquema de recorrido para calcular la distancia máxima
// entre dos puntos cualesquiera
float MaxDistancia3D(const tPuntos3D tp)
{
  int i = 0, j = 0;
  float aux, valmax = -1;

  while ( i < N-1 )
  {
    // Se calcula el siguiente índice
    j = j + 1;
    // Obsérvese que asignar j=i+1 en lugar de j=i evita muchas consultas repetidas
    if ( j >= N ) { i = i + 1; j = i + 1; }

    // Se trata el siguiente valor
    aux = Distancia3D( (tp[i]), (tp[j]) );
    if ( aux > valmax ) valmax = aux;
  }

  return valmax;
}