Одномерный массив

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Losfos
незнакомец
Сообщения: 2
Зарегистрирован: 02.04.2014 03:19:53

Одномерный массив

Сообщение Losfos »

Помогите составить программу в Lazarus
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

Код: Выделить всё

p:=1; c:=0;
for i:=1 to 12 do if q[i]>d then begin
  p:=p*q[i]; inc(c);
end;
p:=exp(ln(p)/c);
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Осталось задать массив q и значение для d.
Проверить не равно ли c нулю, и не меньше ли 0 значение p
Ну и описать типы переменных. С этого и начать следует.
1) На ноль делить не стоит. Результат не определен.
2) логарифм из отрицательного числа не определен.
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

vada писал(а):На ноль делить не стоит

Вынужден обратить ваше внимание на условие в несколько вольном пересказе:
В массиве есть элементы, для которых выполняется условие q[i]>d.
vada писал(а):Осталось ...
естественно осталось, должен же ТС хоть немного подумать и хоть что-то самостоятельно сделать? Если правильно путаю, запрос готовых решений за вознаграждение на форуме находится в несколько ином разделе.
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Хороший стиль программирования предполагает ВСЕГДА перед делением проверять делитель на ноль. Поспорите? :)
Пусть сразу привыкает правильно код писать.
ЗЫ. Я специально ни строчки кода не написал :) Пусть ТС сам..
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

vada писал(а):Хороший стиль программирования предполагает ВСЕГДА перед делением проверять делитель на ноль. Поспорите? :)

Конечно, про всегда. 1) Переполнение легко получить при делении на малое действительное число, вы эту ситуацию как перед делением ВСЕГДА проверяете? 2) Неужели проверять ПЕРЕД проще чем поймать и обработать исключительную ситуацию ПОСЛЕ?
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Это в тыщу раз быстрее обработки исключения.
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

Код: Выделить всё

var
  a, b: single;
begin
  a:=1e38; b:=1e-38;
  if b=0 then WriteLn('*** Ошибка: деление на 0') else WriteLn(a/b);
end.
Думаете поможет? Тогда, если не поможет, зачем проверять?
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

В данной задаче насрать :)

А вот представьте какую-нибудь расчетную систему (ну мне это ближе, я этим занимаюсь).
Пользователь задает уйму данных, выполняет последовательно множество этапов работы дергая многие десятки разных модулей. Выполняет множество итераций. Матрицы обращает, дифуры крутит вертит... целый день в системе сидит и мышкой что-то дергает... И тут ему БАЦ! Деление на ноль, или потеря порядка, индекс за границей. Досвидос!... Они потом придут и меня на кол посадят. И будут правы! :)
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

vada писал(а):В данной задаче насрать

Консенсус, однако.
vada писал(а):Это в тыщу раз быстрее обработки исключения

vada писал(а):выполняет последовательно множество этапов работы дергая многие десятки разных модулей. Выполняет множество итераций. Матрицы обращает, дифуры крутит вертит... целый день в системе сидит и мышкой что-то дергает

Описана ситуация, когда деление на 0 не является обычным ходом алгоритма. А теперь посмотрите, что дороже, многие тысячи проверок или одно исключение, которое всего лишь в тысячу раз дороже проверки?
Аватара пользователя
vada
энтузиаст
Сообщения: 691
Зарегистрирован: 14.02.2006 12:43:17

Сообщение vada »

Исключение не одно. На каждое деление исключение. И ноль в знаменателе вовсе не означает фатальную ошибку. Может быть что угодно. Может быть это правильно как раз. И повторяться это может миллионы раз в цикле. Если вы готовы накренить пользователя чтоб он час ждал пока ваши все миллионы исключений отработаю, так в перед! Это не моя проблема, а ваша.
В чем вы хотите меня убедить? Не понимаю.
stanilar
постоялец
Сообщения: 289
Зарегистрирован: 09.03.2010 18:09:02

Сообщение stanilar »

В последний раз, когда писал рассчетную программу для родного института(года 4 тому назад), просто воспользовался настройками процессора, когда при делении на ноль, вместо ошибки результат становился равным NAN. И результат любой операции с NAN тоже равен NAN.

Крайне советую такой подход, чтоб не засорять код провеками и сообщениями. Как устанавливать эти настройки уже не вспомню, т.к. код был унаследован. Возможно, просто была отключена опция вызова исключения при таких ошибках.
Ответить