Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.11.2012, 17:41
SHIFT999 SHIFT999 вне форума
Прохожий
 
Регистрация: 18.11.2012
Сообщения: 15
Репутация: 10
Вопрос Вычисление по формуле

Есть переменная типа string, в которой записана формула типа y=f(x) (без "у=", то есть sin(x) или sqr(x)). Как использовать эту формулу для вычисления у, она же стринг? Массив не нужен, каждое вычисленное в цикле значение будем выводить в нем же сразу. х - это значения цикла, от -50 до 50, например.
Ответить с цитированием
  #2  
Старый 18.11.2012, 18:10
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

велосипед давно изобретен:
Код:
var
  ScriptControl: IScriptControl;
begin
  ScriptControl:=CreateComObject(CLASS_ScriptControl) as IScriptControl;
  ScriptControl.Language:='javascript';
  Memo1.Lines.Add(ScriptControl.Eval('(2*5+90+Math.abs(-900))/10'));
end;

http://www.delphisources.ru/forum/sh...00&postcount=8
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
SHIFT999 (20.11.2012)
  #3  
Старый 18.11.2012, 18:25
SHIFT999 SHIFT999 вне форума
Прохожий
 
Регистрация: 18.11.2012
Сообщения: 15
Репутация: 10
По умолчанию

и как это работает?
Ответить с цитированием
  #4  
Старый 18.11.2012, 19:46
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Не вникай в подробности, это обыкновенная магия
Ну, а если серьёзно - гугл в помощь.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #5  
Старый 18.11.2012, 19:53
SHIFT999 SHIFT999 вне форума
Прохожий
 
Регистрация: 18.11.2012
Сообщения: 15
Репутация: 10
По умолчанию

ну спасибо, на защите курсовика так и скажу
серьезно, помогите пожалуйста
Ответить с цитированием
  #6  
Старый 18.11.2012, 20:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,100
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от SHIFT999
ну спасибо, на защите курсовика так и скажу
серьезно, помогите пожалуйста

Просто создается COM-объект для работы со скриптовыми языками. В данном случае используется JavaScript. Ему передается выражение и он вычисляет его. Результат передается обратно в программу.
Ответить с цитированием
  #7  
Старый 19.11.2012, 21:26
SHIFT999 SHIFT999 вне форума
Прохожий
 
Регистрация: 18.11.2012
Сообщения: 15
Репутация: 10
По умолчанию

На CreateComObject ошибка Undeclarated identifier. И еще я не понял где тут ввод.
Ответить с цитированием
  #8  
Старый 19.11.2012, 21:45
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от SHIFT999
На CreateComObject ошибка Undeclarated identifier. И еще я не понял где тут ввод.
В uses пропиши модуль в котором описана эта функция, т.е. ComObj.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
SHIFT999 (20.11.2012)
  #9  
Старый 19.11.2012, 22:40
SHIFT999 SHIFT999 вне форума
Прохожий
 
Регистрация: 18.11.2012
Сообщения: 15
Репутация: 10
По умолчанию

Так, складывать, умножать и делить я его научил, а как быть с более сложными функциями? Выражения типа sqrt(2) он просто не принимает ('Предполагается наличие объекта').
Понял: "Math." перед функцией и все работает.

Последний раз редактировалось SHIFT999, 19.11.2012 в 23:52.
Ответить с цитированием
  #10  
Старый 20.11.2012, 09:43
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от SHIFT999
Понял: "Math." перед функцией и все работает.
на самом деле IScriptControl на много могучее:
Код:
var
  ScriptControl: IScriptControl;
begin
  CoInitialize(nil);
  ScriptControl:=CreateComObject(CLASS_ScriptControl) as IScriptControl;
  ScriptControl.Language:='javascript';

  // add const

  ScriptControl.AddCode('var E = Math.E');
  ScriptControl.AddCode('var LN2 = Math.LN2');
  ScriptControl.AddCode('var LN10 = Math.LN10');
  ScriptControl.AddCode('var LOG2E = Math.LOG2E');
  ScriptControl.AddCode('var LOG10E = Math.LOG10E');
  ScriptControl.AddCode('var PI = Math.PI');
  ScriptControl.AddCode('var SQRT2 = Math.SQRT2');
  ScriptControl.AddCode('var SQRT1_2 = Math.SQRT1_2');

  // add function

  ScriptControl.AddCode('function abs(x){return Math.abs(x)}');
  ScriptControl.AddCode('function acos(x){return Math.acos(x)}');
  ScriptControl.AddCode('function asin(x){return Math.asin(x)}');
  ScriptControl.AddCode('function atan(x){return Math.atan(x)}');
  ScriptControl.AddCode('function cos(x){return Math.cos(x)}');
  ScriptControl.AddCode('function exp(x){return Math.exp(x)}');
  ScriptControl.AddCode('function log(x){return Math.log(x)}');
  ScriptControl.AddCode('function pow(x, y){return Math.pow(x, y)}');
  ScriptControl.AddCode('function random(){return Math.random()}');
  ScriptControl.AddCode('function sin(x){return Math.sin(x)}');
  ScriptControl.AddCode('function sqrt(x){return Math.sqrt(x)}');
  ScriptControl.AddCode('function tan(x){return Math.tan(x)}');

  // meandr - графиком функции является сигнал прямоугольной формы

  ScriptControl.AddCode('function meandr(n, x){'
    +'var result = 0;'
    +'for(var i = 0; i < n; i++){'
    +'var a = i * 2 + 1;'
    +'result = result + Math.sin(a * x) / a;'
    +'}'
    +'return result;'
    +'}');

  // add msg

  ScriptControl.AddCode('function alert(msg){var WScriptShell = new ActiveXObject("WScript.Shell"); WScriptShell.Popup(msg, 60, "Script Control")}');

  // demo

  Memo1.Lines.Add(ScriptControl.Eval('sin(PI/2)'));
  Memo1.Lines.Add(ScriptControl.Eval('cos(PI)'));
  Memo1.Lines.Add(ScriptControl.Eval('abs(-255)'));
  Memo1.Lines.Add(ScriptControl.Eval('random()*10'));
  Memo1.Lines.Add(ScriptControl.Eval('random()*10'));
  Memo1.Lines.Add(ScriptControl.Eval('random()*10'));
  Memo1.Lines.Add(ScriptControl.Eval('random()*10'));
  Memo1.Lines.Add(ScriptControl.Eval('random()*10'));
  Memo1.Lines.Add(ScriptControl.Eval('random()*10'));
  Memo1.Lines.Add(ScriptControl.Eval('random()*10'));
  Memo1.Lines.Add(ScriptControl.Eval('random()*10'));
  ScriptControl.ExecuteStatement('alert("Hello, Delphi")');
  ScriptControl.ExecuteStatement('alert((3+7)*25.5)');
end;
это всего лишь маленькая часть. не говоря уже о том, что его можно заставить работать с VCL элементами Delphi, быть обработчиком событий кнопок и т.д. и т.п. вообщем расширить функционал программы без ее перекомпиляции.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
SHIFT999 (20.11.2012)
  #11  
Старый 20.11.2012, 11:09
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Но если это курсовик, то как было сформулировано задание?
Взять готовый вычислитель формул или написать самому?
Ответить с цитированием
  #12  
Старый 20.11.2012, 20:06
SHIFT999 SHIFT999 вне форума
Прохожий
 
Регистрация: 18.11.2012
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
на самом деле IScriptControl на много могучее:
Спасибо огромное.

icWasya, сказали можно и скачать, главное понимать код, но я хочу сам написать
Ответить с цитированием
  #13  
Старый 20.11.2012, 22:13
SHIFT999 SHIFT999 вне форума
Прохожий
 
Регистрация: 18.11.2012
Сообщения: 15
Репутация: 10
По умолчанию

еще вопрос, немного не по теме: как заставить цикл for проходить по дробным значениям вещественного типа (-10.0,-9.9,-9.8, ... ,9.9,10.0)?
Ответить с цитированием
  #14  
Старый 20.11.2012, 22:16
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от SHIFT999
еще вопрос, немного не по теме: как заставить цикл for проходить по дробным значениям вещественного типа (-10.0,-9.9,-9.8, ... ,9.9,10.0)?
Никак. Цикл for в Delphi (и в Pascal) работает только с перечислимыми типами. Можешь вместо этого организовать цикл от -100 до +100, а значение переменной цикла делить на 10.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:28.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025