Алгоритмическое мышление при решении задач (на примере языка C#). Шамшев А.Б - 15 стр.

UptoLike

Составители: 

15
Этот алгоритм почти верный. Для того, что бы обнаружить ошибку в нем,
реализуем его и рассмотрим порядок его выполнения. Очевидно, что во время
удаления элементов из массива по значению массив может менятся. Поэтому в
параметрах функции удаления по значению будет ключевое слово ref.
public static void delByIndex(ref int[] data, int delIndex) {
int[] newData = new int[data.Length - 1];
for (int i = 0; i < delIndex; i++) {
newData[i] = data[i];
}
for (int i = delIndex; i < newData.Length; i++) {
newData[i] = data[i + 1];
}
data = newData;
}
public static void delByValue(ref int[] data, int delValue) {
for (int i = 0; i < data.Length; i++) {
if (data[i] == delValue) {
delByIndex(ref data, i);
}
}
}
Рассмотрим, как будет работать алгоритм на массиве {2(0), 4(1), 2(2), 8(3),
2(4), 2(5), 3(6), 7(7)}.
Первые команды, которые будут выполнены в процедуре delByValue,
следующие:
int i = 0;
if (data[i] == delValue) {
delByIndex(ref data, i);
}
i++;
if (data[i] == delValue) {
Запишем их в виде, более удобном для человека
int i = 0;
if (data[0] == delValue) {
delByIndex(ref data, 0);
}
i = i + 1;
if (data[1] == delValue) {
………………………………
}
Начнем рассматривать, что происходит с данными. В начале i=0 и мы
просматриваем нулевой элемент массива {2(0)
, 4(1), 2(2), 8(3), 2(4), 2(5), 3(6),
7(7)}. Его необходимо удалить (т. к. он равен удаляемому значению). После
удаления массив будет {4(0)
, 2(1), 8(2), 2(3), 2(4), 3(5), 7(6)}. После этого
выполняется i=i+1. И мы будем просматривать первый элемент массива, т. е.
{4(0), 2(1)
, 8(2), 2(3), 2(4), 3(5), 7(6)}. И обратите вниманиемы НЕ