Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2011, 11:01   #11
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Цитата:
Не вполне понимаю, зачем учить начинающего неправильному стилю программирования. Особенно, если в первом же ответе содержится правильное решение..
TinMan объясни почему у меня неправильный стиль программирования.

Чем тебе не понравился мой ответ? Функция break является стандартной для паскаля и я не вижу причин её не использовать. Вряд ли можно выиграть много времени, если убрать один вложенный цикл
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681

Последний раз редактировалось MaTBeu; 07.10.2011 в 12:25.
GetMax вне форума Ответить с цитированием
Старый 07.10.2011, 12:30   #12
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Okay )
К сожалению, Pascal, несмотря на всю его идейность, не вполне удовлетворяет стандартам полностью структурного языка. Скажем, goto вообще не надо было включать. Непонятно, зачем Вирт его все же включил..

break нарушает видимую последовательность выполнения, тем он и плох. Хотя, я признаю, бывают ситуации, когда он очень выручает. Настолько, что можно поступиться принципами )). Но это все же большие исключения (помню в практике, но привести сейчас пример не смогу). А чаще всего получается так.. Я чувствую, что хочу поставить break, и сразу настораживаюсь и продумываю этот кусок еще раз. И в 99% случаев оказывается, что есть более логичное, красивое и компактное решение.

А данный случай совсем простой, таких полно. Ты посмотри еще раз на мой код и сравни. Заставлять я тебя не буду - как захочешь, так и будешь делать.

А, если быть предельно честным, то я по крайней мере наполовину написал потому, что стало обидно - написал решение, а никто даже не заметил )). Я стараюсь не писать полные решения (хотя сдерживать себя трудно)), чтоб спрашивающие хоть что-то сделали сами.. Но, тем не менее, от слов не отказываюсь. Ты погугли на что-то типа "good bad programming practice break goto pascal" - или русский эквивалент. Только обязательно вставь pascal, потому что в C break имеет другой смысл, там без него никак. Но, правда, не всегда можно верить написанному в Инете.. ))

Успехов тебе
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 07.10.2011, 13:22   #13
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Но это все же большие исключения....break
поиск элемента в массиве с нескольками тысячами элементов, если заведомо извествно что элемент чаще всего встречается в первой четверти массива и реже в последней.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 08.10.2011, 00:13   #14
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
поиск элемента в массиве с нескольками тысячами элементов, если заведомо извествно что элемент чаще всего встречается в первой четверти массива и реже в последней.
Код:
i:= 1;
while (i<=n) and (a[i]<>b) do inc(i);
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 11.10.2011, 12:30   #15
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

отлично, при использовании цикла с for элемент находится в ячейке 15, и оно будет после этого в холостую маслать 999985 элементов пока не закончится цикл. Представляю производительность подобной системы с таким подходам к использованию цикла.
При использовании варианта while (i<=n) and (a[i]<>b) do inc(i);
нельзя определить другие условия прерывания цикла с выдачей соотвествующего сообщения.
Например, прерывания юзером цикла по Application.ProcessMessages() Ваш цикл выглядит вот так:
Код:
while (i<=n) and (a[i]<>b) and (not IsBreak) do
begin
 Application.ProcessMessages();
 value:=a[i]
 inc(i);
end;
Если юзер произвёл прерывание нужно определить нашло ли значение не нашло и прервался ли цикл.
То что прервался вычисляется по IsBreak а то что i>0 и value<> начальному значению нельзя проанализировать на предмет найдено или не найдено.
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 11.10.2011 в 12:35.
JUDAS вне форума Ответить с цитированием
Старый 16.10.2011, 11:49   #16
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

TinMan, как раз сижу и пишу один АРМ.
Задача, имеется динамический массив вот таких записей
Код:
  TDataRecord = packed record
    dType : integer;
    Data  : array of TDataValue;
  end;
  TLibrary = array of TDataRecord;
Нужно найти индекс записи, для которой dType = указанному мной типу eType. По большому счёту, проверить сформирована ли запись для указаного типа или несформирована.
Моё решение с Break:
Код:
function TDM.FindIndex(eType:integer):integer;
var i : integer;
begin
  result:=-1;
  for i:=0 to LenGth(FLIB)-1 do
  if FLIB[i].dType = eType then
  begin
   result:=i;
   break;
  end;
end;
Вы писали что можно написать любой цикл без break.
Напишите плиз с условием что на выходе должен быть индекс элемента динамического массива или -1 (если не найдено)
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 16.10.2011, 15:55   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вы писали что можно написать любой цикл без break.
Напишите плиз с условием что на выходе должен быть индекс элемента динамического массива или -1 (если не найдено)
дык, коллега, это же очевидно и элементарно.
Досточно цикл FOR заменить на условный цикл и добавить в условие цикла тот фактор, по которому Вы выходите из цикла!

например:
Код:
function TDM.FindIndex(eType:integer):integer;
var i : integer;
begin
  result:=-1;
  i:=0;
  while (i<LenGth(FLIB)) and (result=-1) do 
    if FLIB[i].dType = eType then  result:=i
    else Inc(i);
end;
несложно?

p.s. я лично ничего против BREAK не имею. Иногда его использование реально очень удобно!

Последний раз редактировалось Serge_Bliznykov; 16.10.2011 в 16:00.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрицы в Pascal katerina2508 Паскаль, Turbo Pascal, PascalABC.NET 1 19.04.2010 16:49
pascal матрицы tanek Помощь студентам 4 04.04.2009 20:42
Матрицы Pascal bpystep Помощь студентам 8 02.04.2009 19:12