2

Tengo el siguiente código el cual me muestras los datos de N cantidad de empleados ingresados Mi pregunta es la siguiente: ¿Como muestro la cantidad de empleados por sexo?

int main(void){
               /*Declara las variables para los ciclo for*/
int i = 0, n = 0;

               /*Declara estructura person*/
struct person{
    char dni[14];
    char civil_status[15];
    char sex[15];
};
              /*Declara employee, arreglo de la estructura person*/
struct person employee[max];

/*Se pide cuantos registros de employees se guardaran*/
cout<<"Cuantos datos quieres ingresar? \n";
cin>> n;

              /*Ciclo for que va a recorrer según la cantidad escrita anteriormente*/
for (i = 0; i < n; i++){
    cout<<"\n Escriba la Cedula "<< i+1<<":";
    cin>> employee[i].dni;

    cout<<"\n Escriba el Estado Civil "<< i+1<<":";
    cin>> employee[i].civil_status;

    cout<<"\n Escriba el Sexo "<< i+1<<":";
    cin>> employee[i].sex;
}

cout<<"\n El registro de employes que se introdujeron son: \n\n";

/*Ciclo for que muestra el listado de registro ingresados*/
for (i = 0; i < n; i++){
    /*Se llama al arreglo employee seguido de la variable dni*/
    cout<< employee[i].dni;
    cout<<"\t"<<employee[i].civil_status;
    cout<<"\t"<<employee[i].sex<<"\n\n";
  }
   system("pause");
}

Un ejemplo de introducción de datos:

Cuantos datos quieres ingresar? 2
Escriba la Cedula 1:012345
Escriba el Estado Civil 1:soltero
Escriba el Sexo 1:masculino
Escriba la Cedula 2:67891
Escriba el Estado Civil 2:casado
Escriba el Sexo 2:femenino

El registro de employes que se introdujeron son:

012345 soltero masculino 67891 casado femenino

Trauma
  • 25,297
  • 4
  • 37
  • 60

3 Answers3

4

Utiliza std::count_if:

using std::literals::string_literals;

auto mujeres = std::count_if(std::begin(employee), std::end(employee),
               [](const person &p) {
                   return p.sex == "femenino"s;
               });

Cuentas las mujeres, los hombres resultarán de restar la cantidad de mujeres a max, esto te permite evitar contar por separado cada sexo, evitando la necesidad de un if, que afectaría muy negativamente al rendimiento.

La función std::count_if está disponible al incluir la cabecera <algorithm>, te contará todos los elementos entre el iterador de inicio (primer parámetro) y el iterador de final (segundo parámetro) que cumplan con una condición (el tercer parámetro).

Las funciones std::begin y std::end están disponibles en la cabecera <iterator> y son las que calculan el inicio y final de tu formación employee.

La instrucción using std::literals::string_literals; es la que te permite usar los literales definidos por el usuario de cadenas de caracteres, por eso en la lambda pasada a std::count_if podemos escribir

return p.sex == "femenino"s;

en lugar de

return p.sex == std::string{"femenino"};

Puedes no usar los iteradores y aprovechar que employee es una formación y aplicar aritmética de punteros:

auto mujeres = std::count_if(employee, employee + n,
               [](const person &p) {
                   return p.sex == "femenino"s;
               });

Así también esquivas el posible problema de contar mal cuando n y max no contienen el mismo valor.

Otras cosas a tener en cuenta.

En C++ struct no forma parte del tipo, así que no necesitas anteponerlo para declarar estructuras.


En C++ las funciones que no reciben parámetros basta con escribirlas con un paréntesis vacío.


La función main debe devolver un valor.


No se qué tipo tiene max, pero si no es un tipo conocido en tiempo de compilación, tendrás problemas de compatibilidad con tu código, lee este hilo para saber más al respecto.


Las variables de los for se pueden declarar en los propios bucles, no es necesario hacerlo fuera.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
2

Supongamos que tienes dos tipos de sexos, masculino y femenino.

Simplemente crea un integer para cada uno de ellos inicializado a 0, recorre los datos con un for y ve incrementando la cantidad que hay en cada uno en el integer correspondiente:

int masculino = 0, femenino = 0;
for(int i = 0; i < n; i++){
    if(employee[i].sex == "masculino")
        masculino++;
    else if (employee[i].sex == "femenino")
        femenino++;
}
cout << "Número de empleados masculinos: " << masculinos;
cout << "Número de empleados femeninos: " << femeninos;
Wyrncael
  • 1,130
  • 1
  • 7
  • 18
  • Lo que has puesto en tu `cout` compila? Me parece que esa no es la sintaxis de C++. Btw, te has "comido" unas comillas al final de la palabra `masculino`. Por último, puedes hacer más sencillos tus bucles haciendo uso de un `range-for loop` (C++11 en adelante). – Xam Mar 29 '18 at 20:45
  • @Xam Compila, pero el comportamiento será, curioso. Por ejemplo si hubieran 28 hombres y 28 mujeres se mostraría: `os: 28` y `s: 28` porque se sumaría 28 al literal de cadena. No puede usar el `for` de rango porque no está trabajando sobre la formación completa si no sobre el rango `0-n`. – PaperBirdMaster Mar 29 '18 at 21:06
  • @Paula_plus_plus hmm, `n` no es el tamaño del arreglo? – Xam Mar 29 '18 at 21:10
  • 1
    @Xam Toda la razón, no he compilado como suelo hacer porque era un ejemplo sencillo y lo he escrito directamente; y me he confundido con la sintaxis de java. Ya lo he corregido, gracias por avisar! Respecto al `range-for`no se puede hacer como dice @Paula_plus_plus ya que el `n` es el número de datos introducidos y es distinto de `max` (el tamaño del array). – Wyrncael Mar 29 '18 at 21:34
-1

Los datos ya los tenés, solo ténes que contar cuantos registros tienen en su atributo sexo el valor 'masculino' o 'femenino' y contarlos. Puedes definir una variable para cada uno y después mostrarlas, por ejemplo:

int cantidadMasculinos = 0;
int cantidadFemeninos = 0;    
/*Ciclo for que muestra el listado de registro ingresados*/
for (i = 0; i < n; i++){
 /*Se llama al arreglo employee seguido de la variable dni*/
 cout<< employee[i].dni;
 cout<<"\t"<<employee[i].civil_status;
 cout<<"\t"<<employee[i].sex<<"\n\n";
  if(employee[i].sex = 'masculino'){
   cantidadMasculinos += 1;
   }else{cantidadFemeninos += 1;}
}
cout<<"Cantidad de empleados masculinos: "<<cantidadMasculinos;
cout<<"Cantidad de empleados femeninos: "<<cantidadFemeninos;
system("pause");
}
Mario L
  • 1,686
  • 1
  • 8
  • 11