Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 1.15 MB
Время: 0.208 c
1-1098555440
Bee
2004-10-23 22:17
2004.11.07
StringGrid


4-1096701082
opoloxai
2004-10-02 11:11
2004.11.07
Перехват "звуковго" сообщения


14-1098281223
XProger
2004-10-20 18:07
2004.11.07
Мастера Delphi - официальный IRC канал сайта www.delphimaster.ru


3-1097061190
Its
2004-10-06 15:13
2004.11.07
SQL - запрос


1-1098331929
TeNY
2004-10-21 08:12
2004.11.07
.CHM HELP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский