• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 215
  • Last Modified:

Find a string in a record array

I need the procedure to find a string in a record array. Thanks
0
gsoldado
Asked:
gsoldado
  • 4
  • 3
  • 2
  • +2
1 Solution
 
HypoCommented:
could you explain exaclty what you mean... should the procedure be able to find the string in any records types or only in one specified? Should it scan for a part of a string in the record array or only full strings???

My proposal of a function (as the sollution to your problem) would be one that works like this...

Function FindString(S: string; Data: YourRecordArray) : word; that returns the index of the record in the record array where the string was found!

Am I on the right track here? tell me and I'll do the function for you.
0
 
BatalfCommented:
Could this help you ?

Or are you searching for something else ?

PROGRAM findstring;
uses crt;
CONST
   N = 100 {the numbers of records you need in the array}


type
    myrecord = record
       name : string[30];
       age  : integer;
       height : integer;
       weight : integer;
    end;
    myarraytype = array[1..n] of myrecord;
var
    myarray : myarraytype;
    name : string[30];
    i, j : integer;

begin
   {I assume that you know how to put in values into the array. You're not asking for anything like that so I don't put in any code here.

The search routine could be like this :}

writeln{'Type in the name you would search for : ');
readln(name};
for i:=1 to n do
if name = myarray[i].name then
begin
    writeln('Found user ',myarray[1].name);
    writeln('No ',i,' in the array');
end;

end.

Regards
Batalf

   
0
 
My name is MudSystems EngineerCommented:
Program BusquedaEnArray;
USES
  CRT;
Const
  ConstSexo: Array[0..1] Of String = ('Hombre','Mujer');
  NombreArchivoLista = 'LISTA.REC';
  CuantasVeces: LongInt = 0;
Type
  TipoSexo = (Hombre,Mujer);
  TipoOrdena = (Nom,Ap1,Ap2,Eda,Sex,Dir);
  EncLista = ^ListaEncontro;
  ListaEncontro = Record
    Puntero: Pointer;
    AEnc: EncLista;
    SEnc: EncLista;
  End;
  MiLista = ^ListaRec;
  ListaRec = Record
    Nombre: String[20];
    Apellido1: String[20];
    Apellido2: String[20];
    Edad: Byte;
    Sexo: TipoSexo;
    Direccion: String[40];
    AntRec: MiLista;
    SigRec: MiLista;
  End;
Var
  ArchivoLista: File Of ListaRec;
  Comienzo,Anterior,Actual,Final: MiLista;
  ComEnc,AntEnc,ActEnc,FinEnc: EncLista;
  CadenaABuscar: String;
  Key: Char;
  I: LongInt;

{ Function para contar el numero de records en la lista }
Function CuentaLista: LongInt;
Var
  I: LongInt;
Begin
  Actual:=Comienzo;
  I:=0;
  While Actual <> Nil Do
    Begin
      I:=I+1;
      Actual:=Actual^.SigRec;
    End;
  CuentaLista:=I;
End;

{ Procedure para a¤adir records a la lista }
Procedure AnadeALaLista(DatosNuevos: ListaRec);
Begin
  { Establecer si no es la primera vez que hacemos la lista }
  If Actual = NIL Then
    Begin
      New(Actual); { Obten memoria para los datos }
      With Actual^ do  { Llenado de los datos }
        Begin
          Nombre:=DatosNuevos.Nombre;
          Apellido1:=DatosNuevos.Apellido1;
          Apellido2:=DatosNuevos.Apellido2;
          Edad:=DatosNuevos.Edad;
          Sexo:=DatosNuevos.Sexo;
          Direccion:=DatosNuevos.Direccion;
          SigRec:=NIL; { No hay mas registros arriba, apunta a NIL }
          AntRec:=NIL  { No hay mas registros abajo, apunta a NIL }
        End;
      Comienzo:=Actual;
      Final:=Actual
    End
  Else  { Esta no es la primer vez que a¤adimos registros }
    Begin
      New(Final);
      Final^.AntRec:=Actual; {Actual <- Final}
      Final^.SigRec:=NIL;     {Final -> Nil}
      Actual^.SigRec:=Final; {Actual -> Final}
      Actual:=Final;       {Actual:=Final}
      With Actual^ do  {Fill in the data}
        Begin
          Nombre:=DatosNuevos.Nombre;
          Apellido1:=DatosNuevos.Apellido1;
          Apellido2:=DatosNuevos.Apellido2;
          Edad:=DatosNuevos.Edad;
          Sexo:=DatosNuevos.Sexo;
          Direccion:=DatosNuevos.Direccion;
        End
    End
End;

{ Procedure para ordenar la lista usando el metodo de Burbuja }
Procedure OrdenaLista(QueOrdena: TipoOrdena);
Var
  Index1,Index2: Integer;
  MaxNum: Integer;

  Procedure CambiaLugar(Var Ant,Act: MiLista);
  Var
    Temp: MiLista;
  Begin
    New(Temp);
    Move(Ant^,Temp^,SizeOf(ListaRec) - 8);
    Move(Act^,Ant^,SizeOf(ListaRec) - 8);
    Move(Temp^,Act^,SizeOf(ListaRec) - 8);
    Dispose(Temp);
  End;

Begin
  MaxNum:=CuentaLista;
  Anterior:=Comienzo;
  Actual:=Final;
  For Index1:=1 To MaxNum-1 Do
    Begin
      For Index2:=MaxNum DownTo Index1+1 Do
        Begin
          Case QueOrdena Of
            Nom:
              If Anterior^.Nombre > Actual^.Nombre Then
                CambiaLugar(Anterior,Actual);
            Ap1:
              If Anterior^.Apellido1 > Actual^.Apellido1 Then
                CambiaLugar(Anterior,Actual);
            Ap2:
              If Anterior^.Apellido2 > Actual^.Apellido2 Then
                CambiaLugar(Anterior,Actual);
            Eda:
              If Anterior^.Edad > Actual^.Edad Then
                CambiaLugar(Anterior,Actual);
            Sex:
              If Anterior^.Sexo > Actual^.Sexo Then
                CambiaLugar(Anterior,Actual);
            Dir:
              If Anterior^.Direccion > Actual^.Direccion Then
                CambiaLugar(Anterior,Actual);
          End;
          Actual:=Actual^.AntRec;
        End;
      Anterior:=Anterior^.SigRec;
      Actual:=Final;
    End
End;

Procedure EliminaListaEncontro;
Begin
  ActEnc:=ComEnc;
  If ActEnc <> NIL Then
    Begin
      While ActEnc^.AEnc <> Nil Do
        Begin
          AntEnc:=ActEnc;
          ActEnc:=ActEnc^.SEnc;
          If AntEnc <> Nil Then
            Dispose(AntEnc)
        End;
    Dispose(ActEnc)
  End
End;

Procedure AnadeListaEncontro(DondeEsta: Pointer);
Begin
  If ActEnc = NIL Then
    Begin
      New(ActEnc);
      With ActEnc^ do
        Begin
          Puntero:=DondeEsta;
          SEnc:=NIL;
          AEnc:=NIL
        End;
      ComEnc:=ActEnc;
      FinEnc:=ActEnc
    End
  Else  {Now this is not the first time}
    Begin
      New(FinEnc);
      FinEnc^.AEnc:=ActEnc; {Current <- FinEnc}
      FinEnc^.SEnc:=NIL;     {FinEnc -> Nil}
      ActEnc^.SEnc:=FinEnc; {Current -> FinEnc}
      ActEnc:=FinEnc;       {Current:=FinEnc}
      With ActEnc^ do  {Fill in the data}
        Begin
          Puntero:=DondeEsta;
        End
    End
End;

Function CadenaEncontrada(EnDonde: TipoOrdena; QueCadena: String): Boolean;
Var
  SeEncontro: Boolean;
Begin
  Actual:=Comienzo;
  EliminaListaEncontro;
  While Actual <> Nil Do
    Begin
      Case EnDonde Of
        Nom:
          If QueCadena = Actual^.Nombre Then
            Begin
              SeEncontro:=True;
              CuantasVeces:=CuantasVeces + 1;
              AnadeListaEncontro(Actual)
            End;
        Ap1:
          If QueCadena = Actual^.Apellido1 Then
            Begin
              SeEncontro:=True;
              CuantasVeces:=CuantasVeces + 1;
              AnadeListaEncontro(Actual)
            End;
        Ap2:
          If QueCadena = Actual^.Apellido2 Then
            Begin
              SeEncontro:=True;
              CuantasVeces:=CuantasVeces + 1;
              AnadeListaEncontro(Actual)
            End;
        {Edad:
          If QueCadena = Actual^.Sexo Then
            Begin
              SeEncontro:=True;
              CuantasVeces:=CuantasVeces + 1;
              AnadeListaEncontro(Actual)
            End;}
        {Sex:
          If QueCadena = Actual^.Sexo Then
            Begin
              SeEncontro:=True;
              CuantasVeces:=CuantasVeces + 1;
              AnadeListaEncontro(Actual)
            End;}
        Dir:
          If QueCadena = Actual^.Direccion Then
            Begin
              SeEncontro:=True;
              CuantasVeces:=CuantasVeces + 1;
              AnadeListaEncontro(Actual)
            End;
      End;
      Actual:=Actual^.SigRec;
    End;
End;

Procedure DesasteDeTodo;
Begin
  Actual:=Comienzo;
  If Actual <> NIL Then
    Begin
      While Actual^.SigRec <> Nil Do
        Begin
          Anterior:=Actual;
          Actual:=Actual^.SigRec;
          If Anterior <> Nil Then
            Dispose(Anterior)
        End;
      Dispose(Actual)
    End
End;

Procedure LeeArchivo;
Var
  Temp: ListaRec;
Begin
  Assign(ArchivoLista,NombreArchivoLista);
  {$I-} Reset(ArchivoLista); {$I+}
  If IOResult <> 0 Then
    Rewrite(ArchivoLista);
  While Not EOF(ArchivoLista) Do
    Begin
      Read(ArchivoLista,Temp);
      AnadeALaLista(Temp);
    End;
  Close(ArchivoLista);
End;

Procedure EscribeArchivo;
Begin
  Assign(ArchivoLista,NombreArchivoLista);
  {$I-} Reset(ArchivoLista); {$I+}
  If IOResult <> 0 Then
    Rewrite(ArchivoLista);
  Actual:=Comienzo;
  While Actual <> Nil Do
    Begin
      Write(ArchivoLista,Actual^);
      Actual:=Actual^.SigRec;
    End;
  Close(ArchivoLista);
End;

Procedure LlenaDatos;
Var
  Temp: ListaRec;
  T: String[1];
  ST,Cod: Integer;
Begin
  Write('Nombre: ');
  ReadLn(Temp.Nombre);
  Write('Apellido1: ');
  ReadLn(Temp.Apellido1);
  Write('Apellido2: ');
  ReadLn(Temp.Apellido2);
  Write('Edad: ');
  ReadLn(Temp.Edad);
  Repeat
    Write('Sexo [0=Hombre/1=Mujer]');
    ReadLn(T);
    Val(T,ST,Cod)
  Until ((Cod = 0) And (ST in [0..1]));
  Temp.Sexo:=TipoSexo(ST);
  Write('Direccion: ');
  ReadLn(Temp.Direccion);
  AnadeALaLista(Temp);
End;

Procedure VisualizaLista(PLista: Pointer);
Begin
  With ListaRec(PLista^) Do
    Begin
      WriteLn('Nombre: ',Nombre);
      WriteLn('Apellido1: ',Apellido1);
      WriteLn('Apellido2: ',Apellido2);
      WriteLn('Edad: ',Edad);
      WriteLn('Sexo: ',ConstSexo[Byte(Sexo)]);
      WriteLn('Direccion: ',Direccion);
      WriteLn;
    End;
End;

Begin
  ClrScr;
  WriteLn('Leyendo De Archivo ',NombreArchivoLista);
  LeeArchivo;
  Repeat
    WriteLn('Presione Una Tecla para continuar [ESC=Salir]');
    Write('A¤ade Ordena Busca Ver [ESC]');
    WriteLn(#10#13);
    Key:=ReadKey;
    If Key=#0 Then
      Key:=ReadKey;
    Key:=UpCase(Key);
    Case Key Of
      'A':
        Begin
          LlenaDatos;
          WriteLn(#10#13);
        End;
      'O':
        Begin
          Repeat
            WriteLn('Ordenar Que??? ');
            Write('1)Nombre 2)Apellido1 3)Apellido2 4)Edad 5)Sexo 6)Direccion ');
            Key:=ReadKey;
          Until Key in ['1'..'6'];
          OrdenaLista(TipoOrdena(Byte(Key)-49));
          WriteLn(#10#13);
        End;
      'B':
        Begin
          Repeat
            WriteLn('Buscar Que??? ');
            Write('1)Nombre 2)Apellido1 3)Apellido2 6)Direccion ');
            Key:=ReadKey;
            WriteLn;
          Until Key in ['1'..'3','6'];
          Write('Que Cadena Busca?: ');
          ReadLn(CadenaABuscar);
          CuantasVeces:=0;
          If CadenaEncontrada(TipoOrdena(Byte(Key)-49),CadenaABuscar) Then
            Begin
              WriteLn;
              WriteLn('La Cadena se encontro ',CuantasVeces,' Ves(ces) en los Records...');
              ActEnc:=ComEnc;
              While ActEnc <> Nil Do
                Begin
                  VisualizaLista(ActEnc^.Puntero);
                  ActEnc:=ActEnc^.SEnc;
                  ReadKey;
                End;
            End;
          WriteLn(#10#13);
        End;
      'V':
        Begin
          Actual:=Comienzo;
          While Actual <> Nil Do
            Begin
              VisualizaLista(Actual);
              Actual:=Actual^.SigRec;
              ReadKey;
            End;
        End;
    End;
  Until Key = #27;
  WriteLn('Escribiendo a archivo ',NombreArchivoLista);
  EscribeArchivo;
  DesasteDeTodo;
End.
0
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
My name is MudSystems EngineerCommented:
Tiene algunos errores, hay que refinarlo...
0
 
BatalfCommented:
If my comment helps, maybe I should have the points here :-)
0
 
gsoldadoAuthor Commented:
I'll give the points to bathalf, since he wrote a clear and short answer.

Thanks to all the other ones who wrote was very educative.

Alex
0
 
jack_p50Commented:
>Tiene algunos errores, hay que refinarlo...
Whatboy, does that means: "Oh (Edited by Computer101) you, sanuvabitch???"
Heh
Sorry guys
Qsoldado, pls in further messages write more clear about your task. It's not cool to make people guess not about the answer, but about the question too
Farewell
0
 
BatalfCommented:
Thanks Gsoldado.

Look at my comments above
0
 
My name is MudSystems EngineerCommented:
>>Whatboy, does that means: "Oh (Edited by Computer101) you, sanuvabitch???"

Yeah why not, if you say so... :)

Guess, i was wrong, i though he spoke spanish, guess it was another soldier...
0
 
gsoldadoAuthor Commented:
And yes I speak spanish hermano.
0
 
My name is MudSystems EngineerCommented:
It is a good idea to say something when rejecting an answer... Like


"Hey are you stupid or what??? that's not what i want, i want..."

  Kind like that... It's worst to be ignored and that some one deserves the points for a less elavorated proggy...
:(
0

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

  • 4
  • 3
  • 2
  • +2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now