Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/40: Рейтинг темы: голосов - 40, средняя оценка - 4.90
25 / 0 / 0
Регистрация: 14.12.2010
Сообщений: 9
1

Макрос для вывода наиболее часто встречающийся в тексте символа.

14.12.2010, 16:35. Показов 7495. Ответов 40
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите написать макрос для WORD, который бы отображал наиболее часто встречающийся в тексте символ. Причем рассматривается текст только в выделенной области.

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

Добавлено через 13 минут
нашел подобную задачу для Delphi тут
но нужно сделать подобное для VBA Word..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2010, 16:35
Ответы с готовыми решениями:

Определить наиболее часто встречающийся символ в тексте
дан текстовый файл необходимо определить наиболее часто встречающийся символ в тексте

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

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

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

40
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
21.12.2010, 18:25 21
Author24 — интернет-сервис помощи студентам
Так это ж по умолчанию было! «Перед запуском макроса» — слишком специальный оборот. Okay?
Цитата Сообщение от deafmute Посмотреть сообщение
Помогите написать макрос для WORD, который бы отображал наиболее часто встречающийся в тексте символ. Причем рассматривается текст только в выделенной области.
0
1390 / 531 / 67
Регистрация: 10.04.2009
Сообщений: 8,726
21.12.2010, 18:43 22
Да не будет лишней проверка
PureBasic
1
2
3
4
5
6
'условие о том выделен ли текст, если длина текста равна нулю, то есть пустому месту - "", тогда ...
If Len(Application.Selection.Range.Text) = 0 Then
'вывести надпись указанную в кавычках
MsgBox$ "Никакой текст не выделен", vbOKOnly, "ОБРАБОТКА ДОКУМЕНТА НЕ МОЖЕТ БЫТЬ ВЫПОЛНЕНА"
'выйти из программы
End If
А что далее у Вас я не пойму??? Вернее не вникал, потому что увидел сообщение в любом случае и плюнул
Желание есть дорабатывайте, потом выложите, ОК??
1
Заблокирован
21.12.2010, 19:07 23
За 15 минут код написал (на основе своего опыта), методом тыков:
Visual Basic
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
Sub m_1()
Dim myArray() As String
Dim i As Long
Dim j As Long
Dim MaxPrevious As Long
Dim MaxCurrent As Long
Dim vСимвол As String
ReDim myArray(Selection.Characters.Count)
For i = 0 To UBound(myArray)
    myArray(i) = Mid(Selection.Text, i + 1, 1)
Next i
MaxPrevious = 0
For i = 0 To UBound(myArray)
    MaxCurrent = 0
    For j = 0 To UBound(myArray)
        If UCase(myArray(i)) = UCase(myArray(j)) Then
            MaxCurrent = MaxCurrent + 1
        End If
    Next j
    If MaxCurrent > MaxPrevious Then
        MaxPrevious = MaxCurrent
        vСимвол = myArray(i)
    End If
Next i
Debug.Print vСимвол
End Sub
0
1390 / 531 / 67
Регистрация: 10.04.2009
Сообщений: 8,726
21.12.2010, 19:26 24
проверил, вроде работает, я дописал последнюю строку
MsgBox vСимвол
Получил пустой МсгБокс, вероятно это пробел???
Думаю стоить выводить несколько ответов
самое большое количество встречаемых символов, то есть на 1 месте символ ...
2 место
3 место
0
Заблокирован
21.12.2010, 20:42 25
Ципихович Эндрю,
я на одном слове делал код. Тогда надо Replace сделать для пробелов.
Visual Basic
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
Sub m_1()
Dim myArray() As String
Dim i As Long
Dim j As Long
Dim MaxPrevious As Long
Dim MaxCurrent As Long
Dim vСимвол As String
Dim vСтрокаБезПробелов As String
vСтрокаБезПробелов = Replace(Selection.Text, " ", "")
ReDim myArray(Len(vСтрокаБезПробелов))
For i = 0 To UBound(myArray)
    myArray(i) = Mid(vСтрокаБезПробелов, i + 1, 1)
