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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2015, 18:48   #1
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию Упростить / цивилизовать запись

Доброго всем. Что то не приходят в голову идеи как цивилизованнее записать следующее
Код:
  if Lambda <= 0.3 then Result := 1;
  if Lambda = 0.4 then Result := 0.997;
  if Lambda = 0.5 then Result := 0.964;
  if Lambda = 0.6 then Result := 0.864;
  if Lambda = 0.7 then Result := 0.711;
  if Lambda = 0.8 then Result := 0.544;
  if Lambda = 0.9 then Result := 0.393;
  if Lambda = 1.0 then Result := 0.27;
  if Lambda = 1.1 then Result := 0.178;
  if Lambda = 1.2 then Result := 0.112;
  if Lambda = 1.3 then Result := 0.068;
  if Lambda = 1.4 then Result := 0.04;
Ходил да около вокруг типов и массивов, но так ничего толкового не придумал. Есть идеи?
kta87 вне форума Ответить с цитированием
Старый 24.01.2015, 18:55   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Умножить на 10 и бахнуть константный массив, не?
Poma][a вне форума Ответить с цитированием
Старый 24.01.2015, 18:59   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Как идея:
Код:
const lare:array[1..14] of float=(0,0,0,0.997,0.964,... остальное);
...
var i:integer;
...
i:=trunc(lambda*10);
if (i>=Low(lare))and(i<=High(Lare)) then Result:=lare[i];
Или двумерным массивом-словарем и цикл для поиска.
Цитата:
Poma][a
Тоже об этом подумал но пока писал код ты опередил.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.01.2015, 19:05   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

тут round луше, а то trunc от 3.999999999 троечку вместо ожидаемой четверочки вернет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.01.2015, 19:17   #5
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

Спасибо уважаемые! Stilet, забрал твой вариант с доработкой от Аватар и с исправлениями от себя
Код:
const lare:array[1..14] of float=(1,1,1,0.997,0.964,... остальное);

Последний раз редактировалось kta87; 24.01.2015 в 19:34.
kta87 вне форума Ответить с цитированием
Старый 24.01.2015, 20:20   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вообще я бы делал словарем... Надежнее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.01.2015, 21:55   #7
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

Stilet, я не в теме словарей видимо... научишь?
kta87 вне форума Ответить с цитированием
Старый 24.01.2015, 21:59   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Бахаешь массив записей..
Одно поле есть ключ, другое - значение..

Бежим по массиву и ищем наш ключ. Вот. А еще можно отсортировать по ключу и баловаться бинарным поиском
Poma][a вне форума Ответить с цитированием
Старый 24.01.2015, 23:04   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот вот.
Код:

const lare:array[1..14,1..2] of float=((0.3,0.997),(0.4,0.964)...);
...
var i:integer;
...
for i:=Low(lare) to High(lare) do
 if lare[i,1] = Lambda then нужный коэффициент lare[i,2];
Зато этот код не зависит от наполнения массива-словаря. А если массив огромный можно и бинарный поиск применить для скорости. Надежнее просто.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.01.2015, 23:09   #10
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Быть может, посоветую не совсем то, что нужно, но, возможно, для практики будет полезно.

Что если выполнить интерполяцию для указанных эспериментальных данных?
Массивы экспериментальных данных можно засунуть в константный массив, использовать его в подпрограмме-функции, которой потом просто передаётся аргумент, а она даёт значение интерполированной функции. Тогда появится возможность вычислять функция не только, например, от 0.8 и 0.9, но и между ними, например, для 0.88547, 0.81142 и т. п. Правда, не будет возможности вычислить значение для аргумента, превышающего максимальное значение (либо наоборот, предшествующее минимальное) из экспериментальных данных - для этого придётся выполнять уже экстраполяцию данных.

Кода, конечно, будет побольше, но функционал расширится...
Вадим Мошев вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Упростить формулу agregator Microsoft Office Excel 4 22.10.2013 16:27
Упростить, 2 стр в 1. Gefo JavaScript, Ajax 10 29.03.2013 21:39
Можно ли упростить? Helennna Microsoft Office Excel 4 16.07.2010 12:15
Упростить SAS888 Microsoft Office Excel 4 25.08.2009 12:07
Упростить формулу Stif-rva Microsoft Office Excel 7 09.03.2009 11:03