program cadena(input,output); type TCad255=string[255]; TCad25= string[25]; var palabra,nomFic: TCad255; pal: Tcad25; esta: boolean; pos, total: integer; fTexto: text; procedure esSubcadena(var palabra, pal:string; palabraini, palabrafin, palini,palfin: integer; var encontrado: boolean; var donde:integer); {---------------------------------------------------------------------} { Procedimiento: esSubcadena } { Programador: Area de Lenguajes y Sistemas Informaticos } { Fecha: Noviembre 1996 } {---------------------------------------------------------------------} { 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' } {---------------------------------------------------------------------} var i,j,k: integer; continuar: boolean; begin i:=palabraini; j:= palini; encontrado:= false; while (i<=palabrafin-(palfin-palini+1) + 1) and not encontrado do begin if (palabra[i]<>pal[j]) then i:= i + 1 else begin k:= i + 1; j:= j + 1; continuar:= true; while (k<=palabrafin) and (j<=palfin) and continuar do begin if (palabra[k] = pal[j]) then begin k:= k + 1; j:= j + 1 end else begin continuar:= false; i:= i + 1; j:= palini end end; if (j>palfin) then begin encontrado:= true; donde:= i end end end end; function cuantasVeces(var palabra, pal: string): integer; {---------------------------------------------------------------------} { Funcion: EsSubcadena } { Programador: Area de Lenguajes y Sistemas Informaticos } { Fecha: Noviembre 1996 } {---------------------------------------------------------------------} { 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' } {----------------------------------------------------------------------} var i, contador: integer; encontrado: boolean; donde: integer; lpal,lsub: integer; begin i:= 1; contador:= 0; lpal:= strlen(palabra); lsub:= strlen(pal); while (i <= lpal - lsub + 1) do begin esSubcadena(palabra,pal, i,lpal, 1,lsub, encontrado,donde); if encontrado then begin contador:= contador + 1; i:= donde + 1 end else i:= lpal+1; end; cuantasVeces:= contador; end; begin writeln('Que cadena buscamos?'); readln(pal); writeln('En que fichero?'); readln(nomFic); reset(fTexto,nomFic); total:= 0; while not eof(fTexto) do begin readln(fTexto,palabra); {Leemos una l'inea del fichero} esta:= false; esSubcadena(palabra,pal,1,strlen(palabra),1,strlen(pal),esta,pos); if esta then total:= total + CuantasVeces(palabra,pal) end; writeln('Encontrado: ',total:1,' veces'); close(fTexto) end.