Форум: "Начинающим";
Текущий архив: 2015.03.22;
Скачать: [xml.tar.bz2];
ВнизИнтерпритатор строки. Найти похожие ветки
← →
Александр_2014 (2014-02-04 15:53) [0]Доброго дня.
Задача:
Есть массив, который заполняется SQL-запросами из таблицы БД. Но в отчёте присутствуют и расчетные строки, например, в одной колонке реализованные товары за прошедший год, в другой - за текущий (эти две колонки из БД), в третьей +-%,т.е прирост или спад спроса, в четвёртой удельный вес конкретного товара к общему числу проданного и т.п.
Написал простенький интерпритатор строки.
procedure TForm1.Button1Click(Sender: TObject);
var
oper: set of char;
i, j: SmallInt;
buf: string;
masoper: array of char;
maspos: array of SmallInt;
mas: array of integer;
sum: Real;
begin
oper:=["+","-","*","/"];
buf:=Edit1.Text;
j:=0;
Edit2.Text:="";
sum:=0;
SetLength(masoper,10);
SetLength(maspos,10);
SetLength(mas,11);
for i:=0 to length(buf)-1 do
if buf[i] in oper then
begin
//сохраняем тип операции
masoper[j]:=buf[i];
//сохраняем позицию операции в строке
maspos[j]:=i;
inc(j); //счётчик кол-ва операций в строке
if (j+1) mod 10=0 then
begin
SetLength(masoper,j+11);
SetLength(maspos,j+11);
SetLength(mas,j+12);
end;
end;
for i:=0 to j do //формируем массив операндов из строки
begin
if i=0 then
mas[i]:=StrToInt(Copy(buf,1,maspos[i]-1))
else
if maspos[i]<>0 then
mas[i]:=StrToInt(Copy(buf,maspos[i-1]+1,maspos[i]-maspos[i-1]-1))
else
mas[i]:=StrToInt(Copy(buf,maspos[i-1]+1,Length(buf)));
end;
for i:=0 to j-1 do
case masoper[i] of
"+": begin
if i=0 then
sum:=mas[i]+mas[i+1]
else
sum:=sum+mas[i+1];
end;
"-": begin
if i=0 then
sum:=mas[i]-mas[i+1]
else
sum:=sum-mas[i+1];
end;
"*": begin
if i=0 then
sum:=mas[i]*mas[i+1]
else
sum:=sum*mas[i+1];
end;
"/": begin
if i=0 then
sum:=mas[i]/mas[i+1]
else
sum:=sum/mas[i+1];
end;
end;
Edit2.Text:=FloatToStr(sum);
end;
Он прекрасно считает строки типа 2+4/3*6-1 (без учета старшинства операций) и мне бы полностью подошёл, но не могу придумать как написать обработку строк типа
[1,1]/[2,1]*100, где значения в скобках это ячейки массива (допустим mas[i,j]), уже заполненного из БД. Подскажите как дописать процедуру, чтобы это заработало.
← →
Inovet © (2014-02-04 16:10) [1]Для чего велосипеды делать?
← →
ВладОшин © (2014-02-04 16:19) [2]
> Он прекрасно считает строки типа 2+4/3*6-1
значит, сосчитает и строки типа F(x1)+F(x2)/F(x3)*F(x4)-F(x5)
где F(x) = x
осталось переписать F(x) как F(i,j)=mas[i,j]
← →
Александр_2014 (2014-02-04 16:32) [3]>Для чего велосипеды делать?
Что ж, если возможно, то не отказался бы от ссылки.
ВладОшин
Мне надо фактически преобразовать строку [1,2] в два числа, которые будут подставлены параметрами в mas[i,j], при этом не нарушив работу уже работающей части, т.е. если в строке встречается [, то предполагаем, что до запятой будет первое число, а после запятой до ] будет второе число. Предполагаю, что обработчик надо вставить в часть после
for i:=0 to j do //формируем массив операндов из строки, но дальше запутываюсь.
← →
stas © (2014-02-04 18:04) [4]В каком виде у Вас результат SQL запроса получается?
← →
Ega23 © (2014-02-04 18:16) [5]
> Мне надо фактически преобразовать строку [1,2] в два числа,
> которые будут подставлены параметрами в mas[i,j], при этом
> не нарушив работу уже работающей части, т.е. если в строке
> встречается [, то предполагаем, что до запятой будет первое
> число, а после запятой до ] будет второе число. Предполагаю,
> что обработчик надо вставить в часть после
> for i:=0 to j do //формируем массив операндов из строки,
> но дальше запутываюсь.
Вам нужен лексический анализатор. Дело это не совсем простое, как кажется.
← →
Inovet © (2014-02-04 18:34) [6]> [3] Александр_2014 (04.02.14 16:32)
> >Для чего велосипеды делать?
>
> Что ж, если возможно, то не отказался бы от ссылки.
> [0] Александр_2014 (04.02.14 15:53)
> Но в отчёте
Значит, смотреть в сторону генераторов репортов. Например:
http://www.fast-report.com/ru/
← →
Александр_2014 (2014-02-04 22:05) [7]>В каком виде у Вас результат SQL запроса получается?
Фактически имею два файла. В одном в псевдографическом формате прорисована итоговая таблица, во-втором описаны запросы, обеспечивающие заполнение этой таблицы и формат выводимых данных. В программе формируется динамический массив необходимой размерности, в который и записываются результаты выполненных запросов. Таким образом заполняются ячейки массива не требующие дополнительных расчетов. Конечно, можно было бы используя вложенные подзапросы решить часть расчетных проблем, но это сильно усложняет запросы, увеличивает вероятность ошибок, увеличивает трафик, нагружает БД и замедляет работу задачи. Поэтому хотелось бы переложить расчётные данные на программу.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2015.03.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c