Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/114: Рейтинг темы: голосов - 114, средняя оценка - 4.85
Twiky

Подсчёт слов в тексте.

24.05.2009, 07:31. Показов 21289. Ответов 68
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть Memo (c текстом) и Edit

Задача заключается в том, чтобы найти слово (введённое в Edit) в тексте (которое в Memo) и подсчитать сколько раз это слово встречается в тексте

P.S: мне посоветовали воспользоваться счётчиком, но поискав информацию в нете, я не смогла разобраться

Помогите, пожалуйста, решить..
Заранее всем спасибо.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.05.2009, 07:31
Ответы с готовыми решениями:

Подсчёт слов в тексте.
Загружаю в мемо текст из файла, и ищу со всего текста 2 слова и вывожу количество их повторений в едит. кусок кода begin m:=0; ...

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

Подсчет кол-ва слов в тексте и вывод их в столбик
Ввести несколько слов, подсчитать количество слов в тексте , вывести эти слова в столбик

68
1 / 1 / 0
Регистрация: 21.08.2013
Сообщений: 54
21.08.2013, 22:54
Студворк — интернет-сервис помощи студентам
Блин, блинский - страшно отключать :-) Программист из меня никакой, просто очень интересно разобраться. Буду пробовать убирать части кода, чтобы понять в чем причина агрессии антивируса :-)
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
21.08.2013, 23:04
Цитата Сообщение от test-reklama Посмотреть сообщение
Буду пробовать убирать части кода, чтобы понять в чем причина агрессии антивируса :-)
Да, можно так действовать.
Я лично использую AVG FREE - это бесплатная версия антивируса AVG. Очень доволен этим продуктом. Защищает хорошо. Пользуюсь уже лет 6. Он тоже иногда на исполняемые файлы проектов ругается, но редко. Чаше всего у него вызывают подозрения проекты с небольшим количеством кода, где имеются циклы с малым количеством команд в теле. - И, возможно, работа с указателями.
0
1 / 1 / 0
Регистрация: 21.08.2013
Сообщений: 54
21.08.2013, 23:08
Вот код, которым я баловался, но циклы задать не смог. На него не ругается. Можно модернизировать этот код, чтобы учитывал предлоги и цифры?
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
65
66
unit MainUnit;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, ComCtrls;
 
type
  TMainForm = class(TForm)
    Label1: TLabel;
    btnChange: TButton;
    XPManifest1: TXPManifest;
    Memo1: TMemo;
    lblResult: TLabel;
    Label2: TLabel;
    StatusBar1: TStatusBar;
    procedure btnChangeClick(Sender: TObject);
  end;
 
var
  MainForm: TMainForm;
 
implementation
 
{$R *.dfm}
 
procedure TMainForm.btnChangeClick(Sender: TObject);
var
  i, l, n, p: Integer;
 
    // i - счётчик цикла
  // l - длина текущего слова
  // n - количество слов
  // s - количество секунд
  // p - количество предлогов
begin
  l := 0;
  n := 0;
  p := 0;
  // проверяю есть ли пробел в конце.. если его там нет, то добавляю...
  If Memo1.Text[Length(Memo1.Text)] <> ' ' then
    Memo1.Text := Memo1.Text + ' ';
  // а вот, собственно, цикл, который проверяет кол-во слов... тут учтено, что могут стоять лишние пробелы
  For i := 1 to Length(Memo1.Text) do
    If Memo1.Text[i] <> ' ' then
      l := l + 1
    Else
      If l <> 0 then
        begin
          l := 0;
          n := n + 1;
 
  // Если в слове больше 10 символов, то добавляем пробел
 
 
          end;
  // Вывожу результат на экран:
  lblResult.Caption := 'Количество слов: ' + IntToStr(n) ;
  label2.Caption := 'Количество предлогов: ' + IntToStr(p) ;
  statusbar1.Panels[0].Text:='Cлов: ' +IntToStr(n);
  statusbar1.Panels[1].Text:='секунд: ' +IntToStr(n div 2);
 
end;
 
end.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
21.08.2013, 23:32
Таких конструкций надо избегать:
Цитата Сообщение от test-reklama Посмотреть сообщение
If Memo1.Text[i] <> ' ' then
- Это очень ресурсоёмкая операция. Ресурсоёмкость этой операции пропорциональна количеству символов в тексте. Если текст содержит 1 000 000 символов, то эта операция потребует более, чем 1 000 000 ассемблерных операций. Потому что, когда происходит обращение к свойству Memo1.Text, выделяется память для строки, которая сможет принять весь текст Мемо. Затем каждый символ копируется в эту строку. - Для этого требуется операций даже больше, чем количество символов в Мемо.

Добавлено через 6 минут
Сейчас через указатели напишу. Посмотрим, как к такому коду отнесётся Аваст.
0
1 / 1 / 0
Регистрация: 21.08.2013
Сообщений: 54
21.08.2013, 23:33
А там миллиона символов и не будет. Это я просто решил поэкспериментировать и попробовать реализовать в делфи прогу, которая реализована ребятами знакомыми по подсчету количества секунд при произнесении объявления. Там максимум слов 200 встречается.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
21.08.2013, 23:39
test-reklama, попробуй вот такой код:
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
procedure TForm1.Button1Click(Sender: TObject);
const
  //Разделители слов.
  D = ['.', ',', ':', ';', '!', '?', '-', ' ', #9, #10, #13];
  //Множество десятичных цифр.
  Dd = ['0'..'9'];
var
  S : String;
  PCh : PChar;
  i, Len, LenW : Integer;
  Cnt, Cnt3, Cnt12, CntNum : Integer;
  IsNum : Boolean;
begin
  S := Memo1.Text;
  PCh := PChar(S); //Указатель на первый символ строки.
 
  Len := Length(S);
  //Длина очередного слова.
  LenW := 0;
  //Счётчики.
  Cnt := 0;
  Cnt3 := 0;
  Cnt12 := 0;
  CntNum := 0;
  //Флаг, показывающий, что слово состоит только из десятичных цифр.
  IsNum := True;
  for i := 1 to Len do begin
    //Если символ не является разделителем, значит он принадлежит слову.
    if PCh[i] in D then Continue;
    //Учитываем очередной символ в длине слова.
    Inc(LenW);
    //Если символ не является цифрой, то устанавливаем флаг IsNum в False.
    if IsNum and not (PCh[i] in Dd) then IsNum := False;
    //Отслеживаем конец слова и производим подсчёт.
    if (i = Len) or (PCh[i + 1] in D) then begin
      //Если слово состоит только из десятичных цифр.
      if IsNum then
        Inc(CntNum)
      //Количество слов с длиной 1..3 символов.
      else if LenW <= 3 then
        Inc(Cnt3)
      //Количество слов с длиной 12 и более символов.
      else if LenW >= 12 then
        Inc(Cnt12)
      //Количество слов с прочими длинами - т. е.: 4..11 символов.
      else
        Inc(Cnt);
 
      LenW := 0;
      IsNum := True;
    end;
  end;
 
  //Ответ.
  ShowMessage('В заданном тексте:'
    + #13#10
    + #13#10'Количество слов, состоящих только из десятичных цифр: ' + IntToStr(CntNum)
    + #13#10
    + #13#10'Слова, в которых есть буквы и могут быть цифры:'
    + #13#10
    + #13#10'Количество слов с длиной 1..3: ' + IntToStr(Cnt3)
    + #13#10'Количество слов с длиной 12...: ' + IntToStr(Cnt12)
    + #13#10'Количество слов с прочими длинами: ' + IntToStr(Cnt) );
end;
0
1 / 1 / 0
Регистрация: 21.08.2013
Сообщений: 54
21.08.2013, 23:44
Всё равно аваст блокирует.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
21.08.2013, 23:55
Вот ещё вариант с указателями. В предыдущем коде использовался особый указатель - PChar. А теперь обыкновенный - PByte (^Byte):
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
65
66
67
procedure TForm1.Button2Click(Sender: TObject);
const
  //Разделители слов.
  D = [Ord('.'), Ord(','), Ord(':'), Ord(';'), Ord('!'), Ord('?'),
    Ord('-'), 32, 9, 10, 13];
  //Множество десятичных цифр.
  Dd = [Ord('0')..Ord('9')];
var
  S : String;
  Pb : PByte;
  i, Len, LenW : Integer;
  Cnt, Cnt3, Cnt12, CntNum : Integer;
  IsNum : Boolean;
begin
  S := Memo1.Text;
  Pb := PByte(S); //Указатель на первый символ строки.
 
  Len := Length(S);
  //Длина очередного слова.
  LenW := 0;
  //Счётчики.
  Cnt := 0;
  Cnt3 := 0;
  Cnt12 := 0;
  CntNum := 0;
  //Флаг, показывающий, что слово состоит только из десятичных цифр.
  IsNum := True;
  for i := 1 to Len do begin
    //Если символ не является разделителем, значит он принадлежит слову.
    if not (Pb^ in D) then begin
      //Учитываем очередной символ в длине слова.
      Inc(LenW);
      //Если символ не является цифрой, то устанавливаем флаг IsNum в False.
      if IsNum and not (Pb^ in Dd) then IsNum := False;
      //Отслеживаем конец слова и производим подсчёт.
      if (i = Len) or (PByte(Integer(Pb) + 1)^ in D) then begin
        //Если слово состоит только из десятичных цифр.
        if IsNum then
          Inc(CntNum)
        //Количество слов с длиной 1..3 символов.
        else if LenW <= 3 then
          Inc(Cnt3)
        //Количество слов с длиной 12 и более символов.
        else if LenW >= 12 then
          Inc(Cnt12)
        //Количество слов с прочими длинами - т. е.: 4..11 символов.
        else
          Inc(Cnt);
 
        LenW := 0;
        IsNum := True;
      end;
    end;
    Inc(Pb); //Перемещаем указатель на следующий символ.
  end;
 
  //Ответ.
  ShowMessage('В заданном тексте:'
    + #13#10
    + #13#10'Количество слов, состоящих только из десятичных цифр: ' + IntToStr(CntNum)
    + #13#10
    + #13#10'Слова, в которых есть буквы и могут быть цифры:'
    + #13#10
    + #13#10'Количество слов с длиной 1..3: ' + IntToStr(Cnt3)
    + #13#10'Количество слов с длиной 12...: ' + IntToStr(Cnt12)
    + #13#10'Количество слов с прочими длинами: ' + IntToStr(Cnt) );
end;
0
1 / 1 / 0
Регистрация: 21.08.2013
Сообщений: 54
22.08.2013, 00:03
Здесь ошибка была в названии кнопки - 1 кнопка должна быть, а указана 2. После исправления - всё равно блокирует. Во, жесть. Как же оптимизировать, чтоб было интеллигентно?

Добавлено через 1 минуту
А у вас аваст не блокирует? Или у вас в исключениях стоит папка?
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
22.08.2013, 00:05
Да, я на форуме Аваста посмотрел сейчас - очень не дружит он с Delphi (возможно, не только с Delphi).
http://195.74.76.34/index.php?topic=118328.0

Добавлено через 1 минуту
Цитата Сообщение от test-reklama Посмотреть сообщение
А у вас аваст не блокирует? Или у вас в исключениях стоит папка?
У меня AVG FREE. Я уже упоминал об этом:
Цитата Сообщение от Mawrat Посмотреть сообщение
Я лично использую AVG FREE - это бесплатная версия антивируса AVG. Очень доволен этим продуктом. Защищает хорошо. Пользуюсь уже лет 6. Он тоже иногда на исполняемые файлы проектов ругается, но редко. Чаше всего у него вызывают подозрения проекты с небольшим количеством кода, где имеются циклы с малым количеством команд в теле. - И, возможно, работа с указателями.
0
22.08.2013, 00:11

Не по теме:

Avast - самый тупой антивирус. Все ему не так. Конечно, у каждого свой взгляд

0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
22.08.2013, 00:12
Да - на него (на Аваст) много жалоб.
---
Рекомендую AVG FREE. Пользуюсь им уже около 6 лет.
http://free.avg.com/ru-ru/down... ll-product
0
1 / 1 / 0
Регистрация: 21.08.2013
Сообщений: 54
22.08.2013, 00:14
А попробуйте скомпилировать exe и выслать мне. Будет аваст ругаться на готовый exe?
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
22.08.2013, 00:18
Так я уже публиковал проект ранее - в нём уже скомпилированный EXE. Могу выложить проект, в котором применено решение с указателями. Сейчас...
0
22.08.2013, 00:20

Не по теме:

От подсчета слов в текстах плавно перейдем к антивирусам:) У меня на домашнем Dr. Web 8. На Windows 8 работает аккуратно, систему не грузит.
Обновляется без паники в отличии от того же Кашперовского:) Он вообще "весь инет в себя всасывает" при обновлении. Вообще не понимаю, зачем KAV нужен для Mac OS?

0
1 / 1 / 0
Регистрация: 21.08.2013
Сообщений: 54
22.08.2013, 00:23
Если честно, я не очень доволен avast - из последнего, он не пропускал письма из бата, который к gmail-овскому адресу подключался. Но, как-то уже привык к авасту. Не хочется менять.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
22.08.2013, 00:32
Архивы проектов. Без оптимизации и с включенной оптимизацией. Те, что с оптимизацией - с префиксом "Opt_".
Вложения
Тип файла: rar CountWord-02.rar (171.0 Кб, 7 просмотров)
Тип файла: rar CountWord-03.rar (171.0 Кб, 7 просмотров)
Тип файла: rar Opt_CountWord-01.rar (170.7 Кб, 8 просмотров)
Тип файла: rar Opt_CountWord-02.rar (170.9 Кб, 11 просмотров)
Тип файла: rar Opt_CountWord-03.rar (170.9 Кб, 9 просмотров)
0
1 / 1 / 0
Регистрация: 21.08.2013
Сообщений: 54
22.08.2013, 00:36
Все заблокировал - и с оптимизацией, и без. Блин, мне аж самому неудобно. Помогаете мне, а я как баран.
0
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
22.08.2013, 00:46
Это Аваст - баран. Наверное, лучше поставить AVG FREE.
0
Эксперт Pascal/Delphi
 Аватар для droider
4891 / 2824 / 866
Регистрация: 04.10.2012
Сообщений: 10,269
22.08.2013, 00:50
Цитата Сообщение от Mawrat Посмотреть сообщение
Это Аваст - баран
еще один в копилку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.08.2013, 00:50
Помогаю со студенческими работами здесь

Посчитать общее количество слов и определить, сколько слов в этом тексте состоит из двух символов
1) Заданы: массив наименований продукции и соответствующие ему данные плановой рентабельности (RP), фактической цены реализации (C) и...

Дан файл, содержащий текст. Сколько слов в тексте? Сколько цифр в тексте?
Дан файл, содержащий текст. Сколько слов в тексте? Сколько цифр в тексте?

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

Подсчёт слов в тексте
имеется задача. Ввести текст с клавиатуры в процессе выполнения программы. Для каждого слова заданного текста указать, сколько раз оно...

Подсчет слов в тексте
есть многостраничный текст в нем мы встречаем одинаковые слова, нужно вывести каждое слово единожды(без повторений) указать сколько раз оно...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru