Dev - C++ - problema distancias en c++

 
Vista:
sin imagen de perfil
Val: 22
Ha disminuido su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

problema distancias en c++

Publicado por juan (13 intervenciones) el 11/04/2020 20:27:40
Hola, tengo que resolver el siguiente programa en C++ y tengo algunos problemas. Las intrucciones para crear el programa son las siguientes:
Tenemos un fichero llamado coordenadas.txt que esta formado por dos columnas de numeros, la primera columna son las coordenadas x y la segunda columna son las coordenadas y. Puede haber puntos repetidos.

1º Pedir al usuario que introduzca por consola un punto, con las coordenadas x, y.
2º Ir leyedo el fichero coordenadas.txt. El programa debe ir calculando la distancia de cada punto del fichero al punto introducido por consola y debe ir guardando solamente la distancia mayor.
3º En la consola debe aperecer la distancia máxima entre el punto que hemos introducido por teclado y el punto o los puntos del fichero en el que se alcanza dicha distancia.
Yo he hecho lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
 
const char puntosFichero[]="coordenadas.txt";
 
int main()
{
 
    //Pedir las coordenadas del punto por consola
 
    double x,y;
    std::cout << "\n Introduzca el valor de x: ";
    std::cin >> x;
    std::cout << "\n Introduzca el valor de y: ";
    std::cin >> y;
 
	// Leer el fichero
	std::ifstream inFich_vec(puntosFichero,std::ios::in);
	//Si el fichero no se puede abrir da error y finaliza.
	if(!inFich_vec){
		std::cout << "El fichero no se puede abrir. ";
		return 1;
	}
	std::vector<double> X, Y;
	  while(!inFich_vec.eof()){
		double a,b;
		X.push_back(a);
		Y.push_back(b);
	  }
 
        inFich_vec.close();
        if (X.size() == 0){
            std::cout << "El fichero esta vacio";
            return 1;
        }
 
	//----------------------------------
	//DISTANCIA ENTRE LOS DOS PUNTOS
	//------------------------------
 
	double distancia = 0;
    for(unsigned int i=0; i < X.size(); i++){
        distancia = sqrt(pow((X-x),2)+pow((Y-y),2));
        std::cout << "Distancia del punto a la recta: " << distancia <<std::endl;
    }
 
return 0;
}

Mis dudas son las siguientes:
1º Quiero asegurarme de que el fichero tiene las mismas coordenadas en x y en y. Habia pensado lo siguiente pero no funciona:
1
2
3
4
if(X.size() != Y.size()){
        std::cout << "ERROR: falta una coordenada " << std::endl;
            return 1;
}
De hecho cuando en el fichero pongo una coordenada x o y de más la ignora
2º Al calcular la distancia entre los dos puntos, en la consola me aparecen todas las distancias y yo solo quiero la mayor de todas y los puntos en los que aparece.

No se si me he explicado bien XD
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

problema distancias en c++

Publicado por Alfil (1444 intervenciones) el 12/04/2020 07:02:22
No es necesario almacenar los datos en un vector, los datos como tal ya están almacenados en el archivo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
 
const std::string puntosFichero = "coordenadas.txt";
 
int main()
{
    double x1, y1, x2, y2, distancia, max;
 
    std::cout << "\n Introduzca el valor de x: ";
    std::cin >> x1;
    std::cout << "\n Introduzca el valor de y: ";
    std::cin >> y1;
 
    std::ifstream in(puntosFichero, std::ios::in);
 
    if (!in.is_open())
        std::cout << "\nEl fichero no se puede abrir." << std::endl;
 
    else
    {
        int k = 0;
        while (!in.eof())
        {
            in >> x2; in >> y2;
            distancia = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
            if (k++ == 0 || max < distancia)
            {
                max = distancia;
                std::cout << "\nDistancia maxima: " << max;
            }
        }
    }
 
    std::cout << std::endl;
 
    in.close();
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 22
Ha disminuido su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

problema distancias en c++

Publicado por juan (13 intervenciones) el 12/04/2020 13:35:09
Muchas gracias por su respuesta!
Le comento unas cuantas dudas que me surgen.
Es cierto que se puede ir leyendo el fichero directamente sin necesidad de almacenar los datos en vectores pero la unica forma de asegurarme de que en el fichero no hay errores era guardando los datos en un vector, ¿puedo asegurarme de que no hay errores en el fichero solamente leyendolo? Los posibles errores que se me ocurren en el fichero son:
1º) El fichero esté vacio.
2º) Haya caracteres en en el fichero que no sean numeros, por ejemplo, #,@ o una letra cualquiera
3º) no coincidan el numero de coordenadas x con el numero de coordenadas y.
Lo que yo he hecho es lo mismo que tenia antes en los vectores pero directamente sobre el fichero. El problema que tengo es que cuando llega a std::ifstream in(puntosFichero, std::ios::in); el programa da error y se detiene.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
 
const std::string puntosFichero = "coordenadas.txt";
 
int main()
{
    double x1,y1;
 
    std::cout << "\n Introduzca el valor de x: ";
    std::cin >> x1;
 
    std::cout << "\n Introduzca el valor de y: ";
    std::cin >> y1;
 
    std::ifstream in(puntosFichero, std::ios::in);
 
    if (!in.is_open()){
        std::cout << "EL FICHERO NO SE PUEDE ABRIR. " << std::endl;
        return 1;
    }
 
    if(in.fail()){
        std::cout << "DATO NO VALIDO EN FICHERO. "<< std::endl;
        return 1;
    }
    if(in.eof()){
        std::cout << "FICHERO INCOMPLETO" << std::endl;
        return 1;
    }
    double x2,y2,distancia,MAX;
    for(unsigned int i=0; i++){
        while(!in.eof()){
            in >> x2;
            in >> y2;
            distancia = sqrt(pow(x2-x1),2)+pow((y2-y1),2);
            if(i++ ==0 || MAX < distancia){
                MAX = distancia;
                std::cout << "\n La distancia máxima es: " << MAX << std::endl;
            }
        }
    }
    inFich.close();
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar