Подсчет букв и пробелов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
zip111
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 01.05.2006 (Пн) 11:46

Подсчет букв и пробелов

Сообщение zip111 » 01.05.2006 (Пн) 11:49

Уважаемые, помогите!

Пишу контрольную, а в программировании не силен!

Задача такая: написать приложение которое подсчитывает количество символов и пробелов в заданном ряде. Написать нужно в Microsoft Excel редакторе Visual Basic.

Спасибо заранаее!

BasiС
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 16.02.2006 (Чт) 23:34
Откуда: Koenigsberg

Сообщение BasiС » 01.05.2006 (Пн) 12:07

Думаю, подробно врядли кто расписывать будет. Попробую описать, как бы я это сделал в общих чертах

Код: Выделить всё
Public Sub Подсчёт()
Dim row As String 'Ряд, который мы анализируем
row = "Задача такая: написать приложение которое подсчитывает количество символов и пробелов в заданном ряде."

MsgBox Count(row, "а") 'Количество букв "а" в анализируемом ряде
MsgBox Count(row, " ") 'Количество пробелов в анализируемом ряде

End Sub

Public Function Count(str As String, spl As String) As Integer
Count = Len(str) - Len(Replace(str, spl, ""))
End Function

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 02.05.2006 (Вт) 12:29

2 BasiC, И это работает?

Если я правильно поняла вопрос, то нужно посчитать кол-во пробелов, и всех остальных символов. Но на всякий случай кидаю 2 варианта, второй для подсчета разных символов.

Код: Выделить всё
Dim b(255)
Private Sub Form_Load()

'Первая часть считает общее количество символов и пробелов

a$ = InputBox("Введите текст для анализа")
i = 0
j = 0
For k = 1 To Len(a$)
If Mid$(a$, k, 1) <> " " Then i = i + 1 Else j = j + 1
Next
MsgBox ("Количество пробелов = " & j)
MsgBox ("Количество остальных символов = " & i)

'Вторая часть считает количество разных символов. Результаты выводит в файл.
For k = 1 To Len(a$)
b(Asc(Mid$(a$, k, 1))) = b(Asc(Mid$(a$, k, 1))) + 1
Next
Open "c:\output.txt" For Output As #1
For k = 1 To 255
If b(k) <> 0 Then
Print #1, Chr$(k) & "=" & b(k)
End If
Next
Close
End
End Sub
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 02.05.2006 (Вт) 12:35

Oxygen
что-то у тебя второе дыхание открылось этой весной :lol:
даже в блоге своем целую дисскусию начала :wink:

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 02.05.2006 (Вт) 12:37

Oxygen писал(а):
Код: Выделить всё
MsgBox ("Количество пробелов = " & j)
MsgBox ("Количество остальных символов = " & i)



Количество пробелов + Количество остальных символов = Длина строки => можно считать что-то одно

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 02.05.2006 (Вт) 12:41

Nicky писал(а):
Oxygen писал(а):
Код: Выделить всё
MsgBox ("Количество пробелов = " & j)
MsgBox ("Количество остальных символов = " & i)



Количество пробелов + Количество остальных символов = Длина строки => можно считать что-то одно


В производительности разницы особо никакой нету. А это для особо одаренных. :)
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 02.05.2006 (Вт) 12:45

Oxygen писал(а):В производительности разницы особо никакой нету. А это для особо одаренных. :)

Дело не в производительности ;)

BasiС
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 16.02.2006 (Чт) 23:34
Откуда: Koenigsberg

Сообщение BasiС » 02.05.2006 (Вт) 13:14

2Oxygen
Конечно работает =)))

Думаю, оба способа имеют право нажизнь =)
Какой предпочтительней - вопрос к zip111

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 02.05.2006 (Вт) 14:56

Cтранно, что работает.... У меня ругается на слово Count - оно по-моему, зарезервированно....

Кстати, если текст очень большой (заметно от 20 Кб), то большая разница в производительности. Сообственно, выкладываю для сравнения тест. В начале нужно нажать "генерировать файл", когда появится сообщение, что файл сгенерирован, то нажать "тест". За сколько пройден тест, не считается, но разница очень сильно заметна.
Вложения
test.zip
(1.72 Кб) Скачиваний: 93
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 02.05.2006 (Вт) 15:48

Пробелы можно перебирать по InStr, это раза в два-три ускорит.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 02.05.2006 (Вт) 15:55

Код: Выделить всё
Dim arr() as String
Dim ProbelCount as Long

arr=split(LongString," ")
ProbelCount=iif(Ubound(arr)>0,Ubound(arr),0)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 02.05.2006 (Вт) 16:02

Я. конечно не пробовал, но:

Код: Выделить всё
s = Replace(MyString," ","")

Debug.Print "Пробелов: " & Len(MyString)-Len(s)
Debug.Print "Других символов: " & Len(s)


Ась? :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 02.05.2006 (Вт) 16:05

Andrey Fedorov писал(а):Я. конечно не пробовал, но:

Код: Выделить всё
s = Replace(MyString," ","")

Debug.Print "Пробелов: " & Len(MyString)-Len(s)
Debug.Print "Других символов: " & Len(s)


Ась? :lol:

По плавному кругу вернулись ко второму посту

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 02.05.2006 (Вт) 16:12

Nicky писал(а):По плавному кругу вернулись ко второму посту


И начинаем следующий круг - по спирали... ;)
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

x-rex
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 30.04.2006 (Вс) 16:03

Сообщение x-rex » 02.05.2006 (Вт) 16:56

Oxygen писал(а):В начале нужно нажать "генерировать файл", когда появится сообщение, что файл сгенерирован, то нажать "тест".

а теперь просто запустить ;)

Oxygen писал(а):За сколько пройден тест, не считается, но разница очень сильно заметна.

А если время замерять, то твой вариант в ~20 быстрее
Вложения
test.zip
upgraded test
(1.76 Кб) Скачиваний: 102

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 02.05.2006 (Вт) 18:05

Как видно, здесь собрались "строколюбы" :P
Ну помогите решить такую задачу:
В RichtextBox'e имеется текст. Необходимо найти все подстроки в данной сторке, которые начинаются с символа "Ш" и перекрасить их. Например:


Шнпрвлалмьирпалплатвлбвдптрьвлпрлдватплдва
оаоаолдаопладопоподШвадлвоадов
волоалвоалвоал
воапдлвыопдлывопдлоШвпаьвлдыоп
выпловаыдлпоавлдгполдоав
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

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

Сообщение BV » 02.05.2006 (Вт) 18:26

InStr(Rev) или .Find

Получив позицию входа "Ш" закрашивай всё до vbCr.
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;

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 02.05.2006 (Вт) 19:14

BV
Да, да, а поподробней. Здесь просто любителям сторк раз плюнуть.
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

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

Сообщение BV » 02.05.2006 (Вт) 22:03

А подумать?

InStr возвращает позицию входа строки или символа в основной строке. В начале вызови InStr для поиска "Ш", после - для поиска vbCr. Теперь у тебя две позиции - место начала строки с "Ш" и конец основной строки. Выделяй и делай rtbMain.SelColor = vbBlue.
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;

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 05.05.2006 (Пт) 21:32

Вот кое-что. Окончательно сделать не получилось :( . В данном случае процедура выполняется 1 раз, но это исправимо.
Код: Выделить всё
Private Sub Remark(ByVal rtb As RichTextBox, ByVal simvol As String)
        Dim text1 As String = rtb.Text, s$
        Static i As Integer, flg As Boolean
        If flg = False Then i = rtb.Find(simvol)
        s$ = Mid$(text1, i + 1, 1)
        If s$ = simvol Then
            rtb.SelectionStart = i
            Do
                i += 1
                Application.DoEvents()
            Loop Until (Mid$(text1, i + 1, 1) = vbCr)
            Application.DoEvents()
            rtb.SelectionLength = i
            rtb.SelectionColor = Color.Green
            If i <> text1.Length Then Call Remark(rtb, simvol)
            flg = True
        End If
    End Sub


Может ещё кто-нибудь что-нибудь предложит?
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

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

Сообщение BV » 05.05.2006 (Пт) 22:22

:?

Код: Выделить всё
Option Explicit
'Option Base 0
'Option Compare Binary

Private Sub Form_Activate()
    Dim intPos(0 To 1) As Integer
    intPos(0) = 1: intPos(1) = 1
    Do
        intPos(0) = InStr(intPos(1), rtbMain.Text, "Ш")
        If intPos(0) = 0 Then Exit Do
        intPos(1) = InStr(intPos(0), rtbMain.Text, vbCr)
        If intPos(1) = 0 Then Exit Do
        With rtbMain
            .SelStart = intPos(0) - 1
            .SelLength = intPos(1) - intPos(0)
            .SelColor = vbBlue
        End With
    Loop
End Sub

Private Sub Form_Load()
    rtbMain.Text = "Шнпрвлалмьирпалплатвлбвдптрьвлпрлдватплдва" & vbCrLf & _
                   "оаоаолдаопладопоподШвадлвоадов" & vbCrLf & _
                   "волоалвоалвоал" & vbCrLf & _
                   "воапдлвыопдлывопдлоШвпаьвлдыоп" & vbCrLf & _
                   "выпловаыдлпоавлдгполдоав"
End Sub
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;

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 05.05.2006 (Пт) 22:40

BV
Спасибо конечно. Но... Оформляю это в подпрограмму, вызываю, и... ничего.
Код: Выделить всё
Private Sub Remark(ByVal rtbMain As RichTextBox)         
Dim intPos(0 To 1) As Integer
        intPos(0) = 1 : intPos(1) = 1
        Do
            intPos(0) = InStr(intPos(1), rtbMain.Text, "'")
            If intPos(0) = 0 Then Exit Do
            intPos(1) = InStr(intPos(0), rtbMain.Text, vbCr)
            If intPos(1) = 0 Then Exit Do
            With rtbMain
                .SelectionStart = intPos(0) - 1
                .SelectionLength = intPos(1) - intPos(0)
                .SelectionColor = Color.Green
            End With
        Loop

    End Sub
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

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

Сообщение Amed » 05.05.2006 (Пт) 22:43

Роман-вб, ключевое слово ByVal что у нас обозначает? :)

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 05.05.2006 (Пт) 22:47

Amed
Чё ты придираешься? :)
Передача параметра по значению
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

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

Сообщение Amed » 05.05.2006 (Пт) 22:53

Зачем оно?
И почему SelectionStart, а не SelStart?

Я медленно подвожу к решению, а не придираюсь. И не надо панибратства.

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 05.05.2006 (Пт) 22:59

Amed
Если CSerg увидит -- "убъёт" :D .
Да это просто с VB8. Принципиальной разницы в данном случае нет, поэтому и код только тем и отличается, что вместо SelectionStart -- SelStart.
И всё же хотелось бы узнать, где именно я ошибался......
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

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

Сообщение BV » 05.05.2006 (Пт) 23:41

Может передашь объект по ByRef?
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;

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 05.05.2006 (Пт) 23:50

BV
Толку нуль.
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 06.05.2006 (Сб) 18:59

Вот ещё вариация на тему.
Код: Выделить всё

Private Sub Command1_Click()
a$ = RTB1.Text + vbCr
b = 0
i1 = 0: i2 = 0: j1 = 1
Do
i1 = InStr(j1, a$, "Ш")
If i1 = 0 Then b = 1: GoTo 10
i2 = InStr(i1, a$, vbCr)
RTB1.SelStart = i1 - 1: RTB1.SelLength = i2 - i1: RTB1.SelColor = vbBlue j1 = i2
10:
Loop Until (b = 1)
End Sub
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 06.05.2006 (Сб) 19:19

Oxygen
Большое спасибо, обязательно попробую.
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

След.

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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 65

    TopList