Частота появления символов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Fox_Malder
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 20.10.2005 (Чт) 7:25
Откуда: Россия, г. Астрахань

Частота появления символов

Сообщение Fox_Malder » 28.10.2005 (Пт) 17:49

Подскажите код, как подсчитать частоту появления любого символа в строке?
Смог организовать это только для одного конкретного символа (для "1"):

Код: Выделить всё
Dim InputMessage As String      'строка для подсчета
Dim v            'частота появления
Dim retval         'возвращаемое значение
InputMessage = Text1.Text   'берем текст, например, из TextBox
retval = Split(InputMessage, "1")
v = UBound(retval1)      'определение индекса последнего (нужного) элемента в строке

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 28.10.2005 (Пт) 18:07

Так в чём вопрос?

А что, Скали тоже не знает?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 28.10.2005 (Пт) 18:47

Отсортировать строку по возрастанию. Подсчитать число вхождений каждой новой буквы.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 28.10.2005 (Пт) 19:07

На сортировку куча времени уйдет. Быстрее создать массив частот всех возможных символов, пробежаться циклом по строке и увеличивать при проходе каждого символа соотв. элемент массива.
Быть... или не быть. Вот. В чём вопрос?

Fox_Malder
Новичок
Новичок
Аватара пользователя
 
Сообщения: 42
Зарегистрирован: 20.10.2005 (Чт) 7:25
Откуда: Россия, г. Астрахань

Сообщение Fox_Malder » 28.10.2005 (Пт) 19:08

Например, дана строка:
123456фыукещз56ощежаф
И здесь необходимо подсчитать появление каждого символа, например:
1 - 1 раз,
2 - 1 раз,
ф - 2 раза и т.д.
Т.е. код должен сам определять уникальные символы и подсчитывать их количество.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 28.10.2005 (Пт) 19:21

На форме Text1,Text2,Command1

Код: Выделить всё
Private Sub Command1_Click()
Dim Inpstr As String, InChr As String, n As Long, Num As Long
Inpstr = Text1.Text
InChr = Text2.Text
For n = 1 To Len(Inpstr)
If Mid(Inpstr, n, 1) = InChr Then Num = Num + 1

Next
MsgBox Num
End Sub


В Text1 строку, в Text2 искомый символ.
Оно должно подсчитать скока раз символ встречается, так?
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 28.10.2005 (Пт) 22:13

Код: Выделить всё
Option Explicit
Private Const TestString As String = "VBStreets - лучший форум по Visual Basic в Рунете!!!"

Private Sub Form_Load()
Dim arr(Len(TestString)) As Integer, tmp As Integer, tmp2 As Integer, i As Long, j As Long

Me.Print "TestString: " & TestString & vbCrLf

'Строку в массив
For i = 0 To Len(TestString) - 1
    arr(i) = Asc(Mid$(TestString, i + 1, 1))
Next i

'Сортируем массив
For j = 0 To Len(TestString) - 1
    For i = 0 To Len(TestString) - 2
        If arr(i) > arr(i + 1) Then
            tmp = arr(i)
            arr(i) = arr(i + 1)
            arr(i + 1) = tmp
        End If
    Next i
Next j

'Результаты
tmp = 0
For i = 0 To Len(TestString) - 1
    tmp = tmp + 1
    If arr(i) <> arr(i + 1) Then
        tmp2 = tmp
        tmp = 0
    End If
    If tmp2 > 0 Then
        Me.Print "Symbol '" & Chr$(arr(i)) & "': " & tmp2 & " times."
        tmp2 = 0
    End If
Next i
End Sub

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 28.10.2005 (Пт) 22:59

Amed
И снова ты с сортировкой :) Это почти что наихудший вариант (потому что наверняка есть хуже) :)
Код: Выделить всё
Dim nOcurrencesOfSymbols(255) as long
Dim nCount as long

For nCount=1 to len(MyString)-1
   nOcurrencesOfSymbols(asc(mid$(MyString,nCount,1)))=nOcurrencesOfSymbols(asc(mid$(MyString,nCount,1)))+1
Next nCount

В итоге в массиве nOcurrencesOfSymbols находится частота вхождения символов в строке MyString

P.S.: ну а вот этот массив ты уже можешь при желании сортировать любыми методами ;)
P.P.S.: жаль UHM раньше уже написал :)
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 28.10.2005 (Пт) 23:07

А для двухбуквенных сочетаний мы создадим массив 255х255. А для трехбуквенных? :)

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 28.10.2005 (Пт) 23:11

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

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 28.10.2005 (Пт) 23:19

Запомните, дети! :)
Мои способы делать из мухи слона идеальны и критике не подлежат. Оспаривать будем? :)))

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 28.10.2005 (Пт) 23:26

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


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 43

    TopList