[ Foro de Pascal ]

consulta

05-Aug-2010 07:25
José Raúl CAstillo Rosales
4 Respuestas

¿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.


06-Aug-2010 01:11
Nacho Cabanes (+83)

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.


06-Aug-2010 16:03
José Raúl CAstillo Rosales

{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.






07-Aug-2010 14:50
Nacho Cabanes (+83)

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).


07-Aug-2010 16:41
Nacho Cabanes (+83)

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.)