Алгоритмы и программы Методические указания для подготовительных курсов Ростов-на-Дону

Вид материалаМетодические указания

Содержание


ИмяПроцедуры СписокФактическихПараметров
Call. Синтаксис: Call
ОК и Cancel
Отображаемые кнопки
Значок сообщения
Нажатая кнопка
Ответ: -128Комментарий решения
Ответ: А(3,5)= 3 и А(5,5)=25Комментарий решения
Требуется заполнить пропущенные строки.
Подобный материал:
1   2   3   4   5   6   7   8   9

ИмяПроцедуры СписокФактическихПараметров



СписокФактическихПараметров – список аргументов, передаваемых процедуре. Он должен соответствовать списку, заданному в описании процедуры по количеству и типу.

Если требуется использовать несколько процедур с одинаковыми названиями, расположенных в разных модулях, при их вызове после имени процедуры через точку надо указывать имя модуля в котором они расположены:

Синтаксис:

ИмяМодуля.ИмяПроцедуры СписокФактическихПараметров


Второй способ вызова процедуры sub производится с помощью инструкции Call.

Синтаксис:


Call ИмяПроцедуры (СписокФактическихПараметров)


Обратите внимание, что в этом случае список фактических параметров заключается в скобки.


1.8. Операторы ввода и вывода


С помощью встроенных диалоговых окон осуществляют ввод и вывод информации и результаты программ.

Окно сообщений (MsgBox) выводит простейшие сообщения для пользователя, а окно ввода (InputBox) обеспечивает ввод информации.


Функция InputBox

Выводит на экран диалоговое окно, содержащее сообщение и поле ввода, две кнопки ОК и Cancel. Устанавливает режим ожидания ввода текста пользователем и нажатия кнопки. Если нажата кнопка ОК, то функция возвращает текст, веденный в поле ввода. Если нажата кнопка Cancel, то возвращает пустую строку.

Синтаксис:

InрutBох(Рrоmpt[, Title] [, Default]

[, xPos] [, yPos] [,Helpfile, Context])

  • Prompt  строковое выражение, отображаемое как сообщение в диалоговом окне. Строковое выражение Prompt может содержать несколько строк. Для разделения строк допускается использование символа возврата каретки (Chr(13)), символа перевода строки (Chr(10)) или комбинацию этих символов (Chr(13) & Chr(10));
  • Title  строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот параметр опущен, то в строку заголовка помещается имя приложения;
  • Default  строковое выражение, отображаемое в поле ввода как используемое по умолчанию, если пользователь не введет другую строку. Если этот параметр опущен, то поле ввода изображается пустым;
  • xPos  числовое выражение, задающее расстояние по горизонтали между левой границей диалогового окна и левым краем экрана. Если этот параметр опущен, то диалоговое окно выравнивается по центру экрана по горизонтали;
  • yPos  числовое выражение, задающее расстояние по вертикали между верхней границей диалогового окна и верхним краем экрана. Если этот параметр опущен, то диалоговое окно помещается по вертикали примерно на одну треть высоты экрана;
  • Helpfile  строковое выражение, определяющее имя файла справки, содержащего справочные сведения о данном диалоговом окне. Если этот параметр указан, то необходимо указать также параметр Context;
  • Context  числовое выражение, определяющее номер соответствующего раздела справочной системы. Если этот пара- метр указан, то необходимо указать также параметр Helpfile.




Процедура

MsgBox

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

Синтаксис:

MsgBox(Prompt[, Buttons] [, Title] [, Helpfile, Context])
  • Prompt  строковое выражение, отображаемое как сообщение в диалоговом окне;
  • Buttons  числовое выражение, представляющее сумму значений, которые указывают число и тип отображаемых кнопок, тип используемого значка, основную кнопку. Значение по умолчанию этого параметра равняется 0. Значения констант, определяющих число, тип кнопок и используемого значка, приведены в табл. 2;
  • Title  строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот параметр опущен, то в строку заголовка помещается имя приложения;

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


Значения параметра Buttons процедуры MsgBox, определяющие отображаемые кнопки в диалоговом окне:


Константа

Значение

Отображаемые кнопки

vbOKOnly

0



vbOKCancel


1



vbAbortRetryIgnore

2



vbYesNoCancel


3



vbYesNo

4



vbRetryCancel

5



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

Значения параметра Buttons процедуры MsgBox, определяющие отображаемые значки в диалоговом окне:


Константа

Значение

Значок сообщения

vbCritical

16



