OberonCore
https://forum.oberoncore.ru/

Удаление/добавление индексов в массиве
https://forum.oberoncore.ru/viewtopic.php?f=35&t=5423
Страница 1 из 1

Автор:  snuk [ Вторник, 02 Июнь, 2015 16:16 ]
Заголовок сообщения:  Удаление/добавление индексов в массиве

Я как то сомневаюсь в том, что то как я решил задачи-можно подходить к этому. В выделенных местах я правильно сделал, или было более простое решение?

Числовой ненулевой массив, дано число L. Вставить ноль в позицию L массива. Пример 12345 L=4. Результат 123045
MODULE Ex;
IMPORT In, StdLog;
VAR
N, k, c, L:INTEGER;
flag:BOOLEAN;
mas:ARRAY 10 OF INTEGER;
In.Open;
In.Int(L);
PROCEDURE L*;
BEGIN
N:=-1;
k:=0;
WHILE k<N DO
N:=N+1;
In.Int(mas[k])
k:=k+1;
END;

N:=0;
k:=0;
flag:=FALSE;
WHILE (k<N) & flag DO
IF mas[k]=L THEN
flag:=TRUE;
ELSE
k:=k+1;
END;
END;

k:=k;
N:=N+1;
WHILE k<N DO
c:=mas[k];
mas[k]:=mas[N];
mas[N]:=c;
k:=k+1;
END;
END L;
END Ex.




Числовой ненулевой массив, дано число L. Удалить число в позиции L массива. Пример 12345 L=4. Результат 1235
MODULE Ex;
IMPORT In, StdLog;
VAR
N, k, c, L:INTEGER;
flag:BOOLEAN;
mas:ARRAY 10 OF INTEGER;
In.Open;
In.Int(L);
PROCEDURE Kick*;
BEGIN
N:=-1;
k:=0;
WHILE k<N DO
N:=N+1;
In.Int(mas[k])
k:=k+1;
END;
END;

k:=0;
flag:=FALSE;
WHILE (k<N) & flag DO
IF mas[k]=L THEN
flag:=TRUE;
ELSE
k:=k+1;
END;
END;

k:=k;
WHILE k<N DO
IF k=(N-1) THEN
N:=N-1;
ELSE
mas[k]:=mas[k+1];
k:=k+1;
END;
END;
END Kick;
END Ex.

Автор:  Artyemov [ Среда, 03 Июнь, 2015 11:43 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

snuk писал(а):

flag:=FALSE;
WHILE (k<N) & flag DO
IF mas[k]=L THEN
flag:=TRUE;
ELSE
k:=k+1;
END;
END;



Цикл хотя бы раз выполнится?

Автор:  Илья Ермаков [ Четверг, 04 Июнь, 2015 16:01 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Конечно, нет.
Т.к. его условие сразу ложно (конъюнкт flag ложен).

Кстати, сами попытки писать циклы с булевым флагом говорят о том, что Вам надо учиться писать циклы :)

http://oberoncore.ru/wiki/start
Посмотрите раздел "Алгоритмизация и программирование"

Автор:  Artyemov [ Пятница, 05 Июнь, 2015 10:47 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Куда автор темы делся? Вопрос ему был.

Автор:  snuk [ Суббота, 06 Июнь, 2015 12:18 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Artyemov писал(а):
snuk писал(а):

flag:=FALSE;
WHILE (k<N) & flag DO
IF mas[k]=L THEN
flag:=TRUE;
ELSE
k:=k+1;
END;
END;



Цикл хотя бы раз выполнится?


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

Автор:  snuk [ Суббота, 06 Июнь, 2015 12:47 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Илья Ермаков писал(а):
Кстати, сами попытки писать циклы с булевым флагом говорят о том, что Вам надо учиться писать циклы :)

Кстати, а что не так с писанием цикла с булевым флагом? Я шпарю по книге, там в одном месте в цикле начинался с false флагом, в других двух примерах уже цикл начинался с true, да и показалось что это единственный вариант решения задачи, поскольку вложенные циклы лишь после начинаются, из этого сделал вывод что без них должно быть решение. Кроме этого я не придумал других, но построил цикл явно криво :? Это книга Потопахина В. "Современное программирование с нуля - 2010", страницы 25-27, там работа с булевым флагом. Описано бегло о принципе работы.

Автор:  Илья Ермаков [ Суббота, 06 Июнь, 2015 13:13 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Тут вопрос к маэстро Виталию Валерьевичу, почему он примеры с булевым флагом приводит ))

Булевый флаг нужен ну крайне редко.

В случаях, как у Вас, нужно строить цикл, чтобы условие IF-а, который выставляет флаг, оказалось частью условия WHILE.

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

Автор:  snuk [ Суббота, 06 Июнь, 2015 20:33 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Илья Ермаков писал(а):
Тут вопрос к маэстро Виталию Валерьевичу, почему он примеры с булевым флагом приводит ))

Булевый флаг нужен ну крайне редко.

В случаях, как у Вас, нужно строить цикл, чтобы условие IF-а, который выставляет флаг, оказалось частью условия WHILE.

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


Если я Вас правильно понял, то в принципе построенный алгоритм решает поставленную задачу, пускай громоздко, но всё же. И ошибка судя по всему была мной допущена в объявлении значения flag в начале цикла. Очень хочется верить что я хотя бы решил задачу :roll:
Благодарю за комментарии, это для меня очень важно, особенно видеть разницу как общаются между собой админы(сам им являюсь) и программисты, разница колоссальна :D

Автор:  Иван Денисов [ Воскресенье, 07 Июнь, 2015 19:34 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Цитата:
Числовой ненулевой массив, дано число L. Вставить ноль в позицию L массива. Пример 12345 L=4. Результат 123045

Честно говоря, задача сформулирована неясно. Значения массива в примере, соответствуют положениям (если считать положения с 1-цы). Под "вставить ноль в позицию L массива" я бы однозначно понял:
Код:
array[L] := 0

исходя из примера, значения > L сдвигаются вправо. При этом длина массива увеличивается на 1. Поэтому с моей точки зрения, задачи решены неверно.

Snuk, очевидно, понял задачу совершенно иначе. Что необходимо найти позицию числа L в массиве, и вставить 0 в эту позицию. Правильное решение для инженера в подобной непонятной ситуации — уточнить техническое задание :)

Автор:  snuk [ Среда, 10 Июнь, 2015 12:55 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Иван Денисов писал(а):
Цитата:
Числовой ненулевой массив, дано число L. Вставить ноль в позицию L массива. Пример 12345 L=4. Результат 123045

Честно говоря, задача сформулирована неясно. Значения массива в примере, соответствуют положениям (если считать положения с 1-цы). Под "вставить ноль в позицию L массива" я бы однозначно понял:
Код:
array[L] := 0

исходя из примера, значения > L сдвигаются вправо. При этом длина массива увеличивается на 1. Поэтому с моей точки зрения, задачи решены неверно.

Snuk, очевидно, понял задачу совершенно иначе. Что необходимо найти позицию числа L в массиве, и вставить 0 в эту позицию. Правильное решение для инженера в подобной непонятной ситуации — уточнить техническое задание :)


В общем то да, значения > L сдвигаются вправо, получается что так. Я ничего не придумывал, задача из ученика Потопахина В., решение только мое.
А неверно задачи решены в чем? Ошибка в назначении flag перед циклом была как FALSE. Есть еще ошибки?

Автор:  Иван Денисов [ Четверг, 11 Июнь, 2015 06:04 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

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

Автор:  snuk [ Четверг, 11 Июнь, 2015 09:48 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Собственно вот сам фрагмент из учебника. Возможно я зря укоротил на пару слов условие задачи, но смысл то по сути сохранил.

Вложения:
ss.PNG
ss.PNG [ 309.64 КБ | Просмотров: 14007 ]

Автор:  Artyemov [ Четверг, 11 Июнь, 2015 10:36 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

А давайте позовём сюда автора учебника, он здесь на форуме бывает…

Автор:  Пётр Кушнир [ Четверг, 11 Июнь, 2015 12:51 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Из описания задач 8 и 9 понятно, что автор совершенно точно различает индекс L и число по индексу L.
А еще, наверное индексы массива в задачах начинаются с единицы, потому что в Обероне M[4] = 5. Возможно, это опечатка, так как две почти одинаковые задачи рядом.
Но если мы сделаем L = 3 для Оберона первом случае для массива с количеством заданных чисел N и длиной больше N имеем
Код:
      i:=N;
      WHILE (i>0) & (i>=L) DO
         m[i] := m[i-1]; (* двигаем вправо *)
         DEC(i)
      END;
      m[L] := 0;

и во втором
Код:
      i:=0;
      WHILE (i<N) & (m[i]#L) DO INC(i) END; (* линейный поиск *)
      (* тут либо m[i] = L либо i = N *)
      WHILE i+1<N DO
         m[i]:=m[i+1]; (* двигаем влево *)
         INC(i)
      END;
      m[i] := 0;

Автор:  Artyemov [ Четверг, 11 Июнь, 2015 13:13 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Пётр Кушнир писал(а):
Из описания задач 8 и 9 понятно, что автор совершенно точно различает индекс L и число по индексу L.
А еще, наверное индексы в задаче 8 начинаются с единицы, потому что в Обероне M[4] = 5. Возможно, это опечатка, так как две почти одинаковые задачи рядом.


Пример ну очень, скажем так, одиозный. Зачем элементы массивов совпадают с их индексами?

Автор:  Пётр Кушнир [ Четверг, 11 Июнь, 2015 13:16 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

ИМХО, чтобы научились различать индексы и содержимое.

Автор:  snuk [ Пятница, 12 Июнь, 2015 10:38 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Пётр Кушнир писал(а):
Из описания задач 8 и 9 понятно, что автор совершенно точно различает индекс L и число по индексу L.
А еще, наверное индексы массива в задачах начинаются с единицы, потому что в Обероне M[4] = 5. Возможно, это опечатка, так как две почти одинаковые задачи рядом.
Но если мы сделаем L = 3 для Оберона первом случае для массива с количеством заданных чисел N и длиной больше N имеем
Код:
      i:=N;
      WHILE (i>0) & (i>=L) DO
         m[i] := m[i-1]; (* двигаем вправо *)
         DEC(i)
      END;
      m[L] := 0;

и во втором
Код:
      i:=0;
      WHILE (i<N) & (m[i]#L) DO INC(i) END; (* линейный поиск *)
      (* тут либо m[i] = L либо i = N *)
      WHILE i+1<N DO
         m[i]:=m[i+1]; (* двигаем влево *)
         INC(i)
      END;
      m[i] := 0;


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

Автор:  Пётр Кушнир [ Пятница, 12 Июнь, 2015 13:16 ]
Заголовок сообщения:  Re: Удаление/добавление индексов в массиве

Нельзя "заменить" индексы. В массиве в Обероне индексы всегда идут от 0 до LEN(m) - 1 включительно, таким образом, в массиве из 5 элементов индексы всегда от 0 до 4.
Нельзя и добавить/удалить индексы, как это сказано в заголовке темы.
Но можно считать, что мы ограничиваем индексы справа не длиной массива, а какой-либо константой N, которая меньше длины массива.
Это и происходит в задачах, когда итоговая длина списка цифр (но не реального массива) после выполнения алгоритма становится больше или меньше.

А по поводу затирания значений - смотрите на условие цикла и его тело. В данном случае мы копируем значения из ячейки справа/слева в ячейку, значение которой не было определено в условии задачи. То есть мы имеем сначала массив 1 2 3 4 5, N = 5, L = 3.

i = 5, скопировали "5" из m[4] в m[5], массив 1 2 3 4 5 5. уменьшили i.
i = 4, "4" из m[3] в m[4], на этом шаге у нас массив выглядит как 1 2 3 4 4 5. уменьшили i
i = 3, "4" из m[2] в m[3], на этом шаге у нас массив выглядит как 1 2 3 3 4 5. уменьшили i
И в этом месте условие продолжения цикла становится ложным
i = 2, (2 >= L) = FALSE
цикл останавливается и мы просто вставляем "0" в позицию m[3]
Возможно даже последняя итерация лишняя. Так как я писал на скорую руку вышел такой косяк. Можно поправить условие на (i > L)

Аналогично для второй задачи сдвиг влево. Распишите руками последовательность значений. Пока не поймете как меняются данные в каждой итерации - не поймете и суть условий цикла.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/