Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 15.07.2014
Сообщений: 3
1

Найти слово, встречающееся в каждом предложении

14.04.2016, 19:15. Показов 1281. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Возникла проблема с тем, что я просто не могу придумать как все таки найти слово, которое встречается в каждом предложении, а именно я не могу придумать алгоритм нахождения.
Точная формулировка задания:
Дан файл, содержащий текст. Найти слово, встречающееся в каждом предложении, или сообщить, что такого слова нет.
Пример:
Ввод: Abc, abc wasd bbq. Wasd hgtydf abc? Koolgh it, vguyf abc!
Вывод: ABC

Удалось сделать разбиение на предложения и слова.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
type
  TNeed = record
    word: Array [1..15] of string // будет использоваться для хранения слов
  end;
 
const Letters: set of char = ['a'..'z','A'..'Z'];
      eo_sentence: set of char =['?', '!', '.'];
var Pred: array [1..15] of TNeed; // pred - будет хранить "предложения"
                           // будет, что-то вроде Pred[i].word[j] ,  j-е слово из i-го предложения
var s: String;
    t: Boolean;
    i, j, kol, l, n, k, count: integer;
begin
   k:=0; l:=1;
   reset(f);
   Memo1.Lines.LoadFromFile(namef);
   s := Memo1.Text;
   closefile(f);
   Memo1.Text := '';
   for i := 1 to length(s) do
       s[i] := Upcase(s[i]); // чтобы не возникали проблемы с регистром
   i:=1; j:=1;
   // Deal with it
   for n := 1 to length(s) do begin
     if (s[n] = ',') then delete(s,n,1);
     if (s[n] in eo_sentence) then begin
        inc(i);
        delete(s,n,1);
        j := 1;
     end;
     if (s[n] in Letters) then begin
        Pred[i].word[j] := Pred[i].word[j] + s[n]; 
     end;
     if not (s[n] in Letters) then begin
        inc(j);
     end;
   end;// for
   kol := i; 
   t := False;
   for i := 1 to 15 do
       if (Pred[1].word[i] <> '') then inc(k);
   count := 0;
   for i := 1 to k do begin // отсюда начинаются попытки найти нужное слово, счетчик для слов из 1-го предложения
     for j := 2 to kol do begin // счетчик начинается с 2, потому, что сравнивается 1-е предложение с другими (нач. с 2
       for l := 1 to 15 do begin
         if (Pred[1].word[i] = Pred[j].word[l]) then begin //т.к. слово должно быть в каждом предложении, то сравниваю 
            t := true;                                                  // со словами из первого предложения
            break;
         end;
       end;
       if (t = true) then begin
          inc(count);
          t := false;
       end
       else count := 0;
     end;
     if (count >= k) then Edit1.Text := Pred[1].word[1]
     else Edit1.Text := 'Такого слова нет';
     t := false;
   end;
   for i := 1 to 15 do // очистка
       for j := 1 to 15 do
           Pred[i].word[j] := '';
end;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2016, 19:15
Ответы с готовыми решениями:

Найти слово встречающееся в каждом предложении
Дан файл, содержащий текст на русском языке. Найти слово, встречающееся в каждом предложении, или...

Найти слово, встречающееся в каждом предложении или сообщить, что такого слова нет
Помогите написать программу да Delphi которая: Найти,слово встречающиеся в каждом предложений или...

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

Написать программу, которая находит самое длинное слово, встречающееся в предложении
Задано предложение-строка. Написать программу, которая находит самое длинное слово, встречающееся в...

3
669 / 559 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
15.04.2016, 12:28 2
Цитата Сообщение от wolf3w Посмотреть сообщение
именно я не могу придумать алгоритм нахождения.
Исходя из задания необходимо узнать какие слова из одно предложения встречают во всех остальных. Для проверки лучше использовать предложение с наименьшим кол-во слов.
Для разделения слов можно использовать TStringList и его свойство DelimitedText
1
1077 / 488 / 316
Регистрация: 05.04.2013
Сообщений: 2,140
15.04.2016, 14:21 3
Лучший ответ Сообщение было отмечено wolf3w как решение

Решение

wolf3w, предлагаю загрузить текстовый файл в stringList, затем сделать алгоритм добавления предложения по принципу "каждое предложение - в отдельную строку Memo (или другой StringList)" но в Memo можно редактировать текст если нужно или написать свой...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure TForm1.Open1Click(Sender: TObject);
var
list:TStringList;
i:Integer;
s,b:String;
begin
Memo1.Clear;
list:=TStringList.Create;
OpenDialog1.InitialDir := ExtractFilePath(Application.ExeName);
if not OpenDialog1.Execute then exit;
list.LoadFromFile(OpenDialog1.FileName);
s := list.Text;
 
b := ''; // это предложение
for i := 1 to length(s) do begin
    if (not (s[i] in ['.','!','?'])) and (i < length(s)) then b := b + s[i]
    else begin        // предложение кончилось
          // удалим начальные пробелы из предложения
          while(pos(' ',b) = 1) and (length(b) > 0) do delete (b,1,1);
          // преобразуем переносы в пробелы
          b  := StringReplace(b, #13#10, ' ',[rfReplaceAll, rfIgnoreCase]);
          // удалим конечные пробелы (необязательно - это если кривой ввод)
          //while(LastDelimiter(' ',b) = 1) and (length(b) > 0) do delete (b,length(b),1);
          if b <> '' then Memo1.Lines.Add(b + s[i]);
          b := '';   // очищаем буфер для нового предложения
          continue;  // перепрыгнем через разделитель предложений
         end;
    end;
// удаление пустых строк
for i := Memo1.Lines.Count-1 downto 0 do
    if Memo1.Lines[i] = '' then Memo1.Lines.Delete(i);
 
list.Free;
end;
затем алгоритм обработки строк Memo (предложений). Слово ищется Через функцию Pos() по принципу
"слово будет слово (сорри за тавтологию) если оно стоит:
1) в начале строки
2) между двумя пробелами или между пробелом и знаком разделителя слов (запятая, двоеточие и т.д.) при условии что тест введен корректно
3) в конце слова после пробела
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm1.Find1Click(Sender: TObject);
VAR
i,k:Integer;
s,p:String;
begin
p := AnsiLowerCase(InputBox('Окно ввода','Искомое слово','ABC'));
k := 0; // счетчик слов
for i := 0 to Memo1.Lines.Count-1 do begin
    s:=AnsiLowercASE(Memo1.Lines[i]);
    if Pos(p,s) = 1 then inc(k); // если слово в начале предложения
    if pos(p,s) > 1 then begin
       if  (s[pos(p,s)-1] = ' ')    // если слово то оно между пробелами
       and (s[pos(p,s)+length(p)] in [' ',':',',']) then inc(k); // добавьте разделители
 
       if  (s[pos(p,s)-1] = ' ')    // если слово в конце
       and (pos(p,s)+length(p) = length(memo1.Lines[i])) then inc(k);
 
       end;
    end;
if k = memo1.Lines.Count then ShowMessage('В каждом!')
else ShowMessage('Не в каждом!');
 
end;
Вложения
Тип файла: rar predl.rar (178.6 Кб, 2 просмотров)
1
1077 / 488 / 316
Регистрация: 05.04.2013
Сообщений: 2,140
15.04.2016, 14:24 4
во второй процедуре нужно исправить 10 строку:
Delphi
1
if Pos(p,s) = 1 then inc(k); // если слово в начале предложения
на:
Delphi
1
if (Pos(p,s) = 1) and (s[pos(p,s)+length(p)] in [' ',':',',']) then inc(k);
во вложении тоже поправить
1
15.04.2016, 14:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2016, 14:24
Помогаю со студенческими работами здесь

Найти слово,встречающееся в каждом предложении
Здравствуйте,я новичок в программировании,очень хочу научиться программировать...&quot;но чтобы писать...

Найти слово встречающееся в каждом предложении
что то программа не получается,в чём ошибка? помогите пожалуйста разобраться,вот сама задача:...

Найти слово, встречающееся в каждом предложении в файле
2) Дан файл, содержащий текст на английском языке. Найти слово, встречающееся в каждом предложении,...

Файлы. Найти слово, встречающееся в каждом предложении
Уже сломал голову с ней, решил кучу других задач. Но эта... вынос мозга.:wall: :wall: :wall:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru