AYUDA EJERCICIO C++

Iniciado por gomezjuan, 13 Mayo 2020, 18:06 PM

0 Miembros y 1 Visitante están viendo este tema.

gomezjuan

Hola, a ver si alguien puede ayudarme con este ejercicio.
Hay que leer los datos de un fichero de dos columnas coordenadas.txt, pedir por consola que el usuario introduzca un numero (n) y debe hacer la siguiente operación n*(x+y).
Por consola debe imprimir el resultado máximo que se obtiene al hacer esa operación con todas las coordenadas del fichero y los puntos en los que se obtiene ese resultado, si hay puntos repetidos solo tiene que salir una vez por consola.
Un ejemplo:
Si n = 1 y el fichero es:
1 1
2 1
4 5
3 6
6 3
8 1
0 0
3 6
4 3
Por consola debería aparecer: " La solucion maxima es 9 y se obtiene en los puntos (4,5), (3,6), (6,3), (8,1)"
Tengo hecho el código pero no consigo que salga por pantalla todos los puntos en los que se consigue ese resultado, solo me sale el ultimo punto en el que se obtiene 9.
Mi codigo es:

#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

int main()
{
double n;
std::cout << "Valor de n ";
std::cin >> n;

std::ifstream in("coordenadas.txt",std::ios::in);
double operacion, op_max, x_max, y_max;
std::vector<double> x0,y0;
while(!in.eof()){
double X,Y;
in >> X >> Y;
operacion = n*(X+Y);
if(operacion > op_max){
op_max = operacion;
x_max = X;
y_max = Y;
x0.clear();
y0.clear();
x0.push_back(X);
y0.push_back(Y);
}
else if(operacion == op_max){
op_max = operacion;
x_max = X;
y_max = Y;
x0.clear();
y0.clear();
x0.push_back(X);
y0.push_back(Y);
}
}
in.close();
std::cout << "La solucion maxima es " << op_max << " y se consigue en los puntos (" << x_max << "," << y_max << ")" << std::endl;
}


K-YreX

En el segundo caso, si la operación actual es igual a la operación máxima, no tienes que vaciar los vectores usando clear() porque entonces te estarás cargando el resto de valores. El clear() es solo para cuando encuentras una operacion > operacion_max.

Además al final en vez de mostrar x_max, y_max, que son variables simples que contienen un único valor cada una (concretamente el último punto que cumpla la lógica del ejercicio), debes recorrer ambos vectores al mismo tiempo e ir mostrando cada uno de sus elementos.

Suerte.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

gomezjuan

MUCHAS GRACIAS!!
Ya he conseguido que me imprima todos los puntos, pero que puedo hacer para que los puntos repetidos solo aparezcan una vez?
Por ejemplo, el punto (3,6) está dos veces en el fichero y solo quiero que se muestre una vez por pantalla.
He quitado el .clear() como me has dicho y he añadido

for(int i = 0; i < x0.size(); i++){
std::cout << "La solucion maxima es " << op_max << " y se consigue en los puntos (" << x0[i] << "," << y0[i] << ")" << std::endl;
}


K-YreX

Para que no aparezcan puntos repetidos tienes varias opciones.
1. Seguir usando vectores y comprobar manualmente que no se muestren repetidos. Para ello a su vez tienes dos formas de conseguirlo, por lo pronto:
- Cuando (operacion = operacion_max), antes de insertar los nuevos x e y, compruebas que no existen ya.

SI (operacion == operacion_max) ENTONCES
  indice := 0
  MIENTRAS indice < vectorX.size() and !encontrado HACER
    SI vectorX[indice] == x ENTONCES
      encontrado = (vectorY[indice] == y)
    FIN SI
    indice := indice + 1
  FIN MIENTRAS
  SI !encontrado ENTONCES
    vectorX.push_back(x)
    vectorY.push_back(y)
  FIN SI
FIN SI


- La otra opción sería guardarlos todos y a la hora de mostrar comprobar que el elemento actual que vas a mostrar no lo has mostrado ya. La idea es la misma pero ahora tendrías que recorrer desde la actual hacia el inicio. Puedes probarlo pero es menos eficiente ya que estás gastando más memoria al guardarlos repetidos.

2. Crear una class/struct que guarde x e y. Y sustituir ambos vectores por un SET de la STL (http://www.cplusplus.com/reference/set/set/?kw=set).
Desde luego, esta opción es mejor que las anteriores. Primero porque es la más eficiente y segundo porque te permite demostrar un mayor dominio del lenguaje sabiendo encapsular la información dentro de un objeto y eligiendo la mejor estructura de datos para tu propósito.
La ventaja principal del SET es que no guarda valores repetidos. Si tienes una class/struct tal que:
Código (cpp) [Seleccionar]

class Punto {
  private:
    int x;
    int y;
  //...
}

Y defines el operador de igualdad como que un Punto P1 es igual a un Punto P2 cuando ambos atributos (x e y) son iguales. Hecho esto será el SET el que se encargará cada vez que quieras meter un Punto en su interior de comprobar si ya existe un punto igual a ese. De existir, no lo meterá. Todo esto último sin que tú tengas que hacer nada más.

Te dejo que investigues por tu cuenta. Da más satisfacción si lo consigues tú que si te lo dan hecho.
Suerte.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;