Одномерный массив
Модератор: Модераторы
Одномерный массив
Помогите составить программу в Lazarus
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Код: Выделить всё
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);Осталось задать массив q и значение для d.
Проверить не равно ли c нулю, и не меньше ли 0 значение p
Ну и описать типы переменных. С этого и начать следует.
1) На ноль делить не стоит. Результат не определен.
2) логарифм из отрицательного числа не определен.
Проверить не равно ли c нулю, и не меньше ли 0 значение p
Ну и описать типы переменных. С этого и начать следует.
1) На ноль делить не стоит. Результат не определен.
2) логарифм из отрицательного числа не определен.
vada писал(а):На ноль делить не стоит
Вынужден обратить ваше внимание на условие в несколько вольном пересказе:
В массиве есть элементы, для которых выполняется условие q[i]>d.
естественно осталось, должен же ТС хоть немного подумать и хоть что-то самостоятельно сделать? Если правильно путаю, запрос готовых решений за вознаграждение на форуме находится в несколько ином разделе.vada писал(а):Осталось ...
Хороший стиль программирования предполагает ВСЕГДА перед делением проверять делитель на ноль. Поспорите?
Пусть сразу привыкает правильно код писать.
ЗЫ. Я специально ни строчки кода не написал
Пусть ТС сам..
Пусть сразу привыкает правильно код писать.
ЗЫ. Я специально ни строчки кода не написал
vada писал(а):Хороший стиль программирования предполагает ВСЕГДА перед делением проверять делитель на ноль. Поспорите?
Конечно, про всегда. 1) Переполнение легко получить при делении на малое действительное число, вы эту ситуацию как перед делением ВСЕГДА проверяете? 2) Неужели проверять ПЕРЕД проще чем поймать и обработать исключительную ситуацию ПОСЛЕ?
Это в тыщу раз быстрее обработки исключения.
Код: Выделить всё
var
a, b: single;
begin
a:=1e38; b:=1e-38;
if b=0 then WriteLn('*** Ошибка: деление на 0') else WriteLn(a/b);
end.В данной задаче насрать 
А вот представьте какую-нибудь расчетную систему (ну мне это ближе, я этим занимаюсь).
Пользователь задает уйму данных, выполняет последовательно множество этапов работы дергая многие десятки разных модулей. Выполняет множество итераций. Матрицы обращает, дифуры крутит вертит... целый день в системе сидит и мышкой что-то дергает... И тут ему БАЦ! Деление на ноль, или потеря порядка, индекс за границей. Досвидос!... Они потом придут и меня на кол посадят. И будут правы!
А вот представьте какую-нибудь расчетную систему (ну мне это ближе, я этим занимаюсь).
Пользователь задает уйму данных, выполняет последовательно множество этапов работы дергая многие десятки разных модулей. Выполняет множество итераций. Матрицы обращает, дифуры крутит вертит... целый день в системе сидит и мышкой что-то дергает... И тут ему БАЦ! Деление на ноль, или потеря порядка, индекс за границей. Досвидос!... Они потом придут и меня на кол посадят. И будут правы!
vada писал(а):В данной задаче насрать
Консенсус, однако.
vada писал(а):Это в тыщу раз быстрее обработки исключения
vada писал(а):выполняет последовательно множество этапов работы дергая многие десятки разных модулей. Выполняет множество итераций. Матрицы обращает, дифуры крутит вертит... целый день в системе сидит и мышкой что-то дергает
Описана ситуация, когда деление на 0 не является обычным ходом алгоритма. А теперь посмотрите, что дороже, многие тысячи проверок или одно исключение, которое всего лишь в тысячу раз дороже проверки?
Исключение не одно. На каждое деление исключение. И ноль в знаменателе вовсе не означает фатальную ошибку. Может быть что угодно. Может быть это правильно как раз. И повторяться это может миллионы раз в цикле. Если вы готовы накренить пользователя чтоб он час ждал пока ваши все миллионы исключений отработаю, так в перед! Это не моя проблема, а ваша.
В чем вы хотите меня убедить? Не понимаю.
В чем вы хотите меня убедить? Не понимаю.
В последний раз, когда писал рассчетную программу для родного института(года 4 тому назад), просто воспользовался настройками процессора, когда при делении на ноль, вместо ошибки результат становился равным NAN. И результат любой операции с NAN тоже равен NAN.
Крайне советую такой подход, чтоб не засорять код провеками и сообщениями. Как устанавливать эти настройки уже не вспомню, т.к. код был унаследован. Возможно, просто была отключена опция вызова исключения при таких ошибках.
Крайне советую такой подход, чтоб не засорять код провеками и сообщениями. Как устанавливать эти настройки уже не вспомню, т.к. код был унаследован. Возможно, просто была отключена опция вызова исключения при таких ошибках.
