with text_io, Ada.integer_text_io; use text_io, Ada.integer_text_io; procedure subcadFich is -- Definicion de tipos subtype TCad255 is string(1..255); subtype TCad25 is string(1..25); -- Definicion de variables linea, nomFic: TCad255; pal: Tcad25; tamPal, tamNom, tamLin: integer; esta: boolean; pos, total: integer; fTexto: File_Type; procedure esSubcadena(palabra: string; palabraini,palabrafin: integer; pal: 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' ----------------------------------------------------------------------- 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 (palabra(i)/=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 (palabra(k) = 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 : string; LP:integer; pal: 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 ----------------------------------------------------------------------- i, contador: integer; encontrado: boolean; donde: integer; begin i:= 1; contador:= 0; while (i <= LP - LS + 1) loop encontrado:= false; esSubcadena(palabra,i,LP, pal, 1,LS, encontrado,donde); put(donde); if encontrado then contador:= contador + 1; i:= donde + 1; else i:= LP+1; end if; put(i); put(LP); put(LS); new_line; end loop; return contador; end cuantasVeces; begin put("Que cadena buscamos?");new_line; get_line(pal,tampal); put("En que fichero?");new_line; get_line(nomFic,tamNom); open(fTexto,In_File,nomFic(1..tamNom)); total:= 0; while (not End_Of_File(fTexto)) loop get_line(fTexto,linea,tamLin); --Leemos una l'inea del fichero esta:= false; esSubcadena(linea,1,tamLin,pal,1,tampal,esta,pos); if esta then total:= total + cuantasVeces(linea,tamLin,pal,tamPal); end if; end loop; put("Encontrado: "); put(total,1); put(" veces"); new_line; close(fTexto); end subcadFich;