Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: gomezjuan en 26 Abril 2020, 18:11 pm



Título: Ayuda con ejercicio en C++
Publicado por: gomezjuan en 26 Abril 2020, 18:11 pm
Buenas, tengo que hacer un ejercicio que haga lo siguiente:
1º Leer un fichero que esta formado por dos columnas (desconocemos el numero de filas), asegurarse de que los datos del fichero son numeros reales y de que en la columna 1 y en la 2 hay la misma cantidad de numeros.
2º Sumar los elementos de las filas, por ejemplo:
2 3 --> 2+3=5
1 2 --> 1+2=3
4 1 --> 4 +1 = 5
2 3 -->2 + 3 =5
3º Mostrar por consola el numero mas grande que se obtiene al sumar las columnas y los numeros que se han sumado para alcanzar ese numero, pero si en el fichero hay una fila con los mismos numeros solo debe salir una vez por consola.
Segun el ejemplo anterior en la consola deberia aparecer:
"El número mayor que se obtiene es 5 que se obtiene al sumar: 2 y 3, 4 y 1.

Yo he pensado ir añadiendo a un vector los resultados de las sumas y luego imprimir por consola el mayor, pero no se como puedo hacer esto.
Esto es lo que tengo hecho:
Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <sstream>
  5. #include <cmath>
  6.  
  7. const char sumasFich[] = "puntos.txt";
  8.  
  9. int main()
  10. {
  11. std::ifstream in(sumasFich, std::ios::in);
  12. //SI EL FICHERO NO SE PUEDE ABRIR DA ERROR Y FINALIZA
  13. if(!in){
  14. std::cout << "ERROR  " << sumasFich;
  15. return 1;
  16. }
  17.  
  18. std::vector<double> columna1,columna2;
  19. while(!in.eof()){
  20. double col1, col2;
  21. in >> col1;
  22. if(in.eof())break;
  23. if(in.fail()){
  24. std::cout << "ERROR " << sumasFich << std::endl;
  25. return 1;
  26. }
  27.  
  28. inFich >> col2;
  29.  
  30. if(in.eof()){
  31. std::cout << "ERROR " ;
  32. return 1;
  33. }
  34. if(in.fail()){
  35. std::cout << "ERROR" << std::endl;
  36. return 1;
  37. }
  38.  
  39. columna1.push_back(col1);
  40. columna2.push_back(col2);
  41. }
  42.  
  43. in.close();
  44. if(columna1.size() == 0){
  45. std::cout << "El fichero " << sumasFich << " esta vacio. ";
  46. return 1;
  47. }
  48.  
  49.       double Sumas;
  50.  
  51. for(unsigned int i = 0; i < columna1.size(); i++){
  52. Sumas = columna1[i]+columna2[i]
  53. std::cout << "El resultado mayor es " << Sumas << " se obtiene al sumar "<< columna1[i] << " y " <<
  54.                columna2[i] << std::endl;
  55. }
  56. return 0;
  57. }
  58.  


Título: Re: Ayuda con ejercicio en C++
Publicado por: K-YreX en 26 Abril 2020, 18:34 pm
1º Leer un fichero que esta formado por dos columnas (desconocemos el numero de filas), asegurarse de que los datos del fichero son numeros reales y de que en la columna 1 y en la 2 hay la misma cantidad de numeros.
Si te piden que compruebes que todas las columnas están formadas por 2 valores y que ambos sean numéricos, yo diría que tienes que leer línea por línea del fichero con getline() por ejemplo y el resultado que obtendrás en un string tendrás que separarlo en dos partes y validar cada parte para saber que son números.
Así dicho parece mucho pero son un par de funciones simples.

2º Sumar los elementos de las filas, por ejemplo:
2 3 --> 2+3=5
1 2 --> 1+2=3
4 1 --> 4 +1 = 5
2 3 -->2 + 3 =5
3º Mostrar por consola el numero mas grande que se obtiene al sumar las columnas y los numeros que se han sumado para alcanzar ese numero, pero si en el fichero hay una fila con los mismos numeros solo debe salir una vez por consola.
Segun el ejemplo anterior en la consola deberia aparecer:
"El número mayor que se obtiene es 5 que se obtiene al sumar: 2 y 3, 4 y 1.
Yo he pensado ir añadiendo a un vector los resultados de las sumas y luego imprimir por consola el mayor, pero no se como puedo hacer esto.
Si sólo te pidiesen la mayor suma bastaría con una variable que irías actualizando al encontrar una suma mayor. Si solo te pidiesen el resultado mayor y una de las filas que lo obtienen, bastaría con 3 variables que irías actualizando de igual forma que antes.
Sin embargo, como pueden ser muchas filas las que obtienen el mayor resultado, sería mejor crear un struct o una clase (ya que es C++) que contenga:
Código
  1. class Registro {
  2.  private:
  3.    double operando1;
  4.    double operando2;
  5.    double suma;
  6.  //...
  7. };

Y hacer un vector de registros.
Otra opción un poco más avanzada pero más eficiente es que como se pide no mostrar repetidos puedes usar un Set de la STL también. Defines que un registro es igual que otro cuando sus tres atributos son iguales o con que los dos operandos sean iguales es suficiente también. Y así al introducir un registro en el Set, si ya existe, se omitirá.