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[i] % n == 0){
Vectmult.push_back(datos[i]);
}
}
//pasamos a binario los enteros múltiplos de n
for (unsigned i = 0; i < Vectmult.size(); i++){
while (Vectmult[i] != 0){
binario += ( Vectmult[i] % 2 == 0 ? "0" : "1" );
Vectmult[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 i = 0; i < VectBinario.size(); i++){
for (unsigned j = 0; j < VectBinario[i].size(); j++){
if (j == 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[i] << std::endl;
}
return 0;
}