[ Foro de Pascal ]

duda con registro centinela

27-Jan-2012 10:33
oscar gomez
4 Respuestas

buenos dias profesor Nacho Cabanes.
ante todo como siempre mil gracias por tu tiempo, paciencia y tus valiosas enseñanzas.

profesor es que realice un pequeño programita que trabajaba con valor centinela ("...Al final de los registros hay un registro centinela con el numero 999 en el numero de la cedula de la persona") bien el problema que me surge es que se me pide un listado de las cedulas de las personas y claro me genera estas dos inquietudes:

1)si trabajo con un vector para almacenar dichas cedulas,como hago para definir dicho vector si no conozco previamente la cantidad de personas?

yo pensaria no se si se pueda hacer profesor me corrijes por favor.

cedulas:arrar[1..1000] of integer (pongo hasta 1000 como por dar un valor alto de personas introducidas y no manejar creo que lo de memoria dinamica que no se como es eso aun en mis conocimientos y integer pues como el registro centinela me habla de 999,pues supongo que es un valor integer aunque quiza pueda hacerlo tambien como string,que creo que da igual ?¿.


2)suponiendo que puedo definir ese vector cedula como hago para pedir ese dato?, pues en mi solucion inicial sin manejar lo del vector yo hago esto:
{declaracion de variables}
....
...
begin
contadorpersonas:=0;
write('digite la cedula de la persona:');
readln(cedula);
While cedula <> 999 do
 begin
    write('digite salario:);
    readln(salario);
    write('digite numero de hijos:);
    readln(numhijos);
   
   {operaciones...}
   ...
   ...
   ...
   contadorpersonas:=contadorpersonas + 1;
    write('digite la cedula de la persona:');
    readln(cedula);
  end;{del while}
...
end.{ del programa principal}

como veis esta seria la version sin utilizar un vector.
sin embargo para almacenar las cedulas pues al final se me pide un listado de ellas, y no que las vaya mostrando por cada persona que vaya entrando,se que debo almacenarlas en un vector, pero mi pregunta en este item es esa profesor como puedo transformar mi codigo inicial , pero utilizando el vector para las cedulas, teniendo en cuenta que este campo o registro es el valor centinela con el cual cuando se digite el valor 999 deja de introducirsen mas datos y se muestran resultados, incluido el listado final de las cedulas de las personas.

espero como siempre tu importante ayuda para poder conseguir mi objetivo.mil gracias profesor.y gracias por compartir tu conocimiento y tu vocacion altruista de profesor para con nosotros los de menos posibilidades.


27-Jan-2012 17:43
Nacho Cabanes (+84)

Cuando se quiere usar un array, pero no se sabe el tamaño, la solución habitual es sobredimensionar: si esperas guardar datos de 100 personas, preparas espacio para 500 (por ejemplo).

Entonces, además, debes saber cuales de esos 500 datos ya están ocupados y cuales no lo están. Para eso hay dos formas habituales:

- La más simple es llevar un contador. Por ejemplo, si ya has guardado 5 datos, sabes que todas las lecturas y búsquedas sólo tienen que llegar hasta la ficha 5, y que no es necesario recorrer las 495 restantes.

- Una alternativa es tener un "centinela" que indique cual es la primera ficha no válida. Por ejemplo, si todas las fichas tienen como código "P01", "P02" y similares, en la primera vacía podías poner el código "ZZZ", y para hacer las búsquedas y lecturas usarías un "while" en vez de un "for".

Suele ser más eficiente usar un contador. Generalmente, sólo tiene sentido usar centinelas cuando la situación es un poco más complicada. Por ejemplo, si las fichas borradas no se eliminan realmente, sino que se marcan como disponibles. En ese caso, puede que tu última ficha fuera la 7, pero que tuvieras 2 fichas borradas entre medias, por lo que sólo habría 5 fichas "reales", y el contador de 7 no sería fiable. En ese caso necesitarías dos centinelas: la marca de final de datos (por ejemplo, "ZZZ") y la marca de ficha borrada (por ejemplo, "YYY").


27-Jan-2012 18:26
oscar gomez

cordial saludo profesor.
profesor bueno la verdad me quede un poco corto con tu explicacion, aunque trato de entenderte cosas,me gustaria saber mas o menos como podria transformar el codigo en el caso que use el vector y que el funcionamiento sea el mismo claro, es que la verdad quede casi en lo mismo.

begin
contadorpersonas:=0;
write('digite la cedula de la persona:');
readln(cedula);
While cedula <> 999 do
 begin
   write('digite salario:);
   readln(salario);
   write('digite numero de hijos:);
   readln(numhijos);
 
   {operaciones...}
   ...
   ...
   ...
   contadorpersonas:=contadorpersonas + 1;
   write('digite la cedula de la persona:');
   readln(cedula);
 end;{del while}

por tu orientacion y ayuda mil gracias.


29-Jan-2012 11:53
Nacho Cabanes (+84)

Estoy preparando un nuevo apartado en el tema 6, para que se vea mejor el uso de estructuras repetitivas para recorrer arrays. Es posible que lo tenga listo hoy mismo.

De momento, te incluyo aquí el ejemplo de cómo usar un array que no está completamente lleno, y recorrerlo usando un contador:


{--------------------------}
{  Ejemplo en Pascal:      }
{                          }
{    Ejemplo de uso de     }
{    arrays (02):          }
{    Pedir datos y mostrar }
{    al revés, en un array }
{    parcialmente lleno,   }
{    usando un contador    }
{    ARRAY02.PAS           }
{                          }
{  Este fuente procede de  }
{  CUPAS, curso de Pascal  }
{  por Nacho Cabanes       }
{                          }
{  Comprobado con:         }
{    - Free Pascal 2.4.2w  }
{--------------------------}

Program Array02;

const
  capacidad = 200;
 
var
  datos: array[1..capacidad] of integer;
  cantidad: integer; { Los datos existentes }
  i: integer;  { Para bucles }
 

begin
  cantidad := 0;
  repeat
    if cantidad >= capacidad then
      writeLn('No caben mas datos!')
    else
      begin
      cantidad := cantidad+1;
      write('Deme el dato ',cantidad,' (999 para salir): ');
      readln(datos[cantidad]);
      end;
  until datos[cantidad]=999;
 
  { El ultimo dato no hay que guardarlo }
  cantidad := cantidad-1;
 
  { Al final, muestro todos }
  write('Cantidad de datos: ', cantidad);
  write('Los datos al reves son: ');
  for i := cantidad downto 1 do
    write(datos[i], ' ');
  writeLn;
end.


Y un fuente parecido, que usara un centinela (para mostrar de principio a fin, no al revés) sería:



{--------------------------}
{  Ejemplo en Pascal:      }
{                          }
{    Ejemplo de uso de     }
{    arrays (03):          }
{    Pedir datos y mostrar }
{    al revés, en un array }
{    parcialmente lleno,   }
{    usando un centinela   }
{    ARRAY03.PAS           }
{                          }
{  Este fuente procede de  }
{  CUPAS, curso de Pascal  }
{  por Nacho Cabanes       }
{                          }
{  Comprobado con:         }
{    - Free Pascal 2.4.2w  }
{--------------------------}

Program Array03;

const
  capacidad = 200;
 
var
  datos: array[1..capacidad] of integer;
  cantidad: integer; { Los datos existentes }
  i: integer;  { Para bucles }
 

begin
  cantidad := 0;
  repeat
    if cantidad >= capacidad then
      writeLn('No caben mas datos!')
    else
      begin
      cantidad := cantidad+1;
      write('Deme el dato ',cantidad,' (999 para salir): ');
      readln(datos[cantidad]);
      end;
  until datos[cantidad]=999;
 
  { Al final, muestro todos }
  write('Los datos leidos son: ');
  i := 1;
  while datos[i] <> 999 do
    begin
    write(datos[i], ' ');
    inc(i);
    end;
  writeLn;
end.


29-Jan-2012 17:21
oscar gomez

Cordial saludo profesor Nacho.
Mil gracias comprendido y ya pude lograrlo mil gracias a tu ayuda.






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