1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
std::vector<bool> bitMsimo(const std::vector<int>& datos, int n, int m){
std::vector<bool> bitM; //Declaración de un vector tipo booleano
for(unsigned i = 0; i < datos.size(); i++){
if(i %n == 0){ //analiza si es múltiplo, resto cero
if(datos[i] & (1 << m)){ //operación lógica AND entre un 1 y la posicion m-sima del componente i del vector datos (en binario)
bitM.push_back(true);//si la operación AND es 1, significa true
}else{
bitM.push_back(false);
}
}
}
return bitM;
}
int main(int argc, char *argv[]){
std::cout << "El programa contiene " << argc << " argumentos."
<< std::endl;
if (argc < 2){
std::cerr << "No se ha especificado el nombre del archivo. FIN."
<< std::endl;
return 1;
}
//Colocamos el datos y .dat al nombre del fichero.
//argc cantidad de argumentos y argv array de posiciones.
std::string nombreArchivo = argv[1];//se asigna la segunda posición.
std::size_t Inicial = nombreArchivo.find("datos"); //buscamos 'datos'
//Si no se encuentra 'datos', se le inserta al principio, posición 0.
if (Inicial == std::string::npos){ //npos significa no encontrado.
std::cerr << "No se ha encontrado 'datos'." << std::endl;
nombreArchivo.insert(0,"datos");
}
std::size_t Final = nombreArchivo.find(".dat");
if(Final == std::string::npos){//si npos es igual a final, no hay .dat
std::cerr << "No hay .dat" << std::endl;
int tamFinal = nombreArchivo.length(); //con length hacemos referencia a la última posición (nº de caracteres)
nombreArchivo.insert(tamFinal, ".dat"); //insertamos el
}
//Abrimos el fichero y volcamos los datos.
std::ifstream fichDatos(argv[1]);
if (fichDatos.fail() ){
std::cerr << "No se ha especificado el nombre. FIN." << std::endl;
return 2;
}
//Almacenamos los datos en el vector.
int datoLeido;
std::vector<int> vDatos;
fichDatos >> datoLeido;
while(fichDatos.good() ){
vDatos.push_back(datoLeido);
fichDatos >> datoLeido;
}
//Valor del bit que consideramos.
int m;
if(argc >= 3){
m = std::stoi(argv[2]);
}else{
std::cerr << "No se ha espeficicado el valor del bit a considerar."
<< std::endl;
return 3;
}
//Parámetro n de la función.
int n = 2;
if(argc >= 4){
n = std::stoi(argv[3]);
}else{
std::cout <<"El valor n toma 2." << std::endl;
}
//Llamada a la función.
std::vector<bool> bitM = bitMsimo(vDatos, m, n);
// si en la posición del vector hay un true, devuelve V, si no, F.
for (std::size_t i = 0; i < bitM.size(); i++){
if (bitM[i] == true){
std::cout << "Verdad, ";
}else{
std::cout << "Falso, ";
}
}
std::cout << std::endl;
return 4;
}
|