Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Один алгоритм по-разному работает 
:(
    Опции темы
Zerony
Дата 23.1.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 21.12.2008

Репутация: нет
Всего: нет



У меня такая вот проблемка: алгоритм синтаксического анализатора двух перменных работает в паскале, и не работает в дельфи.

А точнее, функции типа 9*9 и т.д. без переменных работют и там и там без всяких проблем, а вот 
x:=5;
s:='х*х' 
в паскале выдает 25 а в ельфи 5. 

Я понимаю, что скоре всего в этом анализаторе никто копатся не будет, но всё таки, из-за чего такие глюки могут быть?

 smile 
PM MAIL   Вверх
bems
Дата 23.1.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Zerony @  23.1.2009,  17:51 Найти цитируемый пост)
Я понимаю, что скоре всего в этом анализаторе никто копатся не будет
а если кто-то и решит это сделать, то не видя кода анализатора у него мало шансов



--------------------
Обижено школьников: 8
PM MAIL   Вверх
CodeMonkey
Дата 23.1.2009, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Отладчиком пройдитесь под паскалем и под Delphi, да посмотрите на отличия выполнения - и сразу же сами всё увидите. 
Так проще всего найти причину, чем гадать и/или изучать исходный код.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Zerony
Дата 23.1.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 21.12.2008

Репутация: нет
Всего: нет



Цитата

program arithmetic;
type ptree = ^ttree;
     ttree = record
                left, right : ptree;
                num : real;
                op : char;{+, -, *, /, n-number, e-end, s-sin}
             end;
var s : string;
    i : byte;
    lex : char;
    n : real;
    root : ptree;
procedure write_error;
begin
   writeln('Syntax Error!');
   halt;
end;

function exp : Ptree; forward;
function exp1: Ptree; forward;
function exp2: Ptree; forward;

procedure getLex; forward;
function exp : Ptree;
var pt, ptrnew : Ptree;
begin
   pt := exp1;
   while lex in ['+', '-'] do
   begin
      new(ptrnew);
      ptrnew^.op := lex;
      ptrnew^.left := pt;
      pt := exp1;
      ptrnew^.right := pt;
      pt := ptrnew;
   end;
   exp := pt;
end;

function exp1 : ptree;
var pt, ptrnew : Ptree;
begin
   pt := exp2;
   while lex in ['*', '/'] do
   begin
      new(ptrnew);
      ptrnew^.op := lex;
      ptrnew^.left := pt;
      pt := exp2;
      ptrnew^.right := pt;
      pt := ptrnew;
   end;
   exp1 := pt;
end;

function exp2 : ptree;
var ptrnew : Ptree;
begin
   getLex;
   if lex='n' then
   begin
      new(ptrnew);
      ptrnew^.op := lex;
      ptrnew^.num := n;
      ptrnew^.left := nil;
      ptrnew^.right := nil;
      getLex;
   end else
   if (lex='x') or (lex='y') then
   begin
      new(ptrnew);
      ptrnew^.op:=lex;
      ptrnew^.left:=nil;
      ptrnew^.right:=nil;
   end else
   if lex = 's' then
   begin
      new(ptrnew);
      ptrnew^.op := lex;
      getlex;
      if lex <> '(' then write_error;
      ptrnew^.left := exp;
      if lex <> ')' then write_error;
      ptrnew^.right := nil;
      GetLex;
   end else
   if lex = 'c' then
   begin
     new(ptrnew);
     ptrnew^.op := lex;
     getlex;
     if lex <> '(' then write_error;
     ptrnew^.left := exp;
     if lex <> ')' then write_error;
     ptrnew^.right := nil;
     getLex;
   end else
   if lex = '(' then
   begin
      ptrnew := exp;
      if lex <> ')' then write_error;
      getlex;
   end else
   if lex <>'e' then write_error;
   exp2 := ptrnew;
end;

procedure getLex;
var s1 : string; j : integer;
begin
   if s[i] in ['+', '-', '*', '/', '(', ')'] then
   begin
      lex := s[i];
      inc(i);
   end else
   if copy(s, i, 3) = 'sin' then
   begin
      lex := 's';
      inc(i, 3);
   end else
   if copy(s, i, 3) = 'cos' then
   begin
      lex := 'c';
      inc(i, 3);
   end else
   if s[i] in['0'..'9'] then
   begin
      s1 := s[i];
      inc(i);
      while (s[i] in ['0'..'9', '.']) and(i<=Length(s)) do
      begin
         s1 := s1 + s[i];
         inc(i);
      end;
      val(s1, n, j);
      if j <> 0 then write_error;
      lex := 'n';
   end else
   if (s[i]='x') or (s[i]='y') then begin
      lex := s[i];
      inc(i);
   end else
   if i>length(s) then lex := 'e' else
      write_error;
end;
function calc(t : Ptree) : real;
begin
   case t^.op of
   'x' : calc := x;
   'y' : calc := y;
   'n' : calc := t^.num;
   '+' : calc := calc(t^.left)+calc(t^.right);
   '-' : calc := calc(t^.left)-calc(t^.right);
   '*' : calc := calc(t^.left)*calc(t^.right);
   '/' : calc := calc(t^.left)/calc(t^.right);
   's' : calc := sin(calc(t^.left));
   'c' : calc := cos(calc(t^.left));
   end;
end;

begin
   writeln('arithm:');
   readln(s);
   i := 1;
   root := exp;
   if i<length(s) then writeln('Error! not an eoln!') else
   writeln(calc(root) : 0 : 5);
end.

PM MAIL   Вверх
bems
Дата 23.1.2009, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Zerony, оно не компилируется. Если объявить x и у, то компилируется но ругается Error! not an eoln! на выражение x*x
Никакого резудьтата (ни 5 ни 25) мне не удалось получить. Оно вообще рабочее?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
SneG0K
Дата 23.1.2009, 20:21 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 1
Всего: 54



Цитата(Zerony @  23.1.2009,  16:51 Найти цитируемый пост)
s:='х*х' 

А как это вообще может цифру выводить?
Кавычки
PM WWW Skype   Вверх
Zerony
Дата 25.1.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 21.12.2008

Репутация: нет
Всего: нет



Это переменная, которая считывает вводимое. 

Можна 
read(s);
Там ввести что то. типа 2+3*7 и оно вам выдаст результат.

Это ж синтаксический анализатор.

Добавлено через 1 минуту и 16 секунд
Да, рабочее. 

Удалите строку s:='x*x' и замените на read(s);


PM MAIL   Вверх
bems
Дата 25.1.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(Zerony @  25.1.2009,  20:52 Найти цитируемый пост)
Удалите строку s:='x*x' и замените на read(s);
я так и делал



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Akella
Дата 25.1.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Zerony, пользуйся НЕ тэгом Цитата, а тэгом КОД!!! Справа вверху над окном ввода сообщения.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.