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 в начале цикла. Очень хочется верить что я хотя бы решил задачу Благодарю за комментарии, это для меня очень важно, особенно видеть разницу как общаются между собой админы(сам им являюсь) и программисты, разница колоссальна |
Автор: | Иван Денисов [ Воскресенье, 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: Удаление/добавление индексов в массиве | ||
Собственно вот сам фрагмент из учебника. Возможно я зря укоротил на пару слов условие задачи, но смысл то по сути сохранил.
|
Автор: | 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/ |