Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Visual Basic - Трюки и Хитрости, советы и ответы на вопросы


Служба Рассылок Городского Кота
VB Хитрости - советы и ответы на вопросы
Здравствуйте, уважаемые читатели.
           


Сегодня я хотел чуть чуть разбавить наши хитости теорией. Не совсем сухой терией, а теорией с примерами. Давайте начнем с простейшей манипуляции функциями, знать о которой должен любой программист. Называется эта манипуляция рекурсией, и подразумевает ситуацию, когда функция вызывает сама себя.

Люди не отягошенные написанием алгоритмов согут воскликнуть - И зачем нам это все сдалось .... Только голову морочить. Я на это могу рассказать вам анекдот про математика, которого спросили про алгоритм изготовления чая. "Взять чайник, налить вожы, поставить на огонь, после закипания заварить чай." Ответил он. А тогда расскажите нам алгоритм приготовления чая если в чайнике уже есть вода. "Вылить воду - после этого задача сводится к предыдущей"
Именно так и стоит поступать часто. Зависит, правда от того, сколько "воды" выливать. Простейший пример, где рекурсия вполне уместна - реализация вычисления факториала числа. (надеюсь вы еще помните этот термин со школы? )
Итак , n! = 1 * 2 * 3 * .... * n
Как можно реализовать это программно -
делаем функцию, которая возвращает искомое число

           Function Factorial(N as long ) as long
           If n > 1 Then
           'Проверяем не дошли ли мы до конца нашей рекурсии
                      Factorial = n * Factorial(n - 1)
           Else
           'Последний элемент рекурси
                          Factorial = n
           End If
           End function
           


Какие плюсы предоставляет такой метод вычислений?
Во первых он безразличен к количеству элементов. Во вторых компактен и упрощает код.
Какие слжности могу ждать вас на этом пути: Главное - рекурсия должна сходится. Это значит, что число последовательных вызовов функцией самой себя не может быть бесконечным. Каждый вызов помещает информацию об адресе точки вызова в стек, на VB мы этого не видим, и повлиять на это никак не можем. При этом размер стека большей но не бесконечный. Т.е. если вы получаете сообщение stack overflow ( переполнение стека) - проверьте алгоритм.
Так как этот пример мне задавали на днях - давате рассмотрим приложение выводящее текст в лэйбл . при этом текст должен быть разбит на строки не как попало, а по пробелам. Количество символов в строке может быть разным, но не должно превышать заданного числа

'итак, вызываем нашу функцию
Label1.Caption = SplitString("12 34 567 890 12 123 1234 ", 6)



 Function SplitString(s As String, nSplit As Integer) As String
    'nsplit - максимальное количество символов в строке
    Dim tmp As String
    Dim tmp1 As String
    Dim pos As Integer
    pos = InStrRev(s, " ", nSplit + 1)
    If pos = 0 Then
        'в строке только одно слово
        'поместить код для разбивки по гласным
        'для переноса
    Else
        tmp = Left(s, pos)
        tmp1 = Mid(s, pos + 1, Len(s) - pos)
        If Len(tmp1) = Len(tmp) Then
            SplitString = tmp & vbCrLf & tmp1
        Else
            SplitString = tmp & vbCrLf & SplitString(tmp1, nSplit)
        End If
    End If
  


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

  
          


Традиционная рекомендация из серии "куда пойти учиться" - по мнению читателей (а читатели выражают свое мнение не только письмами, но и покупками, статистика которых вполне доступна) лучший печатный учебник по VB . Отзывы читателей об этой книге можно посмотреть у меня на сайте - здесь

Рассылка, которая вам может пригодится:
Рассылки Subscribe.Ru
СообЧа (СООБщество ЧАйников). Обмен опытом, вопросы, ответы.
"СообЧа (СООБщество ЧАйников). Обмен опытом, вопросы, ответы." Программистам - начинающим, опытным, маститым профессионалам и непрофессионалам. Всем, кого не коробит слово "ЧАЙНИК". Не тот программист, кто диплом имеет, а тот, у кого голова в мониторе, локти сшибают кофе на пол, а уши совершенно не слышат ни давно охрипший свисток чайника, ни призывное воркование жены. Цель этой рассылки: объединение увлеченных людей, которые сами себе создают проблемы и потом в отчаянии рвут последние волосы с лысеющей головы. Или не с лысеющей... И не последние... И не рвут, а пляшут, потому что проблема, над которой бился полмесяца (надо же! Вроде всего пара дней.) теперь, наконец, решена. А в сущности, возможно, проблема уже давно кем-нибудь решена, и причитающиеся ей волосы давно выдраны. Пишите сюда, просите помощи и получайте готовое решение! Но не забывайте, что за все надо платить. Ваша плата - доброжелательность, отзывчивость и готовность помочь. Решайте проблемы СообЧа! И если Вы подписались на эту рассылку - Вы уже член нашего СООБщества ЧАйников, более ничего не требуется. (А вот к "суперпрограммистам", презрительно надувающим щеки при слове "ЧАЙНИК", огромная просьба не беспокоиться с подпиской.) Автор рассылки - тоже "ЧАЙНИК", хотя и смеет надеяться на то, что со свистком. А потому прочь стеснительность и другие комплексы, задавайте друг другу пусть самые, казалось бы, идиотские вопросы, получайте на них ответы и решения. Знакомьтесь, обменивайтесь опытом, текстами программ... В планах - создание совместного сайта на конкурсной основе.

 

Успехов в программировании!

Борис Рудой

Автор сайта - Visual Basic на русском



http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное