[ Foro de Pascal ]
Tengo el siguiente código que me compila en el celular pero no en otros compiladores.
program UNEFATEL;
uses
crt;
type
nino = record
dia_semana: Integer;
minutos: Integer;
x, x1, x2, x3, total_a_pagar, impuesto, total_sin_impuesto: real;
horario: Integer;
end;
var
i, j, num_factura: Integer;
Ist: array of nino;
nombre, apellido: String;
cedula: real;
begin
Clrscr;
Writeln('=======================');
Writeln('_______BIENVENIDO______');
Writeln('=======================');
writeln('---Datos del Cliente---');
write('Nombre: ');
Readln(nombre);
write('Apellido: ');
Readln(apellido);
Write('Cedula: ');
Readln(cedula);
writeln('Número de Servicios a Registrar?:');
ReadLn(num_factura);
SetLength(Ist, num_factura);
clrscr;
for i := 0 to num_factura - 1 do
begin
writeln;
Writeln('==Servicio N° ', i + 1, '==');
writeln('Seleccione el día de la semana');
writeln('1. Lunes.');
writeln('2. Martes.');
writeln('3. Miércoles.');
writeln('4. Jueves.');
writeln('5. Viernes.');
writeln('6. Sábado.');
writeln('7. Domingo.');
Readln(Ist[i].dia_semana);
write('Minutos de duración de la llamada: ');
Readln(Ist[i].minutos);
case Ist[i].minutos of
1..5:
begin
Ist[i].total_sin_impuesto := Ist[i].minutos * 100;
end;
1..8:
begin
Ist[i].x := (Ist[i].minutos - 5);
Ist[i].x1 := (Ist[i].minutos - Ist[i].x) * 100;
Ist[i].total_sin_impuesto := (Ist[i].x * 80) + Ist[i].x1;
end;
1..10:
begin
Ist[i].x := 5 * 100;
Ist[i].x1 := 3 * 80;
Ist[i].x2 := (Ist[i].minutos - 8) * 70;
Ist[i].total_sin_impuesto := Ist[i].x + Ist[i].x1 + Ist[i].x2;
end
else if (Ist[i].minutos > 10) then
begin
Ist[i].x := 5 * 100;
Ist[i].x1 := 3 * 80;
Ist[i].x2 := 2 * 70;
Ist[i].x3 := (Ist[i].minutos - 10) * 50;
Ist[i].total_sin_impuesto := Ist[i].x + Ist[i].x1 + Ist[i].x2 + Ist[i].x3;
end ;
end;
if (Ist[i].dia_semana = 7) then
begin
Ist[i].impuesto := Ist[i].total_sin_impuesto * 0.03;
Ist[i].total_a_pagar := Ist[i].total_sin_impuesto + Ist[i].impuesto;
end
else
begin
writeln('Horario de atención? seleccione! ');
writeln('1.Matutino |7:00 am - 2:00 pm| ');
writeln('2.Vespertino |2:00 pm - 8:00 pm| ');
Readln(Ist[i].horario);
if (Ist[i].horario = 1) then
begin
Ist[i].impuesto := Ist[i].total_sin_impuesto * 0.15;
Ist[i].total_a_pagar := Ist[i].impuesto + Ist[i].total_sin_impuesto;
end
else
begin
Ist[i].impuesto := Ist[i].total_sin_impuesto * 0.10;
Ist[i].total_a_pagar := Ist[i].total_sin_impuesto + Ist[i].impuesto;
end;
end;
end;
Clrscr;
writeln('---Datos del Cliente---');
writeln(' Nombre: ', nombre);
writeln(' Apellido: ', apellido);
writeln(' Cédula: ', cedula: 3: 0);
writeln;
for j := 0 to num_factura - 1 do
begin
Writeln('==== Servicio N° ', j + 1, ' ====');
writeln(' Duración de la llamada: ', Ist[j].minutos, ' minutos. ');
writeln(' Total a pagar: ', Ist[j].total_a_pagar, ' Bs.');
writeln;
end;
ReadLn;
end.
El código que compartes presenta algunos errores que pueden ser la causa de que no se compile en otros compiladores. A continuación, te comento los errores más relevantes que encontré:
1. El tipo de dato 'real' no es una buena opción para almacenar valores monetarios, ya que pueden presentarse problemas de precisión. Es preferible usar el tipo 'currency' para este propósito.
2. La declaración de variables en el registro 'nino' no sigue un orden lógico. Es recomendable agrupar las variables del mismo tipo.
3. En las sentencias 'case', los rangos definidos no están bien establecidos. Por ejemplo, '1..5', '1..8' y '1..10' son rangos superpuestos, lo que puede generar errores en el cálculo del costo de la llamada.
4. La sentencia 'else if' no es válida en Pascal. Debes usar la sentencia 'else' seguida de una nueva sentencia 'if' para evaluar una condición adicional.
5. La salida del programa no está bien formateada. Por ejemplo, en la línea 'writeln(' Cédula: ', cedula: 3: 0);', el formato '3:0' no es necesario y puede generar errores.
Teniendo en cuenta estos errores, te sugiero que modifiques tu código de la siguiente manera:
program UNEFATEL;
uses
crt;
type
nino = record
dia_semana: Integer;
minutos: Integer;
total_sin_impuesto, impuesto, total_a_pagar: currency;
horario: Integer;
x, x1, x2, x3: Integer;
end;
var
i, j, num_factura: Integer;
Ist: array of nino;
nombre, apellido: String;
cedula: Integer;
begin
Clrscr;
Writeln('=======================');
Writeln('_BIENVENIDO');
Writeln('=======================');
writeln('---Datos del Cliente---');
write('Nombre: ');
Readln(nombre);
write('Apellido: ');
Readln(apellido);
Write('Cedula: ');
Readln(cedula);
writeln('Número de Servicios a Registrar?:');
ReadLn(num_factura);
SetLength(Ist, num_factura);
clrscr;
for i := 0 to num_factura - 1 do
begin
writeln;
Writeln('==Servicio N° ', i + 1, '==');
writeln('Seleccione el día de la semana');
writeln('1. Lunes.');
writeln('2. Martes.');
writeln('3. Miércoles.');
writeln('4. Jueves.');
writeln('5. Viernes.');
writeln('6. Sábado.');
writeln('7. Domingo.');
Readln(Ist[i].dia_semana);
write('Minutos de duración de la llamada: ');
Readln(Ist[i].minutos);
case Ist[i].minutos of
1..5:
begin
Ist[i].total_sin_impuesto := Ist[i].minutos * 100;
end;
6..8:
begin
Ist[i].x := Ist[i].minutos - 5;
Ist[i].x1 := Ist[i].x * 80;
Ist[i].x2 := Ist[i].minutos * 100 - Ist[i].x1;
Ist[i].total
(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.)