Shortening Code

What can I do to simplify this notice that i'm a novice
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;
}
Last edited on
Lines 68-75:
1
2
3
4
5
  int datoLeido;
  std::vector<int> vDatos;
  while ( fichDatos >> datoLeido ) {
    vDatos.push_back(datoLeido);
  }

Read data and test success of that read.

Lines 104-108:
IF bitM[i] == true THEN bitM[i] is true

Consider ternary operator:
std::cout << ( bitM[i] ? "Verdad, " : "Falso, " );


Same in lines 15-19:
bitM.push_back( datos[i] & (1 << m) );
thanks
Topic archived. No new replies allowed.