[ Foro de Pascal ]

Como Ir Acumuladando Resultados (oO)??

23-Nov-2010 16:12
Miguel Meza Martinez
4 Respuestas

Hola

Necesito una ayuda con Lazarus



Me enseñaron a hacer el programa de esta forma (q' es la + larga x lo q' veo S= )  [[UNIT & PROG]].

Aunke ya estoi aprendiendo a hacer solo el PROG.

El Ejercicio dice asi: determinar el salario de N empleados teniendo en cuenta q', si las horas trabajadas son mayores que 40 cada hora excedida de 40 valdra 1.5 vece + (o sea, si son 41 horas trabajas seran 41.500 y asi sucesivamente) y cada salario tiene un 4.5% de descuento por impuestos[[ESA ES LA PARTE FACIL]].



***El problema es q' tengo q' sumar el salario de cada empleado, y q' me imagino debe ser con un /Acumulador/ pero no se como hacerlo, porke mi profesor sinceramente no enseña na' xD y lo que he aprendido es gracias a los tutoriales suyos.



Les pido que por favor me ayuden en esto. Aqui les dejo lo que he hecho !!!*

OJO: Utilizo la orden {MezaT} para q' lleve mi sello personal.

Seria bueno q' me lo enseñaran para todos los ciclos.


XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX



unit salariociclo ;



{$mode objfpc}{$H+}



interface



uses

 Classes , SysUtils ;



 Type

  Ts = class



 Private

  NumEmp:word;

  HorasT:word;
(Trabajas)
  ValorH:integer;



 Public

  constructor create;

  procedure sNE(n:word);

  procedure sHT(h:word);

  procedure sVH(v:integer);



  function gNE:word;

  function gHT:word;

  function gVH:integer;



  function salario:extended;

  function salud:double;

  function salarioNETO:double;

  function mensaje:double;

  end ;



implementation

  constructor Ts.create;

  begin

    NumEmp:= 0;

    HorasT:= 0;

    ValorH:= 0;

  end ;



  procedure Ts.sNE(n:word);

  begin

    NumEmp:= n;

  end ;



  procedure Ts.sHT(h:word);

  begin

    HorasT:= h;

  end ;



  procedure Ts.sVH(v:integer);

  begin

    ValorH:= v;

  end ;





  function Ts.gNE:word;

  begin

    gNE:= NumEmp;

  end ;



  function Ts.gHT:word;

  begin

    gHT:= HorasT;

  end ;



  function Ts.gVH:integer;

  begin

    gVH:= ValorH;

  end ;





  function Ts.salario:extended;

  begin

    if(gHT>=0)and(gHT<=40)then

      begin

        salario:= gHT*gVH;

      end



    else

      begin

        if(gHT>40)then

          begin

            salario:= (((gHT-40)*gVH)*1.5)+(40*gVH);

          end ;

      end ;

  end ;



  function Ts.salud:double;

  begin

    salud:= salario*0.045;

  end ;



  function Ts.salarioNETO:double;

  begin

    salarioNETO:= salario-salud;

  end ;



  function Ts.mensaje:double;

  begin

    writeln('Salario: $ ',salario:2:0);

    writeln('Descuento en salud de 4.5% : $ ',salud:2:0);

    writeln('Salario Neto: $ ' ,salarioNETO:2:0);

  end ;



end.



XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX



program project1;



{$mode objfpc}{$H+}



uses

 {$IFDEF UNIX}{$IFDEF UseCThreads}

 cthreads,

 {$ENDIF}{$ENDIF}

 Classes, salariociclo

 { you can add units after this };



 var

  e:word;

  h:word;

  v:integer;

  mensaje:extended;

  acumulador:extended;

  mezaT:Ts;



{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}



begin

  mezaT:= Ts.create;



  writeln('SALARIO CON CICLOS');

  writeln;

  writeln('Digite el # de empleados');

  read(e);

  mezaT.sNE(e);



  begin

   for e:= 1 to e do

     begin

       writeln;

       writeln('-Digite el # de horas trabajadas');

       read(h);

       mezaT.sHT(h);



       writeln('-Digite el $ de cada hora');

       read(v);

       mezaT.sVH(v);



       writeln;

       mensaje:= mezaT.mensaje;

       readln;

       readln;

     end;

  end;



end.


24-Nov-2010 17:39
Antonio P.G.

Hola Miguel.

Antes que nada, decirte que me ha sido un poco difícil entender el código que viene en el mensaje, porque está muy extendido y es complicado ver los cometidos de las funciones y procedimientos.

Este este es un típico problema de bucles. O de un bucle solo, incluso.

Un fallo importante que he visto es que en la cabecera del bucle del programa principal escribes "for e:=1 to e do". Bien, cuando en esa cabecera aparece "e:=1", lo que el programa hace es asignar a la variable "e" el valor "1". O sea, que estás diciendo "desde 1 hasta 1 haz...". Eso, obviamente, no es lo que queremos. Para ello, tenemos que poner algo como "for e:=1 to Numero_empleados do", donde "Numero_empleados" sería una variable de tipo integer, o longint, u otro (en fin, matemáticamente discreta).

Otra detalle: te aconsejo estructurar más el código. La forma en que se escribe el código es muy importante. Yo utilizaría sangrías (también llamado "sangrado") y añadiría comentarios a las funciones y procedimientos, para saber lo que hacen. Recuerda que para el constructor del programa es fácil entender sus propias funciones, pero para otros usuarios no tiene por qué.

Respecto a este tipo de programas de "listas" (no listas enlazadas, sino listas de personas o ítems), puede resultar interesante almacenar los datos de esas personas en arreglos (o "arrays"). En este caso tu programa lee los datos y devuelve output tras cada individuo, si no me equivoco.

Hoy no tengo mucho tiempo, pero si me envías el programa y la unidad puedo echarles directamente un vistazo mañana o pasado. Aunque he de decirte que Lazarus no me funciona bien desde que desinstalé una versión beta e instalé otra. Lo probaré en Free-Pascal.

Por cierto, si encuentro algún programa que yo haya hecho de este tipo, lo envío.

De todas formas, seguro que el profesor Nacho puede ayudarte más que yo.

¡Hasta luego!


24-Nov-2010 20:00
Miguel Meza Martinez

Muchas gracias por interesarte !!!*
ya aprendi como es y lo hice asi.

program project1;

{$mode objfpc}{$H+}

uses
 {$IFDEF UNIX}{$IFDEF UseCThreads}
 cthreads,
 {$ENDIF}{$ENDIF}
 Classes
 { you can add units after this };

 var
  rep:integer; [repeticiones o i cm algunos la nombran
  N_Emp:word; [# de empleados]
  Horas:integer;
  Valor:integer;
  salario:extended;
  salud:double;
  sNeto:double; [Salario neto]
  contSal:integer;  [Me di cuenta que no se necesita este contador]
  totSal:extended;  [este seria el acumulador o la nomina pues]

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}

begin
  writeln('SALARIO CON CICLO');
  writeln('-----------------');;
  writeln('-Digite el # de empleados');
  read(N_Emp);

  for rep:=1 to N_Emp do
    begin
     writeln;
     writeln('-Digite las horas trabajadas del empleado');
     read(Horas);

     writeln('-Digite el $ de cada hora');
     read(Valor);

     begin
       if(Horas>=0)and(Horas<=40)then
         begin
           salario:= Horas*Valor;
         end

       else if(Horas>40)then
              begin
                salario:= (40*Valor)+(((Horas-40)*Valor)*1.5);
              end;
     end;

     salud:= salario*0.045;
     sNeto:= salario-salud;


     writeln('**Su salario es: $ ',sNeto:2:0);
     contSal:= contSal+1;
     totSal:= totSal+sNeto;  [esto va acumulando las sueldos]
     end; [Se cierra el ciclo for para ke no entre el mensaje de la nomina]

       
     writeln;
     writeln('------------------------');
     writeln('La nomina es: $' ,totSal:2:0);
     writeln('------------------------');
     readln;
     readln

end.


24-Nov-2010 22:54
Nacho Cabanes (+32)

Bienvenido, Miguel.

Este segundo fuente es mucho más legible, y tiene apariencia de funcionar correctamente. Aun así, unos comentarios que te pueden ayudar (espero):

- En vez de poner aclaraciones cuando "copias y pegas", como

var
 rep:integer; [repeticiones o i cm algunos la nombran
 N_Emp:word; [# de empleados]
 sNeto:double; [Salario neto]

usa comentarios, que pueden permanecer en el código y ayudar a otros programadores, o incluso a ti mismo, cuando necesites ampliar o corregir el programa pocos días después:

var
 rep:integer; {repeticiones}
 N_Emp:word;   {# de empleados}
 sNeto:double; {Salario neto}

pero aun así, deberías intentar que los comentarios explicaran "la lógica" de tu programa, no lo que hace cada variables, porque los nombres de las variables deberían ser autoexplicativos (un programa se escribe una vez, pero se lee muchas veces más), así:

var
 repeticiones : integer;
 numero_empleados : word;
 salario_neto : double; { Salario descontando impuestos }


- Intenta ser consistente con los nombres: tienes unas variables que empiezan en minúsculas (rep), otras en mayúsculas (Valor), otras que forman varias palabras usando _ (N_Emp), otras que lo hacen mezclando mayúsculas y minúsculas (sNeto). Pascal es tolerante con las mayúsculas y minúsculas, pero el no tener un estilo definido, además de hacer tu programa menos legible, te dará problemas si en algún momento programas en otros lenguajes, como C, C++, Java, C#...


- Si algo no es necesario, quítalo en cuanto veas que no lo necesitas, o seguirá ahí en mejoras posteriores del programa, haciéndolo más grande y más difícil de entender (me refiero a "contSal", que incrementas pero no llegas a usar para nada más).

En cualquier caso, parece que vas por buen camino. ¡ Sigue así !


25-Nov-2010 21:30
Miguel Meza Martinez

Muchas Gracias Por Los Consejos !!!*






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)