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<A(i, i) Then: m = A(i, i)

If m<A(i, n-i+1) Then: m = A(i, n-i+1)

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<A(i, i)Then: m=A(i, i) на каждом шаге цикла присваивает переменной m значение элемента A(i, i), если оно оказалось больше сохраненного в m значения, второй оператор:

If m<A(i n-i+1)Then: m=A(i, n-i+1) присваивает переменной m значение элемента A(i, n-i+1), если оно оказалось больше сохраненного в 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

Ответ: первая строка: For j=2 To 5, вторая строка: A(5,j)=1 And A(5,j)=A(j,5).

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

При выполнении таких задач необходимо по программе восстановить алгоритм, попытавшись вначале осознать возможные пути решения. Поскольку вторая траектория прямолинейна и пересекает первую (диагональную) под прямым углом, следовательно, ее элементы расположены симметрично относительно этой диагонали, например: А(1,2) и А(2,1); А(1,3) и А(3,1); А(1,4),А(2,3) и А(3,2),А(4,1) и т. д. Один из алгоритмов решения может состоять в том, чтобы проанализировать поочередно такие цепочки элементов на наличие у них значения, равного 1 (т. к. траектория «закрашена» цифрой 1). Более оптимальные алгоритмы могут проверять не всю цепочку целиком, а лишь два или даже один ее элемент, т. к. из условия следует, что первая и вторая траектории есть на карте и никаких других траекторий нет. Поэтому достаточно проверить «на единицу» только элементы первой строки и последнего столбца (или последней строки), чтобы определить один из концов искомой траектории, второй конец будет иметь симметричные координаты i, j. Чтобы уточнить, какой именно из этих алгоритмов реализован, обратимся к программе.

Очевидно, программа должна начинаться с определения исходных данных, здесь – нужно считать карту с листа Excel. Операторы первого (вложенного) цикла выполняют это. Скобки Next:Next указывают, что к моменту пропуска этот цикл полностью закрыт, карта считана. Дальнейший просмотр программы обнаруживает наличие операторов Exit For и закрывающей цикл For скобки Next, хотя такой цикл в имеющихся строках не открывался. Значит, первая пропущенная строка открывает цикл For. Внутри этого цикла фигурирует счетчик j в перечислении элементов карты A(i, j), счетчик же i отсутствует, значит открывался простой цикл (без вложенных): For j=. Последующие за первым пропуском операторы If и печати MsgBox свидетельствуют, что проверяются на значение 1 элементы первой строки и симметричные элементы 1-го столбца: A(1,j) и A(j,1). Значит, выбран алгоритм определения траектории по двум ее точкам. Так как анализируются элементы карты 5´5 и пятый элемент этой строки также может быть концом траектории, последнее значение счетчика j будет 5, т. е. пропущенный заголовок цикла имеет вид: For j= To 5. Осталось определить начальное значение счетчика. Так как элемент А(1,2) уже может принадлежать траектории, то претенденты на это значение – числа 1 или 2. Если подставить в условие If значение j=1, получим: условие истинно и будут напечатаны координаты диагонального элемента А(1,1) – вторая траектория выродилась в точку, что противоречит условию задачи. Значит, начало отсчета j есть 2, т. е. первая пропущенная строка: For j=2 To 5. Шаг Step можно не указывать, т. к. перебираются первые элементы каждого столбца.

При дальнейшем анализе обратим внимание на то, что если элемент траектории в первой строке обнаружен, то программа выходит на оператор End Sub, поскольку, если условие в If истинно, то сработает последующий за печатью результата оператор Exit For принудительного выхода из цикла. Этого достаточно, если один из концов траектории находится в первой строке или первом столбце. Если же это не так (например, концевой элемент А(2,5) или А(5,2), то требуются дальнейшие проверки – анализ на наличие единицы в 5-м столбце или 5-й строке. Последующий за вторым пропуском оператор печати подсказывает, что так и есть – анализируются А(j,5) или А(5,j) для всякого значения счетчика j. Значит, претендентами на начало второй пропущенной строки могут быть строки: A(5,j)=1 или A(j,5)=1. Любая из них дает правильный ответ. Но, если следовать логике предложенного решения задачи (анализ по двум точкам), то к полученной строке нужно «прицепить» еще одну проверку симметричной точки, получим строку: A(5,j)=1 And A(5,j)=A(j,5) или эквивалентную A(j,5)=1 And A(j,5)=A(5,j). Если придерживаться порядка, указанного в операторе печати MsgBox и «стиля» первого оператора If A(1,j)= … , то вторая пропущенная строка – это: A(5,j)=1 And A(5,j)=A(j,5).

2.2. Тестовые задачи с ответом

Пример П6 (задача на алгоритмизацию). Какую из задач решает данный алгоритм.

 

Варианты ответа:

1) нахождение номера первого максимального элемента одномерного массива размерности 15;

2) нахождение номера первого минимального элемента одномерного массива размерности 15;

3) нахождение номера последнего максимального элемента одномерного массива размерности 15;

4) нахождение номера последнего минимального элемента одномерного массива размерности 15.

Ответ: 3.

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

Sub MyProcOtvet()

Dim x As Integer, k As Integer

k = 2: x = k-3

If x > k Then

x = x–5

Else

x = x+5

End If

While x>0

x = k*2 + x^2

Wend

MsgBox x

End Sub

Ответ: ничего, программа зациклится, т. к. условие продолжения цикла всегда истинно.

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

Public Sub matrixOtvet()

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

x = 3

For j=1 To 5

A(1,j) = 2

Next

For i=2 To 5

For j=1 To 5

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

Next

Next

End Sub

Ответ: A(1,5) = 2 и A(4,5) = 64

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

Public Sub WhatIsItOtvet()

Dim A(5, 5) As Integer, m As Integer, B As Integer

For i=1 To 5

For j=1 To 5

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

Next: Next

m = A(1,1)

For i=1 To 5

For j=1 To 5

If m<A(i, j) Then: m = A(i, j)

Next: Next

For i=1 To 5

If A(i, i)<m Then

B = A(i, i): Exit For

End If

Next

For i=1 To 5

A(i,3) = B: A(4,i) = B

Next

For i=1 To 5

For j=1 To 5

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

Next: Next

End Sub

Ответ: вводит двумерный массив размера 5´5 и заменяет значения элементов третьего столбца и четвертой строки на значение первого из элементов главной диагонали, меньшего максимального элемента всего массива. Результат выводит на лист Excel.

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

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

Дана квадратная сетка размером 8´8. Заполнить ее единицами, расположив их в шахматном порядке: первая клетка пуста, вторая равна 1, третья пуста и т. д. Результат вывести на лист Excel.

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

Public Sub tema10Otvet()

Dim A(8,8) As Integer

For i=1 To 8

 

A(i, j) = 1

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

Next

 

End Sub

Ответ: первая строка: For j=i Mod 2 +1 To 8 Step 2, вторая строка: Next.

2.3. Упражнения по теме для самостоятельного решения

1. Составить блок-схему алгоритма для решения следующий задачи: дан одномерный массив размерности 20, найти сумму элементов массива до первого нуля.

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

Sub MyProcSamost()

Dim x As Single, y As Single, A As Integer, C As Integer

x = 9: A =6: C = А/2

y = (Sqr(x) + 2*A*x-3)/(x-C)^2

For i= 1 To y

x = x+1

Next

MsgBox x

End Sub

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

Public Sub matrixSamost()

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

x = 5

For i=1 To 6

A(i,1) = 3

Next

For i=1 To 6

For j=2 To 6

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

x = x-1

Next

Next

For i=1 To 6

A(i,7-i) = 77

Next

End Sub

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

На листе Excel задана квадратная сетка размером n´n (одна клетка соответствует одной ячейке листа, отсчет с начала листа). Сетка разделена диагоналями на четыре части, верхняя четверть заполнена единицами. Скопировать значения этой четверти на нижнюю, зеркально отображая строки (например, первую на последнюю, вторую на предпоследнюю и т. п.) и не копируя элементы оставшихся частей сетки. Решить для n=6.

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

Public Sub tema10Samost()

Dim n As Integer, k As Integer

n = 6: k = 1

For i=4 To n

 

Cells(i, j) = Cells(i-k, j)

Next

 
 

Next

End Sub

2.4. Образцы тестов по программированию

Что напечатает программа?

Dim r As Integer, t As Long

r = 4000: t = 35000

If Not (t = r) Then

Do

r = r + 100

t = t - 100

Loop While r < 5000

End If

r = t * 2

MsgBox r

 

1) 10000

2) 5000

3) ошибка переполнения памяти

4) синтакси-ческая ошибка в блоке If...

5) 68000

6) 20000

7) нет правиль-ного варианта ответа

8) 35000

9) 4000

 

Что напечатает программа?

Dim p As Integer, s As Single

Dim pr As Integer, porog As Integer

p = CInt(110 Mod 50): porog = 79: s = 0

If p < (porog Mod 70) Then

pr = 5: s = p + p * pr / 100

ElseIf p >= (porog Mod 6) + 9 And s > 0 Then

pr = 4: s = p + p * pr /

Else

pr = 10: s = 2 * p + p * pr / 100

End If

MsgBox s

 

1) 9.4

2) 10.5

3) 3

4) 21

5) 10

6) 9

7) нет правиль-ного варианта ответа

8) 85

9) 11

3.  Найти результат выполнения программы

b = 2

a = b: c = 1

For i = 1 To 5 Step 2

a = a + b

b = b - c

c = a + c

Next

MsgBox (a + b + c + i)

 

1) 15

2) 0

3) 5

4) 3

5) нет правиль-ного варианта ответа

6) 2

7) 10

8) 1

9) -3

Что напечатает программа?

Dim A() As Integer, n As Integer, m As Integer, s As Integer

n = 4: m = 5

ReDim A(n, m): s = 0

For i = 4 To 1 Step -1

For j = 1 To 5

A(i, j) = i ^ 2 + j ^ 2: Cells(i, j) = A(i, j)

If i = j Or Not (i ^ 2 < i * j) Then

s = s + A(i, j)

End If

Next

Next

MsgBox s

 

1) 60

2) 150

3) сообщение об ошибке описания

4) зациклится

5) сообщение об ошибке выхода за пределы массива

6) нет правиль-ного варианта ответа

7) 25

8) 100

9) 200

Что напечатает программа?

Dim A(7, 7) As Integer, F As Integer

F = 1

For i = 1 To 7

For j = 1 To 7

A(i, j) = (i - j) ^ 2

If i = j Or j = 7 - i + 1 Then

F = F + A(i, j) - j

End If

Next

F = F + i

Next

MsgBox F

 

1) 82

2) 40

3) 89

4) 48

5) нет правиль-ного варианта ответа

6) 20

7) 55

8) 100

9) 300

6.  Найти результат выполнения программы

Dim s As String

s = "мир, труд, май!"

n = Len(s): k = 0

For i = 1 To n - 3

If Mid(s, i, 1) = "р" Or Mid(s, i, 2) = "уд" Then

k = k + InStr(1, s, "а") - 2

Else

k = k + 10

End If

Next

MsgBox k

 

1) 83

2) 72

3) 123

4) 120

5) 211

6) 56

7) 121

8) 111

9) нет правиль-ного варианта ответа

Какую задачу решает программа?

Dim a(10) As Integer, s As Integer

For i = 1 To 10

a(i) = Cells(i, 1): Next

For i = 1 To 10

s = 0

For j = 1 To 10

If i <> j And a(j) < a(i) Then

s = s + a(j): End If

Next

Cells(i, 2) = s

Next

 

1) для каждого элемента массива а находит

сумму элементов этого массива, меньших

данного и стоящих левее него

2) для каждого элемента массива а находит

сумму элементов этого массива, меньших

данного элемента

3) для каждого элемента массива а находит

сумму элементов этого массива, меньших

данного и стоящих правее него

4) находит сумму элементов массива,

являющихся локальными максимумами

5) нет правильного варианта ответа

6) для каждого элемента массива а находит

произве-дение элементов этого массива, меньших

данного и стоящих левее него

7) для каждого элемента массива а находит

сумму элементов этого массива, больших

данного элемента

8) находит сумму элементов массива,

не являющихся локальными максимумами

9) находит сумму элементов массива,

являющихся локальными минимумами

Какую задачу решает программа?

alf = "ABCDEFGHI"

s = InputBox("Vvedi stroku"): n = Len(s)

If n > 9 Then: MsgBox "Error": Exit Sub

snew = Space(n)

For i = 1 To Len(s)

If Asc(Mid(s, i, 1)) > 57 Or _

Asc(Mid(s, i, 1)) < 49 Then

MsgBox "Error input": Exit Sub

End If: Next

For i = 1 To n

Mid(s, i, 1) = Mid(alf, CInt(Mid(s, i, 1)), 1)

Next

MsgBox s

 

1) кодирует заданную строку, не состоящую из цифр, буквами алфавита "ABCDEFGHI",

стоящих на тех же позициях

2) кодирует заданную строку, состоящую из

букв, буквами алфавита "ABCDEFGHI",

стоящих на тех же позициях

3) нет правильного варианта ответа

4) кодирует заданную строку, состоящую из букв, цифрами, соответствующими кодировке букв алфавита "ABCDEFGHI" в Windows

5) кодирует заданную строку, состоящую из цифр, буквами алфавита "ABCDEFGHI", позиции которых соответствуют цифрам строки

6) кодирует заданную строку, состоящую из цифр, буквами алфавита "ABCDEFGHI",

стоящих на тех же позициях

7) кодирует заданную строку, состоящую из цифр, буквами алфавита "ABCDEFGHI", позиции которых соответствуют цифрам строки в обратном порядке

8) кодирует заданную строку, состоящую из

букв, буквами алфавита "ABCDEFGHI",

стоящих на тех же позициях, но в обратном порядке

9) кодирует заданную строку, не состоящую из цифр, буквами алфавита "АБВГДЕЁЖЗ",

стоящих на тех же позициях

Список использованной и рекомендуемой литературы

1.  Абрамян по программированию на языке Паскаль.–

Ростов-н/Д, 2004.

2.  Гарнаев VBA. – СПб.: BHV-Петербург, Санкт-Петербург, 2006.

3.  , Сенокосов : Учебник для 8-9 кл. –– М.: Просвещение, 1995.

4.  и др. Информатика. 10-11 кл. – М.: Просвещение, 2002.

5.  Информатика: Задачник-практикум в 2т. / Под ред. , . – М., 2001.

6.  , Семенов и упражнения по программированию.– Ростов-н/Д, 1996.

7.  Угринович и информационные технологии. 10-11 кл. – М.: Бином, 2003.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6