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

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

25.10.2013, 19:40. Показов 5564. Ответов 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
13114 / 5895 / 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
13114 / 5895 / 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru