[ Foro de Pascal ]
Buenas noches, me aparece un error en solicitardatos, me pone que las variables no son un registro textualmente 'request for field... is not a record a shcema or a object'. Muchas gracias.
(*Ridely Scott en el año 1982 estrenó la cinta ?Blade Runner?, ligeramente basada en la
novela de Philip K. Dick ¿Sueñan los androides con ovejas eléctricas?. En la película,
ambientada en el año 2019, Harrison Ford se dedica a ?retirar? androides replicantes
fabricados por la Tyrell Corporation, Roy Batty era uno de ellos..
Realice un programa para ayudar en su tarea a nuestro protagonista. La citada empresa
ha llegado a fabricar 5.000 androides.
Se debe llevar un registro de los androides con la siguiente información:
Nº de serie
Año de fabricación
Sexo
Planeta de fabricación
Planetas visitados por cada androide (hasta la fecha sólo se conocen 500 planetas)
Debe codificar la parte TYPE del programa y un procedimiento que indique por
pantalla los androides que hay que retirar si se cumplen las condiciones de haber
visitado un determinado planeta y haber sido fabricado en un año en concreto.*)
PROGRAM basico(input,output);
CONST maxandroides=5000;
maxplanetas=500;
TYPE
tanho=0..maxint;
tplaneta=string(50);
tnumplanetas=0..maxplanetas;
trAndroide=RECORD
numserie:integer;
anhofab:tanho;
sexo:char;
planeta:tplaneta;
numplanetas:tnumplanetas;
END;
tAndroide=array[1..maxandroides] of trAndroide;
VAR
androide:tAndroide;
(************************************************************************)
PROCEDURE SolicitarDatosAndroide(var Androide:tAndroide);
var i:integer;
BEGIN
For i:=1 TO maxandroides DO begin
with androide do begin
write('Introduzca el numero de serie'); readln(numserie);
write('Introduzca el año de fabricacion'); readln(anhofab);
write('Introduzca el sexo'); readln(sexo);
write('Introduzca el planeta'); readln(planeta);
write('Introduzca el numero de planetas visitado'); readln(numplanetas);
end;
end;
end;
begin
end.
Debiste escribirlo así:
with androide[i] do
begin
.
.
.
end;
- Por otra parte, tienes un error en la declaración de tipos, específicamente aquí:
tplaneta=string(50);
Debe ser string[50]; con corchetes
- Si utilizas freepascal no tendrás problema con la memoria, pero en caso de usar Turbo Pascal sí lo tendrías, en vez de declarar la constante maxandroides como 5000, deberías bajarlo a 500, de manera que no se desborde la capacidad de memoria asignada por Turbo Pascal a las variables, la cual es muy limitada.
Saludos.
Muchas gracias por la correccion. Uso pascal estandar extendido(ISO 10206)
A ver si me podeis ayudar ahora con la condicion de retirar los androides( es decir borrar los datos en una casilla de un array) con dos condiciones introducidas por teclado por el usuario.
Las variables planeta y año de fabricacion serian otros distintas, y compararlas con las del registro y si son iguales retirarlo??? Podria valer esto???( no esta en el codigo esta idea)
PROCEDURE RetirarAndroide(var androide:tAndroide);
var i:integer;
begin
FOR i:=1 TO maxandroides
with androide[i] do begin
writeln('Que planeta quiere introducir como condicion de retiro?');readln;(planeta);
writeln('Que año de fabricacion para retirar androides?'); readln(anhofab);
if androide[i] .....
Solucionado!!
Procedure BUSCAR(Protected VAR Androide:
TAAndroides;planeta:Tcadena15;Manno:Tanno);
VAR i,j: Integer;
Encontrado:Boolean;
BEGIN
FOR i:= 1 to MaxAndroides DO
With Androides[i] Do BEGIN
if anno = Manno then BEGIN { Busco en planetas}
j:= 1;
Encontrado:= FALSE;
Repeat
IF PlanetaVisi[j]= Planeta THEN BEGIN
Encontrado:= TRUE;
Writeln('Hay que RETIRAR al siguiente androide:');
Writeln('Nº de Serie:', NumSerie);
Writeln('Año de fabricación: ',anno);
Writeln('Sexo: ',Sexo);
Writeln('Fue fabricado en: ',PlanetaFabri);
END;
j:= j+1;
UNTIL ((j> MaxPlanetas) or (encontrado));
END;
END;
END;
(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.)