[ Foro de Pascal ]
¿Cómo crear una funcion que me liste los jugadores mayores de 21 años.
2. Que me permita ver el inventario, añadir y retirar articulos.
Sin más detalles, difícil.
¿Qué estructura contiene los datos de esos jugadores? ¿Un array de registros? ¿Un fichero? Y si es un fichero, ¿de texto? ¿con tipo?
Incluye al menos el fragmento de fuente con lo que ya has hecho.
{inventario de cinco productos en el quese pueda agreagrse, retirar }
program almacen;
uses wincrt;
type productos = record
tarjetas:integer;
documentacion:string[40];
discos:integer;
carpetas:integer;
etiquetas:integer;
end;
lista = array [1..2] of productos;
var
inventario : lista;
i: integer;
Procedure Ordenar(Var inventario:lista);
Var i,j:byte;
aux:productos;
Begin
For i:=2 to 10 do
Begin
aux:=inventario[i];
j:=i-1;
While ( (j>=1) and (inventario[j].tarjetas>aux.tarjetas) ) do
Begin
inventario[j+1]:= inventario[j];
j := j - 1;
End;
inventario[j+1]:=aux;
End;
End;
begin
for i:= 1 to 2 do
begin
writeln (' ********** CONTROL DE INVENTARIO ********** ');
writeln (' REGISTRO ',i ) ;
writeln (' Escriba la cantidad de Tarjetas de pedido ');
readln (inventario[i].tarjetas);
writeln (' Escriba la documentacion ');
readln(inventario[i].documentacion);
writeln (' escriba cantidad de disco ');
readln(inventario[i].discos);
writeln('Cantidad de carpetas ');
readln(inventario[i].carpetas);
writeln('cantidad de etiquetas ');
readln(inventario[i].etiquetas);
end;
Ordenar(inventario);
for i := 1 to 2 do
begin
writeln ('********** DATOS DE LOS PRODUCTOS ********** ');
writeln (' TARJETAS DE PEDIDO : ',inventario[i].tarjetas );
writeln (' DOCUMENTACION : ',inventario[i].documentacion);
writeln (' CANTIDAD DE DISCOS : ' ,inventario[i].discos );
writeln ('CANTIDAD D CARPETAS : ' ,inventario[i].carpetas);
writeln ('CANTIDAD DE ETIQUETAS : ' ,inventario[i].etiquetas);
end;
end.
{Crear un modulo para preguntar al usuario u nombre y que despues busque ese nombre en la lista}
program nombres1;
uses wincrt;
var nombres : array [1..6] of string [30];
nombre : string[20];
i :integer ;
j:integer;
Resp:char;
begin
clrscr;
write('¿Desea ingresar un nombre ? (S/N): ');
readln(Resp);
while Upcase(Resp) = 'S' Do
begin
clrscr;
i:=i+1;
writeln('Escriba el nombre ',i,':');
readln(nombres[i]);
writeln('¿Desea ingresar otro nombre ? (S/N) ');
readln(Resp);
end ;
writeln('*******************************************************');
for j:= 1 to i Do
writeln(' El ',j,' nombre almacenado es : ', nombres[j]);
writeln('*******************************************************');
readln;
end.
Comencemos por el segundo fuente, que es más sencillo...
Para empezar, una cosa que no está bien; no te piden que muestres todos los nombres, sino que veas si existe uno concreto. Para eso, deberías pedir un nuevo nombre, y el "for" que recorre para mostrarlos debería incluir un "if" que compare antes de mostrar, de modo que visualice sólo los que coinciden con ese nombre concreto.
También hay un segundo posible problema: tu array sólo tiene capacidad parar 6 nombres, pero cuando pides datos no estás comprobando si desbordas esa capacidad.
Y un tercer problema: no das valor inicial a la variable "i", Es mala costumbre dar por sentado que va a tener el valor 0, porque puede no ocurrir con todos los compiladores, y desde luego no ocurre en otros lenguajes como C, así que te puede crear malos hábitos y dar lugar a errores muy difíciles de encontrar.
Como posibles mejoras que no son estrictamente necesarias: que la variable "i" se llame "ultimo" o "maximo", por legibilidad. Además, suele ser deseable que un programa que busca sea capaz de avisar si no encuentra nada, para lo que te haría falta un "boolean" adicional (encontrado := false).
En cuanto al primer fuente:
- En primer lugar, dos fallos: te piden 5 artículos, pero tu array sólo contiene 2. Además, la rutina de ordenación no llega hasta 5, sino hasta 10.
- La rutina de "agregar" se podría hacer como tu primer "for", pero terminando en 5, en vez de 2. Aun así, sería más elegante no obligar al usuario a introducir los 5 datos seguidos, sino preguntarle si desea añadir más, como has hecho en el segundo fuente, y llevar cuenta de cuantos valores hay insertados.
- La rutina de "ver" ya la tienes hecha: es el último "for", que deberías colocar dentro de un "procedure", y que no terminaría en 2, sino en la cantidad de valores introducidos.
- La rutina de "eliminar" un artículo debería mover todos los siguientes hacia arriba en el array, y finalmente disminuir el contador. Por ejemplo, si tienes 4 artículos y quieres borrar el 2, darías los pasos: 3->2, 4->3, total = 3 (basta con un "for" para conseguirlo).
Prueba a hacerlo y vuelve a incluir el fuente, para que podamos ver qué funciona y qué no.
(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.)