• Viernes 29 de Marzo de 2024, 09:00

Autor Tema:  Como borrar un registro en pascal?  (Leído 5207 veces)

carldark76

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Como borrar un registro en pascal?
« en: Sábado 11 de Enero de 2014, 21:47 »
0
Que tal amigos, este es mis primer tema en un foro,soy muy nuevo en esto asi que de antemano mis disculpas, no se si este es el medio adecuado para solicitar ayuda con respecto a un ejercicio que debo hacer en pascal el cual consiste en trabajar con arrays, como incluir, modificar , consultar y eliminar datos, mi problema es que no puedo hacer el procedure, simplemente no tengo la minima idea de como hacerlo, ya el programa hace las otras opciones excepto eliminar el registro, anexo el codigo que tengo hasta ahora. agradeceria algun ejemplo u idea.. gracias de antemano

program estadistica;
uses
crt;
const
tipove : array[1..4] of string[20] = (
'particulares','porpuesto','taxi','transporte publicos');
acion : array['A'..'B'] of string[5] = (
'Sale','Entra');
type
regvehiculo = record
nplaca : string[20];
npasaj : integer;
alcabala : string[20];
fecha : string[10];
tipovl : byte;
salent : string[5];
end;

var
datos : array[0..200] of regvehiculo;
cont : integer;
tecla : char;

procedure entrada_datos;
var
d : integer;
cu : char;
begin
writeln('***** Entrada De Datos Vehiculos *****');
writeln;
write(' Numero Placa : ');
readln(datos[cont].nplaca);
for d := 1 to length(datos[cont].nplaca) do
datos[cont].nplaca[d] := upcase(datos[cont].nplaca[d]);
write(' Numero Pasajeros : ');
readln(datos[cont].npasaj);
write(' Alcabala : ');
readln(datos[cont].alcabala);
write(' Fecha d/m/a : ');
readln(datos[cont].fecha);
writeln(' Tipo Vehiculo : 1=particulares 2=porpuesto 3=taxi',
' 4=transporte publicos');
write(' Tipo Veiculo : ');
readln(datos[cont].tipovl);
write(' Accion [A]=Sale =entra : ');
repeat
readln(cu);
until upcase(cu) in['A','B'];
datos[cont].salent := acion[upcase(cu)];
cont := cont + 1;
if cont > 200 then
cont := 200;
end;

procedure consulta;
var
nume : string[20];
nn : integer;
enco : boolean;
begin
writeln(' ****** Consulta Entre Numero Matricula ******');
writeln;
write(' Numero : ');
readln(nume);
for nn := 1 to length(nume) do
nume[nn] := upcase(nume[nn]);
nn := 0;
enco := false;
repeat
if datos[nn].nplaca = nume then
enco := true
else
nn := nn + 1;
until (nn > cont - 1) or (enco = true);
if enco = true then
begin
clrscr;
writeln(' ***** Datos Consultados Son *****');
writeln;
writeln(' Numero Placa = ',datos[nn].nplaca);
writeln(' Numero Pasajeros = ',datos[nn].npasaj);
writeln(' Alcabala = ',datos[nn].alcabala);
writeln(' Fecha = ',datos[nn].fecha);
writeln(' Tipo Vehiculo = ',tipove[datos[nn].tipovl]);
writeln(' Sale/Entra = ',datos[nn].salent);
writeln;
writeln(' >>>>> Pulse Una Tecla <<<<<');
readkey;
end;
end;

procedure modifica;
var
termina, si : boolean;
pu, tec : char;
nn : integer;
num : string[20];
begin
if cont > 0 then
begin
writeln('***** Modificacion De Datos *****');SALE
writeln;
write(' Entre Nume Matricula : ');
readln(num);
for nn := 1 to length(num) do
num[nn] := upcase(num[nn]);
nn := 0;
si := false;
termina := false;
repeat
if datos[nn].nplaca = num then
si := true
else
nn := nn + 1;
until (nn > cont) or (si = true);
if si = true then
begin
repeat
clrscr;
writeln('*** Elija Elemento A Modificar ***');
writeln;
writeln(' A = Numero Placa ');
writeln(' B = Numero Pasajeros');
writeln(' C = Alcabala ');
writeln(' D = Fecha');
writeln(' E = Tipo Vehiculo');
writeln(' F = Sale/Entra');
writeln(' S = Nada');
writeln;
repeat
tec := upcase(readkey);
until tec in['A','B','C','D','E','F','S'];
clrscr;
case tec of
'A' : begin write(' Numero Placa : '); readln(datos[nn].nplaca); end;
'B' : begin write(' Numero Pasajeros : '); readln(datos[nn].npasaj); end;
'C' : begin write(' Alcabala : '); readln(datos[nn].alcabala); end;
'D' : begin write(' Fecha : '); readln(datos[nn].fecha); end;
'E' : begin write(' Tipo Vehiculo : '); readln(datos[nn].tipovl); end;
'F' : begin write(' Sale/Entra : '); readln(datos[nn].salent); end;
'S' : termina := true;
end;
if tec <> 'S' then
begin
writeln('** Desea Modificar Mas [S/N] **');
repeat
pu := upcase(readkey);
until pu in['S','N'];
if pu = 'N' then
termina := true;
end;
until termina = true;
end;
end
else
begin
writeln('<<<<<<< Sin Datos En Registro Pulse Una Tecla >>>>>>>>>');
readkey;
end;
end;

procedure ordena;
var
pu : char;
porque : string;
kk, nn : integer;
temp : regvehiculo;
begin
if cont > 1 then
begin
for kk := 0 to cont - 1 do
for nn := cont - 1 downto kk + 1 do
begin
if datos[kk].alcabala > datos[nn].alcabala then
begin
temp := datos[kk];
datos[kk] := datos[nn];
datos[nn] := temp;
end;
end;
end;
end;

procedure eliminaregistro;
var
tt, nn : integer;
reg : regvehiculo;
placa : string[20];
sal : boolean;
pul : char;
begin
if cont > 1 then
begin
writeln(' **** Eliminicain De Un Registro ****');
writeln;
write(' Entre Numero Placa : ');
readln(placa);
for nn := 1 to length(placa) do
placa[nn] := upcase(placa[nn]);
sal := false;
nn := 0;
repeat
if datos[nn].nplaca = placa then
sal := true
else
nn := nn + 1;
until (nn > cont - 1) or (sal = true);
if sal = true then
begin
writeln('???? Se Anulara El Registro Matricula = ',datos[nn].nplaca);
writeln('****** Desea Anularlo [S/N] *******');
repeat
pul := upcase(readkey);
until pul in['S','N'];
if pul = 'S' then
begin
for tt := 0 to cont do
begin
if tt <> nn then
datos := datos;
end;
cont := tt;
end;
end;
end;
end;

procedure ordenafecha(d : array of regvehiculo; num : integer);
var
j, t : integer;
auxil : regvehiculo;
begin
for j := 1 to num do
for t := num downto j + 1 do
if d[j].fecha > d[t].fecha then
begin
auxil := d[j];
d[j] := d[t];
d[t] := auxil;
end;
end;

