Алгоритмы и программы Методические указания для подготовительных курсов Ростов-на-Дону
Вид материала | Методические указания |
- Методические указания для подготовительных курсов Ростов-на-Дону, 445.48kb.
- Методические указания для студентов заочной формы обучения Финансового факультета Ростов-на-Дону, 342.26kb.
- Методические указания для студентов заочной формы обучения Финансового факультета Ростов-на-Дону, 168.33kb.
- Методические указания для студентов заочной формы обучения Финансового факультета Ростов-на-Дону, 205.36kb.
- Методические указания курса «культурология» Для студентов биологического факультета, 331.04kb.
- Бюджетное планирование и прогнозирование методические указания для студентов заочной, 174.2kb.
- Методические указания к изучению курса «История зарубежной литературы 19 века» для, 569.78kb.
- Методические указания по выполнению курсовых работ и подготовки к экзамену для студентов, 320.85kb.
- Методические указания по выполнению курсовых работ и подготовки к экзамену для студентов, 359.09kb.
- Методические указания по организации и проведению учебной практики студентов Ростов-на-Дону, 102.61kb.
ИмяПроцедуры СписокФактическихПараметров
СписокФактическихПараметров – список аргументов, передаваемых процедуре. Он должен соответствовать списку, заданному в описании процедуры по количеству и типу.
Если требуется использовать несколько процедур с одинаковыми названиями, расположенных в разных модулях, при их вызове после имени процедуры через точку надо указывать имя модуля в котором они расположены:
Синтаксис:
ИмяМодуля.ИмяПроцедуры СписокФактическихПараметров
Второй способ вызова процедуры sub производится с помощью инструкции Call.
Синтаксис:
Call ИмяПроцедуры (СписокФактическихПараметров)
Обратите внимание, что в этом случае список фактических параметров заключается в скобки.
1.8. Операторы ввода и вывода
С помощью встроенных диалоговых окон осуществляют ввод и вывод информации и результаты программ.
Окно сообщений (MsgBox) выводит простейшие сообщения для пользователя, а окно ввода (InputBox) обеспечивает ввод информации.
Функция InputBox | Выводит на экран диалоговое окно, содержащее сообщение и поле ввода, две кнопки ОК и Cancel. Устанавливает режим ожидания ввода текста пользователем и нажатия кнопки. Если нажата кнопка ОК, то функция возвращает текст, веденный в поле ввода. Если нажата кнопка Cancel, то возвращает пустую строку. Синтаксис: InрutBох(Рrоmpt[, Title] [, Default] [, xPos] [, yPos] [,Helpfile, Context])
|
Процедура MsgBox | Выводит на экран диалоговое окно, содержащее сообщение, устанавливает режим ожидания нажатия кнопки пользователем, а затем возвращает значение типа Integer, указывающее какая кнопка была нажата. Синтаксис: MsgBox(Prompt[, Buttons] [, Title] [, Helpfile, Context])
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, то общий результат: заданная программа вводит двумерный массив А размером 66, находит максимум среди элементов его диагоналей и определяет количество равных этому числу значений среди остальных его элементов.
Пример П5. Определить ошибки или пропущенные строки в заданной программе.
Задана программа с пропущенными строками, решающая следующую задачу:
На квадратной карте-сетке размером 55, считанной с листа 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