Вот ещё варианты решения задач (покороче, без вложенных циклов):
1.
function kw(s:string; c:char):integer;
var sl:string; n,k,i:integer;
begin
n:=0; k:=0;
s:=s+'.';
for i:=1 to length(s) do
if s[i] in [' ',',',';','.']
then begin if k>0 then inc(n); k:=0; end
else if s[i]=c then inc(k);
kw:=n;
end;
var st:string; c:char;
begin
st:='program, begin, procedure, var, div, array.';
c:='r';
writeln('m=',kw(st,c));
end.
2. Здесь анализируются только строчные английские буквы. При желании можно добавить заглавные англ. и русские. Всё будет аналогично.
procedure pk(s:string;k:integer);
var a:array['a'..'z'] of integer; i:integer; c:char;
begin
for c:='a' to 'z' do a[c]:=0;
for i:=1 to length(s) do
if s[i] in ['a'..'z'] then inc(a[s[i]]);
for c:='a' to 'z' do if a[c]end;
var st:string; k:integer;
begin
st:='program, begin, procedure, var, div, array.';
k:=2;
pk(st,k);
end.