Дана строка в которой содержится осмысленной текстовое сообщение. Слова сообщения...

0 голосов
62 просмотров

Дана строка в которой содержится осмысленной текстовое сообщение. Слова сообщения разделяются пробелами и знаками препинания. Вывести только те слова, которые встречаются более n раз.


Информатика (3.3k баллов) | 62 просмотров
Дано ответов: 2
0 голосов
Правильный ответ

Const
  n=50; { максимальное число различных слов в строке }
  del=[' ','.',',',':',';','-','!','?','/'];
var
  mw:array[1..n] of string; { найденные слова }
  mk:array[1..n] of integer; { количество повторений слов }
  s,w:string;
  i,j,k,l,m:integer;
  skip,new_word:boolean;
begin
  Write('Введите текст: ');
  Readln(s);
  s:=s+' ';
  Write('Укажите предельное число повторений слова: ');
  Read(k);
  l:=Length(s);
  m:=0;
  skip:=(s[1] in del);
  if skip then w:='' else w:=s[1];
  for i:=2 to l do
    if s[i] in del then begin
      if not skip then begin
        { w содержит очередное найденное слово }
        j:=1; new_word:=true;
        while (j<=m) and new_word do begin<br>          if w=mw[j] then begin Inc(mk[j]); new_word:=false end;
          Inc(j)
        end;
        if new_word then begin Inc(m); mw[m]:=w; mk[m]:=1 end;
        w:=''; skip:=true
      end
    end
    else
      if skip then begin w:=s[i]; skip:=false end
      else w:=w+s[i];
  { фраза разобрана и проанализирована }
  j:=0; i:=1;
  while (i<=m) and (j=0) do begin<br>    if mk[i]>k then j:=i;
    Inc(i)
  end;
  if j>0 then begin
    Writeln('Слова, которые встретились больше, чем ',k,' раз:');
    Writeln(mw[j]);
    for i:=j+1 to m do
      if mk[i]>k then Writeln(mw[i]);
  end
  else  Writeln('Нет слов, которые встретились больше, чем ',k,' раз.')
end.

Тестовое решение:
Введите текст: еду, еду в чистом поле; колокольчик дин-дин-дин... страшно, страшно поневоле средь неведомых равнин!
Укажите предельное число повторений слова: 1
Слова, которые встретились больше, чем 1 раз:
еду
дин
страшно



(142k баллов)
0 голосов

 const     
z = 30; // максимально число слов  
var   
s,w : string;   
n,p,i,j,l : integer;   
words : array [1..z] of string;   
kw : array [1..z] of integer;   
r : boolean;    
begin 
writeln ('введите строку'); 
readln (s); 
writeln ('укажите кол-во повторений'); 
readln (n);   
l := Length(s); 
p := 1; 
w := '';    
 for i := 1 to l do       
 if (s[i] <> ' ') and (s[i] <> '.') and (s[i] <> ',') then   
   w := w + s[i]    
    else     
begin   
  for j := 1 to p do   
   if w = words[j] then 
      begin   
      kw[j] := kw[j] +1;   
     r := true;     
   end;        
      if not r then   
    begin   
      p := p +1;   
      words[p] := w; 
       kw[p] := kw[p] +1;     
   end;    
    w := '';   
  r := false;   
      end;   
      for i := 1 to p do 
  if kw[i] > n then 
  writeln (words[i]);      
      end.

(2.6k баллов)
0

Кривовато работает. Ввел строку (без парных кавычек, конечно): "Да, это мои, - и только мои, слова!" и задал значение n, равное нулю с тем, чтобы посмотреть, что именно программа сочтет словами. Получился следующий вывод:

Да
это
мои
-
и
только

0

Т.е. в качества первого "слова" взято пустое, а последнее слово их фразы не учлось. Знак дефиса тоже попал в слово, но это понятно и легко устраняется его внесением в число знаков перепинания. А вот с первым и последним словами - это ошибка. Причем, и без восклицательного знака на конце слово не учитывается.

0

И, конечно же, все знаки препинания учесть в логическом выражении - это растянуть его на довольно много строчек.