vbQuestion

32



vbExclamation

48



vbInformation

64



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


Константа

Значение

Нажатая кнопка

vbOK

1

ОК

vbCancel

2

Отмена (Сапсеl)

vbAbort

3

Прервать (Abort)

vbRetry

4

Повторить (Retry)

vbIgnore

5

Пропустить (Igпоrе)

vbYes

6

Да (Yes)

vbNo

7

Нет (No)



2. Образцы тестовых заданий на тему «Программирование»


2.1. Задачи с подробным комментарием


Пример П1. Построена блок-схема, по ней найти значение переменной k.



Ответ : 3.

Комментарий решения


Как видно из алгоритма, в качестве исходных данных выступает одномерный массив A размерности 7, причем А(1)=-1, А(2)=5, А(3)=6, А(4)=4, А(5)=-2, А(6)=0, А(7)=1. Пронумеруем блоки алгоритма.




1-й блок – переменным M и k присваиваются начальные значения; 2-й – условный блок с условием M<=6; 3-й – условный блок с условием A(M)>0; 4-й – блок, где происходит изменение переменной k; 5-й– блок, где происходит изменение переменной M. По стрелке, соединяющей блок 5 и блок 2, можно сделать вывод, что в блок-схеме представлен циклический алгоритм с параметром М. Начальное значение параметра цикла М=1, условие работы цикла M<=6, шаг цикла 1.

Шаг 1: M=1, k=0, условие работы цикла выполняется, A(1)=-1 не больше нуля, поэтому блок 4 пропускаем, на 5-м M=1+1=2.

Шаг 2: M=2, k=0, условие работы цикла выполняется, A(2)=5 больше нуля 0, поэтому k=0+1=1, на 5-м блоке M=2+1=3.

Шаг 3: M=3, k=1, условие работы цикла выполняется, A(3)=6 больше нуля 0, поэтому k=1+1=2, на 5-м блоке M=3+1=4.

Шаг 4: M=4, k=2, условие работы цикла выполняется, A(4)=4 больше нуля 0, поэтому k=2+1=3, на 5-м блоке M=4+1=5.

Шаг 5: M=5, k=3, условие работы цикла выполняется, A(5)=-2 не больше нуля 0, поэтому k=3 по прежнему, на 5-м блоке M=5+1=6.

Шаг 6: M=6, k=3, условие работы цикла выполняется, A(6)=0 равно 0 условие не выполняется, поэтому опять k=3, на 5-м блоке M=6+1=7.

Шаг 7: M=7, k=3, условие работы цикла не выполняется, из цикла выходим и в результате получаем, что k=3.


Пример П2. Что напечатает эта программа?

Sub MyProc()

Dim x As Integer, k As Integer

k = 1: x = 4

x = sqr(x*x) - 2*x3

For i = x/2 To -50 Step 4

x = x-k

Next

MsgBox x

End Sub


Ответ: -128


Комментарий решения

Поскольку переменная x описана как целое число (первая строка программы) и последним оператором программы является единственный оператор печати MsgBox x, то возможные варианты ответа: а) числовое значение x, б) программа выдаст сообщение об ошибке, с) программа зациклится. Рассмотрим ход решения.

Вначале внимательно читаем текст программы, проверяя, нет ли синтаксических ошибок в написании операторов языка VBA. В нашем случае таких ошибок нет. Проверяем также соответствие (эквивалентность или приводимость) типов данных в операторах присваивания и в выражениях. В нашей задаче все операции не выводят за пределы допустимых значений объявленных (в Dim) типов. С этой стороны также ошибок нет.

Далее анализируем ход вычисления. Во второй строке переменные k и x получают начальные значения. В третьей строке перевычисляется значение переменной x. В приведенной формуле sqr(x*x)-2*x3 следует обратить внимание на операцию вызова функции sqr и порядок действий в выполнении выражения 2*x3. Для функции нужно проверить, во-первых, есть ли такая в списке стандартных (встроенных) функций VBA и, во-вторых, правильно ли указаны ее аргументы (количество и тип параметров). Если хотя бы на один из этих вопросов ответ отрицательный, то программа выдаст сообщение об ошибке. В данном случае все в порядке: функция sqr является встроенной функцией VBA, вычисляющей корень квадратный из положительного целого числа – результата операции x*x. Ее значение здесь равно 4. В выражении 2*x3 вначале вычисляется x3, т.к. операция возведения в степень имеет больший приоритет по сравнению с операцией * умножения. Поэтому порядок вычисления такой: 2* (43)=128. Общий результат для x в третьей строке: x=4-128=-124.

В четвертой строке программы открывается цикл For с заголовком i=x/2 To -50 Step 4, в котором начальное значение счетчика цикла i равно x/2, т.е. -124/2=-62, конечное допустимое значение равно -50 и приращение счетчика цикла на каждом шаге равно 4. Нетрудно посчитать число шагов – количество повторений для тела цикла: |(-62-(-50))|/4+1=12/4+1=4 (для i=-62, -58, -54, -50). Таким образом, тело цикла (операторы до закрывающей цикл «скобки» Next): x=x–k будет выполняться четыре раза. Так как значение k=1 и не меняется в цикле, то x на выходе из цикла (когда i будет равен уже -50+4=-46) приобретет значение -128 (четыре раза из -124 вычтется 1). Результат: программа напечатает число -128.


В задачах, содержащих циклы, всегда нужно тщательно проанализировать заголовок цикла по двум критериям: 1) не выводят ли граничные значения (начальное и конечное значения счетчика, переменных в цикле) за допустимые для задачи пределы (например, в теле есть оператор sqr(i), а значение параметра цикла i<0), 2) не приводит ли условие завершения цикла к зацикливанию программы. В нашей задаче цикл работает корректно.


Пример П3 (вложенные циклы и двумерные массивы). Какое значение будет иметь элемент A(3,5) и A(5,5) в результате выполнения следующей программы:

Public Sub matrix()

Dim A(6, 6) As Integer, x As Integer

x = 2

For i=1 To 6

For j=1 To 6

A(i,j)=0

Next

Next

For i = 1 To 6

A(i,i)=i2

Next

For i=1 To 6

For j=2 To 6

If i<>j Then

A(i,j) = A(i,j-1)+ x*3 - A(i,i)

End If

Next

Next

End Sub


Ответ: А(3,5)= 3 и А(5,5)=25


Комментарий решения

В программе два независимых вложенных For-цикла: начало одного в третьей строке программы, начало второго – в одиннадцатой. Напомним, как работает вложенный цикл. Один шаг внешнего цикла влечет выполнение всех шагов внутреннего. Таким образом, в нашей программе при каждом изменении счетчика внешнего цикла (i) на единицу полностью отрабатывается внутренний цикл – выполняются все его шаги, j меняется от 1 до 6. Так перебираются все элементы двумерного массива построчно: А(1,1), А(1,2), А(1,3),…,А(1,6), А(2,1), А(2,2), А(2,3), …, и т.д., до А(6,6).

Поскольку условие задачи не предполагает проверку ее на синтаксическую правильность и соответствие типов данных, анализируем ход вычисления. Вначале переменной x присваивается целое число 2. Первый вложенный цикл нашей программы обнуляет двумерный массив А: все элементы стали равны 0.

Далее следует простой, без вложенных, цикл For. Он присваивает значения элементам главной диагонали массива А (признак главной диагонали – номер столбца равен номеру строки, т.е. для любой строки i массива номер столбца на диагонали также есть i). Эти значения равны А(1,1)=1 (12 для i=1), А(2,2)=4 (22 для i=2), А(3,3)=9 (32 для i=3), А(4,4)=16 (42 для i=4), А(5,5)=25 (52 для i=5).

Следующий оператор нашей программы – снова вложенный цикл For, который также изменяет значения элементов массива А. Тело внутреннего цикла содержит условный оператор If, который выполняет присваивание A(i,j)=A(i,j-1)+x*3-A(i,i)элементам массива, если они не лежат на главной диагонали (i<>j). Заметим, что в этом присваивании значение A(i,j)зависит от значения предыдущего (по столбцу) элемента A(i,j-1), которое, в свою очередь, зависит от значения A(i,j-2)и т. д. Чтобы правильно вычислить искомый элемент А(3,5), можно либо вычислить все элементы массива А, либо последовательно посчитать значения элементов А(3,4), А(3,3), А(3,2), А(3,1). Последний путь проще, и этих элементов достаточно, т.к. вычисление A(i,j) не зависит от предыдущего по строке элемента (например, A(i-k,j)), и другие слагаемые выражения также не зависят от значений предыдущих шагов. Поэтому, считаем: А(3,1)=0, А(3,2)= А(3,1)+x*3-A(3,3)=0+6-9=-3, А(3,3)=9 (диагональный элемент), А(3,4)=А(3,3)+6-A(3,3)=6, и, наконец, искомый А(3,5)=А(3,4)+6-A(3,3)=6+6-9=3.

Поскольку далее в программе нет операторов, изменяющих значения элементов массива, искомые значения сохраняются: А(5,5)=25, А(3,5)=3.

Заметим попутно, что если в строке 12 заменить For j=2 To 6 на For j=1 To 6, то для j=1 в присваивании A(i,j)=A(i,j-1)+… вычисление A(i,1)потребовало бы знания значения A(i,0), которое не определено. Это как раз случай, когда граничные значения счетчика приводят к некорректному исполнению программы (выходу за пределы массива).

Пример П4 ( восстановление постановки задачи по заданной программе). Какую задачу решает следующая программа?

Public Sub WhatIsIt()

Dim A(6,6) As Integer, m As Integer, n As Integer, k As Integer

n = 6

For i=1 To n

For j=1 To n

A(i,j) = InputBox("Введите элемент массива")

Next

Next

k = 0: m = A(1,1)

For i=1 To n

If m
If m
Next

For i=1 To n

For j=1 To n

If i<>j And j<>n-i+1 Then

If A(i,j)=m Then: k = k+1

End If

Next

Next

MsgBox k

End Sub


Ответ: программа вводит двумерный массив и считает количество недиагональных элементов массива, равных максимальному элементу ее диагоналей.


Комментарий решения

Задача сводится к определению алгоритма по заданному набору операторов. Поскольку всякий алгоритм пошагово преобразует исходный набор данных, для понимания задачи нужно проследить как меняется этот набор после исполнения каждого оператора. В данном случае в качестве данных в программе описаны три целые переменные (n,m,k) и двумерный массив А(6,6). Первые операторы: присваивание n=6, последующий вложенный цикл и присваивания k=0: m=A(1,1)определяют начальные значения объявленного набора данных.

Далее идет цикл, изменяющий значение переменной m. Первый условный оператор:

If m
If mвсех элементов A(i,i), A(i,n-i+1) значение, и оно сохраняется в переменной m. Выясним, где расположены эти элементы. Подставим вместо i значения, получаемые этим счетчиком в процессе прохождения цикла: i =1, 2, …, 6. Получим элементы А(1,1),А(2,2),…,А(6,6) и А(1,6),А(2,5),А(3,4),…,А(6,1), которые в точности соответствуют диагональным элементам двумерного массива (т.е. лежат на его главной и побочной диагоналях). Итог: первая часть программы находит максимум среди диагональных элементов введенного массива А.

Далее в программе вновь идет вложенный цикл, изменяющий значение переменной k. Цикл перебирает все недиагональные элементы массива А (условие i<>j And j<>n-i+1 выделяет только те A(i,j) , которые не находятся ни на главной диагонали, где i=j, ни на побочной диагонали, где j=n-i+1). Для этих элементов выясняется равны ли они полученному максимуму m и, если да, то k увеличивается на единицу. Периодическое увеличение какой-либо переменной на единицу обычно свидетельствует о том, что эта переменная является счетчиком чего-либо. В данном случае k считает элементы, равные найденному максимуму m. Итог: вторая часть программы находит количество недиагональных элементов массива А, равных максимальному элементу его диагоналей.

Поскольку далее идет оператор печати полученного значения счетчика k, то общий результат: заданная программа вводит двумерный массив А размером 66, находит максимум среди элементов его диагоналей и определяет количество равных этому числу значений среди остальных его элементов.


Пример П5. Определить ошибки или пропущенные строки в заданной программе.

Задана программа с пропущенными строками, решающая следующую задачу:

На квадратной карте-сетке размером 55, считанной с листа Excel, указаны (цифрой 1) прямолинейные траектории движения двух поездов, начинающиеся и заканчивающиеся на границах сетки. Известно, что один поезд шел путем, совпадающим с главной диагональю этого квадрата, а траектория второго пересекла этот путь под прямым углом. Определить координаты (номер строки и номер столбца) начала и конца траектории второго поезда.

Требуется заполнить пропущенные строки.

Public Sub tema10()

Dim A(5, 5) As Integer

For i=1 To 5

For j=1 To 5

A(i,j) = Cells(i,j)

Next: Next

______

If A(1,j) = 1 And A(1,j) = A(j,1) Then

MsgBox "1, " & CStr(j) & " и " & CStr(j) & ",1"

Exit For

End If

If Then

MsgBox "5, " & CStr(j) & " и " & CStr(j) & ",5"

Exit For

End If

Next

End Sub