Next i
MaxPrevious = 0
For i = 0 To UBound(myArray)
    MaxCurrent = 0
    For j = 0 To UBound(myArray)
        If UCase(myArray(i)) = UCase(myArray(j)) Then
            MaxCurrent = MaxCurrent + 1
        End If
    Next j
    If MaxCurrent > MaxPrevious Then
        MaxPrevious = MaxCurrent
        vСимвол = myArray(i)
    End If
Next i
Debug.Print vСимвол
End Sub
0
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
21.12.2010, 22:58 26
Цитата Сообщение от Busine2009 Посмотреть сообщение
Ципихович Эндрю,
я на одном слове делал код. Тогда надо Replace сделать для пробелов.
Visual Basic
1
2
Debug.Print vСимвол
End Sub
печатает лишь один (последний по ходу текста) символ с наибольшей встречаемостью.

Формально задача решена.

Но считая так, например, самую частую цифру числа пи (а они там равновероятны), мы каждый раз (начиная где-то с двухмиллиардной) получим последнюю из рассматриваемых. Что неверно в принципе.

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

Что касается выделения — это дело практики. Пусть топикстартер сам потренируется.
0
1390 / 531 / 67
Регистрация: 10.04.2009
Сообщений: 8,726
22.12.2010, 05:52 27
Я же вывожу (в мессиджбокс) все максимально частые символы (все равные между собой максимумы). И кстати, отчего же не пробел? Символ есть символ... Хоть бы и разделитель.

все равные между собой максимумы? то есть если пробелов 40, а букв "А" 20, тогда будет пробел, если пробелов 20, а букв "А" 20, тогда будет пробел и буква "А"??? плоховато, лучше на 1 месте..., на втором .... и т. д.

Подожду
1
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
22.12.2010, 18:09 28
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
пробелов 40, а букв "А" 20, тогда будет пробел, если пробелов 20, а букв "А" 20, тогда будет пробел и буква "А"???
Да: Макрос для вывода наиболее часто встречающийся в тексте символа. (вы же видели)

Пробел (код 32) там на первом месте лишь потому, что его код меньше.
0
1390 / 531 / 67
Регистрация: 10.04.2009
Сообщений: 8,726
22.12.2010, 18:42 29
Пробел (код 32) там на первом месте лишь потому, что его код меньше??????????
А я думал, что Пробел (код 32) там на первом месте лишь потому, что наиболее часто встречающийся в тексте символ

Во всяком случае в том тексте, который я проверял
0
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
23.12.2010, 06:02 30
Ну правильно. Не по частоте же на 1-м месте (при равных частотах, например, с буквой А) — а в окне с результатом!
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
...если пробелов 20, а букв "А" 20, тогда будет пробел и буква "А"??? плоховато, лучше на 1 месте..., на втором .... и т. д.
#6 (YourResult.png) чётко это показал. Что тут ещё обсуждать...
0
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
23.11.2011, 06:06 31
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
>Тут, если кто не понял, подразумевается (перед Выполнить) протаскивание указателя мыши (с нажатой её левой кнопкой) от конца выделяемого текста к его началу.
А от начала к концу нельзя??
Нет. Это всё ещё в разработке☻

Прилагаю документ, где (после выделения текста как я объяснил) можно увидеть частоту его символов (в пределах 1 байта, то есть с кодами 0—255). Запуск по F5.

Если снять комментарий с оператора if...end if (там лишь одна такая пара) — будет как на 1-м рисунке: наиболее частый/частые.
Миниатюры
Макрос для вывода наиболее часто встречающийся в тексте символа.  
Изображения
 
Вложения
Тип файла: doc Частотность.doc (38.5 Кб, 25 просмотров)
0
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
23.11.2011, 12:25 32
Лучший ответ Сообщение было отмечено как решение

Решение

