[ Foro de Pascal ]
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.
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!
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.
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í !
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.)