[ Foro de C++ ]

Error "Excepción de coma flotante"

13-Jan-2021 13:29
Invitado (Patricia)
0 Respuestas

Estoy empezando a programar en C++ y tengo este ejercicio:

Realizar una función que reciba como parámetros:

por referencia constante un vector de enteros
un entero sin signo (n)
un entero sin signo (m)
y devuelva un vector de bool que corresponderá al valor del bit m-simo (en la posición m de la representación binaria del entero) de los elementos en posición múltiplo de n del vector de enteros.

En el programa principal se leerán los datos de un fichero cuyo nombre se pasará como primer parámetro al programa. El segundo parámetro será el valor del bit a considerar (m). El tercer parámetro será le parámetro n de la función, si no está disponible valdrá 2.

El nombre del fichero deberá comenzar por “datos” y terminar por “.dat” si falta alguno se añadirá antes de acceder al fichero.

Mi código:
//Librerías
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

//PARÁMETROS DE ENTRADA Y FUNCIONAMIENTO DEL CÓDIGO
std::vector<bool> Msimo (const std::vector<int>&datos, unsigned int n, unsigned
int m){
 
 //vector de múltiplos de n
 std::vector<int> Vectmult;
 
 //creamos vector de strings binario
 std::string binario;
 std::vector<std::string> VectBinario;
 
 //creamos el vector de salida
 std::vector<bool> VectMsimo;
 
 //recorremos el vector de enteros de entrada
 for(unsigned i = 0; i<datos.size(); i++){
   //ver qué enteros del vector son múltiplos de n
   if (datos.at(i) % n == 0){
     Vectmult.push_back(datos.at(i));
   }
 }
 
 //pasamos a binario los enteros múltiplos de n
 for (unsigned int i = 0; i < Vectmult.size(); i++){
   while (Vectmult.at(i) != 0){
       binario += ( Vectmult.at(i) % 2 == 0 ? "0" : "1" );
       Vectmult.at(i) /= 2;
   }
   //guardamos en un vector nuevo los enteros pasados a binario
   VectBinario.push_back(binario);
 }
 
 //buscamos la posición m en cada número del vector
 for (unsigned int i = 0; i < VectBinario.size(); i++){
   for (unsigned j = 0; j < VectBinario.size(); j++){
     if (VectBinario[i][j] == VectBinario[i][m]){
       //guardamos en un nuevo vector los valores de la posición m
       VectMsimo.push_back(VectBinario[i][j]);
     }
   }
 }
 
 return VectMsimo;
}

int main(int argc, char* argv[]){
 
//Lectura de parámetros de entrada
 //nombre del fichero
 if (argc < 2){
   std::cerr << "Error 1: es necesario un fichero" << std::endl;
   return 1;
 }
 
 //leemos el nombre del fichero
 char* nombre = argv[1];
 std::string nombrefichero = nombre;
 
 //añadimos "datos" al principio del nombre del fichero en caso de que no
 //lo tenga
 std::size_t encontrar = nombrefichero.find("datos");
 if (encontrar == std::string::npos){
   nombrefichero == "datos" + nombrefichero;
 }
 
 //añadimos ".dat" al final del nombre del fichero en caso de que no lo
 //tenga
 std::size_t encontrar1 = nombrefichero.find(".dat");
 if (encontrar1 == std::string::npos){
   nombrefichero =+ ".dat";
 }  
 
//Lectura del documento
 std::fstream fent(nombrefichero);
 
 //fallo de lectura del documento
 if (fent.fail()){
   std::cerr << "Error 2: fallo de lectura del documento" << std::endl;
   return 2;
 }
 
 //lectura de los valores del fichero
 int valor;
 std::vector<int> valores;
 
 fent >> valor;
 while (fent.good()){
   valores.push_back(valor);
   fent >> valor;
 }
 
 //lectura de los parámetros m y n
 unsigned int m = 0;
 if (argc >= 3) {
   try {
     m = std::stoi(argv[2]);
   }
   catch (unsigned int m) {
     std::cerr << "Error 3: fallo de lectura del parámetro m" << std::endl;
         return 3;
   }
 }  

 unsigned int n = 2;
 if (argc >= 3) {
   try {
     n = std::stoi(argv[2]);
   }
   catch (unsigned int n) {
     std::cerr << "Error 4: fallo de lectura del parámetro n" << std::endl;
         return 4;
   }
 }
 
 //Creamos el vector donde se guardarán los resultados
 std::vector<bool> VectorMsimo;
 VectorMsimo = Msimo (valores, m, n);
 
 std::cout << "Resultado: " << std::endl;
 for (unsigned i = 0; i <= VectorMsimo.size(); i++){
   std::cout << VectorMsimo.at(i) << std::endl;
 }
 
 return 0;
}




Si ya eres usuario del sistema, puedes contestar desde tu cuenta y así ganar prestigio.

Si sólo eres un visitante, puedes optar por...