elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  AYUDA EJERCICIO C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: AYUDA EJERCICIO C++  (Leído 2,173 veces)
gomezjuan

Desconectado Desconectado

Mensajes: 11


Ver Perfil
AYUDA EJERCICIO C++
« en: 13 Mayo 2020, 18:06 pm »

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:
Código:
#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;
}


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: AYUDA EJERCICIO C++
« Respuesta #1 en: 13 Mayo 2020, 18:35 pm »

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.


En línea

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

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: AYUDA EJERCICIO C++
« Respuesta #2 en: 13 Mayo 2020, 18:55 pm »

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
Código:
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;
}

En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: AYUDA EJERCICIO C++
« Respuesta #3 en: 13 Mayo 2020, 19:17 pm »

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.
Código:
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
  1. class Punto {
  2.  private:
  3.    int x;
  4.    int y;
  5.  //...
  6. }
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.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Ayuda] Ejercicio C 100
Ejercicios
Dem0ny 2 6,007 Último mensaje 19 Diciembre 2007, 22:45 pm
por Dem0ny
Ayuda co un ejercicio de C#
.NET (C#, VB.NET, ASP)
hitori batusai 2 5,320 Último mensaje 22 Febrero 2008, 01:53 am
por hitori batusai
Ayuda con ejercicio de VB
Programación Visual Basic
guada_sp 5 3,311 Último mensaje 8 Marzo 2008, 02:54 am
por ‭‭‭‭jackl007
Ayuda con ejercicio
.NET (C#, VB.NET, ASP)
elbrunosimpson 4 3,493 Último mensaje 4 Septiembre 2008, 23:16 pm
por Meta
Ayuda ejercicio de Pascal, cuando uno no lo ve claro pide ayuda
Programación General
manu3742 1 3,203 Último mensaje 31 Marzo 2011, 15:43 pm
por d(-_-)b
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines