Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика_ЗФ / Лабораторный практикум по программированию / Лабораторный_практикум_по_программированию_4

.pdf
Скачиваний:
142
Добавлен:
22.03.2016
Размер:
1.4 Mб
Скачать

Чтобы их увидеть, создадим процедуру обработки события Click для четвертой командной кнопки CmdRezultat с надписью «Визуализация результатов» и впишем в нее программный код.

Private Sub CmdRezultat_Click() TxtMin.Value = amin TxtI.Value = imin

End Sub

Пояснение. Переменные amin и imin выводим в элементы управления TextBox (Текстовое поле или окно ввода) TxtMin и TxtI при помощи свойства Value.

Программный код полностью представлен в окне программы VBA на рисунке 12.

Рис. 12. Программный код в окне программы VBA

31

Запустите ваше приложение, выбрав команду Run Run Sub/UserForm или нажав функциональную клавишу F5. Появится экранная форма (рис. 13).

В качестве тестовых значений исходных данных возьмем одномерный массив А, состоящий из семи элементов: массив А = (3,-6,4,5,-3,8,2),

Рис. 13. Экранная форма после запуска приложения

После щелчка на первой командной кнопке с надписью «Ввод (заполнение) массива» появится диалоговое окно ввода переменной n (рис. 14).

Рис. 14. Диалоговое окно ввода переменой n – результат использования функции InputBox("Введите n")

Введем количество элементов массива – 7 – и нажмем кнопку ОК либо клавишу Enter.

Появится диалоговое окно ввода 1-го элемента массива a(1) c соответствующей поясняющей надписью (рис. 15).

32

Рис. 15. Диалоговое окно ввода элементов массива А – результат использования функции InputBox ("Введите" & i & "элемент")

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

После ввода массива щелкнем на второй командной кнопке «Вывод (визуализация) массива». В элемент управления ListBox (Список) будет выведен одномерный массив А.

Щелкнем на третьей командной кнопке «Нахождение наименьшего». Как было сказано выше, результатов работы этой процедуры мы не увидим, так как переменные amin и imin пока хранятся в оперативной памяти.

Чтобы их увидеть щелкнем на четвертой командной кнопке «Визуализация результатов». Результаты – значения переменных amin и imin увидим в элементах управления типа TextBox (Текстовое поле).

Полностью результаты выполнения программного кода при значениях одномерного массива А = (3, -6, 4, 5, -3, 8, 2) представлены на рисунке 16.

Рис. 16. Результаты работы программного кода поиска наименьшего элемента одномерного массива

33

Задачи для самостоятельного выполнения

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

Вариант 1. Дан массив А (а1, а2, ..., аn). Найти среднее арифметическое отрицательных элементов. Найти максимальный элемент из элементов, стоящих на четных местах.

Вариант 2. Дан массив А (а1, а2, ..., аn). Найти индекс максимального элемента из элементов, стоящих на четных местах и произведение отрицательных элементов.

Вариант 3. Дан массив А (а1, а2, ..., аn). Найти среднее арифметическое положительных элементов, стоящих на четных местах. Найти индекс максимального элемента.

Вариант 4. Дан массив А (а1, а2, ..., аn). Найти произведение отрицательных элементов, стоящих на четных местах, и отсортировать массив по возрастанию.

Вариант 5. Дан массив А (а1, а2, ..., аn). Переместить нулевые элементы массива в конец, сдвинув остальные элементы влево.

Вариант 6. Дан массив А (а1, а2, ..., аn). Переместить нулевые элементы массива в начало, сдвинув остальные элементы вправо.

Вариант 7. В массиве А (а1, а2, ..., аn) определить первый отрицательный элемент и его номер.

Вариант 8. В одномерном массиве А (а1, а2, ..., аn) перенести в начало максимальный элемент.

Вариант 9. Дан массив А (а1, а2, ..., аn), где n – число четное. Получить новый массив B (b1, b2, ..., bn/2) по следующему правилу (b11 + аn, b22n-1 и т.д.). Найти минимальный элемент полученного массива.

Вариант 10. В одномерном массиве А (а1, а2, ..., аn) перенести в конец минимальный элемент.

Вариант 11. Дан массив А (а1, а2, ..., аn). Найти максимальный и минимальный элементы массива А и поменять их местами.

Вариант 12..Дан массив А (а1, а2, ..., аn). Переписать в массив В подряд положительные элементы массива А.

Вариант 13. Дан массив А (а1, а2, ..., аn). Переписать в массив В подряд сначала отрицательные элементы массива А, а затем положительные.

Вариант 14. Дан массив А (а1, а2, ..., аn). Переписать в массив В подряд элементы массива А (а1, а2, ..., аn), значения которых по модулю лежат в заданном диапазоне от b до с (b ai c). Значения переменных b и с вводятся.

Вариант 15. Дан массив А (а1, а2, ..., аn). Переписать в массив N подряд индексы элементов массива А (а1, а2, ..., аn), значения которых по модулю лежат в заданном диапазоне от b до с (b ai c). Значения переменных b и с вводятся.

34

Методические указания к выполнению задания B

Самый простой способ – заполнить двумерный массив элементами (как, впрочем, и одномерный) с помощью операторов присваивания. Например:

A(1,1)=3

A(1,2)=1

A(2,1)=-5

A(1,2)=7

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

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

В нижеприведенном фрагменте программы на языке QBasic ввод элементов матрицы размером m × n производится по строкам.

10 INPUT “Введите размер матрицы – M и N”;M,N

20 OPTION BASE 1

‘ установление нижней границы индексов

 

 

‘ равной единице

30 DIM A(M, N)

‘ объявление двумерного массива А,

 

 

‘содержащего M строк и N столбцов

40 REM ввод элементов матрицы

50 FOR I=1 TO М

‘ выбор строки

60

FOR J=1 TO N

‘ выбор элемента строки

70

PRINT “A(“;I;”,”;J;”)=”; ‘ вывод подсказки

80

INPUT A(I,J)

' ввод очередного элемента матрицы

90

NEXT J

' следующий элемент строки

100 NEXT I

' следующая строка

Номера строк приведены, чтобы на них можно было сослаться, а вообще они необязательны.

В строках 50–100 происходит построчный ввод матрицы. Для этого оператор INPUT помещен внутрь двух вложенных циклов. Имеет смысл разобрать алгоритм ввода матрицы более подробно. Оператор внешнего цикла (строка 50) задает параметру цикла I значение, равное 1. Так как I<М, то выполняются все операторы, входящие в этот цикл. Первым таким оператором является оператор внутреннего цикла (строка 60), который задает параметру J значение 1. Затем вводится элемент массива А(1,1) (строка 80). С помощью строки 70 на экран выводится подсказка, в которой указывается, какой элемент должен вводится в этом цикле. В строке 90 осу-

35

ществляется переход на продолжение внутреннего цикла J=2,3,...,N. Как только параметр J превысит значение N, внутренний цикл считается выполненным для данного значения I. После окончания внутреннего цикла оператор внешнего цикла (строка 50) присваивает параметру I значение 2 и снова повторяет внутренний цикл N раз. После M-кратного выполнения внешнего цикла ввод матрицы считается выполненным.

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

A(1,1), A(1,2), A(1,3), ..., A(1,M), A(2,1), A(2,2), A(2,3), ..., A(2,M), ..., A(M,1), A(M,2), A(M,3), ..., A(M,N),

т.е. элементы первой строки, затем второй и т.д., и наконец – элементы последней M-й строки.

Элементы двумерного массива могут быть введены по столбцам: 10 INPUT “Введите размер матрицы – M и N”;M,N

20 OPTION BASE 1

30 DIM A(M, N)

‘объявление двумерного массива

40 REM ввод элементов матрицы

 

50 FOR J=1 TO М

‘выбор столбца

60

FOR I=1 TO N

‘выбор элемента столбца

70

PRINT “A(“;I;”,”;J;”)=”;

‘вывод подсказки пользователю

80

INPUT A(I,J)

‘ввод очередного элемента матрицы

90

NEXT I

‘следующий элемент столбца

100 NEXT J

‘следующий столбец

Вэтом случае внешний цикл организуется по параметру J (столбец),

авнутренний – по параметру I (строка). Последовательность записи при вводе по столбцам:

A(1,1), A(2,1), A(3,1), ..., A(M,1), A(1,2), A(2,2), A(3,2), ..., A(M,2), ..., A(1,N), A(2,N), A(3,N), ..., A(M,N),

т.е. элементы первого столбца, затем второго и т.д., и наконец – последнего N-го столбца.

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

Вычислить сумму всех отрицательных чисел матрицы А размерно-

стью M × N, где M<100 и N<100.

Визуальное представление алгоритма вычисления суммы всех отрицательных чисел двумерного массива (матрицы) А размерностью M × N представлено на рисунке 17.

36

Рис. 17. Визуальное представление алгоритма вычисления суммы всех отрицательных чисел двумерного массива А размерностью M × N

В блоке 2 вводятся переменные m и n – количество строк матрицы и количество столбцов соответственно.

Далее алгоритм данной задачи представляет собой последовательность из трех детерминированных сложных (вложенных) структурных циклов с управлением по индексу. Внутрь последнего сложного цикла вложена структура «Ветвление».

37

Сначала это построчный ввод элементов матрицы (блок 3), т.е. происходит заполнение двумерного массива. Блок 3 представляет собой сложный циклический процесс, т.к. элемент двумерного массива A(I, J) имеет два индекса: индекс строки I и индекс столбца J.

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

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

 

Программа на языке QBasic

10

REM вычисление суммы всех отрицательных чисел матрицы

20

DEFINT I-J, M-N

'объявление типа переменных

30

INPUT "Введите размер матрицы – M и N"; M, N

40

DIM A(1 TO M, 1 TO N)

' объявление двумерного массива

50

REM ввод элементов матрицы

60

FOR I=1 TO M

' выбор строки

70

FOR J=1TO N

‘выбор элемента строки

80

PRINT "A(";I;",";J;")=";

' вывод подсказки пользователю

90

INPUT A(I, J)

'ввод очередного элемента матрицы

100 NEXT J

'следующий элемент строки

110 NEXT I

' следующая строка

120 REM печать элементов матрицы

130 PRINT SPC(12) "ИСХОДНАЯ МАТРИЦА"

140 FOR I=1 TO M

 

 

150

FOR J=1 TO N

 

 

160

PRINT TAB(10*J) A(I, J);

' вывод на экран очередного

170

NEXT J

' элемента матрицы

180

PRINT

 

 

190 NEXT I

 

 

200 REM накопление суммы

 

 

210

LET S=0

 

 

220

FOR I=1 TO M

' cтрока

 

230

FOR J=1 TO N

' элемент

 

240

IF A(I,J)<0 THEN LET S=S+A(I,J)

' сумма

250

NEXT J

 

' следующий элемент

260 NEXT I

 

' следующая строка

270 PRINT "Сумма отрицательных чисел равна ";S

280 END

38

Пояснение. Номера строк в программе приведены, чтобы на них можно было сослаться, а вообще они необязательны.

Ввод матрицы происходит построчно. Для этого оператор INPUT помещен внутрь двух вложенных циклов. Заголовок внешнего цикла (строка 10) задает параметру цикла I значение, равное 1. Так как I<М, то выполняются все операторы, входящие в этот цикл. Первым таким оператором является заголовок внутреннего цикла (строка 20), который задает параметру J значение 1. Затем вводится элемент массива А (1,1) (строка 40). С помощью строки 30 на экран выводится подсказка, в которой указывается, какой элемент должен вводиться в этом цикле. В строке 50 осуществляется переход на продолжение внутреннего цикла J=2,3,...,N. Как только параметр J превысит значение N, внутренний цикл считается выполненным для данного значения I. После окончания внутреннего цикла оператор внешнего цикла (строка 10) присваивает параметру I значение 2 и снова повторяет внутренний цикл N раз. После M-кратного выполнения внешнего цикла ввод матрицы считается выполненным.

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

A(1,1), A(1,2), A(1,3),..., A(1,M), A(2,1), A(2,2), A(2,3),...,A(2,M),..., A(M,1), A(M,2), A(M,3),..., A(M,N),

Строки программы, в которых происходит вывод исходной матрицы, так же, как и ввод матрицы, представляют собой вложенный цикл. Отметим использование функции TAB для выравнивания элементов матрицы при выводе. Знак «;» в конце оператора

PRINT TAB(10*J) A(I, J);

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

Обработка матрицы также представляет собой вложенный цикл, внутрь которого включена структура «ветвление» для того, чтобы каждый элемент матрицы сравнивать с нулем. Если очередной элемент матрицы меньше нуля (A(I,J)<0), происходит суммирование отрицательных элементов матрицы.

В качестве тестового варианта возьмем матрицу размером 3×3, в которой есть отрицательные элементы

1

2

4

 

 

 

10

1

 

А= 7

,

 

3

4

6

 

 

 

то результаты выполнения программы следующие (рис. 18).

39

Рис. 18. Результаты выполнения программы вычисления суммы всех отрицательных чисел двумерного массива А размерностью M × N на экране вывода системы программирования QBasic

Из результатов видно, что сумма всех отрицательных чисел двумерного массива А размерностью M × N вычислена верно.

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

Встроках 10, 50 120 и 200 находятся операторы комментариев REM.

Встроках 60–110 происходит построчный ввод матрицы. Для этого оператор INPUT помещен внутрь двух вложенных циклов. Алгоритм ввода матрицы подробно рассмотрен выше. Последовательность присваивания значений элементов при вводе по строкам следующая (при установлении нижней границы индекса, равной 1):

A(1,1), A(1,2), A(1,3),..., A(1,M), A(2,1), A(2,2), A(2,3),...,A(2,M),..., A(M,1), A(M,2), A(M,3),..., A(M,N),

С помощью строки 130 печатается заголовок "ИСХОДНАЯ МАТРИЦА".

Строки 140–190, в которых происходит печать исходной матрицы, так же, как и ввод матрицы представляют собой вложенный цикл. Отметим использование функции TAB для выравнивания элементов матрицы при выводе, знак ";" в конце строки 160, чтобы все элементы одной строки массива А находились на одной и той же строке печати. После вывода очередной строки матрицы оператор PRINT в строке 180 переводит курсор в начало следующей строки.

40