procedure visualizatodos;
var
tm, poe, pos, entr, sale, paso, cc : integer;
tempo : array[1..20] of regvehiculo;
conp, alca : string[20];
begin
cc := 0;
tm := 1;
poe := 0;
pos := 0;
entr := 0;
sale := 0;
if cont > 1 then
begin
ordena;
for cc := 0 to cont - 1 do
begin
if (datos[cc].fecha = datos[cc + 1].fecha) and
(datos[cc].alcabala = datos[cc + 1].alcabala) then
begin
tempo[tm] := datos[cc];
tm := tm + 1;
end
else
begin
if tm > 1 then
begin
tempo[tm] := datos[cc];
tm := tm + 1;
ordenafecha(tempo,tm - 1);
for paso := 1 to tm - 1 do
begin
if tempo[paso].salent = acion['B'] then
poe := poe + 1;
if tempo[paso].salent = acion['A'] then
pos := pos + 1;
end;
if poe > 0 then
entr := (100 * poe) div (poe + pos);
if pos > 0 then
sale := (100 * pos) div (poe + pos);
writeln(' Alcabala = ',tempo[paso].alcabala);
writeln;
writeln(' Fecha Entran Salen %entran %salen');
writeln(tempo[paso].fecha,' ',poe,' ',pos,
' ',entr,' ',sale);
writeln;
writeln(' Fechas = ',tm - 1);
end
else
begin
if datos[cc].salent = acion['B'] then
poe := poe + 1;
if datos[cc].salent = acion['A'] then
pos := pos + 1;
if poe > 0 then
entr := (100 * poe) div (poe + pos);
if pos > 0 then
sale := (100 * pos) div (poe + pos);
writeln(' Alcabala = ',datos[cc].alcabala);
writeln;
writeln(' Fecha Entran Salen %entran %salen');
writeln(datos[0].fecha,' ',poe,' ',pos,
' ',entr,' ',sale);
writeln;
writeln(' Fechas = 1');
end;
tm := 1;
poe := 0;
pos := 0;
entr := 0;
sale := 0;
end;
end;
end
else
begin
clrscr;
writeln(' Alcabala = ',datos[0].alcabala);
writeln;
if datos[0].salent = acion['B'] then
begin
entr := 1;
end
else
begin
entr := 0;
poe := 0;
end;
if datos[0].salent = acion['A'] then
begin
sale := 1;
end
else
begin
sale := 0;
pos := 0;
end;
if entr > 0 then
poe := (100 * entr) div (entr + sale);
if sale > 0 then
pos := (100 * sale) div (sale + entr);
writeln(' Fecha Entran Salen %entran %salen');
writeln(datos[0].fecha,' ',entr,' ',sale,
' ',poe,' ',pos);
writeln;
writeln(' Fechas = 1');
end;
readkey;
end;


procedure menu;
var
sal : boolean;
pul : char;
begin
sal := false;
cont := 0;
repeat
clrscr;
writeln(' **** Menu Jeneral ****');
writeln;
writeln(' 1 = Incluir');
writeln(' 2 = Consultar');
writeln(' 3 = Modificar');
writeln(' 4 = Eliminar');
writeln(' 5 = Reporte de estadisticas');
writeln(' 6 = Salida');
writeln;
writeln(' *** Elija Opcion ***');
repeat
pul := readkey;
until pul in['1','2','3','4','5','6'];
clrscr;
case pul of
'1' : entrada_datos;
'2' : consulta;
'3' : modifica;
'4' : eliminaregistro;
'5' : visualizatodos;
'6' : sal := true;
end;
until sal = true;
end;

begin
menu;
end.

oakis

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re:Como borrar un registro en pascal?
« Respuesta #1 en: Martes 1 de Abril de 2014, 09:41 »
0
Bueno, no se si te sirva la ayuda ahora, pero para el que la necesite ahi va.


Pre Condicion: Siempre que se trabajen con arreglos hay que llevar la cantidad logica ( o dimension Logica ) de los datos dentro del mismo.

Esto nos ayuda a saber la cantidad efectiva de datos que hay dentro del arreglo, y esto es practico para cuando queremos agregar mas datos al mismo y no pasarnos de la capacidad maxima.

Lo primero es ubicar el registro a eliminar y determinar en que posicion del arreglo ( o Array) se encuentra.

*Si el dato es el ultimo dentro de la dimension Logica del arreglo, lo que debemos hacer es decrementar la dimension Logica en 1, con esto estamos haciendo un borrado logico de los datos. Esto vale como borrado de datos. Ejemplo:

Buscar y borrar el numero '09' en el siguiente arreglo:

Antes del borrado.
Dimension Fisica del arreglo = 8
Dimension Logica = 6

                                   Dato a borrar
                                               ↓
|_01_|_02_|_03_|_05_|_07_|_09_|____|____|
                                               ↑
                                    Dim. Logica

Despues del borrado.

                                          ┌  Datos Basura   ┐
|_01_|_02_|_03_|_05_|_07_|_09_|____|____|
                                      ↑
                               Dim. Logica

A partir de la Posicion siguiente a la Dim. Logica, los datos se consideran invalidos logicamente.

*Si el dato esta en otra parte que no sea en el final de la dimension Logica ( pero siempre comprendido dentro de la misma ), puedes sobreescribir los datos del registro buscado con el ultimo registro de la dimension Logica y luego decrementar la dimension en 1. Esto tambien vale como borrado, pero tendrias que volver a ordenar los datos para tenerlos ordenados de nuevo. Ejemplo:

Buscar y borrar el numero '02' en el siguiente arreglo:

Antes del borrado.
Dimension Fisica del arreglo = 8
Dimension Logica = 6

      Dato a borrar
             ↓
|_01_|_02_|_03_|_05_|_07_|_09_|____|____|
                                               ↑
                                    Dim. Logica

Sobreescribo el dato a borrar con el ultimo dato de la Dim. Logica ( es decir con el '09' ) y decremento en 1 la cantidad de datos.
Dimension Fisica del arreglo = 8
Dimension Logica = 5

   Dato sobreescrito
             ↓                            ┌  Datos Basura  ┐
|_01_|_09_|_03_|_05_|_07_|_09_|____|____|
                                      ↑
                               Dim. Logica


*Por ultimo puedes tambien borrar de la siguiente manera. Determinas la posicion del registro a borrar y lo sobreescribes con el registro de la posicion siguiente, es decir, haces una superposicion de datos desde la posicion del registro a borrar  hasta la dimension logica. Ejemplo sencillo:

Buscar y borrar el numero '05' en el siguiente arreglo:

Dimension Fisica del arreglo = 8
Dimension Logica = 6

                      Dato a borrar
                              ↓
|_01_|_02_|_03_|_05_|_07_|_09_|____|____|

Tip: Puedes usar el indice del dato a borrar ( en este casi su indice es 4) y restarselo a la dim Logica( que es 6), esto te dara la cantidad de corrimientos de datos que debes hacer ( 6 - 4 = 2 corrimientos de datos ), es ideal para usarlo con un "For"

Determino la posicion del numero buscado, como resultado da que esta en la posicion 4.
Entonces desde la posicion 4 voy superponiendo los datos, es decir, en la posicion 4 copio los datos de la posicion 5, en la 5 copio los datos de la 6, y decrementas la dimension Logica en 1. Por lo tanto te quedaria asi el vector resultante

Dimension Fisica del arreglo = 8
Dimension Logica = 5

                         Superposicion de datos
                                  ←    ← 
|_01_|_02_|_03_|_07_|_09_|_09_|____|____|
                                      ↑  └   Datos Basura  ┘
                                      ↑
                          Nueva Dim. Logica

Como se ve en la representacion, queda repetido el '09' dos veces, pero eso es inevitable. Pero tus datos verdaderos son los que estan comprendidos dentro de la dimension logica. Los datos despues de la misma los debes tratar como basura ya que no sirven, y nuevamente aqui estamos aplicando un "Borrado logico de datos".


Bueno, espero que se haya entendido la idea en general que trate de expresar. Tambien espero que te pueda servir de ayuda o a otra persona que este en la misma condicion.

Sin mas me despido, saludos!
« última modificación: Martes 1 de Abril de 2014, 09:56 por oakis »