Консультация № 40011
11.04.2006, 17:56
0.00 руб.
0 4 3
Здравствуйте!!! Я хочу написать программу, которая будет подсчитывать количество букв,количество предложений и количество слов. Текст будет вводится через TextBox, как это сделать, можете написать пример, может есть какая-то функция или процедура подсчёта символов или что-то вроде такого как в Паскале?

Обсуждение

Неизвестный
11.04.2006, 18:04
общий
это ответ
Здравствуйте, ataman!

CharsCount=LEN(TextBox.Text)
Неизвестный
11.04.2006, 18:19
общий
это ответ
<a href=http://rusfaq.ru/?Step=info&Action=Question&ID=39799>http://rusfaq.ru/?Step=info&Action=Question&ID=39799</a>
Неизвестный
11.04.2006, 19:14
общий
это ответ
Здравствуйте, ataman!

Создаем новый проект.
На форме создаем TextBox с опцией MultiLine=True почти на всю форму.
Внизу создаем Label.
В код формы вставляем программу:

Public b As Long
Public s As Long
Public p As Long
Public s1 As Boolean
Public p1 As Boolean
Public i As Long

Private Sub Form_Load()
Form1.Label1 = ""
Form1.Text1 = ""
End Sub

Private Sub Text1_Change()
Dim simv As String * 1
b = 0
s = 0
p = 0
p1 = False
s1 = False
‘В состав набранного текста входят буквы, символы пунктуации, из которых нам важна точка
‘как символ разделения между предложениями, и пробелы, которые разделяют слова.
‘Правило написания предложений:
‘1. Слова разделяются пробелами
‘2. Первое слово, заключенное в скобки (кавычки), пишется без пробела после кавычек
‘3. Закрывающая скобка (кавычка) пишется без пробела после слова
‘4. После знаков пунктуации перед началом слова ставится пробел
‘5. Точка, восклицательный и вопросительный знаки используются только как признак конца предложения
‘6. При обработке начальные и конечные пробелы обрезаются

If Len(Trim(Form1.Text1)) > 0 Then
‘Если длина текста ненулевая, есть первое слово и первое предложение
p = 1
s = 1
‘Проверяем содержимое посимвольно
For i = 1 To Len(Trim(Form1.Text1))
simv = Mid(Trim(Form1.Text1), i, 1)
If p1 And Not (simv = "." Or simv = "!" Or simv = "?") Then
‘если после точки еще есть символы кроме знаков препинания, значит следующее предложение
p = p + 1
p1 = False
End If
If s1 And Not simv = " " Then
‘если после пробела еще есть символы кроме пробела, значит следующее слово
s = s + 1
s1 = False
End If
Select Case simv
Case ".", "!", "?"
‘признак возможного начала следующего предложения
p1 = True
Case " "
‘признак возможного начала следующего слова
s1 = True
Case "A" To "Z", "a" To "z", "А" To "Я", "а" To "я", "Ё", "ё"
b = b + 1
End Select
Next
End If
Form1.Label1 = "предложений - " & p & " слов - " & s & " букв - " & b

End Sub
Неизвестный
15.04.2006, 14:37
общий
Могу еще идею предложить:Private Sub CommandButton1_Click() Dim ar() As String, tmp() As String Dim predl As Long, slov As Long, symv As Long Dim i As Long ‘Разбиваем строку по предложениям ar = Split(Me.txtText.Text, ".") ‘И сразу узнаем их кол-во If UBound(ar) = 0 Then predl = 1 Else predl = UBound(ar) + 1 End If ‘Теперь считаем слова: проходим по всему массиву с предложениями и разбиваем каждую ячейку по пробелу: For i = 0 To UBound(ar) If Len(ar(i)) > 0 Then tmp = Split(ar(i), " ") If Len(tmp(0)) = 0 Then slov = slov + UBound(tmp) Else slov = slov + (UBound(tmp) + 1) End If End If Next i ‘Теперь считаем общее кол-во символов: symv = Len(Me.txtText.Text) ‘Чистим за собой память Erase ar Erase tmp ‘Выводим результат MsgBox "Предложений: " & CStr(predl) & vbCrLf & _ "Слов " & CStr(slov) & vbCrLf & _ "Символов: " & CStr(symv)End SubСкажу сразу, тут нужна доработка: предложение может заканчиваться и знаками: !, ?. Хотя тут гадать особо нечего: можно весь текст засунуть в строковую переменную, заменить все эти знаки точками - и тогда проблема решена:Dim strText as string strText=me.txtText.Text If InStr(1, strText, "!") > 0 Or _ InStr(1, strText, "?") > 0 Then strtext=replace(strText, "!", ".") strtext=replace(strText, "?", ".") End IfВ идеале, у пользователя останется его текст, а Вы будете знать точное кол-во нужных вещей, поскольку заменяете все знаки вопроса и восклицательные знаки в копии текста, который ввел пользователь. тогда вместо ‘Разбиваем строку по предложениямar = Split(Me.txtText.Text, ".")Пишем‘Разбиваем строку по предложениямar = Split(strText, ".")Филатов Евгений Геннадьевич предложил неплохой алгоритм, но он замораживает прогу пока не пройдет все символы - это может быть долго, особенно если текст большой. Выход состоит в применении отдельного потока, но в 6 версии бейсика этого нельзя (я еще не видел действительно везде и со всем работающего примера многопоточности), а в VB.NET - не проблема, но остается время подсчета если текст большой (хотя бы 300 кб).Недостаток моего алгоритма - жрет память при очень больших объемах текста. При очень большом объеме текста этот алгоритм тоже тормознет, но не настолько, как при переборе символов по отдельности. Может я в чем и ошибся в алгоритме - исправьте и сообщите, буду благодарен за развитие этой темы, либо выскажите свои соображения.
Форма ответа