С Новым годом! Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 10

В произвольном тексте найти повторяющиеся слова,определить количество повторений каждого из них

25.10.2013, 19:40. Показов 5527. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В произвольном тексте найти повторяющиеся слова,определить количество повторений каждого из них.
Блок схема и саму программу,если можно..
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2013, 19:40
Ответы с готовыми решениями:

Найти в тексте все различающиеся слова и подсчитать количество присутствий каждого из них.
имеется информация такого типа,записанная в блокнот: aa aa aa aa aa aa aa aa bb bb bb bb bb bb bb bb a1 a1 a1 a1 a1 a1 a1 a1 b1 b1...

Определить количество повторений в тексте заданного слова. Считать, что слова в тексте отделены друг от друга
1)В строке удалить введённое буквосочетание. 2)Определить количество повторений в тексте заданного слова. Считать, что слова в тексте...

Строки. В тексте найти, какая из букв первого слова встречается чаще и определить количество ее повторений.
Вводится текст. Конец ввода F1. В тексте найти, какая из букв первого слова встречается чаще и определить количество ее повторении. ...

3
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.10.2013, 04:59
Решение, в котором исходный текст берётся из файла. В коде даны комментарии - это поможет составить блок-схему самостоятельно (или кто-нибудь из форумчан поможет).

Идея алгоритма заключается в следующем. У нас есть массив типа TArr, в который мы будем записывать сведения о словах. Каждый элемент массива представляет собой запись типа TInfo. В такой записи 2 поля - строковое и целочисленное. Строковое поле будет содержать слово в верхнем регистре, а целочисленное поле будет счётчиком - в него станем записывать количество присутствий данного слова в тексте. Далее, мы делаем следующее - последовательно читаем строки из файла. Из каждой строки извлекаем слова и записываем их в массив следующим образом: если слово уже есть в массиве, то увеличиваем счётчик этого слова на 1; если такого слова в массиве нет, то добавляем это слово в массив и устанавливаем его счётчик, равным 1. Таким образом, в массиве будут записаны только различающиеся слова и для каждого из них будет указано количество их присутствий в тексте.
Поэтому, повторяющиеся слова - это те слова из массива, для которых значение счётчика больше единицы. - Это и есть решение задачи.
Pascal
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
program Project1;
 
