Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.07;
Скачать: CL | DM;

Вниз

Калькулятор   Найти похожие ветки 

 
GrayFace   (2004-07-28 11:09) [240]

function GetValue(var s:PChar; sep:Char; prior:integer; var done:byte):extended;
var fu:pointer;
begin
//  inc(vloz);
 try
//    Application.MessageBox(PChar("Íà÷àëî. Vloz:"+IntToStr(vloz)+" "+s+" Prior:"+IntToStr(prior)+" Sep:"+sep),"");
   while (s^=" ") or (s^="+") do inc(s);
   if s^="(" then
   begin
     inc(s);
     Result:=GetValue(s,")",-MaxInt,done);
     done:=0;
     exit;
   end;
   if s^="-" then
   begin
     inc(s);
     Result:=-GetValue(s,sep,MaxInt,done);
     exit;
   end;
   len:=0;
   for i:=low(BracketFuncs) to high(BracketFuncs) do
   begin
     if (length(BracketFuncs[i].left)>len) and cmp(BracketFuncs[i].left,s) then
     begin
       Br:=BracketFuncs[i].right;
       fu:=BracketFuncs[i].f;
       len:=length(BracketFuncs[i].left);
     end;
   end;
   if len<>0 then
   begin
     inc(s,len);
     Result:=TFunction(fu)(GetValue(s,Br,-MaxInt,done));
     done:=0;
     exit;
   end;
   for i:=low(Funcs) to high(Funcs) do
   begin
     if (length(Funcs[i].name)>len) and cmp(Funcs[i].name,s) then
     begin
       fu:=Funcs[i].f;
       len:=length(Funcs[i].name);
     end;
   end;
   for i:=low(Consts) to high(Consts) do
   begin
     if (length(Consts[i].name)>len) and cmp(Consts[i].name,s) then
     begin
       fu:=nil;
       Result:=Consts[i].v;
       len:=length(Consts[i].name);
     end;
   end;
   if len<>0 then
   begin
     inc(s,len);
     if fu<>nil then
     begin
       Result:=TFunction(fu)(GetValue(s,sep,MaxInt,done));
     end;
     exit;
   end;
   Result:=GetNumber(s);
 finally
//    Application.MessageBox(PChar("Vloz:"+IntToStr(vloz)+" "+s+" Prior:"+IntToStr(prior)+" Sep:"+sep),"");
   if done<>2 then
   begin
     done:=0;
     while done=0 do
     begin
       Result:=GetOper(s,sep,prior,done,Result);
     end;
     if done=1 then done:=0;
   end;
//    vloz:=vloz-1;
 end;
end;

function GetOper(var s:PChar; sep:Char; prior:integer; var done:byte; v1:extended):extended;
var op:TOper;
begin
 while s^=" " do inc(s);
 if (s^=sep) or (s^=#0) then
 begin
   if s^<>sep then raise Exception.Create("Syntax error: ""+sep+"" wasn""t found");
   if s^<>#0 then inc(s);
   done:=2;
   Result:=v1;
   exit;
 end;
 len:=0;
 for i:=low(opers) to high(opers) do
 begin
   if (length(Opers[i].name)>len) and cmp(Opers[i].name,s) then
   begin
     op:=Opers[i];
     len:=length(Opers[i].name);
   end;
 end;
 if Len=0 then op:=OpMul;
 if op.prior>prior then
 begin
   inc(s,Len);
   Result:=TOperator(op.f)(v1,GetValue(s,sep,op.prior,done))
 end else
 begin
   Result:=v1;
   done:=1;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var b:byte; p:PChar; s:string; i:integer;
begin
//  vloz:=0;
 b:=0;
 s:=Edit1.text;
 p:=PChar(s);
 try
   Edit2.Text:=FloatToStr(GetValue(p,#0,-MaxInt,b));
   Edit1.SetFocus;
   Edit1.SelLength:=0;
   Edit1.SelStart:=length(s);
 except
   on E: Exception do
   begin
     if s="" then i:=0 else i:=integer(p)-integer(@s[1]);
     Edit2.Text:=E.Message+" at offset "+IntToStr(i);
     Edit1.SetFocus;
     Edit1.SelStart:=i;
     Edit1.SelLength:=0;
   end;
 end;
end;

end.


 
Anatoly Podgoretsky ©   (2004-07-28 11:10) [241]

Мне страшно за этот автомат


 
GrayFace   (2004-07-28 11:12) [242]

Ё мое! var s1:string; i:integer; Len:integer; Br:char; // vloz:integer=0; Должен быть до function GetNumber(var s:PChar):Extended;


 
Юрий Зотов ©   (2004-07-28 11:12) [243]

> GrayFace   (27.07.04 16:02) [189]

> Я описал только проблемные моменты. Остальное почти
> сооьветствует обычной спецификации.

Вот в этом "почти" все дело и есть. Вводя в калькулятор какое-то выражение, я никогда не могу заведомо и точно предсказать его результат. И не только я - даже Вы этого не сможете. Потому что это "почти" очень велико, а описали Вы лишь малую толику проблемных моментов (и понятно, почему - потому ВСЕ проблемные моменты описать невозможно, он неизвестны даже и Вам самому).

Таким образом, поведение калькулятора непредсказуемо. А раз так - то как можно тестировать такую программу? Ведь на любой глюк Вы можете сказать, что это не глюк, а особенность входного языка. Пример я уже приводил: 5E - это число, или синтаксическая ошибка? Калькулятор почему-то полагает, что число, обычная спецификация утверждает, что ошибка, а Вы никаких комментариев по этому поводу не даете. Как быть?

И таких примеров - море огромное. И Вы никогда не сможете гарантировать, что описали весь набор особых случаев, потому что этот набор неизвестен Вам самому.

А знаете, почему так вышло? Потому что изначально программа, естественно, писалась под обычный входной язык, но этого не получилось. Надо было как-то выходить из положения - и тогда в ход пошли те самые оговорки про "особые случаи". А их просто не должно быть, понимаете? Не должно быть никаких особых случаев, да и все тут. Программа должна иметь абсолютно понятный пользователю входной язык и однозначно его обрабатывать. Вот это и называется НОРМАЛЬНЫМ калькулятором.


 
Юрий Зотов ©   (2004-07-28 11:19) [244]

> Игорь Шевченко ©   (28.07.04 10:51) [234]

"Ф.Льюис, Д.Розенкранц, Р.Стирнз, Теоретические основы проектирования компиляторов" - лежит передо мной на столе. Если надо - звони, встретимся.


 
Anatoly Podgoretsky ©   (2004-07-28 11:20) [245]

В ДЕС это ошибка, спецификация права.
В HEX это число, если спецификация на калькулятор поддерживает HEX режим.

Опять же спецификация это должна одназначно описывать.


 
Григорьев Антон ©   (2004-07-28 11:30) [246]


> Попробуйте предложить сюда еще что-нибудь ДЕЙСТВИТЕЛЬНО
> недостающее (сразу говорю, что возведение в степень ДЕЙСТВИТЕЛЬНО
> недостающей операцией не является).


А что является критерием того, что какая-то операция является ДЕЙСТВИТЕЛЬНО недостающей? Можно вообще выкинуть все операции, кроме функций, и преспокойно записывать любое выражение. Вместо 5+2*3 писать Add(5,Mul(2,3)). Сформировав некоторый набор предопределённых функций, можно записать так любое выражение.


 
Romkin ©   (2004-07-28 11:38) [247]

ААА! Лисп, кажется? ТАм вроде операторов нет, есть только функции :))
Программы выглядят весьма своеобразно


 
VMcL ©   (2004-07-28 11:40) [248]

>>GrayFace  (28.07.04 10:25) [231]

>Очень странно, что FloatToStr("2e")=2 и FloatToStr("23e-")=23.

No comment.

P.S. Можно всё-таки узнать, какие выражения, с точки зрения Вашего калькулятора являются синтаксически правильными, а также каковы правила их вычисления? Если нет, то я считаю, что ветку можно закрыть, так как тестировать программу, которая работает неизвестно как, бесполезно.


 
Anatoly Podgoretsky ©   (2004-07-28 11:42) [249]

Григорьев Антон ©   (28.07.04 11:30) [246]
АДУ напоминает, по сути там нет операторов, они определяются через функции, например сложение а и б

A+B
"+"(A, B)
Add(A, B)


 
Gero ©   (2004-07-28 11:57) [250]


Юрий Зотов ©   (28.07.04 10:48)
> сразу говорю, что возведение в степень ДЕЙСТВИТЕЛЬНО недостающей
> операцией не является

Почему?
А квадратный корень тоже?
Почему тогда напрмер, бинарный минус и умножение есть в этом списке, если и то, и другое можно заменить сложением?


 
VMcL ©   (2004-07-28 12:11) [251]

>>Gero ©  (28.07.04 11:57) [250]

Умножение заменить сложением? Хочу видеть. Вот это выражение, плз: 3.14159 * 2.71828 только сложением.


 
Sandman25 ©   (2004-07-28 12:12) [252]

[251] VMcL ©   (28.07.04 12:11)

В столбик умножать умеете?


 
VMcL ©   (2004-07-28 12:19) [253]

>>Sandman25 ©  (28.07.04 12:12) [252]

Уговорил :)


 
Gero ©   (2004-07-28 12:30) [254]


> Умножение заменить сложением? Хочу видеть. Вот это выражение,
> плз: 3.14159 * 2.71828 только сложением.


 3.14
* 2.71
 314
2198
628  
8.5094


 
Sandman25 ©   (2004-07-28 12:33) [255]

[254] Gero ©   (28.07.04 12:30)

Ответ неверный. Вместо 2198, надо к 314 прибавлять 314, а от 7 отнимать 1, и так пока 7 не станет 0. Можно на Паскале :)


 
Думкин ©   (2004-07-28 12:33) [256]

> [254] Gero ©   (28.07.04 12:30)

Не, так не пройдет. А как получил 314,2198,628? Давай все честно расписывай, только через сложение.


 
Sandman25 ©   (2004-07-28 12:33) [257]

Точнее, пока не станет 1.


 
Anatoly Podgoretsky ©   (2004-07-28 12:36) [258]

Gero ©   (28.07.04 11:57) [250]
Чтоже ты делаешь, сам же говорил про сложение, а пользуешься умножением, пускай и в столбик, ты должен был 314159 сложить 271828 раз и провести форматирование запятой


 
DiamondShark ©   (2004-07-28 12:38) [259]


> >А на основе гравитации ни вечного, ни дарового двигателя
> не
> >получится как на основе постоянного магнитного поля.
>
> Уже несколько десятков конструкций. Запатентованых. С рабочими
> моделями. Видимо эти люди не знали, что это невозможно...
> :))

"Я не знал, что в Кисловодске нет моря. Пошёл -- и искупался"
(ц) анекдот.

Бегом в шестой класс. Читать тему "Консервативные силы".


 
Gero ©   (2004-07-28 12:41) [260]


Sandman25 ©   (28.07.04 12:33)
> Ответ неверный.

С calc.exe можно проверить. И я это и сделал.

Думкин ©   (28.07.04 12:33)
> Не, так не пройдет. А как получил 314,2198,628? Давай все
> честно расписывай, только через сложение.

314 = (1*4) + (1*1)*10 + (1*3)*100
1*4 = 1+1+1+1
1*1=1
1*3=1+1+1
...

Дальше продолжать?


 
Думкин ©   (2004-07-28 12:46) [261]

> [260] Gero ©   (28.07.04 12:41)

Давай. :-)


 
Gero ©   (2004-07-28 12:49) [262]


> Думкин ©   (28.07.04 12:46)

Ну если затраченное мною время будет оплачено, то я с удовольствием.


 
VMcL ©   (2004-07-28 12:49) [263]

>>Gero ©  (28.07.04 12:41) [260]

>Дальше продолжать?

Естественно.


 
Sandman25 ©   (2004-07-28 12:50) [264]

[260] Gero ©   (28.07.04 12:41)

Ты не понял :)
Под ответом я подразумевал не 8.5094, а весь твой пост, как пример умножения без использования умножения.


 
Gero ©   (2004-07-28 12:50) [265]


> VMcL ©   (28.07.04 12:49)

См. 262.


 
VMcL ©   (2004-07-28 12:52) [266]

>>Gero ©  (28.07.04 12:49) [262]

Могу тысячу раз написать в своем посте слово "спасибо" (гы, C/P никто не отменял:). Устроит?


 
Gero ©   (2004-07-28 12:53) [267]


> Sandman25 ©   (28.07.04 12:50)

Так, как я написал, тоже можно.

> VMcL ©   (28.07.04 12:52)

Эээ... Спасибо в карман не положишь и на хлеб не намажешь.


 
VMcL ©   (2004-07-28 12:56) [268]

>>Gero ©  (28.07.04 12:53) [267]

>Спасибо в карман не положишь и на хлеб не намажешь.

Ты просто не умеешь его ("спасибо") готовить :-)


 
Gero ©   (2004-07-28 13:02) [269]


VMcL ©   (28.07.04 12:56)
> Ты просто не умеешь его ("спасибо") готовить :-)

Научишь? ;)


 
VMcL ©   (2004-07-28 13:13) [270]

>>Gero ©  (28.07.04 13:02) [269]

Научу, "если затраченное мною время будет оплачено" :))


 
Рамиль ©   (2004-07-28 13:13) [271]

<оффтоп>

> Уже несколько десятков конструкций. Запатентованых. С рабочими
> моделями. Видимо эти люди не знали, что это невозможно...
> :))

Приведи описание хоть одной рабочей модели. Лучше в отдельной ветке. посмотрим, что эти изобретатели не знали.

> Очень даже есть. Изначально вечный двигатель - это устройство,
> работающее само по себе, без приложения к нему энергии тем,
> кто его создал. Но это не значит, что эта энергия берется
> "ниоткуда", это значит, что источник энергии доступен устройству
> напрямую, без посреднических услуг человека. И тогда этот
> двигатель (способный производить работу) ограничен только
> сроком службы деталей.

Нет, именно значит, что БЕЗ источников энергии. Срок службы деталей или поломка к вечности не имеет абсолютно никакого отношения. Важен сам принцип. По твоей классификации - солнечная батарея вынесенная в космос тоже вечный двигатель.
<оффтоп>


 
VMcL ©   (2004-07-28 13:14) [272]

P.S. Ох, чувствую, щас весь этот офтоп покраснеет :)


 
Рамиль ©   (2004-07-28 13:18) [273]


> [272] VMcL ©   (28.07.04 13:14)

Угу:(
Так калькуляторы кончились:)


 
Сергей Суровцев ©   (2004-07-28 13:21) [274]

>Думкин ©   (28.07.04 10:03) [229]
>При таком подходе мы бы только и делали, что каждый раз изобретали
>палки заново. Именно об этом речь в этой ветке. И именно это я
>вкладывал в весь пост.

Ты можешь не поверить, но именно так и происходит. Много тысяч лет.
Одно и то же изобретается десятки и сотни раз. Добавляя что-то
новое, избавляясь от несовершенства, затем развиваясь, а потом
опять заново, но с учетом (иногда и подсознательным) предыдущего
опыта. Заново изобретают и велосипед, и автомобиль, и спички, и
зубную щетку, и космический корабль - абсолютно все. Просто в
какой-то момент своего изобретательства человек хочет посмотреть,
а что уже сделано другими в этой области. Начинается системный
анализ, потом добавляется свое видение и получается что-то совсем
другое, то, чего раньше не было. Как раз таки человек БЕЗ вот этого
самостоятельного порыва, с самого начала знающий как надо, а как
не надо, что возможно, что нет именно такой человек никогда не
выйдет за границы, он не способен создать, максимум немного улучшить.
А создать способны те, кто с одной стороны понимает необходимость
изучения предыдущего накопленного опыта (и теории, и практики по
конкретному вопросу), но с другой стороны оставляет свой взгляд
на вещи пытается дойти до сути запретов и обойти их, а не принимает
как великую данность.
А насчет вечного двигателя и подмены понятий - вспомни, когда
появился термин "вечный", а когда "даровый" двигатель и сделай
сам выводы о том, кто же эти понятия подменяет.

>Юрий Зотов ©   (28.07.04 11:19) [244]
>"Ф.Льюис, Д.Розенкранц, Р.Стирнз, Теоретические основы
>проектирования компиляторов" - лежит передо мной на столе. Если
>надо - звони, встретимся.

А вот если бы ее, да и подобные ей да отсканировать, да на этом
сайте выложить в библиотеку - цены бы не было этому начинанию.
Есть много книг по теории программирования, которых сегодня в
принципе не найти, а необходимость в них, как явствует эта ветка-
огромна. Что скажете, мастера?


 
Игорь Шевченко ©   (2004-07-28 13:25) [275]


> А вот если бы ее, да и подобные ей да отсканировать, да
> на этом
> сайте выложить в библиотеку - цены бы не было этому начинанию.
> Есть много книг по теории программирования, которых сегодня
> в
> принципе не найти, а необходимость в них, как явствует эта
> ветка-
> огромна. Что скажете, мастера?


Я за. Целиком и полностью.

У меня есть Чарльз Уэзерелл "Этюды для программистов" и Джеймс Мартин "Организация баз данных в вычислительных системах", Гудман с Хидетниеми "Введение в разработку и анализ алгоритмов".
Книжки все старые, в электронном виде их нету, насколько мне известно.

Эт вам не труды Архангельского :))


 
Думкин ©   (2004-07-28 13:31) [276]

> [274] Сергей Суровцев ©   (28.07.04 13:21)
> >Думкин ©   (28.07.04 10:03) [229]

Не надо, я говорил про Фому, а ты влез и начал тыкать мне про Ерему. Знакомая тактика. Но продолжать в этом ключе бессмысленно. Можешь мне еще про Букварь лекции почитать.


 
Gero ©   (2004-07-28 13:31) [277]


> Игорь Шевченко ©   (28.07.04 13:25)

Игорь, давай!
Но имхо имеет смысл создать отдельную ветку.
Наверное, так и поступим.


 
Думкин ©   (2004-07-28 13:32) [278]

> [275] Игорь Шевченко ©   (28.07.04 13:25)
Про этюды ты давно меня в слюноотделение загнал. И когда?


 
Юрий Зотов ©   (2004-07-28 13:46) [279]

Я тоже "за", но как это будет соотноситься с авторским правом и копирайтами? Спрашиваю, потому что сам в этих делах не спец.


 
Gero ©   (2004-07-28 13:49) [280]

Обсуждение электронных книг переходит в http://delphimaster.net/view/14-1091007987/ .



Страницы: 1 2 3 4 5 6 7 8 9 
10 11 12 13 14 15 16 17 18 
19 вся ветка

Текущий архив: 2004.11.07;
Скачать: CL | DM;

Наверх




Память: 1.1 MB
Время: 0.15 c
14-1098184181
Vlad Oshin
2004-10-19 15:09
2004.11.07
Вот так да... Вот до чего попса доперла..


1-1098562792
redlord
2004-10-24 00:19
2004.11.07
opendialog+multiselect


8-1091957143
Delphi5.01
2004-08-08 13:25
2004.11.07
... края силуэта ... плавно переходили в фон


1-1098761666
Кто---то
2004-10-26 07:34
2004.11.07
Как запретить TShellTreeView обращаться к дисководу ?


1-1098866748
новичок-512
2004-10-27 12:45
2004.11.07
Стиль Windows XP и кнопки с иконками