Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1407164036
Rouse_
2014-08-04 18:53
2015.03.22
100 вопросов на собеседовании :)


2-1391592270
Коля
2014-02-05 13:24
2015.03.22
База данных и дата


11-1258282645
homm
2009-11-15 13:57
2015.03.22
Я тут статью написал, так сказать для истории


11-1259072306
heilong
2009-11-24 17:18
2015.03.22
Lazarus 0.9.28b+kolce 2.2.4+kolce_grush(03.06.2007)


2-1391516361
Alexander_K
2014-02-04 16:19
2015.03.22
Из delphi по sftp положить файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский