Tengo un problema con el problema ya que cuando pido el siguiente empleado me pide doble vez los datos

#include <iostream>
#include <stdlib.h>
using namespace std;
class nomina {
public:
struct empleado{
char nom[30],carg[30];
int cedula,n;
int salario,sueldo;
int horED,horEN,horEDdom,horENdom,horas,HorTrabaj,RecarN,RecarD,RecarF;
int ValHorED,ValHorEN,ValHorEDdom,ValHorENdom,ValHorO,ValHorDF,ValHorRecarN,ValHorRecarD,ValHorRecarF,ValTOTHor,AuxTrans,Salud,ValPen,ValDeduc,ValDeveng;
};
public:
void leer(empleado *as, int);
void ver(empleado *as, int);
void proceso (empleado *as);
};
void nomina::leer(empleado *as, int n){
cout<<"\t CALCULO DE NOMINA"<<endl;
for(int i=0;i<n;i++)
{
cout<<"\nDigite nombre: "<<endl;
gets(as->nom);
gets(as->nom);
cout<<"\nDigite su cargo: "<<endl;
gets(as->carg);
cout<<"\nDigite cedula: "<<endl;
cin>>as->cedula;
cout<<"\nDigite sueldo: "<<endl;
cin>>as->sueldo;
proceso(as);
as++;
}
}
void nomina::proceso(empleado *as){
//Obtencion de "Valor de hora ordinaria.
as->ValHorO = as->sueldo/(30 * 8); // (30) los dias de un mes.
//Obtencion de recargos
cout<<"\nIngrese los recargos nocturnos(HORAS): "<<endl;
cin>>as->RecarN;
cout<<"\nIngrese los recargos dominicales(HORAS): "<<endl;
cin>>as->RecarD;
cout<<"\nIngrese los recargos festivos(HORAS): "<<endl;
cin>>as->RecarF;
//Obtencion de horas extras
cout<<"\nIngrese las horas extradiurnas: "<<endl;
cin>>as->horED;
cout<<"\nIngrese las horas extranocturnas: "<<endl;
cin>>as->horEN;
cout<<"\nIngrese las horas extradiurnas dominicales o festivas: "<<endl;
cin>>as->horEDdom;
cout<<"\ningrese las horas dominicales o festivas nocturnas"<<endl;
cin>>as->horENdom;
as->horas = as->horED + as->horEN + as->horEDdom + as->horENdom + as->RecarN + as->RecarD + as->RecarF;
//Valor total de las horas extras
if(as->horas <= 48){
//Valor de horas extradiurnas
as->ValHorED = (((as->ValHorO * as->horED) * 0.25)+as->ValHorO);
//Valor de horas extranocturnas
as->ValHorEN = (((as->ValHorO * as->horEN) * 0.75)+as->ValHorO);
//Valor de horas extradiurnas dominicales/festivas
as->ValHorEDdom = ((((as->ValHorO * as->horEDdom) * 0.75)+((as->ValHorO * as->horEDdom)*0.25))+as->ValHorO);
//Valor de horas extranocturnas dominicales/festivas
as ->ValHorENdom = ((((as->ValHorO * as->horENdom) * 0.75)+((as->ValHorO * as->horENdom)*0.75))+as->ValHorO);
//Valor de recargos noctutnos
as->ValHorRecarN = (((as->ValHorO * as->RecarN) * 0.35)+as->ValHorO);
//Valor de recargos dominicales
as->ValHorRecarD = (((as->ValHorO * as->RecarD) * 0.75)+as->ValHorO);
//Valor de recargos festivos
as->ValHorRecarF = (((as->ValHorO * as->RecarF) * 1.75)+as->ValHorO);
//Valor Total de horas extras y recargos
as->ValTOTHor = as->ValHorED + as->ValHorEN + as->ValHorEDdom + as->ValHorENdom + as->ValHorRecarN + as->ValHorRecarD + as->ValHorRecarF ;
///////Devengos
as->ValDeveng = as->ValTOTHor + as->sueldo;
//Salud
as->Salud = as->sueldo * 0.04;
//Pension
as->ValPen = as->sueldo * 0.04;
////////Deducciones
as->ValDeduc = as->Salud + as->ValPen;
//Salario
as->salario = as->ValDeveng - as->ValDeduc ;
}else{cout<<"Las horas registradas exceden el limite de 48 horas extras como maximo..."<<endl;
system("PAUSE");
}
}
void nomina::ver(empleado *as,int n){
for(int i=0;i<n;i++){
cout<<"\t \nNOMINA"<<endl;
cout<<"\nNombre: "<<as->nom<<endl;
cout<<"Cedula: "<<as->cedula<<endl;
cout<<"Cargo: "<<as->carg<<endl;
cout<<"Sueldo: "<<"$"<<as->sueldo<<endl;
if(as->salario <= 1475434){
cout<<"Aux. Transporte: SI"<<endl;
}else{
cout<<"Aux. Transporte: NO"<<endl;
}
cout<<"Devengos: "<<"$"<<as->ValDeveng<<endl;
cout<<"Deducciones: "<<"$"<<as->ValDeduc<<endl;
cout<<"Total de horas extras y recargos: "<<"$"<<as->ValTOTHor<<endl;
cout<<"Salario: "<<"$"<<as->salario<<endl;
as++;
}
}
int main(){
int n;
nomina d;
cout<<"Ingrese la cantidad de empleados: "<<endl;
cin>>n;
nomina::empleado array[n],*p;
p=&array[0];
d.leer(p,n);
p=&array[0];
d.proceso(p);
p=&array[0];
d.ver(p,n);
}

1 respuesta

Respuesta
1

Puedo ver que en el método leer de la clase nómina llamas dos veces a la función gets() para establecer el nombre.

cout<<"\nDigite nombre: "<<endl;
gets(as->nom);
gets(as->nom);

¿Es esto a lo que te refieres?

Hola muy buenos días, gracias por tu atención... Mira la parte del código a la que me refiero es esta 

//Obtencion de recargos
cout<<"\nIngrese los recargos nocturnos(HORAS): "<<endl;
cin>>as->RecarN;
cout<<"\nIngrese los recargos dominicales(HORAS): "<<endl;
cin>>as->RecarD;
cout<<"\nIngrese los recargos festivos(HORAS): "<<endl;
cin>>as->RecarF;
//Obtencion de horas extras 
cout<<"\nIngrese las horas extradiurnas: "<<endl;
cin>>as->horED;
cout<<"\nIngrese las horas extranocturnas: "<<endl;
cin>>as->horEN;
cout<<"\nIngrese las horas extradiurnas dominicales o festivas: "<<endl;
cin>>as->horEDdom;
cout<<"\ningrese las horas dominicales o festivas nocturnas"<<endl;
cin>>as->horENdom;

Pues mira, así de primeras veo que llamas al método proceso(...) que es donde tienes el código que me mencionas desde varios puntos de tu código.
Lo llamas desde el método leer(...)

void nomina::leer(empleado *as, int n){
    cout<<"\t CALCULO DE NOMINA"<<endl;
    for(int i=0;i<n;i++)
    {
        cout<<"\nDigite nombre: "<<endl;
        gets(as->nom);
        gets(as->nom);
        cout<<"\nDigite su cargo: "<<endl;
        gets(as->carg);
        cout<<"\nDigite cedula: "<<endl;
        cin>>as->cedula;
        cout<<"\nDigite sueldo: "<<endl;
        cin>>as->sueldo;
        proceso(as);
        as++;
    }
}

Y también desde el el main:

int main(){
    int n;
    nomina d;
    cout<<"Ingrese la cantidad de empleados: "<<endl;
    cin>>n;
    nomina::empleado array[n],*p;
    p=&array[0];
    d.leer(p,n);
    p=&array[0];
    d.proceso(p);
    p=&array[0];
    d.ver(p,n);
}

Dentro del método leer(...) estás llamando al método proceso(...) aplicando este método al objeto que invoque el método leer(...) y, desde el main estás llamando a proceso(...) desde el objeto d de tipo nómina por lo que se llama una vez de forma innecesaria.

En resumen, quita la línea "d.proceso(p)" de tu main a ver si así se arregla.

Por cierto, una pregunta:  ¿Por qué igualas siempre p=&array[0]?

¡Gracias! Muchas gracias ese era el error que tenia. En cuestión a tu pregunta es para que el arreglo es decir "array[0]" quede en cero para que el siguiente empleado no tome los mismos valores.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas