OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 12:18

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 02 Июнь, 2015 16:16 
Аватара пользователя

Зарегистрирован: Вторник, 25 Ноябрь, 2014 08:05
Сообщения: 21
Я как то сомневаюсь в том, что то как я решил задачи-можно подходить к этому. В выделенных местах я правильно сделал, или было более простое решение?

Числовой ненулевой массив, дано число 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.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 03 Июнь, 2015 11:43 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 597
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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Конечно, нет.
Т.к. его условие сразу ложно (конъюнкт flag ложен).

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 05 Июнь, 2015 10:47 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 597
Куда автор темы делся? Вопрос ему был.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 06 Июнь, 2015 12:18 
Аватара пользователя

Зарегистрирован: Вторник, 25 Ноябрь, 2014 08:05
Сообщения: 21
Artyemov писал(а):
snuk писал(а):

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



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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 06 Июнь, 2015 12:47 
Аватара пользователя

Зарегистрирован: Вторник, 25 Ноябрь, 2014 08:05
Сообщения: 21
Илья Ермаков писал(а):
Кстати, сами попытки писать циклы с булевым флагом говорят о том, что Вам надо учиться писать циклы :)

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 06 Июнь, 2015 13:13 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Тут вопрос к маэстро Виталию Валерьевичу, почему он примеры с булевым флагом приводит ))

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 06 Июнь, 2015 20:33 
Аватара пользователя

Зарегистрирован: Вторник, 25 Ноябрь, 2014 08:05
Сообщения: 21
Илья Ермаков писал(а):
Тут вопрос к маэстро Виталию Валерьевичу, почему он примеры с булевым флагом приводит ))

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

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

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 07 Июнь, 2015 19:34 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Цитата:
Числовой ненулевой массив, дано число L. Вставить ноль в позицию L массива. Пример 12345 L=4. Результат 123045

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Июнь, 2015 12:55 
Аватара пользователя

Зарегистрирован: Вторник, 25 Ноябрь, 2014 08:05
Сообщения: 21
Иван Денисов писал(а):
Цитата:
Числовой ненулевой массив, дано число L. Вставить ноль в позицию L массива. Пример 12345 L=4. Результат 123045

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

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

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 11 Июнь, 2015 06:04 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
В том, что ты ищешь значения совпадающие с L, а L — это позиция. Поэтому и решение другое будет.
Конечно, я могу ошибаться, но иначе задача странная какая-то.
Например, в твоей интерпретации, ничего не говориться о том, есть ли число L вообще в массиве. А если его нет?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 11 Июнь, 2015 09:48 
Аватара пользователя

Зарегистрирован: Вторник, 25 Ноябрь, 2014 08:05
Сообщения: 21
Собственно вот сам фрагмент из учебника. Возможно я зря укоротил на пару слов условие задачи, но смысл то по сути сохранил.


Вложения:
ss.PNG
ss.PNG [ 309.64 КБ | Просмотров: 13969 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 11 Июнь, 2015 10:36 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 597
А давайте позовём сюда автора учебника, он здесь на форуме бывает…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 11 Июнь, 2015 12:51 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Из описания задач 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;


Последний раз редактировалось Пётр Кушнир Четверг, 11 Июнь, 2015 14:30, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 11 Июнь, 2015 13:13 

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 11 Июнь, 2015 13:16 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
ИМХО, чтобы научились различать индексы и содержимое.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 12 Июнь, 2015 10:38 
Аватара пользователя

Зарегистрирован: Вторник, 25 Ноябрь, 2014 08:05
Сообщения: 21
Пётр Кушнир писал(а):
Из описания задач 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 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Нельзя "заменить" индексы. В массиве в Обероне индексы всегда идут от 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)

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB