with text_io, Ada.integer_text_io, Ada.strings.bounded, bstrings; use text_io, Ada.integer_text_io; procedure subcadFich is -- Definicion de tipos package pCad255 is new Ada.Strings.Bounded.Generic_Bounded_Length(255); use pCad255; package pCad255_ES is new bstrings(pCad255); use pCad255_ES; package pCad25 is new Ada.Strings.Bounded.Generic_Bounded_Length(25); use pCad25; package pCad25_ES is new bstrings(pCad25); use pCad25_ES; -- Definicion de variables linea, nomFic: pCad255.Bounded_String; --Necesario porque hay dos pal: pcad25.Bounded_String; esta: boolean; pos, total: integer; fTexto: File_Type; procedure esSubcadena(palabra: pCad255.Bounded_String; palabraini,palabrafin: integer; pal: pCad25.Bounded_String; palini, palfin: integer; encontrado: out boolean; donde: out integer) is ---------------------------------------------------------------------- -- Procedimiento: esSubcadena -- Programador: Area de Lenguajes y Sistemas Informaticos -- Fecha: Noviembre 1996 -- Modificado por: Area de Lenguajes y Sistemas Informaticos -- Fechas Modificacion: Noviembre 1998 ----------------------------------------------------------------------- -- Este procedimiento busca en la cadena de caracteres almacenada -- entre las posiciones desde 'palabraini' hasta 'palabrafin' de -- la variable 'palabra' la cadena de caracteres almancenada entre -- las posiciones desde 'palini' hasta 'palfin' de la variable 'pal' -- Versi'on con cadenas de caracteres de tama~no acotado. ----------------------------------------------------------------------- i,j,k: integer; continuar: boolean; begin i:=palabraini; j:= palini; encontrado:= false; while (i<=palabrafin-(palfin-palini+1) + 1) and not encontrado loop if (Element(palabra,i)/=Element(pal,j)) then i:= i + 1; else k:= i + 1; j:= j + 1; continuar:= true; while (k<=palabrafin) and (j<=palfin) and continuar loop if (Element(palabra,k) = Element(pal,j)) then k:= k + 1; j:= j + 1; else continuar:= false; i:= i + 1; j:= palini; end if; end loop; if (j>palfin) then encontrado:= true; donde:= i; end if; end if; end loop; end esSubcadena; function cuantasVeces(palabra : pCad255.Bounded_string; LP:integer; pal: pCad25.Bounded_string; LS: integer) return integer is ---------------------------------------------------------------------- -- Funcion: EsSubcadena -- Programador: Area de Lenguajes y Sistemas Informaticos -- Fecha: Noviembre 1996 -- Modificado por: -- Fechas Modificacion: ----------------------------------------------------------------------- -- Esta funcion calcula el numero de veces que la cadena de caracteres -- contenida entre la posicion 1 y la posicion 'LP' de la variable -- 'palabra' contiene a la cadena de caracteres ubicada entre la -- posicion 1 y la posicion 'LS' de la variable 'pal -- Versi'on con cadenas de caracteres acotadas. ----------------------------------------------------------------------- i, contador: integer; encontrado: boolean; donde: integer; begin i:= 1; contador:= 0; while (i <= LP - LS + 1) loop esSubcadena(palabra,i,LP, pal, 1,LS, encontrado,donde); if encontrado then contador:= contador + 1; i:= donde + 1; else i:= LP + 1; end if; end loop; return contador; end cuantasVeces; begin put("Que cadena buscamos?");new_line; get_line(pal); put("En que fichero?");new_line; get_line(nomFic); open(fTexto,In_File,To_String(NomFic)); total:= 0; while (not End_Of_File(fTexto)) loop get_line(fTexto,linea); --Leemos una l'inea del fichero esta:= false; esSubcadena(linea,1,Length(linea),pal,1,Length(pal),esta,pos); if esta then total:= total + cuantasVeces(linea,Length(linea),pal,Length(pal)); end if; end loop; put("Encontrado: "); put(total,1); put(" veces"); new_line; close(fTexto); end subcadFich;