Всуну и я свой пятак..
Тестировал код Busine2009 и свой на тексте порядка 10000 символов.
Результат мой:
пробел - 1427
00:09
Результат Busine2009(тот, который не удаляет пробелы
тут не пустое место - пробел(не указано количество)
01:02

Кроме того таблица встречаемости в дебаггере

Visual Basic
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
Option Explicit
Sub m_2()
Dim t
Dim i As Long
t = Time
Dim Dict As Object
Dim MAX, SIMV
 
Set Dict = CreateObject("Scripting.Dictionary")
With Dict
    For i = 1 To 255
           .Add i, 0
    Next i
    For i = 1 To Len(Selection.Text)
        .Item(Asc(Mid(Selection.Text, i, 1))) = .Item(Asc(Mid(Selection.Text, i, 1))) + 1
        If MAX < .Item(Asc(Mid(Selection.Text, i, 1))) Then
         MAX = .Item(Asc(Mid(Selection.Text, i, 1)))
         SIMV = Mid(Selection.Text, i, 1)
        End If
    Next i
End With
    For i = 1 To 255
   Debug.Print i, Chr(i), Dict.Item(i)
    Next i
 
Debug.Print IIf(SIMV = " ", "пробел", SIMV) & " - " & Dict.Item(Asc(SIMV))
Debug.Print Format((Time - t), "nn:ss")
End Sub
По желанию можно добавить сортировку и не выводить нулевые на печать

Добавлено через 54 минуты
С сортировкой(время увеличилось на 1 с) :
Visual Basic
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
Option Explicit
Sub m_2()
Dim t, TM
Dim i As Long
Dim J As Long
Dim Dict As Object
Dim MAX, SIMV
Dim rez()
ReDim rez(1, 0)
t = Time
Set Dict = CreateObject("Scripting.Dictionary")
With Dict
    For i = 1 To 255
           .Add i, 0
    Next i
    For i = 1 To Len(Selection.Text)
        .Item(Asc(Mid(Selection.Text, i, 1))) = .Item(Asc(Mid(Selection.Text, i, 1))) + 1
        If MAX < .Item(Asc(Mid(Selection.Text, i, 1))) Then
         MAX = .Item(Asc(Mid(Selection.Text, i, 1)))
         SIMV = Mid(Selection.Text, i, 1)
        End If
    Next i
End With
'сортировка
    For i = 0 To 255
    TM = ""
        If Dict.Item(i) > 0 Then
            ReDim Preserve rez(1, UBound(rez, 2) + 1)
            rez(0, UBound(rez, 2)) = i
            rez(1, UBound(rez, 2)) = Dict.Item(i)
                For J = UBound(rez, 2) To 1 Step -1
                    If rez(1, J) > rez(1, J - 1) Then
                        TM = rez(0, J): rez(0, J) = rez(0, J - 1): rez(0, J - 1) = TM
                        TM = rez(1, J): rez(1, J) = rez(1, J - 1): rez(1, J - 1) = TM
                    End If
                Next J
        End If
    Next i
    For i = 0 To UBound(rez, 2)
   Debug.Print i, rez(1, i), IIf(rez(0, i) = 32, "пробел", Chr(rez(0, i)))
    Next i
Debug.Print IIf(SIMV = " ", "пробел", SIMV) & " - " & Dict.Item(Asc(SIMV))
Debug.Print Format((Time - t), "nn:ss")
End Sub
2
406 / 75 / 6
Регистрация: 31.01.2011
Сообщений: 111
Записей в блоге: 1
23.11.2011, 13:14 33
Лучший ответ Сообщение было отмечено как решение

Решение

На скорость не замерял , и не сортировал, просто не стандартный алгоритм О_о
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub test()
Dim t$, tt As String * 1, t2$, i as Byte
t = "tftfasefgvhwaegfyw"
ReDim arr(1 To 255, 1 To 2)
For i = 1 To 255
tt = ChrW(i)
t2 = Replace(t, tt, "")
arr(i, 1) = tt
arr(i, 2) = Len(t) - Len(t2)
Debug.Print arr(i, 1); arr(i, 2)
t = t2
Next
End Sub
3
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
23.11.2011, 13:21 34
Забыл про этот вариант! А ведь в примерах есть
1
406 / 75 / 6
Регистрация: 31.01.2011
Сообщений: 111
Записей в блоге: 1
23.11.2011, 13:29 35
Visual Basic
1
i as long
конечно
1
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
23.11.2011, 13:37 36
Visual Basic
1
i As Integer
Вполне хватает
Добавил сортировку.
Visual Basic
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
Sub test()
Dim ttt, J, TM
ttt = Time
Dim t$, tt As String * 1, t2$, i As Integer
t = Selection.Text
ReDim arr(1 To 255, 1 To 2)
For i = 1 To 255
tt = ChrW(i)
t2 = Replace(t, tt, "")
arr(i, 1) = tt
arr(i, 2) = Len(t) - Len(t2)
t = t2
Next i
For i = 1 To 254
    For J = 255 To i + 1 Step -1
        If arr(J, 2) > arr(J - 1, 2) Then
            TM = arr(J, 2): arr(J, 2) = arr(J - 1, 2): arr(J - 1, 2) = TM
            TM = arr(J, 1): arr(J, 1) = arr(J - 1, 1): arr(J - 1, 1) = TM
        End If
    Next J
Next i
For i = 1 To 254
If arr(i, 2) > 0 Then
Debug.Print arr(i, 1); arr(i, 2)
Else
Debug.Print Format((Time - ttt), "nn:ss")
Exit Sub
End If
Next i
End Sub
1
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
23.11.2011, 17:43 37
Цитата Сообщение от Alex77755 Посмотреть сообщение
Debug.Print arr(i, 1); arr(i, 2)
Всегда пропускал такие коды — забыл, куда этот дебаггер шлёт свои аргументы.

Сегодня проникся красотой темы — решил испытать, 10 минут пытал VBE. Попытки сфотографировал.

Алекс, объясните по-простому, а? Жалко же, что в натуре симфония оборачивается пустым звуком.
Миниатюры
Макрос для вывода наиболее часто встречающийся в тексте символа.  
0
11508 / 3794 / 681
Регистрация: 13.02.2009
Сообщений: 11,197
23.11.2011, 19:41 38
Всё намного проще? Ctrl+G
1
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
24.11.2011, 05:19 39
Цитата Сообщение от R Dmitry Посмотреть сообщение
просто не стандартный алгоритм
Для небольших строк (с повтором символа в пределах сотни — то есть около ста слов) я его переделал с прицелом на удобочитаемость.

В частности, даже не особый дока сможет понять (по рисунку), что пробелов в тексте — 7.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub test(): Dim t$, i As Byte, arr&(0 To 255)
t = "Съешь-ка ещё 1/2 франц. булки да выпей чаю!"
    Do
        arr(i) = Len(t) - Len(Replace(t, Chr(i), ""))
        'символ с кодом i в исследуемой строке t найден в количестве arr(i)
        Debug.Print Chr(i); IIf(arr(i) > 0, Space(1) & arr(i) & vbTab, vbTab);
        'напечатали символ Chr(i) и, через пробел, его кол-во (если оно > 0)
        If i Mod 16 = 0 Then Debug.Print 'новая строка после кода, кратного 16
        i = i + 1
    Loop Until i = 255
End Sub
Миниатюры
Макрос для вывода наиболее часто встречающийся в тексте символа.  
1
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
24.11.2011, 05:34 40
Оставил i As Byte, но забыл отдельно обработать i = 255 (буква я, в данном контексте).
0
24.11.2011, 05:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2011, 05:34
Помогаю со студенческими работами здесь

Найти наиболее часто встречающийся символ
1. Дана строка. Найти наиболее часто встречающийся символ.

Найти наиболее часто встречающийся элемент матрицы
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; void main() { int n, a, cnt, ans = -1, result; FILE*f;...

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

Вернуть элемент, наиболее часто встречающийся в массиве
Прога заполняет массив 5х5 случ числами от 1 до 20. затем возвращает самый часто-встречаемый...


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

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