const
  {Размер массива, который содержит сведения о различающихся словах.}
  M = 200;
  {Разделители слов.}
  D = ['.', ',', ':', ';', '!', '?', '-', ' ', #9, #10, #13];
type
  {Сведения о слове.}
  TInfo = record
    S : String[20]; {Слово.}
    Cnt : Integer;  {Количество присутствий слова в тексте.}
  end;
  {Массив сведений о различающихся словах.}
  TArr = array[1..M] of TInfo;
 
{Для кодовой страницы CP866 (DOS) переводит символы строки в верхний регистр.
Правильно обрабатывает русские и английские буквы.}
function UpCaseStr866(const aStr : String) : String;
var
  S : String;
  i : Integer;
begin
  S := aStr;
  for i := 1 to Length(S) do
    case S[i] of
      #$A0..#$AF: S[i] := Char(Ord(S[i]) - $20);
      #$E0..#$EF: S[i] := Char(Ord(S[i]) - $50);
      #$F1: S[i] := #$F0;
      else S[i] := UpCase(S[i]);
    end;
  UpCaseStr866 := S;
end;
 
{Функция извлекает из текста слова и добавляет эти слова и количество их
присутствий в массив aArr.
Предположим, из строки извлечено очередное слово. Если это слово уже есть
в массиве aArr, то счётчик этого слова увеличивается на 1. Если такого
слова в массиве нет, то слово добавляется в массив и его счётчик устанавливается
равным 1.
aArrLen - Количество значимых элементов в массиве.
Если все найденные слова записаны в массив, то функция возвращает значение True.
Если в массиве не хватило места для добавления слов, то функция возвращает
значение False.}
function ProcStr(const aStr : String; var aArr : TArr; var aArrLen : Integer) : Boolean;
var
  Sw : String;
  i, j, Len, LenW : Integer;
  Res : Boolean;
begin
  Res := True;
  Len := Length(aStr);
  LenW := 0; {Длина слова.}
  for i := 1 to Len do
    {Если символ не является разделителем, значит он принадлежит слову.}
    if not (aStr[i] in D) then begin
      Inc(LenW); {Учитываем очередной символ в длине слова.}
      {Отслеживаем конец слова.}
      if (i = Len) or (aStr[i + 1] in D) then begin
        {Выделяем слово и переводим его символы в верхний регистр.}
        Sw := UpCaseStr866( Copy(aStr, i - LenW + 1, LenW) );
        {Ищем индекс этого слова в массиве aArr.}
        j := 1;
        while (j <= aArrLen) and (aArr[j].S <> Sw) do Inc(j);
        {Если индекс оказался в пределах значимой части массива, значит
        слово найдено. В этом случае увеличиваем счётчик слова на 1.}
        if j <= aArrLen then Inc(aArr[j].Cnt)
        {Если индекс вышел за пределы значимой части массива, значит слово
        не найдено. В этом случае, если в массиве есть свободное место
        (j <= High(aArr)), то добавляем слово в массив и устанавливаем его
        счётчик, равным 1.}
        else if j <= High(aArr) then begin
          Inc(aArrLen);
          aArr[j].S := Sw;
          aArr[j].Cnt := 1;
        {Если индекс вышел за пределы массива (j > High(aArr)), значит,
        произошло переполнение. Т. е., в массиве нет свободного места для
        добавления нового слова.}
        end else begin
          Res := False; {Произошло переполнение.}
          Break;        {Прерываем цикл.}
        end;
        LenW := 0;
      end;
    end;
  ProcStr := Res;
end;
 
var
  F : Text;
  Arr : TArr; {Массив различающихся слов.}
  S, Fn : String;
  i, Cnt, ArrLen : Integer;
  Res : Boolean;
begin
  repeat
    {Открываем файл с исходным текстом.}
    Writeln('Задайте имя файла:');
    Readln(Fn);
    Assign(F, Fn);
    {$I-}
    Reset(F);
    {$I+}
    if IOResult <> 0 then begin
      Writeln('Не удалось открыть заданный файл. Действие отменено.');
      Writeln('Перейти к началу программы - Enter, выход - любой символ + Enter.');
      Readln(S);
      Continue;
    end;
    {Обработка файла. Последовательно читаем строки из файла и обрабатываем
    их с помощью функции ProcStr(). ProcStr() выделяет слова из строки и
    записывает сведения о них в массив Arr.}
    Res := True;
    ArrLen := 0; {Количество элементов, добавленных в массив Arr.}
    while not Eof(F) do begin
      Readln(F, S);
      Res := ProcStr(S, Arr, ArrLen);
      if not Res then Break;
    end;
    Close(F);
    {Проверяем - не было ли переполнения.}
    if not Res then begin
      Writeln('Обработка текста прервана. Произошло переполнение.');
      Writeln('Будут учтены не все слова.');
    end;
 
    {Распечатка сведений о повторяющихся словах.
    Повторяющиеся слова - это те слова из массива Arr, для которых показание
    счётчика больше, чем 1.}
    Writeln('Перечень повторяющися слов.');
    Writeln('В скобках указано количество присутствий слова:');
    Cnt := 0; {Количество повторяющихся слов.}
    for i := 1 to ArrLen do
      if Arr[i].Cnt > 1 then begin
        Inc(Cnt);
        if Cnt > 1 then Write(', ');
        Write(Arr[i].S, '(', Arr[i].Cnt, ')');
      end;
    if Cnt > 0 then Writeln;
    Writeln('Всего повторяющихся слов: ', Cnt);
    
    Writeln('Перейти к началу программы - Enter, выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
2
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 10
26.10.2013, 10:32  [ТС]
Теперь бы не помешала бы блок-схема,то правда не понятно...
0
 Аватар для Mawrat
13113 / 5894 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
26.10.2013, 17:15
Блок-схемы к функции ProcStr().
Миниатюры
В произвольном тексте найти повторяющиеся слова,определить количество повторений каждого из них   В произвольном тексте найти повторяющиеся слова,определить количество повторений каждого из них  
Вложения
Тип файла: rar Схемы 01, 02 в формате MS Visio.rar (66.6 Кб, 11 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.10.2013, 17:15
Помогаю со студенческими работами здесь

Найти число повторений каждого слова в тексте
Добрый вечер, помогите пожалуйста найти ошибку в программе: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstring&gt; ...

Массивы. Найти повторяющиеся элементы и количество повторений каждого из таких элементов
Добрый день! Нужна помощь в написании программы: В произвольном массиве из n целых чисел (n&lt;100) найти повторяющиеся элементы и...

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

Определить количество повторений каждого слова
Помогите пожалуйста с этой программой,я несколько раз пытался делать так:разбивал введенную строку на массивы слова и сравнивал каждое с...

Определить количество повторений в тексте заданного слова
Определить количество повторений в тексте заданного слова. Считать, что слова в тексте отделены друг от друга одним или несколькими...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru