Форум: "Потрепаться";
Текущий архив: 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