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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2010, 23:25   #1
designer999
Форумчанин
 
Регистрация: 16.02.2010
Сообщений: 187
По умолчанию действия над числами в строке

Здравствуйте
вот такой вроде не сложный но в тоже время интересный вопрос, как сделать действия над числами если они все в одной строке и разделены знаками, например:

S:='1+2+2-3+5-1=';

пробовал сделать так но что то запутался в парсе(
Код:
while (s<>'=')  do
begin
if pos('+',s)<pos('-',s) then
begin
i:=i+strtoint(copy(s,0,pos('+',s)-1));
delete(s,0,pos('+',s)+);
i:=i-strtoint(copy(s2,0,pos('-',s)-1));
delete(s,0,pos('-',s)+1);
end;
может кто то знает как это реализовать ?
designer999 вне форума Ответить с цитированием
Старый 29.09.2010, 23:54   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я выкладывал готовый парсер - тут

p.s. там исходники, код несложный, легко разберётесь, если нужно.

p.p.s.
Вычисление результата выражений.
Допустимые операции: + - * /
Приоритет обычный, для изменения приоритета допускается задание
скобок ( в т.ч. вложенных).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.09.2010, 01:14   #3
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Да, лучше всего так как написал Serge_Bliznykov, но если хочется пострадать фигней, то можно через цикл for проверять каждый элемент строки на знаки +, - и если такие находятся то складывать или вычитать число предыдущее и следующее. Но а если будет знак * или / тогда задача на порядок усложняется. Поэтому не страдайте фигней и используйте парсер
RIO вне форума Ответить с цитированием
Старый 30.09.2010, 08:08   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А я бы не морочил голову а скормил бы все это Экзелу, или какому нить ОпенОфису:
http://www.programmersforum.ru/showthread.php?t=100279
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.09.2010, 15:22   #5
designer999
Форумчанин
 
Регистрация: 16.02.2010
Сообщений: 187
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А я бы не морочил голову а скормил бы все это Экзелу, или какому нить ОпенОфису:
http://www.programmersforum.ru/showthread.php?t=100279
я то посмотрел на ваш пример, но честно говоря не понял как это реализовать)
designer999 вне форума Ответить с цитированием
Старый 30.09.2010, 15:33   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Дык просто бери код и вставляй, не забыв оказать в дизайне события соответствующие.
Он откроет Экзель, скормит ему формулу в ячейку (Экзель сразу ее посчитает, он умный), и получит результат, который выведет в заголовок формы
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.09.2010, 15:40   #7
designer999
Форумчанин
 
Регистрация: 16.02.2010
Сообщений: 187
По умолчанию

если не сложно подскажите кодом, и что такое Экзель пытался поискать в google инфы по нём нету)
designer999 вне форума Ответить с цитированием
Старый 30.09.2010, 15:42   #8
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Экзель - это Excel.
По сабжу:
Компоненты CalcExpress и DiffExpress - это интерпретаторы для вычисления математических выражений. Поддерживают 5 операций, скобки, 18 математических функций и определение пользовательских переменных.

P.S. Я когда-то писал программу с БД и в одно из строковых полей вставлял формулу (типа Summa = "(Kolichestvo * Cena) + NDS"), по которой какие-то поля этой строки должны рассчитываться. А бухгалтер при необходимости могла сама изменять формулу (разумеется, только с существующими переменными). Мне же самому ЛЕНЬ изменять формулу и перекомпилировать программу. Ох, всё от лени.
Все это выглядело очень эффектно :=))

Последний раз редактировалось _SERGEYX_; 30.09.2010 в 15:53.
_SERGEYX_ вне форума Ответить с цитированием
Старый 30.09.2010, 16:21   #9
designer999
Форумчанин
 
Регистрация: 16.02.2010
Сообщений: 187
По умолчанию

я вот не пойму причём тут формула)))) тут же не по формуле нужно что то сделать, а сделать действия над числами(-,+)

поставил DiffExpress.pas, думал так разберусь глянув в компонент) но не тут то оно было

вот что это значит из примера ?
Цитата:
DiffExpress1.Formula := ExprEdt.Text;
ShowMessage('diff('+DiffExpress1.Fo rmula+','+VarEdt.Text+')='+DiffExpr ess1.diff(VarEdt.Text));
designer999 вне форума Ответить с цитированием
Старый 30.09.2010, 16:40   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если не сложно подскажите кодом
А что по ссылке что я дал кода нет?

Цитата:
тут же не по формуле нужно что то сделать, а сделать действия над числами
А это не формула???? Или понятие "формула" уже переделали?

Кстати вспомнил тут еще один финт
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls;

type
  TForm1 = class(TForm)
    ADOQuery1: TADOQuery;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 ADOQuery1.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source=a25';
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if key=#13 then begin
  with ADOQuery1 do begin
   SQL.Text:='select '+Edit1.Text;
   Open;
   if not Eof then   Caption:=Fields[0].AsString;
   close;
  end;
 end;
end;

end.
Теперь напрягается не Экзель а MS SQL.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Действия над неизвестными korsmile Общие вопросы Delphi 3 04.09.2010 18:54
действия над многочленами nuevegramodelamor Помощь студентам 4 21.06.2010 01:31
линейные действия над векторами morgan996 Помощь студентам 4 09.01.2010 00:13
Действия над массивами hen Помощь студентам 2 06.06.2009 23:34
Pascal действия над числами werser Помощь студентам 1 13.11.2008 22:55