Пример 4.7.4-9. Разработать программный код процедуры-Sub, который из массива вещественных чисел x(n) удаляет все отрицательные элементы и подсчитывает их количество k

Удаление всех отрицательных элементов массива реализуется в процедуре Pr748() по так называемому алгоритму «сжатия». Метод заключается в поиске удаляемого отрицательного элемента, фиксации его номера, а затем в последовательной перезаписи всех последующих элементов массива так, чтобы значение следующего i+1 элемента записывалось на место предыдущего, и так до конца массива.

 

Sub Pr749(ByRef x() As Single, ByRef k As Integer) Dim i, n, j As Integer k = 0 i = 0 n = UBound(x) Do If x(i) < 0 Then k = k + 1 'сжатие массива For j = i To n - 1 x(j) = x(j + 1) Next n = n - 1 ReDim Preserve x(n) Else i = i + 1 Loop Until i > n End Sub Private Sub Button1_Click(…) Dim n, k As Intege n = CInt(InputBox("Введите" & _ "количество элементов ")) Dim x(n - 1) As Double vvodSngRnd16(x) vivodSngMac17(x, ListBox1) Pr749(x, k) vivodSngMac17(x, ListBox2) TextBox1.Text = CStr(k) End Sub

 

Рис. 4.7.4-9. Схема алгоритма и программный код процедуры Pr749()

Пример 4.7.4-9

Из последовательности исчезает удаляемый элемент, однако последний элемент повторяется дважды, поэтому после выхода из внутреннего цикла по перезаписи элементов длина массива (число n) должна быть уменьшена на единицу. Для изменения размерности массива используется оператор ReDim Preserve. уменьшена на единицу. Для изменения размерности массива используется оператор ReDim Preserve.

Так как отрицательные элементы могут идти подряд, то i+1 элемент, который перешел на место i -го, тоже может быть меньше нуля. Поэтому необходимо снова проверить текущий i -й элемент (бывший i+1) и, возможно, тоже удалить его «сжатием». Переход к следующему элементу по параметру i (т.е. увеличение i на 1) происходит, только если проверяемый i -й элемент оказался неотрицательным, поэтому алгоритм «сжатия» может

быть реализован с помощью внешнего итеративного (не регулярного) цикла.

Ввод исходного одномерного массива случайными числами из диапазона [-10;5] осуществляет процедура vvod(), а вывод массива на форму в элемент управления ListBox осуществляет процедура vivod(), которая по вычисляемому методом Length количеству элементов массива проводит проверку, не является ли выводимый массив пустым.

На рис. 4.7.4-9 приведены алгоритм и программа решения задачи.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: