[ Foro de Pascal ]

eliminación de un dato en pascal

01-Mar-2020 17:30
Miguel Castro
1 Respuestas

Buenas amigos me gustaría que me pudiesen ayudar con este programa en pascal que debo crear y me esta dando bastantes quebraderos de cabeza

Se me pide crear un programa que permita ingresar el nombre y el salario de los trabajadores de una empresa. así como también poder consultarlos y eliminarlos.

ya he creado una parte del código en geany:


program ACME;
 
 
 
type
 
    tipoPersona = record
 
        nombre: string;
 
        salario: real;
 
		sal_anu: real;
 
		sal_anual: real;
 
		sal_men: real;
 
		sal_mensual: real;
 
		utili, utilidades, vaca, vacaciones: real;
 
		bono: real;
 
 
 
    end;
 
 
 
const
 
    capacidad = 1000;
 
 
 
var
 
    tra: array[1..capacidad] of tipoPersona;
 
    cantidad: integer;
 
    opcion: integer;
 
    i: integer;
 
    textoBuscar: string;
 
    encontrado: boolean;
 
	bono: real;
 
	cesta: integer;
 
	seBorro:boolean;
 
 
 
{Cuerpo del programa principal}
 
begin
 
    cantidad := 0;
 
    repeat
 
        WriteLn('***BIENVENIDO A ACME***');
 
        WriteLn;
 
        WriteLn('1- Agregar Trabajador');
 
        WriteLn('2- Todos los trabajadores');
 
        WriteLn('3- Buscar a un trabajador');
 
        WriteLn('4- Reporte 1');
 
        WriteLn('5- Reporte 2');
 
		WriteLn('6- Eliminar Trabajador');
 
        WriteLn('0- Salir');
 
        Write('Escoja una opcion: ');
 
        ReadLn(opcion);
 
        WriteLn;
 
 
 
        case opcion of
 
            1: { Agregar trabajador }
 
                if (cantidad < capacidad) then
 
                begin
 
                    inc(cantidad);
 
                    WriteLn('Introduciendo al trabajador ', cantidad);
 
 
 
                    Write('Introduzca el nombre: ');
 
                    ReadLn(tra[cantidad].nombre);
 
 
 
                    Write('Introduzca Salario: ');
 
                    ReadLn(tra[cantidad].salario);
 
 
 
					for i:=1 to cantidad do
 
					begin
 
						if tra[i].salario > 1500 then begin
 
							tra[i].bono:=tra[i].salario*0.1;
 
							tra[i].utilidades:=tra[i].salario*2;
 
							tra[i].vacaciones:=tra[i].salario;
 
							tra[i].sal_mensual:=tra[i].salario+tra[i].bono;
 
							tra[i].sal_anual:=tra[i].sal_mensual*12+tra[i].vacaciones+tra[i].utilidades;
 
						end;
 
						if tra[i].salario <= 1500 then
 
						begin
 
							cesta:=20;
 
							tra[i].vaca:=tra[i].salario;
 
							tra[i].utili:=tra[i].salario*4;
 
							tra[i].sal_men:=tra[i].salario+cesta;
 
							tra[i].sal_anu:=tra[i].sal_men*12+tra[i].vaca;
 
						end;
 
					end;
 
				end;
 
 
 
            2: begin {Todos los trabajadores}
 
					if cantidad = 0 then
 
						WriteLn('No hay datos')
 
					else
 
						for i := 1 to cantidad do
 
							WriteLn(i, ' ', tra[i].nombre, tra[i].salario:4:2);
 
					WriteLn;
 
				end;
 
 
 
            3:  {Buscar a un trabajador}
 
                begin
 
                Write('Escriba el nombre del trabajador ');
 
                ReadLn( textoBuscar );
 
                encontrado := false;
 
                for i := 1 to cantidad do
 
                    if pos (textoBuscar, tra[i].nombre) > 0 then
 
                    begin
 
                        encontrado := true;
 
                        WriteLn( i,' - Nombre: ', tra[i].nombre,
 
                          ', Salario: ', tra[i].salario:4:2);
 
                    end;
 
                if not encontrado then
 
                    WriteLn('No se ha encontrado.');
 
                WriteLn;
 
                end;
 
 
 
            4:  {Reporte 1 }
 
				for i := 1 to cantidad do
 
                begin
 
                if tra[i].salario > 1500 then
 
                begin
 
					writeln('Nombre del trabajador: ', tra[i].nombre);
 
                    WriteLn('Salario: ', tra[i].salario:4:2);
 
                    WriteLn('Bono: ', tra[i].bono:4:2);
 
                    WriteLn('Total: ', tra[i].sal_mensual:4:2);
 
                end;
 
                end;
 
 
 
            5: { Reporte 2}
 
				for i := 1 to cantidad do
 
                begin
 
                if tra[i].salario <= 1500 then
 
                begin
 
					writeln('Nombre del trabajador: ', tra[i].nombre);
 
                    WriteLn('Salario: ', tra[i].salario:4:2);
 
                    WriteLn('Cestaticket: ', cesta);
 
                    WriteLn('Total: ', tra[i].sal_men:4:2);
 
                end;
 
                end;
 
			6: 	{ Eliminar trabajador }
 
				begin
 
				  seBorro := false;
 
				  for i := 1 to capacidad do
 
					ReadLn(tra[cantidad].nombre);
 
				  if pos (textoBuscar, tra[cantidad].nombre) = tra[i].nombre then
 
				   begin
 
					seBorro := true;
 
					fillchar(tra[i].salario, tra[i].sal_anu, tra[i].sal_anual, tra[i].sal_men, tra[i].sal_mensual, tra[i].utili, tra[i].utilidades, tra[i].vaca, tra[i].vacaciones, tra[i].bono;),0);
 
					end;
 
					if seBorro = true then
 
					writeln('El Trabajador indicado se ha borrado con exito')
 
				  end;
 
 
           0: { salir}
 
                begin
 
                ;
 
                WriteLn;
 
                WriteLn('Saliendo...');
 
                WriteLn;
 
                end;
 
 
 
             else
 
                begin
 
                WriteLn;
 
                WriteLn('Opción incorrecta!');
 
                WriteLn;
 
                end;
 
        end;  { Fin de "case" }
 
 
 
    until opcion = 0;
 
end.



El problema surge cuando trato de crear el código para la eliminación del trabajador ya que tengo que borrar su nombre y todo lo relacionado con este. Pero al compilar me da estos errores:

prueba2.pas(267,10) Error: Incompatible types: got "LongInt" expected "ShortString"
prueba2.pas(273,177) Fatal: Syntax error, ")" expected but ";" found
Fatal: Compilation aborted
Ha fallado la compilación.

Creo que estoy haciendo algo mal en el codigo para la eliminacion (opcion 6)


begin
  seBorro := false;
 
  for i := 1 to capacidad do
    ReadLn(tra[cantidad].nombre);

  if pos (textoBuscar, tra[cantidad].nombre) = tra[i].nombre then
   begin
    seBorro := true;
 
    fillchar(tra[i].salario, tra[i].sal_anu, tra[i].sal_anual, tra[i].sal_men, tra[i].sal_mensual, tra[i].utili, tra[i].utilidades, tra[i].vaca, tra[i].vacaciones, tra[i].bono;),0);
    end;
    if seBorro = true then
      writeln('El Trabajador indicado se ha borrado con exito')
end;


me gustaría que me pudiera ayudar y explicar como resolverlo.

Muchas gracias



01-Mar-2020 23:42
Nacho Cabanes (+61)

En un array sobredimensionado, como es tu caso, de cara a borrar, lo más importante no es vaciar ese registro, sino "mover hacia atrás" los que le siguen (y disminuir el contador).

Las ideas básicas (pero aplicadas a C#) las puedes ver en este video:

http://www.aprendeaprogramar.com/cursos/verApartado.php?id=4035
 






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