Прикладная информатика

32 

Предполагается, что вводимые значения обрабатываются по мере их ввода и не сохраняются  в массиве. То есть должны будем применять  те же алгоритмы, что и при  решении  задач группы Series

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

Схему описанного алгоритма можно представить  в виде следующих инструкций:

1. Объявить  переменные

2. Ввести  N

3. Ввести  первый элемент в переменную x

4. Определить  эталон min=x

5. Для  i от 2 до N

      5.1. Ввод следующего числа в переменную  x

      5.2. Если x<min, то min=x

    Конец-для

6. Вывести  значение min

      А если требуется определить также  и номер минимального элемента, то кроме переменной-эталона min (которая по-прежнему используется для сравнения) необходимо завести еще переменную для сохранения номера того элемента, который замещает эталон (назовем эту переменную nommin).

Схема примет вид:

1. Объявить  переменные

2. Ввести  N

3. Ввести  первый элемент в переменную x

4. Определить  эталон min=x, nommin=1

5. Для  i от 2 до N

      5.1. Ввод следующего числа в переменную  x

      5.2. Если x<min, то min=x и nommin=i

    Конец-для

6. Вывести  значения min и nommin

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

      При поиске номера первого по порядку минимального элемента выполняется сравнение как в приведенном выше алгоритме, то есть x < min.

      Если  ищется номер последнего по порядку минимального элемента, то выполняется сравнение вида x <= min .

33

      В некоторых задачах требуется  найти минимум или максимум среди  чисел, удовлетворяющих определенному  условию. В этом случае переменные min/max (предназначенные для хранения эталона) нельзя инициализировать значением первого элемента исходного набора, так как этот элемент может не удовлетворять дополнительным условиям.

      Проще всего инициализировать переменную min значением, которое заведомо больше всех элементов исходного набора, а переменную max – значением, которое заведомо меньше этих элементов.

      В этой задаче нужно использовать переменную-счетчик  для хранения количества найденных  минимумов. Этот счетчик необходимо корректировать в двух ситуациях: при изменении значения переменной min (содержащей значение наименьшего элемента из уже просмотренных) и при появлении элемента, значение которого совпадает с текущим значением min.

31

      Для возможности генерации случайных  чисел необходимо создать экземпляр  класса System.Random и вызвать метод Next для генерирования очередного целого случайного числа или метод NextDouble  для генерирования вещественного числа с двойной точностью.

Для примера  создайте приложение, содержащее только модуль с процедурой Main, следующего содержания:

Module Module1

    Sub Main()

        Dim r As New Random, d As Integer

        Dim a, b As Integer

        a = -20 : b = 20

        For i As Integer = 1 To 10

            d = r.Next(a, b)

            Debug.Print(d)

        Next

    End Sub

End Module

 

30

  Sub GetD(ByVal prompt As String, ByRef x As Double)

        x = CDbl(InputBox(prompt))

        Debug.Print(prompt & x)

    End Sub

    Sub GetN(ByVal prompt As String, ByRef x As Integer)

        x = CInt(InputBox(prompt))

        Debug.Print(prompt & x)

    End Sub

    Sub Put(ByVal prompt As String, ByRef x As Double)

        Debug.Print(prompt & x)

    End Sub

В окне InputBox всегда имеются только две кнопки управления: ОК и Cancel. Кнопка ОК подтверждает ввод данных, кнопка Cancel — закрывает диалоговое окно без ввода данных.

Функция InputBox возвращает строку, введенную пользователем. При нажатии кнопки Cancel возвращается пустая строка. Так как функция возвращает строку символов, то при вводе числовых данных нужно позаботится о преобразовании их из строкового представления в числовое. Для этого используются специальные стандартные функции преобразования: CByte(), Cint(), CLng() — для преобразования к целочисленным типам Byte, Integer, Long соответственно; CSng(), CDbl() — для преобразования к типам Single и Double для вещественных чисел; можно использовать функцию Val(), которая любые нечисловые символы воспринимает как ноль, а строку преобразует в соответствии с типом переменной, которой присваивается значение. 

29

      Тело  цикла – последовательность действий (операторов), выполняемых при каждом повторении цикла.

      Цикл  называется простым, если в теле цикла не содержится циклических действий. Если среди операторов тела цикла содержатся циклические операторы, то такой цикл называется сложным, или вложенным.

      Цикл, содержащий в себе другой цикл, называется внешним, а содержащийся в нем – внутренним. При одном повторении внешнего цикла тело внутреннего цикла повторяется столько раз, какова кратность внутреннего цикла. Поэтому необходимо все действия, независящие от параметров внутреннего цикла выносить во внешний цикл.

      Внутренний  цикл должен полностью содержаться  во внешнем.

      Изобразим схематически правильную структуру  вложенных циклов.

       For i=1 to n

        ...

            For j= 1 to m

                  ...

            Next j

            ... 

      Next i 

       Не могут быть так скомбинированы операторы циклов и/или условные операторы, чтобы они пересекались друг с другом. Например, следующим образом:                                   

        

      

      Метод детализации

      Сначала запишем словесно действия, которые  необходимо выполнить во внешнем  цикле, опуская детали. Затем детализируем действия, заменяя их операторами языка.

      Рассмотрим  ту же самую задачу.

      Ввод N

      Ввод K

       S = 0

      Для i от 1 до N

        Вычислить P = iK

          S = S + P

      Конец-для

      Вывод S

      Остается  переписать программу, заменяя словесные  инструкции операторами языка.

28

Тело  цикла – последовательность действий (операторов), выполняемых при каждом повторении цикла.

      Цикл  называется простым, если в теле цикла не содержится циклических действий. Если среди операторов тела цикла содержатся циклические операторы, то такой цикл называется сложным, или вложенным.

      Цикл, содержащий в себе другой цикл, называется внешним, а содержащийся в нем – внутренним. При одном повторении внешнего цикла тело внутреннего цикла повторяется столько раз, какова кратность внутреннего цикла. Поэтому необходимо все действия, независящие от параметров внутреннего цикла выносить во внешний цикл.

      Внутренний  цикл должен полностью содержаться  во внешнем.

      Изобразим схематически правильную структуру  вложенных циклов.

       For i=1 to n

        ...

            For j= 1 to m

                  ...

            Next j

            ... 

      Next i 

       Не могут быть так скомбинированы операторы циклов и/или условные операторы, чтобы они пересекались друг с другом. Например, следующим  образом:                                   

        

      

      Метод окаймления

      В этом методе вначале реализуется  внутренний цикл, а затем он окаймляется внешним.

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

      Этот  метод реализует разработку алгоритма  «снизу – вверх».

Задача 1 (For36. Даны целые положительные числа N и K. Найти сумму

S = 1+ 2+ … + NK.

Чтобы избежать целочисленного переполнения, вычислять слагаемые этой суммы  с помощью вещественной переменной и выводить результат как вещественное число.

      Рассмотрим i – слагаемое этой суммы, т.е. необходимо вычислить значение P = iK  и прибавить его к сумме, т.е. S = S + P

      Опишем  вычисление P

      P = 1

      For j = 1 to K

            P = P * i

      Next

      S = S + P 

      А теперь этот фрагмент нужно выполнить  для всех значений i, изменяющихся от 1 до N, предварительно обнулив значение суммы S.

      ‘ Ввод N

      ‘ Ввод K

      S = 0

       For i = 1 to N

            P = 1

          For j = 1 to K

                  P = P * i

          Next

          S = S + P 
     

     Next

      ‘ Вывод S

27

      В некоторых задачах количество чисел  в наборе неизвестно, но известен признак  завершения ввода. Во всех задачах из задачника PT4 (группа Series) признаком завершения при вводе данных является число 0.

      Алгоритм 3. Обработка элементов последовательности, признаком завершения которой является число 0.

  1. Объявление переменных
  2. Начальные присваивания
  3. Ввод первого значения в переменную X
  4. Пока значение  X не равно 0, выполнить тело цикла
    1. Обработка введенного значения  X (вычисления)
    2. Ввод очередного значения в переменную X
  5. Конец цикла
  6. Завершающие действия
  7. Вывод результатов
 

26

      Алгоритм 1. Общая схема обработки последовательности.

  1. Объявление переменных
  2. Начальные присваивания
  3. Начало цикла (заголовок цикла)
    1. Ввод значения
    2. Обработка значения (вычисления)
  4. Конец цикла
  5. Завершающие действия
  6. Вывод результатов

      Алгоритм 2 (детализированная версия алгоритма 1).

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

  1. Объявление переменных
  2. Начальные присваивания
  3. Начало цикла (заголовок цикла)
    1. Ввод значения
    2. Если значение удовлетворяет условию, то
      1. Обработка значения (вычисления)
    3. Конец-если
  4. Конец цикла
  5. Завершающие действия
  6. Вывод результатов

25

Итерационные  циклы

      Итерационными циклами называют циклы с неизвестным  числом повторений, реализующие процесс  получения последовательности значений y1, y2, … , yn, сходящейся к некоторому пределу y. Каждое новое значение yn в такой последовательности определяется с учетом предыдущего значения  yn-1 и является более точным приближением к y.

      Итерационный  цикл заканчивается, т.е. считается, что  yn » y, если для некоторого значения n выполняется условие | yn – yn-1 | < ε, где ε – допустимая погрешность вычисления результата.

      Рекуррентное  соотношение для вычисления очередного слагаемого выведено и имеет вид  –  a=a*x/i.

      Опишем  словесно схему алгоритма, реализуемого в функции:

  1. Начальное значение суммы y = 0
  2. Начальное значение для первого слагаемого a = 1
  3. Начальное значение для индекса суммирования i = 0
  4. Пока | a | > eps выполнить
    1. y = y + a
    2. i =  i + 1
    3. вычисление очередного слагаемого a = a * x / i

     Конец-пока

  1. Результат – y .

24

Параметры в списке параметров в заголовке  процедуры, называемые иначе формальными параметрами,  разделяется запятыми. Формальный параметр имеет произвольное допустимое имя, необходимое только для описания алгоритма. Место в памяти для формального параметра не выделяется.

Формальный  параметр имеет синтаксис:

[Optional][ByVal|ByRef] имяПеременной[()][As тип][=значение]

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

ByVal — этот описатель указывает, что параметр передается по значению (этот описатель используется по умолчанию); передача параметра по значению означает, что в процедуру передается не сама переменная, а ее копия. Поэтому изменение параметра в теле процедуры не изменяет саму переменную.

ByRef — указывает, что этот параметр передается по ссылке (по адресу). Передача по ссылке означает, что в этом случае вызываемая процедура получает доступ к области памяти вызывающей процедуры, в которой эта переменная хранится. Значит при изменении параметра в вызываемой процедуре, происходит изменение значения переменной–параметра.

Оператор  Exit Sub приводит к немедленному выходу из процедуры. Выполнение программы продолжается с оператора, следующего за оператором, содержащим вызов процедуры. Допускается наличие любого числа операторов Exit Sub.

Фактические параметры замещают соответствующие формальные. Они должны согласовываться с формальными параметрами по порядку, типу и количеству.

Процедура Function

Синтаксис описания процедуры  Function имеет вид:

 [Public|Private][Static] Function имя[(списПарам)][As тип]

            [Операторы]

            [имя = выражение]

        [Exit Function]

        [Операторы]

        [имя = выражение]

  End Function

Синтаксис списка формальных параметров такой  же, как и для процедуры Sub.

23

Параметры в списке параметров в заголовке процедуры, называемые иначе формальными параметрами,  разделяется запятыми. Формальный параметр имеет произвольное допустимое имя, необходимое только для описания алгоритма. Место в памяти для формального параметра не выделяется

Фактические параметры замещают соответствующие формальные. Они должны согласовываться с формальными параметрами по порядку, типу и количеству.

Передача  параметров

Как следует  из синтаксиса параметров процедуры, существует два способа передачи параметров процедур и функций: ByVal — по значению (применяется по умолчанию) и ByRef — по ссылке (по адресу).

Передача  по адресу означает, что вызывающая процедура и вызываемая работают с одним и тем же (общим) адресом памяти. Фактическим параметром в этом случае может быть только переменная.

Другой  способ передачи — по значению. В  этом случае в области памяти, доступной  только вызываемой процедуре, создается копия значения передаваемого параметра. Оригинал в вызывающей процедуре не изменяется. Значит, если нужно обезопасить переменную от возможного изменения, ее нужно передавать по значению.

Существует  две возможности показать, что  передается значение, а не адрес: использование ключевого слова ByVal в описании соответствующего формального параметра в заголовке процедуры; использование выражения  для соответствующего фактического параметра.

Рекомендации  по применению одного из способов передачи параметра:

если  процедура должна изменить значение параметра — то по ссылке; если не должна менять — то по значению.

Вывод: входные параметры можно передавать по значению или по ссылке (но лучше — по значению), выходные параметры — только по ссылке. Параметр-массив лучше передавать по ссылке.

22

Процедура Function

Синтаксис описания процедуры  Function имеет вид:

 [Public|Private][Static] Function имя[(списПарам)][As тип]

            [Операторы]

            [имя = выражение]

        [Exit Function]

        [Операторы]

        [имя = выражение]

  End Function

Синтаксис списка формальных параметров такой  же, как и для процедуры Sub. Посмотрим на отличия Function  от Sub.

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

Возвращаемым  значением называют значение, которое  функция передает обратно в  вызвавшую  ее программу. Функция может вернуть  значение двумя способами:

– значение присваивается самому имени функции один или несколько раз по ходу выполнения процедуры. Управление (и, соответственно, возвращаемое значение) не будет передано в программу, вызвавшую функцию, до тех пор, пока не выполнится Exit Function или End Function.

– использованием оператора Return выражение, чтобы определить возвращаемое значение с немедленной передачей управления программе, вызвавшей функцию.

Таким образом, выход из функции организуется:

– по последнему оператору End Function;

– досрочно — по оператору Exit Function (возможно наличие любого числа операторов Exit  Function);

– по оператору  Return (которых может быть несколько).

Не допускается  описание процедуры Function внутри другой процедуры Function или Sub.

Если  имени функции не присваивается  никакого значения и отсутствует  оператор Return, то процедура Function возвращает значение по умолчанию: числовая функция возвращает нулевое значение, строковая функция возвращает значение пустой строки, функция типа Object — значение Empty.

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

Будем считать, что функцию можно использовать только в выражении, и функция может иметь только входные параметры.  Хотя на самом деле, функцию можно использовать как оператор, если она не возвращает никакого значения. Кроме значения, возвращаемого через имя функции, функция может возвращать значения через параметры (так называемый побочный эффект функции).

21 

Процедура Sub

Синтаксис описания процедуры Sub:

[Public|Private][Static] Sub имя[(списокПараметров)]

         [Операторы]

        [Exit Sub]

Прикладная информатика