Форум: "Потрепаться";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
ВнизКалькулятор Найти похожие ветки
← →
Огромное Кулясищще © (2004-07-24 17:44) [0]GrayFace - сюды пиши. Я как бы тоже решил заняться, но ушёл пить.
← →
Юрий Зотов © (2004-07-24 18:18) [1]Ребята, поверьте - это бесполезно. Зря тратите время.
В первоначальной ветке
http://delphimaster.net/view/14-1089499317/
я уже дважды писал: "До тех пор, пока не будет привлечена теория, ВСЕГДА найдется такое выражение, которое такой калькулятор распознать и выполнить не сможет".
Поймите, наконец, что это не афоризм и сказано не для красного словца. Это так и есть. Такое выражение действительно найдется ВСЕГДА, его надо только хорошо поискать.
Более того, мне кажется, что проанализировав алгоритм любого написанного без теории строчного калькулятора, всегда можно будет составить выражение, которое этот алгоритм не способен вычислить уже в самом своем принципе. То есть, указать выражение, полностью опровергающее сам алгоритм.
← →
Юрий Зотов © (2004-07-24 18:22) [2]Дополнение к [1].
Естественно, говоря "выражение", я имею в виду синтаксически правильное выражение, при вычислении которого не возникает математических ошибок (переполнения, деления на ноль и пр.).
← →
GrayFace © (2004-07-24 18:29) [3]Посмотрим. Пока что половина ошибок (в том числе и выловленных мной) были не в алгоритме, а в деталях, по причине спешки. Сейчас я серьезно модифицировал свой калькулятор - увеличил и подшлейфовал. Так что можно смело добавлять 1-2 часа.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Math;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type TOperator=function(v1,v2:extended):extended;
TFunction=function(v:extended):extended;
TFunc=record
f:pointer;
name:string;
end;
TConst=record
v:Extended;
name:string;
end;
TBracketFunc=record
f:pointer;
left:string;
right:char;
end;
TOper=record
f:pointer;
name:string;
prior:integer;
end;
function Mul(v1,v2:extended):extended;
begin
Result:=v1*v2;
end;
function Div1(v1,v2:extended):extended;
begin
Result:=v1/v2;
end;
function Add(v1,v2:extended):extended;
begin
Result:=v1+v2;
end;
function Dec(v1,v2:extended):extended;
begin
Result:=v1-v2;
end;
function Stepen(v1,v2:extended):extended;
begin
Result:=exp(ln(v1)*v2);
end;
function Sin1(v:extended):extended;
begin
Result:=sin(v);
end;
function Cos1(v:extended):extended;
begin
Result:=cos(v);
end;
function Tg(v:extended):extended;
begin
Result:=tan(v);
end;
function Ctg(v:extended):extended;
begin
Result:=CoTan(v);
end;
function aSin(v:extended):extended;
begin
Result:=arcsin(v);
end;
function aCos(v:extended):extended;
begin
Result:=arccos(v);
end;
function aTg(v:extended):extended;
begin
Result:=arctan(v);
end;
function aCtg(v:extended):extended;
begin
if v=0 then Result:=pi/2
else Result:=arcTan(1/v);
end;
function Modul(v:extended):extended;
begin
Result:=abs(v);
end;
const Opers:array[0..4] of TOper=((f:@Add; name:"+"; Prior:10),(f:@dec; name:"-"; prior:10),(f:@Mul; name:"*"; prior:20),(f:@Div1; name:"/"; prior:20),(f:@stepen; name:"^"; prior:30));
OpMul:TOper=(f:@Mul; name:"*"; prior:20);
Funcs:array[0..7] of TFunc=((f:@sin1; name:"sin"),(f:@cos1; name:"cos"),(f:@tg; name:"tg"),(f:@ctg; name:"ctg"),(f:@asin; name:"arcsin"),(f:@acos; name:"arccos"),(f:@atg; name:"arctg"),(f:@actg; name:"arcctg"));
BracketFuncs:array[0..0] of TBracketFunc=((f:@Modul; left:"|"; right:"|"));
Consts:array[0..0] of TConst=((v:pi; name:"pi"));
function IsDigit(c:char):byte;
begin
if (c=".") or (c=DecimalSeparator) or (c="e") or (c="E") or ((ord(c)>=$30) and (ord(c)<=$39))
then result:=1 else if (c="-") or (c="+") then Result:=2 else Result:=0;
end;
procedure DoString(From,Tom:PChar; var s:string);
var i:integer;
begin
SetLength(s,integer(tom)-integer(from)+1);
for i:=1 to length(s) do
begin
if from^="." then s[i]:=DecimalSeparator
else s[i]:=from^;
inc(from);
end;
end;
function cmp(const s:string; p:PChar):boolean;
var s1:string; l:integer;
begin
l:=length(s);
SetLength(s1,l);
CopyMemory(@s1[1],p,l);
Result:=AnsiCompareText(s,s1)=0;
end;
function GetOper(var s:PChar; sep:Char; prior:integer; var done:byte; v1:extended):extended; forward;
{----------------------------------------------}
← →
GrayFace © (2004-07-24 18:30) [4]
var s1:string; i:integer; Len:integer; from,tom:PChar;
step:integer;
function GetValue(var s:PChar; sep:Char; prior:integer; var done:byte):extended;
var dn:byte; fu:pointer;
begin
try
while s^=" " do inc(s);
if s^="(" then
begin
inc(s);
dn:=0;
Result:=GetValue(s,")",-MaxInt,dn);
exit;
end;
if s^="-" then
begin
inc(s);
dn:=0;
Result:=-GetValue(s,sep,MaxInt,dn);
if dn=2 then done:=2;
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
step:=ord(BracketFuncs[i].right);
fu:=BracketFuncs[i].f;
len:=length(BracketFuncs[i].left);
end;
end;
if len<>0 then
begin
inc(s,len);
dn:=0;
Result:=TFunction(fu)(GetValue(s,chr(step),-MaxInt,dn));
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
dn:=0;
Result:=TFunction(fu)(GetValue(s,sep,MaxInt,dn));
end;
exit;
end;
from:=s;
tom:=nil;
step:=0;
if s^="+" then inc(s);
while true do
begin
if IsDigit(s^)=0 then break;
if (s^="e") or (s^="E") then if step<1 then step:=1 else break;
if (s^="-") then if step=1 then inc(step) else break;
if (s^="+") then if step=1 then inc(step) else break;
if IsDigit(s^)=1 then tom:=s;
inc(s);
end;
if tom=nil then
begin
raise Exception.Create("Syntax error");
end;
s:=tom;
inc(s);
DoString(from,tom,s1);
try
Result:=StrToFloat(s1);
except
raise Exception.Create("Syntax error");
end;
finally
if done<>2 then
begin
dn:=0;
while dn=0 do
begin
Result:=GetOper(s,sep,prior,dn,Result);
end;
if dn=2 then done:=2 else done:=0;
end;
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);
len:=0;
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;
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
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.
← →
Юрий Зотов © (2004-07-24 19:36) [5]> GrayFace [3, 4]
Выражение: arctg(sin(|-2|)/cos(2))
Результат: Syntax error: ")" wasn"t found at offset 23
:о)
← →
Anatoly Podgoretsky © (2004-07-24 19:51) [6]Смело добавляем 1-2 часа и так до бесконечности.
Автор давно доказал, то что было сказано в первоначальной ветке.
← →
GrayFace © (2004-07-24 21:02) [7]Отсутствие опровержения - не есть доказательство.
← →
GrayFace © (2004-07-24 21:22) [8]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Math;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type TOperator=function(v1,v2:extended):extended;
TFunction=function(v:extended):extended;
TFunc=record
f:pointer;
name:string;
end;
TConst=record
v:Extended;
name:string;
end;
TBracketFunc=record
f:pointer;
left:string;
right:char;
end;
TOper=record
f:pointer;
name:string;
prior:integer;
end;
function Mul(v1,v2:extended):extended;
begin
Result:=v1*v2;
end;
function Div1(v1,v2:extended):extended;
begin
Result:=v1/v2;
end;
function Add(v1,v2:extended):extended;
begin
Result:=v1+v2;
end;
function Dec(v1,v2:extended):extended;
begin
Result:=v1-v2;
end;
function Stepen(v1,v2:extended):extended;
begin
Result:=exp(ln(v1)*v2);
end;
function Sin1(v:extended):extended;
begin
Result:=sin(v);
end;
function Cos1(v:extended):extended;
begin
Result:=cos(v);
end;
function Tg(v:extended):extended;
begin
Result:=tan(v);
end;
function Ctg(v:extended):extended;
begin
Result:=CoTan(v);
end;
function aSin(v:extended):extended;
begin
Result:=arcsin(v);
end;
function aCos(v:extended):extended;
begin
Result:=arccos(v);
end;
function aTg(v:extended):extended;
begin
Result:=arctan(v);
end;
function aCtg(v:extended):extended;
begin
if v=0 then Result:=pi/2
else Result:=arcTan(1/v);
end;
function Modul(v:extended):extended;
begin
Result:=abs(v);
end;
const Opers:array[0..4] of TOper=((f:@Add; name:"+"; Prior:10),(f:@dec; name:"-"; prior:10),(f:@Mul; name:"*"; prior:20),(f:@Div1; name:"/"; prior:20),(f:@stepen; name:"^"; prior:30));
OpMul:TOper=(f:@Mul; name:"*"; prior:20);
Funcs:array[0..7] of TFunc=((f:@sin1; name:"sin"),(f:@cos1; name:"cos"),(f:@tg; name:"tg"),(f:@ctg; name:"ctg"),(f:@asin; name:"arcsin"),(f:@acos; name:"arccos"),(f:@atg; name:"arctg"),(f:@actg; name:"arcctg"));
BracketFuncs:array[0..0] of TBracketFunc=((f:@Modul; left:"|"; right:"|"));
Consts:array[0..0] of TConst=((v:pi; name:"pi"));
function IsDigit(c:char):byte;
begin
if (c=".") or (c=DecimalSeparator) or (c="e") or (c="E") or ((ord(c)>=$30) and (ord(c)<=$39))
then result:=1 else if (c="-") or (c="+") then Result:=2 else Result:=0;
end;
procedure DoString(From,Tom:PChar; var s:string);
var i:integer;
begin
SetLength(s,integer(tom)-integer(from)+1);
for i:=1 to length(s) do
begin
if from^="." then s[i]:=DecimalSeparator
else s[i]:=from^;
inc(from);
end;
end;
function cmp(const s:string; p:PChar):boolean;
var s1:string; l:integer;
begin
l:=length(s);
SetLength(s1,l);
CopyMemory(@s1[1],p,l);
Result:=AnsiCompareText(s,s1)=0;
end;
function GetOper(var s:PChar; sep:Char; prior:integer; var done:byte; v1:extended):extended; forward;
{----------------------------------------------}
← →
GrayFace © (2004-07-24 21:23) [9]
var s1:string; i:integer; Len:integer; from,tom:PChar;
step:integer;
function GetValue(var s:PChar; sep:Char; prior:integer; var done:byte):extended;
var dn:byte; fu:pointer;
begin
try
while s^=" " do inc(s);
if s^="(" then
begin
inc(s);
dn:=0;
Result:=GetValue(s,")",-MaxInt,dn);
exit;
end;
if s^="-" then
begin
inc(s);
dn:=0;
Result:=-GetValue(s,sep,MaxInt,dn);
done:=dn;
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
step:=ord(BracketFuncs[i].right);
fu:=BracketFuncs[i].f;
len:=length(BracketFuncs[i].left);
end;
end;
if len<>0 then
begin
inc(s,len);
dn:=0;
Result:=TFunction(fu)(GetValue(s,chr(step),-MaxInt,dn));
done:=dn;
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
dn:=0;
Result:=TFunction(fu)(GetValue(s,sep,MaxInt,dn));
done:=dn;
end;
exit;
end;
from:=s;
tom:=nil;
step:=0;
if s^="+" then inc(s);
while true do
begin
if IsDigit(s^)=0 then break;
if (s^="e") or (s^="E") then if step<1 then step:=1 else break;
if (s^="-") then if step=1 then inc(step) else break;
if (s^="+") then if step=1 then inc(step) else break;
if IsDigit(s^)=1 then tom:=s;
inc(s);
end;
if tom=nil then
begin
raise Exception.Create("Syntax error");
end;
s:=tom;
inc(s);
DoString(from,tom,s1);
try
Result:=StrToFloat(s1);
except
raise Exception.Create("Syntax error");
end;
finally
if done<>2 then
begin
dn:=0;
while dn=0 do
begin
Result:=GetOper(s,sep,prior,dn,Result);
end;
if dn=2 then done:=2 else done:=0;
end;
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);
len:=0;
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;
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;
{function Operate(var s:PChar; sep:char):extended;
var done:boolean;
begin
result:=GetValue(s,sep);
while true do
begin
Result:=GetOper(s,sep,Result,done);
end;
end;
}
procedure TForm1.Button1Click(Sender: TObject);
var b:byte; p:PChar; s:string; i:integer;
begin
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.
← →
Огромное Кулясищще © (2004-07-24 23:27) [10]2 Юрий Зотов © (24.07.04 18:18) [1]:
Больше всего я боюсь, что вы введёте 1+-5 и вылетит ошибка. Я, конечно, проверочку сделаю, но будте добры н аэтом не настаивать.
← →
Marser © (2004-07-24 23:45) [11]Разбираться в коде лень, но ЮЗ как всегда прав. Нужно озннакомиться с теорией конечных автоматов...
← →
Юрий Зотов © (2004-07-25 00:09) [12]> GrayFace [8, 9]
То же самое выражение: arctg(sin(|-2|)/cos(2))
Но уже с другим результатом: Syntax error at offset 22
Время обнаружения глюка: несколько секунд.
:о)
Как Вы тестируете программу - для меня просто загадка. Хотелось бы все же попросить Вас выкладывать более тщательно протестированный код, иначе просто несерьезно получается.
P.S.
"До тех пор, пока к написанию калькулятора не будет привлечена теория, ВСЕГДА найдется такое выражение, которое калькулятор распознать и выполнить НЕ сможет".
© Юрий Зотов.
:о)
← →
Anatoly Podgoretsky © (2004-07-25 00:52) [13]Боюсь за стек но все же [6]
← →
Думкин © (2004-07-25 06:44) [14]Мне кажется будет лучшим выкладывать не код, а ссылку на ЗИП-архив.
Иначе скоро ветка будет весить несколько метров, а конца и видно не будет.
И про Банелла было здраво сказано, вполне хватит. Но своем здорово было бы и еще немного в теории. Сваять что-то можно, но это как раз и выльется в огромную потерю времени и итог почти нулевой, тгогда как после тнории получаешьоружие для всей жизни навсегда(надолго) и с возможностью расширений.
← →
Думкин © (2004-07-25 06:46) [15]Извинясь за очепятки, что к клаве новой не привыкну. :-))
← →
}|{yk © (2004-07-25 13:10) [16]Слушай, ну есть же уже очень простой подход к решению данной задачи. Так как ты решаешь ее не решить. Задача разбивается на 2 части - составление обратной польской записи (отдельно) и вычисление по отдельно этому преобразованию. Каждая из этих задач не сложна, и вместе они полностью решат поставленную задачу. Ты пытаешься решить задачу примитивным способом.
← →
Romkin © (2004-07-25 13:52) [17]Да конечные автоматы тут не очень и нужны, можно без них.
Способов множество. Код я смотреть не буду, но на первый взгляд он слишком длинный :))
← →
Юрий Зотов © (2004-07-25 14:38) [18]> }|{yk © (25.07.04 13:10) [16]
Можно обойтись и без польской записи, это не единственный способ. Но парсить все равно надо грамотно, а не доморощенными способами.
Фишка в том, что человек хочет доказать, что эту задачу можно решить и без теории. На коленке, как бы. Вот и доказывает. Ну не верит он в то, что без теории у него просто жизни не хватит, чтобы написать нормально работающий строчный калькулятор с более-менее развитым входным языком. Разве что он сам изобретет ту же самую (или свою) теорию.
← →
Anatoly Podgoretsky © (2004-07-25 17:15) [19]Юрий Зотов © (25.07.04 14:38) [18]
На это расчитывать не приходится, разве что просто откуда ни будь скопирует готовый код
← →
Огромное Кулясищще © (2004-07-25 17:53) [20]2 Юрий Зотов:
А предъявите требования к выражению? Какие операции должны поддерживаться?
← →
Alx2 © (2004-07-25 17:54) [21]>Фишка в том, что человек хочет доказать, что эту задачу можно
>решить и без теории
Можно и без теории. В этом частном случае. Даже не имея понятия о формальных языках и о грамматиках. Будет у автора желание обобщить сделанное (имею в виду то, что когда-нибудь получится полноценный калькулятор) - будет некая теория. А будет желание посмотреть "как большие пацаны это делают" - будет чувство а-ля "эх, нифига себе!", будет Большая теория :)
PS
Сужу исключительно по себе :)
← →
Romkin © (2004-07-25 18:00) [22]Огромное Кулясищще © (25.07.04 17:53) [20] Ты же сам уже все написал. Четыре арифметических действия плюс набор функций одного аргумента.
← →
Огромное Кулясищще © (2004-07-25 18:18) [23]>Четыре арифметических действия плюс набор функций одного
Как же... +, -, /, * - это конечно. Однако ещё возведение в степень через ^ надо бы. Кроме того - синус, косинус, тангенс, а вот арксинусы и ко - это просто лень уже. Кроме того, Зотов употребил модуль ввиде |a|. Думается, надо бы либо запретить и говорить, чтобы юзало abs(x), либо самому менять.
← →
Ihor Osov'yak © (2004-07-25 18:20) [24]2 [21] Alx2 © (25.07.04 17:54)
> Можно и без теории. В этом частном случае
Нет, в этом частном случае нельзя. Возможно только два варианта:
1. Либо все же полдучить теор. подготовку.
2. Пойти по пути, упомянутом в последнеи предложении постинга [18]. Но и в таком случае теория будет впереди.
Задача эта, несмотря на свою простоту, не из того ряда, что решается методом "инженерного тыка".. Да и метод "инженерного тыка" все же предполагает некоторую теоритическую подготовку :-).
← →
Огромное Кулясищще © (2004-07-25 18:27) [25]2 Ihor Osov"yak © (25.07.04 18:20) [24]:
Вы н абумажке посчитать пример можете? Думаю да. Значит, и комп может.
← →
Ertong © (2004-07-25 18:34) [26]Может я чего не понимаю, но помойму это задачка из ряда школьных оллимпиад! Я всегда решал ее. Там не очень сложный рекурсивный алгоритм. Если кому интересно, то где-то через часик сюда кину простейшую реализацию.
← →
Alx2 © (2004-07-25 18:41) [27]>Ihor Osov"yak © (25.07.04 18:20) [24]
Почему так категорично?
А эта конкретная задача решается именно методом не "инженерного тыка", а переложением своего "know how" на язык программирования (у кого на сколько ясно он формализуется). Тьюринга оставим пока в покое.Я утверждаю, что в этом конкретном случае теория вторична. Как необходимая вещь она возникла когда наступила своего рода "запарка" с подобными задачами и стал необходим универсальный инструмент. Конечно, когда мы уже имеем такой инструмент - подобные задачи выглядят детскими. Но к жизни этот аппарат побудили далеко не единичные задачи.
Но, не зная сего аппарата, САМОСТОЯТЕЛЬНО заставить программу работать так, как читает формулы любой нормальный человек - задача не из легких. И дай бог, если она удается. И радость от успеха ничуть не омрачается тем, что "есть уже такая теория". "Такая теория" просто послужит подтверждением и учителем в дальнейшем.
← →
Ihor Osov'yak © (2004-07-25 18:58) [28]2 [25] Огромное Кулясищще © (25.07.04 18:27)
Меня правилам разбора выражений учили, то бишь парсингу, обучали этому, как его, "на ум пошло", а задача узнавания, она как бы уже на подсознательном уровне делается. Да и есть в наличии такое свойство, как интеллект (надеюсь).
А вот ваш алгоритм почти все это тоже должен уметь делать. Причем делать правильно, и для всех случаев. И не обладая интеллектом. Что повышает требования к качеству реализации алгоритма. Так как исключает обучение и самоусовершенстовование.
Так вот, составить такой алгоритм без соотв. теоритической подготовки автора невозможно. И не важно, будет ли эта теория почерпнута из учебника, либо придумана автором "c нуля". Важно, что теория будет впереди.
Почему теория? Да потому, что эта задачка уже для своего корректного решения требует знаний, выходящих за пределы элементарной арифметики и логики. То есть теории.
Я понимаю, что сказанное выше мною не есть строгое доказательство. Я не философ и не специалист по теории алгоритмов, чтобы приводить строгое доказательство. Мало того, я даже не знаю, есть ли строгое доказательство.
В даном случае меня устраивают "нестрогие" доказательства, такие, как жизненный опыт, практика. Кстати, элемент "практики" мы наблюдаем :-).
Еще. Похожую задачку я решал лет 12-14 назад. Программирование у меня тогда еще не было профессией, но пожалуй, уже немного больше, чем хобби, но это не настолько важно. Помню, ходил дня два, все думал, с какой стороны приступить.. А потом в библиотеке книжечка в руки попала, даже не помню, какая, что-то там о компиляторах с интерпретаторами рассказывалось. Так вот, после прочтение нескольких страничек с введением в теорию синтаксического анализа (если честно, даже не читал до конца (может и зря), а только просмотрел формализацию задачи, и общие подходы к разбору выражений) - как вдруг наступило просветление и озарение. Если не изменяет память, в тот же день был готовый релиз..
← →
Piter © (2004-07-25 19:48) [29]а что такое польская запись?
← →
Ertong © (2004-07-25 19:56) [30]
> а что такое польская запись?
На algolist.manual.ru есть описание, но я не видел задачи, для которой ее использование было необходимо.
Да, вот исходник, правда на паскале, строчного калькулятора. Только четыре основные операции и дужки.var
s:string; {string with expression}
p:longint; {cursor position}
function expr:real; forward;
{Возвращает число, что начинается в позиции курсора и прередвинает курсор за число}
function number:real;
var
n,st:real;
b:boolean;
begin
st:=1;
n:=0;
b:=false;
while s[p] in ["0".."9","."] do
begin
if s[p]="." then
begin
b:=true;
st:=10;
end
else
begin
if b then n:=n+(1/st)*(ord(s[p])-ord("0"))
else n:=n*10+(ord(s[p])-ord("0"));
st:=st*10;
end;
inc(p);
end;
number:=n;
end;
function factor:real;
var
res:real;
begin
if s[p]="-" then
begin
inc(p);
res:=-factor;
end;
if s[p]="+" then
begin
inc(p);
res:=factor;
end;
if s[p]="(" then
begin
inc(p);
res:=expr;
inc(p);
end;
if s[p] in ["0".."9","."] then res:=number;
factor:=res;
end;
function term:real;
var
n:real;
begin
n:=number;
while s[p] in ["*","/"] do
begin
inc(p);
if s[p-1]="*" then n:=n*number else n:=n/number;
end;
term:=n;
end;
function expr:real;
var
n:real;
begin
n:=term;
while (s[p] in ["+","-"]) do
begin
if s[p] in ["+","-"] then
begin
inc(p);
if s[p-1]="+" then n:=n+term else n:=n-term;
end;
end;
expr:=n;
end;
begin
readln(s);
p:=1;
writeln(expr:0:9);
readln;
end.
Добавление степеней, функций и проверки ошибок дело техники.
← →
Ertong © (2004-07-25 19:58) [31]и унарный минус :)
← →
Огромное Кулясищще © (2004-07-26 00:40) [32]Ну, сколько то продвинулся. Думаю, завтра или послезавтра завершить, смотря как со временем будет.
← →
Думкин © (2004-07-26 06:36) [33]> [20] Огромное Кулясищще © (25.07.04 17:53)
> А предъявите требования к выражению? Какие операции должны поддерживаться?
Почему это появляется только сейчас? Вообще, какая задача решается?
А будет считаться: $1AF0 xor $46B8 ?
Что в итоге будет?
← →
Рамиль © (2004-07-26 08:17) [34]Да бесполезно это без теории. Помнится я этот калькулятор за вечер сделал, как дополнительную фичу к курсовой по сплайнам, вооружившись тетрадкой с лекциями по теории компиляторов. Вычислялиь все выражения и ошибки в них ловились на этапе разбора. А тут уже n-ый день пишете и конца не видно...
> что в этом конкретном случае теория вторична.
Первична. Иначе все равно изобретешь теорию, но почти стопроцентно она будет кривой. Вообщем я солидарен с
> [18] Юрий Зотов © (25.07.04 14:38)
← →
Рамиль © (2004-07-26 08:53) [35]
> [30] Ertong © (25.07.04 19:56)
Это прикол? Ни приоритетов операций, ни скобок.
← →
Igorek © (2004-07-26 09:02) [36]как все запущено...
← →
Anatoly Podgoretsky © (2004-07-26 09:14) [37]Прошло много рах по 3,5 часа а калькулятора все нет!
← →
calm © (2004-07-26 09:38) [38]Но парсить все равно надо грамотно, а не доморощенными способами.
Помнится, на 2-м курсе у нас был предмет "Теория выч. процессов".
Писать надо было автоматы, трансляторы, интерпретаторы и т.д.
И курсовик был.
Получив тему курсовика на второй неделе семестра, сразу стал им заниматься. Надо было проверять на допустимость выражение на любой граматике класса не помню какого.
Через неделю сделал. Все работало реально! Граматики задавались через текстовый файл, совершенно произвольно, все проверялось корректно, я был очень доволен.
Но автоматами там и не пахло, потому что до них еще не дошли на лекциях :)
К концу семестра я осознал, какой бред я написал :))
Господа, не отказывайтесь от изучения теории!
← →
GrayFace (2004-07-26 10:26) [39]>Как Вы тестируете программу - для меня просто загадка.
Сам тащусь. :) Я немного сократил ваш пример и тестировал на урезанном.
>Кроме того, Зотов употребил модуль ввиде |a|.
Потому что я такую фичу добавил. Если напишишь *,/,-,+ и какой-нибудь sin - этого будет достаточно.
>Больше всего я боюсь, что вы введёте 1+-5 и вылетит ошибка.
Это неверное выражение - ошибка должна вылетать. (хотя у меня не вылетит)
>Мне кажется будет лучшим выкладывать не код, а ссылку на ЗИП-архив.
Да, но много мароки.
>Вы н абумажке посчитать пример можете? Думаю да. Значит, и комп может.
Тоже на бумажке? :)
← →
Григорьев Антон © (2004-07-26 10:33) [40]
> GrayFace (26.07.04 10:26) [39]
> >Больше всего я боюсь, что вы введёте 1+-5 и вылетит ошибка.
> Это неверное выражение - ошибка должна вылетать. (хотя у
> меня не вылетит)
С какой это радости оно неверное?
← →
Думкин © (2004-07-26 10:37) [41]> [40] Григорьев Антон © (26.07.04 10:33)
Так ведь пока ничего не описано у него. А нет формализации - нет ошибок, или все что угодно - ошибка.
← →
Dmitriy O. © (2004-07-26 10:51) [42]Зачем калькулятор если есть Excel ?
Другое дело калькулятор скажем для мобилы. Вещь бы была полезная но там на Java писать надо.
← →
Григорьев Антон © (2004-07-26 11:18) [43]
> Думкин © (26.07.04 10:37) [41]
> > [40] Григорьев Антон © (26.07.04 10:33)
>
> Так ведь пока ничего не описано у него. А нет формализации
> - нет ошибок, или все что угодно - ошибка.
А это - очень спорный вопрос. Формализация грамматики - это половина теории конечных автоматов. ИМХО, лучший вариант был бы таким: автор, представляющий своё творение на суд Юрию Зотову, сам описывает грамматику, которая является допустимой. Описывает, как умеет. И проверка осуществляется в рамках этой грамматики. Если грамматика сама по себе противоречива - это тоже жирный минус автору. Вот тогда и станет очевидной необходимость теории: она нужна даже для того, чтобы просто грамотно сформулировать то, что будет делать программа, не говоря уже о том, чтобы эту программу реализовать.
← →
Ertong © (2004-07-26 11:21) [44]
> Это прикол? Ни приоритетов операций, ни скобок.
Блин! Косяк в коде. Читать такfunction term:real;
var
n:real;
begin
n:=factor;
while s[p] in ["*","/"] do
begin
inc(p);
if s[p-1]="*" then n:=n*factor else n:=n/factor;
end;
term:=n;
end;
Там и приоритеты и скобки :)
← →
GrayFace (2004-07-26 11:37) [45]Григорьев Антон © (26.07.04 10:33) [40]
>С какой это радости оно неверное?
Возможно, верное. Мне казалось, что надо 1+(-5). Вполне возможно я перепутал сложение с умножением. Мне показалось, что нас так учили писать при сложении.
>автор, представляющий своё творение на суд Юрию Зотову, сам описывает грамматику, которая является допустимой.
Возможно такое:sin5, sin-5, 1+---+5(но 1++5 - нет), 2pi, 2sin2, 2 2 2=8(побочный эффект).
Исключение:|5|-6|| - долно быть |5*|-6||
>Зачем калькулятор если есть Excel?
Ты используешь Excel как калькулятор??!! Это же тормознутый запуск, черти-что вместо названий функций (в русском Excel). А вообще этот калькулятор создавался, можно сказать, специально для этого спора, хотя я его еще как-нибудь использую.
>Прошло много рах по 3,5 часа а калькулятора все нет!
Меньше двух рах.unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Math;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type TOperator=function(v1,v2:extended):extended;
TFunction=function(v:extended):extended;
TFunc=record
f:pointer;
name:string;
end;
TConst=record
v:Extended;
name:string;
end;
TBracketFunc=record
f:pointer;
left:string;
right:char;
end;
TOper=record
f:pointer;
name:string;
prior:integer;
end;
function Mul(v1,v2:extended):extended;
begin
Result:=v1*v2;
end;
function Div1(v1,v2:extended):extended;
begin
Result:=v1/v2;
end;
function Add(v1,v2:extended):extended;
begin
Result:=v1+v2;
end;
function Dec(v1,v2:extended):extended;
begin
Result:=v1-v2;
end;
function Stepen(v1,v2:extended):extended;
begin
Result:=exp(ln(v1)*v2);
end;
function Sin1(v:extended):extended;
begin
Result:=sin(v);
end;
function Cos1(v:extended):extended;
begin
Result:=cos(v);
end;
function Tg(v:extended):extended;
begin
Result:=tan(v);
end;
function Ctg(v:extended):extended;
begin
Result:=CoTan(v);
end;
function aSin(v:extended):extended;
begin
Result:=arcsin(v);
end;
function aCos(v:extended):extended;
begin
Result:=arccos(v);
end;
function aTg(v:extended):extended;
begin
Result:=arctan(v);
end;
function aCtg(v:extended):extended;
begin
if v=0 then Result:=pi/2
else Result:=arcTan(1/v);
end;
function Modul(v:extended):extended;
begin
Result:=abs(v);
end;
const Opers:array[0..4] of TOper=((f:@Add; name:"+"; Prior:10),(f:@dec; name:"-"; prior:10),(f:@Mul; name:"*"; prior:20),(f:@Div1; name:"/"; prior:20),(f:@stepen; name:"^"; prior:30));
OpMul:TOper=(f:@Mul; name:"*"; prior:20);
Funcs:array[0..7] of TFunc=((f:@sin1; name:"sin"),(f:@cos1; name:"cos"),(f:@tg; name:"tg"),(f:@ctg; name:"ctg"),(f:@asin; name:"arcsin"),(f:@acos; name:"arccos"),(f:@atg; name:"arctg"),(f:@actg; name:"arcctg"));
BracketFuncs:array[0..0] of TBracketFunc=((f:@Modul; left:"|"; right:"|"));
Consts:array[0..0] of TConst=((v:pi; name:"pi"));
function IsDigit(c:char):byte;
begin
if (c=".") or (c=DecimalSeparator) or (c="e") or (c="E") or ((ord(c)>=$30) and (ord(c)<=$39))
then result:=1 else if (c="-") or (c="+") then Result:=2 else Result:=0;
end;
procedure DoString(From,Tom:PChar; var s:string);
var i:integer;
begin
SetLength(s,integer(tom)-integer(from)+1);
for i:=1 to length(s) do
begin
if from^="." then s[i]:=DecimalSeparator
else s[i]:=from^;
inc(from);
end;
end;
function cmp(const s:string; p:PChar):boolean;
var s1:string; l:integer;
begin
l:=length(s);
SetLength(s1,l);
CopyMemory(@s1[1],p,l);
Result:=AnsiCompareText(s,s1)=0;
end;
function GetOper(var s:PChar; sep:Char; prior:integer; var done:byte; v1:extended):extended; forward;
{----------------------------------------------}
← →
GrayFace (2004-07-26 11:37) [46]
var s1:string; i:integer; Len:integer; from,tom:PChar;
step:integer;// vloz:integer=0;
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^=" " 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
step:=ord(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,chr(step),-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;
from:=s;
tom:=nil;
step:=0;
if s^="+" then inc(s);
while true do
begin
if IsDigit(s^)=0 then break;
if (s^="e") or (s^="E") then if step<1 then step:=1 else break;
if (s^="-") then if step=1 then inc(step) else break;
if (s^="+") then if step=1 then inc(step) else break;
if IsDigit(s^)=1 then tom:=s;
inc(s);
end;
if tom=nil then
begin
raise Exception.Create("Syntax error");
end;
s:=tom;
inc(s);
DoString(from,tom,s1);
try
Result:=StrToFloat(s1);
except
raise Exception.Create("Syntax error");
end;
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.
← →
Григорьев Антон © (2004-07-26 11:57) [47]
> >автор, представляющий своё творение на суд Юрию Зотову,
> сам описывает грамматику, которая является допустимой.
> Возможно такое:sin5, sin-5, 1+---+5(но 1++5 - нет), 2pi,
> 2sin2, 2 2 2=8(побочный эффект).
> Исключение:|5|-6|| - долно быть |5*|-6||
На описание грамматики это не тянет. Например, из этого описания неясно, как трактуется строка sin2pi - как sin(2*pi) или как sin(2)*pi. Или sin1+2 - sin(1)+2 или sin(1+2).
А вообще, сам факт попытки реализовать калькулятор, распознающий выражения без знаков умножения и аргументы функций без скобок, является весьма показательным. Человек, знакомый с теорией, никогда бы такую глупость не сделал. Потому что слишком хорошо понятно, к чему это приведёт. Захотите вот ввести переменные - и как тогда трактовать pi? Как число pi или как p*i? А arcsin(s)? Может быть, это вообще a*r*c*sin(x)? А log105 - это log(105) или log10(5)? Вы даже не смогли придумать непротиворечивую грамматику, которую должен понимать ваш калькулятор, а без этого его писать просто не стоит.
← →
Юрий Зотов © (2004-07-26 12:01) [48]> Огромное Кулясищще © (25.07.04 17:53) [20]
> А предъявите требования к выражению? Какие операции должны
> поддерживаться?
Они были изложены в предыдущей ветке. Обычный набор - унарные плюс и минус, 4 действия арифметики, возведение в степень, скобки с любым уровнем вложенности и несколько любых функций (каких и сколько - неважно, ну пусть, например sin и cos).
> Alx2 © (25.07.04 17:54) [21]
> Можно и без теории. В этом частном случае.
Могу предложить Вам доказать Ваше утверждение, написав свой вариант такого калькулятора. Требования: он должен правильно вычислять ЛЮБОЕ синтаксически правильное арифметическое выражение, при вычислении которого не возникает деления на ноль, переполнения и др. математических ошибок.
Думаю, что без теории это не получится и у Вас тоже. И неважно, примените ли Вы готовую теорию, или придумаете свою - все равно без теории Вы такую программу тоже не напишете.
> Огромное Кулясищще © (25.07.04 18:18) [23]
> Кроме того, Зотов употребил модуль ввиде |a|. Думается, надо
> бы либо запретить и говорить, чтобы юзало abs(x), либо самому
> менять.
Это не я употребил, а автор программы САМ ввел такую фичу (что однозначно видно из кода). Как тестировщик, а просто обязан был ее проверить. :о)
> Огромное Кулясищще © (25.07.04 18:27) [25]
> Вы н абумажке посчитать пример можете? Думаю да. Значит, и
> комп может.
Странно. Мне казалось, что уж кто-кто, а ПРОГРАММИСТ должен был бы прекрасно понимать что комп не умеет абсолютно НИЧЕГО, кроме как исполнять программы, написанные ЧЕЛОВЕКОМ. И если человек некую задачу пока еще не смог формализовать и запрограммировать, то комп бессилен.
> Ertong © (25.07.04 18:34) [26]
> Ertong © (25.07.04 19:56) [30]
> Может я чего не понимаю, но помойму это задачка из ряда
> школьных оллимпиад! Я всегда решал ее. Там не очень сложный
> рекурсивный алгоритм. Если кому интересно, то где-то через
> часик сюда кину простейшую реализацию.
Код, который Вы привели в [30] - можно сказать, классический. Он совершенно ЯВНО построен на основе строгого формального описания арифметического выражения в виде форм Бэкуса-Наура - то есть, реализует самую что ни на есть классическую теорию. Я ничуть не сомневаюсь, что такой код мог быть САМОСТОЯТЕЛЬНО написан ТОЛЬКО человеком, имеющим торетическую подготовку. Сам алгоритм и даже названия функций (expr, term, factor) ОДНОЗНАЧНО говорят о том, что ПЕРВОНАЧАЛЬНО это код писал человек, ЗНАЮЩИЙ теорию (по крайней мере, хотя бы основы).
← →
Думкин © (2004-07-26 12:51) [49]> [43] Григорьев Антон © (26.07.04 11:18)
Я про это и намекал уже.
Надо вначале самому четко определиться, а не сразу же хвататься за клавиатуру. Чем больше пишу, тем стараюсь долше отттянуть собственно стучание для кода.
← →
GrayFace (2004-07-26 12:54) [50]>Григорьев Антон [47]
sin2pi=sin(2)pi sin2+3=sin(2)+3
Если надо выбрать между трактовкой вашего выражения, как arccos и как a*r*c*cos, то выбирается самое длинное - arccos.
← →
Alx2 © (2004-07-26 13:01) [51]>Юрий Зотов © (26.07.04 12:01)
>Думаю, что без теории это не получится и у Вас тоже. И неважно,
>примените ли Вы готовую теорию, или придумаете свою - все равно
>без теории Вы такую программу тоже не напишете.
Тавтология имхо. Очевидно, что так любая корректно работающая программа станет следствием теории, даже если этой теории не было "до того". Вопрос что таковой называть. Ведь достаточно назвать теорией то, на базе чего что-либо пишется (даже не важно как) и Вы окажетесь правы.
← →
Думкин © (2004-07-26 13:01) [52]> [50] GrayFace (26.07.04 12:54)
> sin2pi=sin(2)pi
А вот математики первое трактуют иначе, отсюда некое вольное трактование чего-то. Не лучше ли чем вникая каждый раз в частности, написать нечто более общее? Чтобы таких вопросов не возникало.
← →
Юрий Зотов © (2004-07-26 13:08) [53]> Alx2 © (26.07.04 13:01) [51]
Никакой тавтологии. Речь идет о том, что Вы сделаете раньше - родите теорию, не думая о программе и ПОТОМ на ее основе напишете программу, или же напишете программу, не думая о теории, а уже потом сформулируете теорию на основе ГОТОВОЙ программы.
← →
Ertong © (2004-07-26 13:14) [54]
> Он совершенно ЯВНО построен на основе строгого формального
> описания арифметического выражения в виде форм Бэкуса-Наура
> - то есть, реализует самую что ни на есть классическую теорию
Я не читал ничего по теории языков и даже впервые слышу, что это форма записи Бэкуса-Наура :) Хотя вы правы, я использовал иммено эту форму описания синтаксиса (незная названия:).
P.S. Я сначала подумал, что тут обсуждают написание калькулятора, а не потребнось(или непотребность) знания хоть некоторой теории:)
> И неважно, примените ли Вы готовую теорию, или придумаете
> свою - все равно без теории Вы такую программу тоже не напишете.
А разве придумать свою теорию для написаня алгоритма - это не написания программы без применения готовых теорий?:)
← →
Ertong © (2004-07-26 13:17) [55]
> а уже потом сформулируете теорию на основе ГОТОВОЙ программы.
Зачем формулировать теорию по готовой программе? В большенстве случаев это не нужно!
← →
вразлет © (2004-07-26 13:23) [56]ИМХО, теория конечно доложна быть первичной, но оно всегда должна идти рука об руку с практикой. Ошибка в теории выявится только на практике. Иногда это может привести к очень нежелательным последствиям,вплоть до пересмотра всей теории на корню.
← →
Думкин © (2004-07-26 13:24) [57]> [55] Ertong © (26.07.04 13:17)
Речь примерно вот о чем:
Вот математики в Др.Греции могли решать сложные задачи. Но почти любая сложная задача сводилась придумыванию нового, к какому-нибудь трюку. Это было сложно и непродуктивно.
Но вот пришла аналитическая геометрия, анализ, проективная геометрия и т.д. и т.п. Теория двинулась. И сейчас вы можете решить многие задачи древности не расписывая многостраничных тркататов, а просто выписав ряд формул. Тот же объем сложной фигуры и т.д и т.п.
Без этих теорий можно конечно тоже что-то сделать - но вы со скрипом посчитаете объем шара, пирамиды, не говоря о более сложных моментах.
Так вот написание калькулятора на коленке занятие плодотворное, но возможно долгое и глючное. И еще не факт что вы вынесите оттуда пользу большую. Ведь у греков так и не родилось диф. и инт. исчисление.
← →
Alx2 © (2004-07-26 13:27) [58]>Юрий Зотов © (26.07.04 13:08) [53]
Мне довольно трудно понять это. Видимо, разный менталитет :)
Вот что я хотел сказать:
Когда я пишу программы на базе теории, то они, как правило, "рабочие лошадки" - призванны просто облегчить рутину.
А для разработки новой теории (довольно помпезно звучит, но, думаю, понятно что имеется в виду) я пишу программы, с помощью которых проверяю правильность идеи. То есть в этом случае я создаю исследовательский инструмент. Но новая теория в данном случае не создается на основе готовой программы. Готовая программа здесь есть нечто вспомогательное. Инструмент.
← →
Григорьев Антон © (2004-07-26 13:27) [59]
> GrayFace (26.07.04 12:54) [50]
Теперь осталось сформулировать эту грамматику не в виде конкретных примеров, а в виде, позволяющем алгоритмизировать разбор. Например, как формализуется запись числа с плавающей десятичной точкой
Знак="+"/"-"
Цифра="0"/"1"/"2"/"3"/"4"/"5"/"6"/"7"/"8"/"9"
Экспонента="e"/"Е"
Точка="."
Число=[Знак]{Цифра}[Точка{Цифра}][Экспонента[Знак]{Цифра}]
Здесь / - "или"
[] - необязательная часть
{} - повторение 1 или более раз
← →
Kerk © (2004-07-26 13:30) [60]Народ, вам делать совсем не чего?
Полно готовых алгоритмов (та же польская запись), зачем свое придумывать???
← →
calm © (2004-07-26 13:32) [61]
> Полно готовых алгоритмов (та же польская запись), зачем
> свое придумывать???
ты не понял сабжа :))
Речь идет как раз о том, что изучать готовые теории/алгоритмы не нужно.
Оно ведь всё можно с наскоку одолеть за 2 часа.
← →
Anatoly Podgoretsky © (2004-07-26 13:33) [62]И при этом не лукавить, не брать готовый код.
← →
Kerk © (2004-07-26 13:36) [63]
> Оно ведь всё можно с наскоку одолеть за 2 часа.
не согласен.. :))
у меня, например, на изучение некоторых готовых алгоритмов уходило куда больше времени. вероятно, я тормоз... :(
← →
calm © (2004-07-26 13:42) [64]
> не согласен.. :))
Да многие не согласны :))
Но Огромное Кулясищще ©, GrayFace © и co
не только согласны, но и пытаются это доказать с помощью написания калькулятора без соответсвтующей теор. подготовки.
Процесс длится, если не ошибаюсь, четверты день.
P.S. Их бы энергию да в мирных целях :))
← →
GrayFace (2004-07-26 13:45) [65]>Речь идет как раз о том, что изучать готовые теории/алгоритмы не нужно.
Нужно, но не слишком много.
>Оно ведь всё можно с наскоку одолеть за 2 часа.
О 2 часах речи не идет. Речь, скорее, о дне. ЮЗ вообще говорит о вечности.
← →
Anatoly Podgoretsky © (2004-07-26 13:50) [66]calm © (26.07.04 13:42) [64]
Нет не первый день, эта ветка была вычоенена из другой более ранней, где он начал кидаться кривым кодом.
← →
calm © (2004-07-26 13:56) [67]
> эта ветка была вычоенена из другой более ранней, где он
> начал кидаться кривым кодом.
Я помню, читал.
Кажется калькулятор начинали писать в пятницу...
← →
Сергей Суровцев © (2004-07-26 14:01) [68]>Юрий Зотов © (26.07.04 12:01) [48]
>Думаю, что без теории это не получится и у Вас тоже. И неважно,
>примените ли Вы готовую теорию, или придумаете свою - все равно
>без теории Вы такую программу тоже не напишете.
Ну это все же не совсем честно. :)) Вы загнали его в диалектический тупик и если принять Ваше выражение то становится абсолютно неважно - напишет он свой калькулятор или нет. Ибо он уже заранее проиграл. По определению.
Честнее будет так - может ли человек, не изучивший теорию предмета заранее создать ее при необходимости самостоятельно, естественно не всеобъемлющую, но универсальную в рамках поставленной задачи.
>GrayFace (26.07.04 12:54) [50]
>Если надо выбрать между трактовкой вашего выражения, как arccos
>и как a*r*c*cos, то выбирается самое длинное - arccos.
При таком подходе Юрий может спать спокойно. Ибо вместо простого парсинга по 7 знакам Вы выбрали головную боль с произвольной трактовкой выражения. Это путь в лежачую восьмерку, даже без всяких переменных. Незнание теории не освобождает от необходимости ее придумать. :))
← →
Думкин © (2004-07-26 14:05) [69]> [68] Сергей Суровцев © (26.07.04 14:01)
> Честнее будет так - может ли человек, не изучивший теорию
> предмета заранее создать ее при необходимости самостоятельно,
> естественно не всеобъемлющую, но универсальную в рамках
> поставленной задачи.
Начало было в другой ветке. Там говорилось, что можно обходиться весьма малым багажом. А если что и возникнет проблемное, то решается быстро и просто.
← →
NeyroSpace © (2004-07-26 14:14) [70]IMHO
А почему изпользуется только процедурный язык? Может использовать объекты? Например каждая операция это объект, операнды это свойсва объекта. А дальше в 2а прохода, сначала парсим и создаем объекты, потом строим дерево связей, которое задает последовательность вычисления операций и раскручиваем его с концов веток. Хотя это экспромт, может не заработать :-).
Я бы за 2а часа ничего не стал придумывать, не изучив все шишки, набитые другими людьми в этом вопросе. Польская запись самое простое :-).
← →
calm © (2004-07-26 14:26) [71]
> А почему изпользуется только процедурный язык? Может использовать
> объекты?
процедуры, объекты... Не в этом же суть
← →
Юрий Зотов © (2004-07-26 14:32) [72]> Сергей Суровцев © (26.07.04 14:01) [68]
> А также для всех желающих уяснить суть сабжа.
Ссылка на исходную ветку есть выше. Там довольно много, поэтому позволю себе привести здесь очень краткую историю вопроса - и да, простят меня модераторы.
:о)
Первоначально речь зашла о том, сколько времени нужно начинающему программисту, чтобы сравняться с опытным - столько же, сколько на это потратил опытный, или гораздо меньше. Я высказался в том смысле, сам кодинг действительно можно освоить быстро, но львиная доля времени опытного программиста ушла не на это, а на изучение теории. Чтобы его догнать, начинающему придется изучить ту же самую теорию в том же объеме - и, значит, потратить примерно столько же времени.
Далее было вот что (привожу только выдержки, относящиеся к сабжу).
=====================================
GrayFace © (22.07.04 16:53) [159]
> Юрий Зотов [156]
Если у вас львинная доля времени ушла на теорию, то вы - странный человек. Я не представляю, как можно больше любить изучение программирования, чем само программирование.
=====================================
Юрий Зотов © (22.07.04 17:38) [160]
> GrayFace © (22.07.04 16:53) [159]
Напишите калькулятор. Просто калькулятор. <skipped>
Когда напишете - сравните, сколько времени у Вас ушло на кодинг и отладку, а сколько - на все остальное. И задумайтесь над двумя вопросами:
1. Смогли бы Вы вообще написать такую программу без теории?
2. А что же такое есть программирование?
=====================================
GrayFace © (22.07.04 19:26) [161]
Программирование - это кодинг и придумывание структуры программы, как я и говорил
=====================================
Юрий Зотов © (22.07.04 19:55) [166]
А я Вам ответил - напишите калькулятор. Быть может, после этого Ваша уверенность и поколеблется.
=====================================
GrayFace © (23.07.04 09:56) [179]
На днях напишу калькулятор и покажу вам.
=====================================
Юрий Зотов © (23.07.04 11:36) [183]
ОК. Заодно и увидим, можно ли без знания теории языков написать безглючный строчный калькулятор "на днях".
=====================================
Далее пошло написание и тестирование калькулятора - но в той ветке это был оффтопик и сабж перехал сюда.
← →
NeyroSpace © (2004-07-26 14:34) [73]>процедуры, объекты... Не в этом же суть
образ мышления разный, и соответственно возможности в построениии алгоритмов.
← →
Огромное Кулясищще © (2004-07-26 14:39) [74]2 Юрий Зотов:
>Они были изложены в предыдущей ветке. Обычный набор - унарные плюс и минус, 4 действия арифметики, возведение в степень, скобки с любым уровнем вложенности и несколько любых функций (каких и сколько - неважно, ну пусть, например sin и cos).
Модуль ввиде |a| вам нужен?
И ещё. Например, я считаю запись 2^-2 недопустимой (нужно 2^(-2)). Вы согласны?
← →
Юрий Зотов © (2004-07-26 14:59) [75]> Огромное Кулясищще © (26.07.04 14:39) [74]
Модуль вообще не обязателен. Хотите - делайте его (в любом виде), хотите - не делайте совсем. Возьмите пару-тройку ЛЮБЫХ функций, хоть с модулем, хоть без него - этого будет вполне достаточно.
2^-2 - синтаксически вполне допустимое выражение. 2^(-2) - тоже. Следовательно, оно должно правильно вычисляться в любой форме.
← →
Сергей Суровцев © (2004-07-26 15:32) [76]>Юрий Зотов © (26.07.04 14:32) [72]
>Ссылка на исходную ветку есть выше.
Спасибо. Я читал, за исключением ну совсем уж мокрых мест.
На тему:
>сколько времени нужно начинающему программисту, чтобы
>сравняться с опытным - столько же, сколько на это потратил
>опытный, или гораздо меньше.
Конечно меньше, иногда намного ибо иначе не было бы движения вперед вообще. Новое поколение успевало бы только усвоить те же знания, что и предыдущее. За доказательство теоремы Пифагора в 14м веке давали звание магистра. А разрыв в объеме знаний в пределах начала и конца 20го века - несколько порядков. Другое дело, что подобная скорость и достигается путем освоения в теории (быстро и четко) того, что предыдущее поколение вымучило практикой (и созданием, собственно, этой теории). Поэтому не изучать теорию глупо.
Но Вы сами поставили вопрос о калькуляторе, как о неком мериле истины, :) поэтому дайте уж ему шанс съиграть на равных, хотя бы теоретическую возможность выиграть. Судя по его словам "придумывание структуры программы" - это и есть ее теоретическая подготовка, описание задач и методов их решения, обдумывание алгоритмов, увязка и т.д. Ибо это и есть основа программирования, а без этого стучать по клавиатуре бессмысленно, если только не получать удовольствие от самого звука это стука.
>Огромное Кулясищще © (26.07.04 14:39) [74]
>Модуль ввиде |a| вам нужен?
>И ещё. Например, я считаю запись 2^-2 недопустимой (нужно 2^(-
>2)). Вы согласны?
Было бы неплохо остановиться на каком-то одном нике. А Вам не приходило в голову, что раз для модуля во всех языках программирования используется функция, то это не просто так? :))
Если Вы будете описавыть КАЖДОЕ недопустимое выражение, то мы все уйдем в мир иной задолго до того как Вы занчите. Есть правило - два знака подряд идти не могут. Этого достаточно.
А вот список этих правил должен быть обнародован ПЕРЕД калькулятором. А уже сам калькулятор должен соответствовать заявленной спецификации. Тогда не придется спрашивать согласие на каждое действие в отдельности. :))
← →
Igorek © (2004-07-26 15:38) [77]
> Юрий Зотов © (26.07.04 12:01) [48]
> И если человек некую задачу пока еще не смог формализовать
> и запрограммировать, то комп бессилен.
Неа.
← →
Огромное Кулясищще © (2004-07-26 15:42) [78]2 Сергей суровцев:
>А вот список этих правил должен быть обнародован ПЕРЕД калькулятором. А уже сам калькулятор должен соответствовать заявленной спецификации. Тогда не придется спрашивать согласие на каждое действие в отдельности. :))
А я так и сделал.
>2^-2 - синтаксически вполне допустимое выражение. 2^(-2) - тоже. Следовательно, оно должно правильно вычисляться в любой форме.
Не согласен. В обычной записи на бумаге мы можем написать, например, основание 2 и показатель -2*3. Как же вы эту запись запишите строчкой без скобок?
← →
Игорь Шевченко © (2004-07-26 15:45) [79]
> Как же вы эту запись запишите строчкой без скобок?
Скобки вводятся тогда, когда необходимо явно указать приоритет операций. Скобки тоже имеют приоритет...
← →
Anatoly Podgoretsky © (2004-07-26 15:46) [80]унарный минус имеет более высокий приоритет
← →
Григорьев Антон © (2004-07-26 15:51) [81]
> Огромное Кулясищще © (26.07.04 15:42) [78]
> 2 Сергей суровцев:
>
> >А вот список этих правил должен быть обнародован ПЕРЕД
> калькулятором. А уже сам калькулятор должен соответствовать
> заявленной спецификации. Тогда не придется спрашивать согласие
> на каждое действие в отдельности. :))
>
> А я так и сделал.
Нет, не сделал. Правила должны быть записаны в виде [59]. Чтобы про любое выражение можно было сказать, допустимо ли оно синтаксически, руководствуясь только формальным подходом, а не той способностью к додумыванию, которой нет у компьютера.
> >2^-2 - синтаксически вполне допустимое выражение. 2^(-2)
> - тоже. Следовательно, оно должно правильно вычисляться
> в любой форме.
>
> Не согласен. В обычной записи на бумаге мы можем написать,
> например, основание 2 и показатель -2*3. Как же вы эту запись
> запишите строчкой без скобок?
А при чём здесь это? Если, например, выражение 2*(2+3) не может быть записано без скобок, то это ещё не повод требовать писать 2*(2) вместо 2*2.
← →
Внук © (2004-07-26 15:58) [82]>>Огромное Кулясищще © (26.07.04 15:42) [78]
> >2^-2 - синтаксически вполне допустимое выражение. 2^(-2)
> - тоже. Следовательно, оно должно правильно вычисляться
> в любой форме.
>
> Не согласен.
Что такое "a в степени b" - это число или выражение a, далее знак ^, далее число или выражение b. -2 является числом? Безусловно. Следовательно, 2^-2 допустимо. Равно как и 2^(-2). И если бы была построена грамматика, таких вопросов бы не возникало ни у создателя программы, ни даже у тестировщика.
← →
Юрий Зотов © (2004-07-26 16:14) [83]> Сергей Суровцев © (26.07.04 15:32) [76]
> Конечно меньше, иногда намного ибо иначе не было бы движения
> вперед вообще. Новое поколение успевало бы только усвоить те
> же знания, что и предыдущее. За доказательство теоремы
> Пифагора в 14м веке давали звание магистра. А разрыв в объеме
> знаний в пределах начала и конца 20го века - несколько
> порядков. Другое дело, что подобная скорость и достигается
> путем освоения в теории (быстро и четко) того, что предыдущее
> поколение вымучило практикой (и созданием, собственно, этой
> теории).
Подчеркнутая мною фраза говорит, что если речь идет обо всем человечестве и исторически значимом промежутке времени (таком, за который предыдущие поколения УСПЕЛИ создать теорию и последующим осталось только ее изучить), то Вы правы. А если речь идет о двух конкретных людях со сравнительно небольшой разницей в возрасте (за которые новых значимых обощений человечество не наработало)- то вряд ли. Потому что младшему придется усваивать практически все то же самое, что проходил и старший.
> Огромное Кулясищще © (26.07.04 15:42) [78]
Видите ли, в чем дело... обычная запись на бумаге и запись в ОДНУ строку - вещи разные. Не стоит сравнивать стулья с балалайками.
<factor> := <operand> | <operand> ^ <factor>
<operand> ::= <number> | <function> | ( <expression> )
<number> ::= <sign> <unsigned> //если рассматривать только целые
<sign> ::= + | - | <empty>
<empty> ::=
И этим ВСЕ сказано. А яблоки падают вниз, а не вверх - хотите Вы того, или нет. Ваше согласие им, извините, по барабану.
← →
Romkin © (2004-07-26 16:22) [84]Задача сравнительно легко, быстро и кратко решается конечным автоматом магазинного типа :)
Вот только чтобы понять, что такое "автомат с магазином" (это не Калашников!) нужно немного теории :)
← →
Игорь Шевченко © (2004-07-26 16:30) [85]Romkin © (26.07.04 16:22)
> Задача сравнительно легко, быстро и кратко решается конечным
> автоматом магазинного типа :)
Насколько я помню, для полькой записи. Нет ?
← →
Romkin © (2004-07-26 16:36) [86]По-моему, для польской магазин уже не нужен...
← →
Огромное Кулясищще © (2004-07-26 16:43) [87]<factor> := <operand> | <operand> ^ <factor>
<operand> ::= <number> | <function> | ( <expression> )
<number> ::= <sign> <unsigned> //если рассматривать только целые
<sign> ::= + | - | <empty>
<empty> ::=
И этим ВСЕ сказано. А яблоки падают вниз, а не вверх - хотите Вы того, или нет. Ваше согласие им, извините, по барабану.
Простите, но это меня начинает бесить. Только возникает дельная мысль, как вы из какой-то книжки или ещё откуда-то достаёте какую-то запись и тычете ею. Мне эта запись ничего не говорит, и более того, теперь я её презираю. Мало ли что мог кто-то когда-то написать. Мне абсолютно пофиг, делать 2^-2 допустимым или нет, но предложения типа "делай, как Пётр I велел" я не поддерживаю.
По делу. Всё, ваяю скобки. Скобки только круглые, раз уж разница между стулом и балалайкой такая огромная.
Извиняйте, вспылил тут немного.
← →
Игорь Шевченко © (2004-07-26 16:44) [88]Romkin © (26.07.04 16:36)
У меня осталось впечатление по "Ахо, Ульман. Теория синтаксического анализа, перевода и компиляции, М., Мир, 1978". Правда, читал я ее в 80-ых годах, мог и позабыть :)
← →
calm © (2004-07-26 16:45) [89]
> Мне эта запись ничего не говорит
Вот и не пылите.
Если люди говорят на языке, который вы не понимаете, то вы презираете этот язык?
← →
Anatoly Podgoretsky © (2004-07-26 16:46) [90]Огромное Кулясищще © (26.07.04 16:43) [87]
Это плохо - надо сдерживаться
А насчет непонимания, самое время восполнить этот пробел.
← →
DiamondShark © (2004-07-26 16:48) [91]
> Romkin © (26.07.04 16:36) [86]
> По-моему, для польской магазин уже не нужен...
Именно для польской он и нужен ;)
← →
Юрий Зотов © (2004-07-26 16:55) [92]> Romkin © (26.07.04 16:36) [86]
Именно нужен.
Обычная запись: (a+b)*c
Польская запись: ab+c*
Алгоритм работы МП-вычислителя:
1. Встретили операнд - затолкнули его в стек.
2. Встретили операцию - вытолкнули их из стека два верхних операнда, произвели над ними эту операцию, результат затолкнули в стек.
Входной_символ Содержимое_стека (вершина слева)
a a
b ba
+ s (сумма a+b)
с cs
* r (произведение s*с)
← →
Игорь Шевченко © (2004-07-26 16:57) [93]Юрий Зотов © (26.07.04 16:55)
Спасибо, значит, память мне не совсем изменяет :)
← →
Огромное Кулясищще © (2004-07-26 17:03) [94]Всё, тестирую своё чудо.
← →
Юрий Зотов © (2004-07-26 17:06) [95]> Огромное Кулясищще © (26.07.04 16:43) [87]
> но предложения типа "делай, как Пётр I велел" я не поддерживаю.
Это велит не Петр I и даже не Юрий Зотов.
:о)
Это велит та самая теория. Можете ее поддерживать, можете не поддерживать - ей это как-то все равно. Но до тех пор, пока Вы не поддержите эту, либо какую-то другую теорию, все Ваши попытки обречены на провал.
Понимаете, арифметика говорит, что 2*3 будет 6. Можете с этим соглашаться, а можете придумать и свою собственную арифметику - но результат в любом случае будет один и тот же: до тех пор пока Вы не сформулируете какой-либо ОДНОЗНАЧНЫЙ алгоритм (или таблицу) умножения, умножать Вы не сможете.
← →
Kerk © (2004-07-26 17:06) [96]
> Игорь Шевченко © (26.07.04 16:57) [93]
> Юрий Зотов © (26.07.04 16:55)
Кончайте подсказывать. Это не спортивно! Они должны свой способ придумать!
← →
Григорьев Антон © (2004-07-26 17:24) [97]
> Kerk © (26.07.04 17:06) [96]
>
> > Игорь Шевченко © (26.07.04 16:57) [93]
> > Юрий Зотов © (26.07.04 16:55)
>
> Кончайте подсказывать. Это не спортивно! Они должны свой
> способ придумать!
Ну, судя по [87], эти подсказки всё равно впрок не идут.
← →
Юрий Зотов © (2004-07-26 17:26) [98]> Игорь Шевченко © (26.07.04 16:57) [93]
Память... какое красивое имя...
:о)
← →
Огромное Кулясищще © (2004-07-26 17:27) [99]2 Юрий Зотов:
Сглотнув слюну, выдаю вам:
http://www.hot.ee/gelphi/Calculator.zip
← →
Romkin © (2004-07-26 17:30) [100]Юрий Зотов © (26.07.04 16:55) [92] А разве здесь нельзя заменить стек двумя регистрами?
← →
calm © (2004-07-26 17:34) [101]
> А разве здесь нельзя заменить стек двумя регистрами?
Это как, позвольте?
← →
Romkin © (2004-07-26 17:41) [102]calm © (26.07.04 17:34) [101] Лемма: для польской записи глубина стека не превышает двух операндов :))
Учитывая только двухместные операции, разумеется.
← →
Юрий Зотов © (2004-07-26 17:42) [103]> Romkin © (26.07.04 17:30) [100]
Двух может и не хватить. Вот здесь, например, нужно уже три:
(a+b)*c-(d+e)/f
ab+c*de+f/-
Да и стек удобнее. Не зря ведь назвали МП-автомат. Можно, конечно, использовать пронумерованные регистры - но ведь это, по сути, получится тот же самый стек.
← →
Romkin © (2004-07-26 17:46) [104]А, точно :)
← →
Юрий Зотов © (2004-07-26 17:48) [105]> Огромное Кулясищще © (26.07.04 17:27) [99]
При щелчке по ссылке IE виснет.
← →
calm © (2004-07-26 17:49) [106]
> Лемма: ...
:)
← →
calm © (2004-07-26 17:50) [107]
> При щелчке по ссылке IE виснет.
Мне исправно предложилось скачать файл.
Но я не стал :)
← →
Игорь Шевченко © (2004-07-26 17:53) [108]Огромное Кулясищще © (26.07.04 17:27) [99]
А как интерпретировать результат вида -1,11111111111111E102}E{66
← →
Игорь Шевченко © (2004-07-26 17:55) [109]Огромное Кулясищще © (26.07.04 17:27) [99]
Вдогонку - глючит по самое не могу, Access Violations сплошь и рядом. Может, лучше теорию поучить ? :)
← →
Romkin © (2004-07-26 17:59) [110]:)))))))
← →
calm © (2004-07-26 17:59) [111]
> Может, лучше теорию поучить ? :)
Кулясищще, не поддавайся на провокации, держись!
Другого такого развлечения я в инете не найду :)
А если серьезно, то по-моему, необходимость теоретической подготовки продемонстрирована весьма наглядно, может и вправду пора сдаваться?
← →
Игорь Шевченко © (2004-07-26 18:03) [112]Очень любопытные результаты получаются при вычислении выражения вида "1+(1-1))))" - результатом является "1}))"
Желающие могут попробовать вычислить выражение вида "1,2/(1,2222-1,22221)" (можно вместо запятых использовать точки)
← →
Ihor Osov'yak © (2004-07-26 18:06) [113]2 [112] Игорь Шевченко © (26.07.04 18:03)
> 1,2/(1,2222-1,22221)
Ну Вы и мерзопакостный тип :-).
С возвращением!
← →
Игорь Шевченко © (2004-07-26 18:10) [114]Ihor Osov"yak © (26.07.04 18:06)
> Ну Вы и мерзопакостный тип :-).
Пустили козла в огород - дали программку потестировать :)
> С возвращением!
Отпуск всегда кончается раньше, чем хотелось бы :)
← →
Romkin © (2004-07-26 18:15) [115]Хм. А фигурные скобки откуда берутся? 8-\
← →
Nous Mellon © (2004-07-26 18:18) [116]Ну раз уж Михей сел писать калькулятор - быть беде :)
← →
Юрий Зотов © (2004-07-26 18:18) [117]> Огромное Кулясищще © (26.07.04 17:27) [99]
Ну виснет у меня IE, и все тут. Не скачивается ссылка.
> Игорь Шевченко © (26.07.04 18:03) [112]
> 1,2/(1,2222-1,22221)
Немного странно. Подобный "зубодробительный" тест я тоже держал в загашнике, но никак не ожидал, что его "зубодробительность" проявится уже при разнице всего лишь в 6-м знаке. Ожидал, что потребуется знаков 15-20 (в зависимости от используемого внутренного типа). Похоже, что это глюк не арифметики, а парсера.
← →
Игорь Шевченко © (2004-07-26 18:23) [118]Юрий Зотов © (26.07.04 18:18)
> Похоже, что это глюк не арифметики, а парсера.
Разумеется. Судя по тому, что в результате появляются нечисловые символы, всю программу можно смело отправлять в Recycle Bin.
← →
Огромное Кулясищще © (2004-07-26 18:29) [119]>Очень любопытные результаты получаются при вычислении выражения вида "1+(1-1))))" - результатом является "1}))"
Да, у меня на портативном калькуляторе тоже любопытные результаты получаются.
>Похоже, что это глюк не арифметики, а парсера.
Вряд ли.
← →
Igorek © (2004-07-26 18:31) [120]С теорией и дурак напишет - ты попробуй без теории...
← →
Игорь Шевченко © (2004-07-26 18:32) [121]Огромное Кулясищще © (26.07.04 18:29) [119]
> >Похоже, что это глюк не арифметики, а парсера.
>
> Вряд ли.
Для проверки запускаем калькулятор Windows и видим результат:
1,2/(1,2222-1,22221) = -0,00001
Never attribute to malice...
← →
Игорь Шевченко © (2004-07-26 18:33) [122]Igorek © (26.07.04 18:31) [120]
> С теорией и дурак напишет
Если не трудно, нельзя ли проиллюстрировать эту фразу ? :)
← →
Огромное Кулясищще © (2004-07-26 18:36) [123]2 Игорь Шевченко:
Парсер - не алгоритм. Алгоритм там правильный - это я вам отвечаю.
← →
Igorek © (2004-07-26 18:38) [124]
> Игорь Шевченко © (26.07.04 18:33) [122]
> > С теорией и дурак напишет
> Если не трудно, нельзя ли проиллюстрировать эту фразу ?
> :)
Трудно. Надо дурака найти. :-)
← →
Юрий Зотов © (2004-07-26 18:41) [125]> Igorek © (26.07.04 18:31) [120]
> С теорией и дурак напишет - ты попробуй без теории...
А умный без теории и писать не станет.
Что-то вспоминается мне постинг Думкин"а о стремлении некоторых людей писать против любого ветра. Неважно, какого - лишь бы писать.
А еше о том, что истинная оригинальность (а не оригинальничание) требует глубоких знаний и серьезный работы.
← →
Огромное Кулясищще © (2004-07-26 18:42) [126]2 Игорь Шевченко © (26.07.04 18:32) [121]:
Ну так естессно, если Delphi какую-то фигню выдаёт. Что за буква "E" в числе? Это великий компилятор?
← →
Юрий Зотов © (2004-07-26 18:48) [127]> Огромное Кулясищще © (26.07.04 18:42) [126]
Вот только что нажал в Delphi Сtrl+F7 и вычислил:
1.2/(1.2222-1.22221)
Результат: -120000 и никаких проблем.
← →
Ihor Osov'yak © (2004-07-26 18:50) [128]> Что за буква "E" в числе?
хм, имхо, это даже не "оригинальничание". Это либо отсутствие элементарных знаний, либо.. Я лучше промолчу, останусь политкорректным :-)
← →
Юрий Зотов © (2004-07-26 18:52) [129]> Огромное Кулясищще © (26.07.04 18:42) [126]
> Ну так естессно, если Delphi какую-то фигню выдаёт. Что за
> буква "E" в числе? Это великий компилятор?
"И этот человек запрещает мне ковыряться в носу"???
И этот человек берется писать калькуляторы?
:о)))))))))))))))))))))))))
← →
Огромное Кулясищще © (2004-07-26 18:53) [130]2 Юрий Зотов
>Для проверки запускаем калькулятор Windows и видим результат:
1,2/(1,2222-1,22221) = -0,00001
>Вот только что нажал в Delphi Сtrl+F7 и вычислил:
1.2/(1.2222-1.22221)
Результат: -120000 и никаких проблем.
:)))))
← →
Юрий Зотов © (2004-07-26 18:58) [131]> Огромное Кулясищще © (26.07.04 18:53) [130]
Если вспомнить, что калькулятор Windows - НЕстрочный, а в Delphi - строчный, то очень нетрудно сообразить, что калькулятором Игорь вычислял только знаменатель (в котором вся суть и есть), а при постинге скопировал мыщкой все выражение.
← →
False_Delirium © (2004-07-26 18:59) [132]Формулировка задачи плавно перетекает в "А слабо написать теорию конечных автоматов?".
Интересно, что победит ... жажда оправдать свою несостоятельность, потугами написать калькулятор или здравый смысл, как ещё одна ступень в саморазвитии?
← →
Огромное Кулясищще © (2004-07-26 19:01) [133]2 Юрий Зотов:
И всё же тем не менее. Ок, не учёл возможное представление числа. Допустим, починю. Вы скажете, что найдёте ещё ошибок. Найдёте. Опять починю. Вы опять скажете. И найдёте?
← →
Огромное Кулясищще © (2004-07-26 19:02) [134]2 False_Delirium © (26.07.04 18:59) [132]:
Че мотличает написать калькулятор по готовой теории, где вместо слова равно надо поставить := или же взять готовый компонент?
← →
VMcL © (2004-07-26 19:02) [135]>>Огромное Кулясищще © (26.07.04 18:42) [126]
>Что за буква "E" в числе?
Мдя. Даже не смешно, честное слово. И ты после этого хочешь написать строчный калькулятор? Серьёзно?
← →
Ihor Osov'yak © (2004-07-26 19:04) [136]2 [133] Огромное Кулясищще © (26.07.04 19:01)
см [6] Anatoly Podgoretsky © (24.07.04 19:51)
← →
Esu © (2004-07-26 19:22) [137]Сколоко уже времени ушло на разработку ? :)
Если алгоритм не очевиден то нужно его сначала придумать/вспомнить/где-то взять. Предполагаю что возможно где-то и найдется человек который "на лету" его может придумать и закодировать.
← →
Юрий Зотов © (2004-07-26 19:36) [138]> Огромное Кулясищще © (26.07.04 19:01) [133]
> Ок, не учёл возможное представление числа. Допустим, починю.
> Вы скажете, что найдёте ещё ошибок. Найдёте. Опять починю. Вы
> опять скажете. И найдёте?
Чтобы не повторяться, процитирую свой ответ [290] из исходной ветки. Точнее, P.S. и P.P.S. из этого ответа. И обратите самое серьезное внимание на выделенное жирным шрифтом.
P.S.
"До тех пор, пока не будет привлечена теория, ВСЕГДА найдется выражение, которое такой компилятор распознать и выполнить НЕ сможет".
(С) Юрий Зотов
P.P.S.
Пока что, как видите, мне удается найти такое выражение без малейших проблем. И это при том, что пока еще я совершенно не вникал в Ваш алгоритм и набираю выражения просто "с потолка". Естественно, по мере доработки программы это будет делать все сложнее и дольше - и вот тогда я проанализирую код, найду в нем слабое место и уже безо всякого подбора СРАЗУ напишу выражение, на котором программа все равно споткнется. И сколько бы Вы ее ни дорабатывали, так будет ВСЕГДА. Потому что - см. P.S. выше.
> Огромное Кулясищще © (26.07.04 19:02) [134]
> Че мотличает написать калькулятор по готовой теории, где
> вместо слова равно надо поставить := или же взять готовый
> компонент?
1. Не стоит думать, что задача сводится к подстановке оператонра присвоения вместо слова "равно". Не знаете - не говорите.
2. Тем, что программу можно написать и без компонентов, а вот калькулятор без теории написать НЕЛЬЗЯ.
3. Напишите по теории - узнаете, что даже и с ее использованием это будет НАМНОГО сложнее, чем компоненты по форме гонять.
← →
Огромное Кулясищще © (2004-07-26 19:48) [139]>так будет ВСЕГДА.
Спорим?
← →
Юрий Зотов © (2004-07-26 19:55) [140]> Огромное Кулясищще © (26.07.04 19:48) [139]
Судя по приведенным выше результатам тестирования, Вы пока еще не написали вообще никакого калькулятора. Потому что то, что Вы написали - это не калькулятор, а генератор ошибок.
Поэтому для начала напишите хоть какой-нибудь калькулятор, мистер спорщик.
← →
Anatoly Podgoretsky © (2004-07-26 19:55) [141]Юрий Зотов © (26.07.04 18:48) [127]
Тот же рещультат в Виндоус, инженерный калькулятор
← →
Esu © (2004-07-26 19:55) [142]А почему 2^-3 нельзя писать ?
← →
Anatoly Podgoretsky © (2004-07-26 19:58) [143]Даже при копировании 1,2/(1,2222-1,22221) пришлось заменить на запятые, Игорь просто не нажал конечный Enter
← →
Esu © (2004-07-26 20:12) [144]Ну не знаю как там с зубодробильными примерами но в последней версии он мне такое сказал:
8/(9+(1)+(-1))+1+1+1
-0,2}+{1}+{1}+{1
Глючит даже на таком:
(1)+(1)+(1)
2}+{1
Тоесть со скобками дело совсем плохо :(
← →
Esu © (2004-07-26 20:14) [145]Извиняюсь, скобки похоже не виноваты. Не работает + :(
3+1+2
4}+{2
← →
Anatoly Podgoretsky © (2004-07-26 20:16) [146]Не надоело спорить?
Первый обещал за 2 часа и где он
← →
Alx2 © (2004-07-26 21:51) [147]Нда... Однако задница. Хотел было послать на суд общественности свою наработку шестилетней давности, как вдруг, страхуясь (слово-то какое) обнаружил разницу в поведении программы после компиляции с отключенной оптимизацией супротив включенной. Самое странное, что я ожидал одинаковую работу программы в этих случаях. Но нет: без оптимизации словил классику - AV.
Причины очевидны. Где-то "руки не помыл" :) А немытье рук заключилось в том, что использовал фиксированные смещения для адресации в коде во вставках на asm (дооптимизировался, однако). И приехал к платформенно-зависимой программе. Не учел, что код настолько меняется в этих двух режимах (оптимизированный и as is). Короче говоря, урок на будущее получил на примере своего-же старого кода. Слава богам, что D3 от D6 не сильно уехал по способу оптимизации. Иначе мне светила бы разборка в стиле "чего это я хотел", глядя на собственноручно сотворенную хирургию с использованием перочинного ножа...
Ошибки молодости, мать их... Сейчас так не пишу. Но прошлое аукается. И на сей раз за это "ау" спасибо Ю.З. за предложение написать калькулятор :) И все-таки, после некоторой правки, готов выложить "на суд общественности свою наработку шестилетней давности". Правда, там написано, в основном, по-теории. Но не все. Так как не только синтаксический разбор идет.
← →
Cobalt © (2004-07-26 23:28) [148]1/sin(1,1222-1,22221)
Очекнь странное сообщение выдал - "Два действия подряд! [02А]"
Ничего не понимаю...
P.S. а виндовый калькулятор слопал, выдал -0,10001
← →
Cobalt © (2004-07-26 23:38) [149]Мда, действительно, виндовый калькулятор не так работает, как я предполагал :)
Вот правильный результат:
1/sin(1,1222-1,22221)=
1/sin(-0,10001)=
1/-0,0017455028985576529057483101606271=
-572,90079599771607277294464413762
← →
Murkt © (2004-07-26 23:42) [150]Я когда-то (с год назад) писал калькулятор. День писал, день обезбаживал. Вроде все подлые выражения вычисляет, но...
Он не умеет вычислять с нецелыми числами. Подозреваю, что для этого надо просто выкинуть проверку на правильность кода :)
Написано БЕЗ знания теории. И я на 98% уверен, что ЮЗ довольно быстро найдет невычисляемую строку :)
кстати, 2^-2=0.25. я все думал, сколько же это будет :)
← →
Murkt © (2004-07-26 23:51) [151]http://murkt.eth0.org.ua/calculator.exe - 46 кб.
http://murkt.eth0.org.ua/calculator.new.dpr - это немного измененный, он умеет (по идее) arc-функции. 7кб.
http://murkt.eth0.org.ua/calculator.new2.dpr - по идее может вычислять с нецелыми числами (закомментирована проверка). 7кб.
Делфи у меня нет в данный момент, потому проверить даже на синтаксические ошибки - не могу. Извиняйте.
← →
Юрий Зотов © (2004-07-27 05:35) [152]> Murkt © (26.07.04 23:51) [151]
> Написано БЕЗ знания теории. И я на 98% уверен, что ЮЗ довольно
> быстро найдет невычисляемую строку :)
Скачал последний вариант (который работает с нецелыми числами). Невычисляемую строку даже и не искал - ею оказалась самая первая.
Выражение: 2+5/3
Результат: пустая строка
Скажите - Вам не совестно выкладывать ТАКИЕ программы? Вы САМИ ее вообще-то тестировали?
← →
Юрий Зотов © (2004-07-27 06:08) [153]> Огромное Кулясищще
Из дома Ваше нерукотворное произведение скачалось. Результаты, как и следовало ожидать, плачевные:
выражение: 6*((2+5)/3+7)
результат: 54}.{33333333333333
Собственно, это не новость, меня куда больше интересовала зрелость программиста. Посмотрел код, стиль. Так вот, мистер спорщик, скажу прямо - не следовало бы Вам спорить. Рано еще.
← →
Думкин © (2004-07-27 06:31) [154]> [133] Огромное Кулясищще © (26.07.04 19:01)
> 2 Юрий Зотов:
> И всё же тем не менее. Ок, не учёл возможное представление
> числа. Допустим, починю. Вы скажете, что найдёте ещё ошибок.
> Найдёте. Опять починю. Вы опять скажете. И найдёте?
Это все замечательно. Только у человечества есть много таких замечательных примеров, когда люди презирая теорию пытаются что-то сделать, дабы показать этим недотепам. Примеры:
1. Посторение вечного двигателя при этом якобы опираясь на механику Ньютона, термодинамику и т.п.
2. Трисекция угла
3. Удвоение куба
4. Поиск решения уравнений степени выше 4-й в радикалах.
Вам еще? Греки удваивали куб, но их теория была слаба. После математики показали, что не получиться как хотелось. И многое иное. И используя механику Ньютона вы никогда не создадите механический вечный двигатель - по доказательству. В Париже это вполне заслуженно отправляют в помойку.
А вот с правильными многоугольниками. Гаусс сваял теорию, и тут же привел пример построения правильного 17-ти угольника.
Но всегда, всегда находятся те кто сие отвергает. Я не против если бы они вообще отвергали и создавали свое - ради бога. Но они почему-то прочитав 3 страницы из физики Кикоина - начинают строить вечный двигатель. Вот этого понять не могу. Или таки упорно делят произвольный угол на 3 равные части. Оно полезно, и я это делал - но чтобы пробудить что-то в понимании, а не чтобы построить - ибо знал что никак.
И вы так и будете латать ее(свое детище). И так будет со многими вашими творениями. Я бы работника с таким подходом уволил нафиг. Может что-то все-таки не так?
← →
Юрий Зотов © (2004-07-27 08:38) [155]> GrayFace (26.07.04 11:37) [45]
В пылу дискуссий даже пропустил, что Вы выложили новый вариант. Мои извинения.
Оценивая код всех представленных "калькуляторов", могу сказать, что пока что Ваш, IMHO - единственный, вообще заслуживающий хоть какого-то внимания. Алгоритм пока не анализировал - еще не пришло время, он и так валится. Вот что выяснилось.
Тест 1.
Выражение: ---5
Результат: -5
Комментарий: Бредовое выражение нормально вычисляется. С огромной натяжкой еще можно сказать, что это не бред, а три унарные операции, но пользователь такого калькулятора будет очень сильно удивлен.
Тест 2.
Выражение: --+5
Результат: 5
Комментарий: точно такой же, как и в тесте 1.
Тест 3.
Выражение: -+-5
Результат: Invalid floating point operation at offset 4
Комментарий: Если бред в тесте 2 проходит нормально, то почему точно такой же бред в тесте 3 дает ошибку? Ведь нем точно те же самые три унарные операции - где логика? Почему пользователь должен запоминать какие-то совершенно искусственные правила составления выражений?
Сорри, но мы говорили о НОРМАЛЬНОМ калькуляторе. Ваш же пока еще таковым не является.
← →
Alx2 © (2004-07-27 08:52) [156]>Юрий Зотов © (27.07.04 08:38) [155]
>Тест 1.
>Выражение: ---5
>Результат: -5
>Комментарий: Бредовое выражение нормально вычисляется. С >огромной натяжкой еще можно сказать, что это не бред, а три >унарные операции, но пользователь такого калькулятора будет >очень сильно удивлен.
Кстати говоря, то же самое "бредовое" выражение в Delphi вычисляется с читается синтаксически верным :) И в Excel, кстати, тоже. Видимо, разработчики тоже не писали калькулятор в свое время ;-)
← →
Сергей Суровцев © (2004-07-27 09:04) [157]>Думкин © (27.07.04 06:31) [154]
>Это все замечательно. Только у человечества есть много таких
>замечательных примеров, когда люди презирая теорию пытаются что-
>то сделать, дабы показать этим недотепам. Примеры:
>1. Посторение вечного двигателя при этом якобы опираясь на
>механику Ньютона, термодинамику и т.п.
Это благо, что они есть, ибо без них Вы все еще грызли бы бананы вися вниз головой. Когда какой-то чудак изобретал колесо его сородичи тащили мамонта, а он наверняка остался без обеда т.к. "кто не работает тот не ест". Но он все равно делал. И сделал. Стремление делать что-то свое, самостоятельное - единственная движущая сила прогресса. Конечно получится не у всех, даже не у большинства. И лишь единицы смогут сделать обобщения, вывести общие выводы и построить теорию для направления в целом, но они все равно будут. И это есть хорошо.
А насчет вечного двигателя - это даже не смешно. Вам, как лесному эльфу, возможно и не известно, но их уже десятки, если не сотни. Вы опять же хотите свести все к диалектической ловушке, когда при любых условиях будете правы. Дескать ничего вечного быть не может и энергия из "ниоткуда" не берется. И это, естественно верно. Но это не противоречит возможности создания двигателя (заметьте, производящего работу, а не просто преодолевающего трение), причем даже элементарного механического на основе ЛЮБОЙ из природных движущих сил, наиболее постоянной и доступной из которых является гравитация. И если такой двигатель проработает хотя бы 50 лет, причем без каких либо усилий с Вашей стороны, то какой же он если не вечный?
Конечно, я знаю, что такой двигатель Вы тут же назовете даровым и тут же скажете, что их то Вы как раз не отвергаете. Но ведь на лицо просто явная подмена понятий - реальную работающую конструкцию назовем даровым, а бредовую не работающую вечным двигателем. И можно ходить и гордиться своей правотой, но разве это будет честно? И разве в этом будет смысл?
>Огромное Кулясищще
Программу желательно садиться писать тогда, когда все уже придумано и продумано. И в голове не один десяток раз прокручено. Когда точно знаешь - что будешь делать и как все это будешь делать. А думать и писать паралельно... Глубоко паралельно и получится.
← →
Юрий Зотов © (2004-07-27 09:07) [158]> Alx2 © (27.07.04 08:52) [156]
Вот только в Delphi и -+-5 тоже вычисляется вполне нормально. То есть, раз уж разработчики специфицировали, что последовательнось унарных операций считается синтаксически верной, так они и обеспечили, что она ВСЕГДА синтаксически верна.
Есть разница, Вы не находите?
← →
Думкин © (2004-07-27 09:08) [159]> [157] Сергей Суровцев © (27.07.04 09:04)
А вот передергивать не надо. Стыдно должно быть при таком коверкании.
Речь не об этом, поэтому прочитай внимательно и остынь, о эльф лесной.
И не надо про иные вечные. вопрос идет о вполне явном вечном двигателе 1-го рода. Не надо, перед детьми не стыдно?
← →
Alx2 © (2004-07-27 09:13) [160]>Юрий Зотов © (27.07.04 09:07)
Согласен. Просто для меня естественна последовательность унарных операций. И я не согласился, что она вдруг оказалась бредовой.
А с -+-5 - глюк, конечно :)
← →
Рамиль © (2004-07-27 09:15) [161]
> Конечно, я знаю, что такой двигатель Вы тут же назовете
> даровым и тут же скажете, что их то Вы как раз не отвергаете.
> Но ведь на лицо просто явная подмена понятий - реальную
> работающую конструкцию назовем даровым, а бредовую не работающую
> вечным двигателем
Отвечу за Думкина:) Нет никакой подмены понятий, "даровый" двигатель он и есть даровый. Классический вечный двигатель не должен черпать энергию из вне, будь то хоть природные явления или пресловутый эфир, которого не существует. А на основе гравитации ни вечного, ни дарового двигателя не получится, как и на основе постоянного магнитного поля. На земле доступно только три первичных источника энергии - солнце, тепло недр земли и синтез/распад (может еще что то есть, конечно, поправьте, если ошибаюсь).
← →
Sandman25 © (2004-07-27 09:20) [162]Еще есть приливные станции, задействующие как раз гравитацию :)
← →
Думкин © (2004-07-27 09:22) [163]> [162] Sandman25 © (27.07.04 09:20)
Но вечного там тоже нет. :) Тормозимся однако.
← →
Alx2 © (2004-07-27 09:23) [164]Мой вариант разбора выражений лежит на spannew.narod.ru/trigon-sources.zip
Но это не совсем калькулятор. Вернее, совсем не калькулятор.
Это заготовка для преобразования выражений.
Код от 98-го года писанный "для внутреннего использования". Так что заранее сорри.
← →
Рамиль © (2004-07-27 09:24) [165]
> [162] Sandman25 © (27.07.04 09:20)
Ну вот, пропустил:) Вообщето это не чисто гравитация - на приливы расходуется кинетическая энергия связки Земля - Луна.
← →
Sandman25 © (2004-07-27 09:25) [166][163] Думкин © (27.07.04 09:22)
Естественно. Интересно, какое событие наступит раньше: Луна упадет на Землю или Земля упадет на Солнце?
← →
Sandman25 © (2004-07-27 09:28) [167][165] Рамиль © (27.07.04 09:24)
Конечно. Если не две материальные точки, а обычные тела, с протяженностью, вращаются вокруг друг друга, то происходит потеря из-за трения.
← →
Думкин © (2004-07-27 09:29) [168]> [166] Sandman25 © (27.07.04 09:25)
Или сутки станут вечными? :)
> [164] Alx2 © (27.07.04 09:23)
Удачи!
> Рамиль ©
Все верно. Спасибо. :)
← →
calm © (2004-07-27 09:38) [169]
> Мой вариант разбора
Ох.. мне тоже уже хочется написать свой калькулятор...
← →
NeyroSpace © (2004-07-27 09:52) [170]>Ох.. мне тоже уже хочется написать свой калькулятор...
Синдром Николая Быкова? :-)
← →
Anatoly Podgoretsky © (2004-07-27 09:53) [171]Ну его мы до сих пор ждем
← →
GrayFace (2004-07-27 09:57) [172]ЮЗ, докажите свое высказывание - найдите в моем алгоритме ошибку, которую невозможно будет исправить.
>При таком подходе Юрий может спать спокойно. Ибо вместо простого парсинга по 7 знакам
>Вы выбрали головную боль с произвольной трактовкой выражения. Это путь в лежачую восьмерку,
>даже без всяких переменных. Незнание теории не освобождает от необходимости ее придумать. :))
Трактовка вполне четкая, просто есть правила трактовки, которые, может быть, стоит изменить (Может быть лучше 2^2pi лучше интерпритировать, как 2^(2pi)). Головной боли в "sin2" вообще нету, а в "2pi" - мало. Основная головная боль - преоритет умножения без знака. По-моем будет логично его повысить, но с другой стороны, это же все-таки умножение...
>NeyroSpace © (26.07.04 14:14) [70]
Из мухи слона делаете. Строительство дерева - это тоже самое, что вычисление, вот только зачем оно калькулятору?
> 1,2/(1,2222-1,22221)
Результат моего калькулятора:-120000,000000001. А вот как сделать более точный подсчет, я не представляю. :(
Юрий Зотов [138]
>2. Тем, что программу можно написать и без компонентов, а вот калькулятор без теории написать НЕЛЬЗЯ.
Наоборот. Программа без компонент - БОЛЬШОЙ геморрой, а калькулятор без теории - 6 часов (если найдетеи еще ошибки - будет больше:)).
Anatoly Podgoretsky © (26.07.04 20:16) [146]
>Не надоело спорить?
>Первый обещал за 2 часа и где он
Я такого не обещал. Я здесь. Новая версия уже давно лежит [45,46], об ошибках никто не докладывает.
Юрий Зотов © (27.07.04 06:08) [153]
> Огромное Кулясищще
>Посмотрел код, стиль. Так вот, мистер спорщик, скажу прямо - не следовало бы Вам спорить. Рано еще.
А вот в этом я с вами полностью согласен.
← →
NeyroSpace © (2004-07-27 09:59) [173]>Из мухи слона делаете. Строительство дерева - это тоже самое, что вычисление, вот только зачем оно калькулятору?
Да это я так, просто послышалось, что-то о самообучении :-)
← →
calm © (2004-07-27 10:00) [174]Синдром Николая Быкова? :-)
Да нет..
Просто топик начал один калькуляторопИсатэл, а сейчас уже чуть ли не десяток :)
← →
Юрий Зотов © (2004-07-27 10:18) [175]> GrayFace (27.07.04 09:57) [172]
> ЮЗ, докажите свое высказывание - найдите в моем алгоритме
> ошибку, которую невозможно будет исправить.
ОК, но на анализ алгоритма потребуется время. Скорее всего, раньше выходных я просто не смогу этим заняться, а вот в выходные постараюсь. Будем считать это как бы пятничной головоломкой. :о)
> Программа без компонент - БОЛЬШОЙ геморрой, а калькулятор без
> теории - 6 часов (если найдетеи еще ошибки - будет больше:)).
Большой геморрой, или малый - неважно. Важно то, что программа без компонентов нормально пишется и нормально работает. А вот калькулятор без теории НИКОГДА нормально работать не будет. И пока что это только подтверждается.
> Новая версия уже давно лежит [45,46], об ошибках никто не
> докладывает.
См. [155]. Если уж калькулятор допускает последовательность унарных операций, то он должен допускать ее ВСЕГДА, а не в отдельных случаях.
← →
Игорь Шевченко © (2004-07-27 10:23) [176]Еще момент: При вычислении выражения 1/((1.2-1.21) результатом является Access Violation
← →
Cobalt © (2004-07-27 10:31) [177]2 GrayFace
Будьте добры, поясните - что означает ошибка "Два действия подряд! [02А]"???
Какие именно действия нельзя делать подряд?
Такое вот почему-то прокатывает - 1/3sin(1)
а такое - 1/sin(1) - нет
Что за дискриминация?
Какие у тебя правила вычисления?
1/3sin(3,1415926)
результат - 0,333333333333333}{0,0523359562429438
Почему у тебя результат - не число, а строка? что это ещё за варианты???
← →
VMcL © (2004-07-27 10:32) [178]>>Всем калькуляторописатялям
Может, прежде, чем выкладывать написанный код, выложите спецификацию выражений? А то бред какой-то получается: нашли дыру, залатали дыру, нашли, залатали, ...
Должно быть чёткое определение синтаксически корректных выражений и правил их вычисления - приоритет операций и т. п.
← →
mrcat © (2004-07-27 10:33) [179]>нашли дыру, залатали дыру, нашли, залатали, ...
нашли, залатали, попутно ещё пару-тройку создали ...
← →
Anatoly Podgoretsky © (2004-07-27 10:46) [180]VMcL © (27.07.04 10:32) [178]
Так это вообще не зубам, код рубить надо.
← →
Григорьев Антон © (2004-07-27 10:49) [181]
> VMcL © (27.07.04 10:32) [178]
> >>Всем калькуляторописатялям
>
> Может, прежде, чем выкладывать написанный код, выложите
> спецификацию выражений? А то бред какой-то получается: нашли
> дыру, залатали дыру, нашли, залатали, ...
>
> Должно быть чёткое определение синтаксически корректных
> выражений и правил их вычисления - приоритет операций и
> т. п.
Да я им об этом ещё вчера писал. А Юрий Зотов даже привёл пример такой спецификации. Только это всё - мёртвому припарки. Осознание необходимости такой спецификации - это осознание необходимости теории. А это и есть суть спора.
← →
Murkt © (2004-07-27 12:39) [182]Юрий Зотов © (27.07.04 05:35) [152]
Блин, ну хоть прочитать, то что я написал, можно было? А я написал, что у меня Делфи нет, и проверить даже на синтаксические (в коде) ошибки - не могу. Честно предупредил! Я даже удивлен, что оно скомпилировалось :)
А так - экспериментируйте с exe-шником, или с ".new." (хотя тут тоже никакой гарантии работы, но добавлены только арк-функции, потому по идее должны работать. Если я правильно написал названия делфевских.), а не new2.
Да, в екзешнике вроде бы и тангенс и котангенс вычисляются как тангенс - ошибка в коде. Но к алгоритму никакого отношения :)
← →
Esu © (2004-07-27 12:59) [183]sin(3,1415926)+++1
Syntax error at offset 16
← →
calm © (2004-07-27 13:17) [184]Блин, ну хоть прочитать, то что я написал, можно было? А я написал, что у меня Делфи нет, и проверить даже на синтаксические (в коде) ошибки - не могу.
Murkt, а зачем ты вообще свое твоерение показываешь?
← →
Murkt © (2004-07-27 13:26) [185]calm © (27.07.04 13:17) [184]
exe-шник - рабочий, скомпиленый год назад.
А почему оно показывает пустую строку - я понял. Вместе с комментированием проверки я закомментировали write :)
Сделал вроде бы нормальный, должно сейчас работать (перезалил).
Еще раз повторю адреса, чтоб не лазить далеко
http://murkt.eth0.org.ua/calculator.exe - неправильно работает тангенс.
http://murkt.eth0.org.ua/calculator.new.dpr - добавлены arc-функции.
http://murkt.eth0.org.ua/calculator.new2.dpr - убрана проверка выражения. возможно работает, скорее всего работает с нецелыми числами.
← →
False_Delirium © (2004-07-27 13:30) [186]Огромное Кулясищще © (26.07.04 19:02) [134]
Разница в знании устройства механизма.
Написании калькулятора необходимо начинать со знания математики.
← →
Григорьев Антон © (2004-07-27 15:31) [187]Кстати, о пользе теории. Компилятор для первых версий Фортрана написать сложнее, чем для первых версий Паскаля. Хотя, казалось бы, всё должно быть наоборот: Паскаль появился позднее, когда компьютеры стали мощнее, появилась возможность создавать более сложные компиляторы. А всё дело в том, что к моменту разработки Паскаля уже была придумана теория синтаксического разбора и стало понятно, как нужно строить синтаксис языка, чтобы он был непротиворечивым и подлежал разбору конечным автоматом. Вот компилятор и упростился.
> calm © (27.07.04 13:17) [184]
> Блин, ну хоть прочитать, то что я написал, можно было? А
> я написал, что у меня Делфи нет, и проверить даже на синтаксические
> (в коде) ошибки - не могу.
>
> Murkt, а зачем ты вообще свое твоерение показываешь?
Меня, кстати, тоже интересует этот вопрос. GrayFace и Кулясищще пытаются доказать, что теория для написания калькулятора не нужна. А что хотите доказать вы?
← →
Юрий Зотов © (2004-07-27 15:40) [188]> GrayFace (27.07.04 09:57) [172]
Значит, так - калькулятор глючит по-страшному. Вероятно, в основном из-за того, что его входной язык представляет собой загадку, ответ на которую неизвестен даже разработчику. То есть: мы писали некий алгоритм, и уж что получилось - то и получилось. А если теперь кто скажет, что это глюки, то мы ответим, что это не глюки, а такие вот фичи входного языка. Например:
Выражение: 2e + 5e (именно так - с пробелами)
Результат: 7 (!!!)
Выражение: --23e--1
Результат: 24
И подобных примеров можно привести множество (часть из них уже приводили и другие). Сорри, но давайте говорить честно - никакие это не запланированные фичи, а законмерные результаты того, что алгоритм писался наобум, а отлаживался методом последовательной вставки подпорок.
Поэтому: еще раз сорри, но я не стану тратить свое время на сколько-нибудь серьезный анализ недостатков алгоритма, который и без того на каждом шагу страдает белой горячкой. В этом нет никакой необходимости.
Если Вы действительно хотите, чтобы я занялся анализом всерьез, то для начала САМИ отнеситесь к своей программе СЕРЬЕЗНО и доведите ее до ПОЛНОГО ума. Чтобы это был действительно НОРМАЛЬНЫЙ калькулятор с НОРМАЛЬНЫМ входным языком. А не жалкая игрушечная поделка из детсадовского кружка "Умелые ручки".
И посмотрим, как это получится у Вас без теории.
← →
GrayFace (2004-07-27 16:02) [189]Юрий Зотов © (27.07.04 10:18) [175]
>См. [155]. Если уж калькулятор допускает последовательность унарных операций, то он должен допускать ее ВСЕГДА, а не в отдельных случаях.
Я не понял, о чем Вы. Унарные операции - это +,-,*,/ ?
Может быть, Вы говорите о sin(3,1415926)+++1? Я считаю эту запись неверной, также, как и sin(2)+----+1, но только это - особенность обработки. Мне не стоило ее указывать в списке допустимого.
Cobalt © (27.07.04 10:31) [177]
>2 GrayFace
>Будьте добры, поясните - что означает ошибка "Два действия подряд! [02А]"???
Она означает, что вы смотрите калькулятор Огромного Кулясищщя. А мой калькулятор - в постах [45] и [46].
Григорьев Антон © (27.07.04 10:49) [181]
>Да я им об этом ещё вчера писал. А Юрий Зотов даже привёл пример такой спецификации.
>Осознание необходимости такой спецификации - это осознание необходимости теории.
Ничего подобного. Спецификация очень важна, т.к. слишком много народу ее от меня требует. :) А в теории настолько большой нужды нет. Хоть в моем калькуляторе и было (и, может быть, будет) много глюков, но он универсальнее калькулятора, написанного по теории. Чтобы добавить в калькулятор, сделаный по теории, новую операцию с новым преоритетом, нужно модифицировать алгоритм (в той теории, котроую мне рассказал отец, после того, как я сделал этот калькулятор), а у меня надо только добавить новый элемент в массив. По затратам времени мой путь и путь по теории (изучение + кодинг) примерно равны.
Я не знаю, как описать по спецификации некоторые вещи, так что опишу словами.
<function>::=После имени идут либо скобки, либо число, либо функция, либо константа.
Преоритеты:
1) "^"
2) "*", "/", отсутствие операции(расценивается, как умножение).
3) "+", "-"
← →
Юрий Зотов © (2004-07-27 16:11) [190]> GrayFace (27.07.04 16:02) [189]
Это не спецификация. В спецификации должны быть четко определены ВСЕ понятия языка, а у Вас нет даже определения числа. Вот, скажем, 5E - это число, или синтаксическая ошибка?
← →
Игорь Шевченко © (2004-07-27 16:22) [191]GrayFace (27.07.04 16:02) [189]
> А в теории настолько большой нужды нет. Хоть в моем калькуляторе
> и было (и, может быть, будет) много глюков, но он универсальнее
> калькулятора, написанного по теории.
LOL !!!!!
Я конечно понимаю, что лавры Ивана Кулибина спать не дают, но не настолько же...
← →
VMcL © (2004-07-27 16:24) [192]>>GrayFace (27.07.04 16:02) [189]
Приоритет(ы), ё-моё.
← →
Григорьев Антон © (2004-07-27 16:29) [193]
> GrayFace (27.07.04 16:02) [189]
> Я не понял, о чем Вы. Унарные операции - это +,-,*,/ ?
Блин! Ну терминологию-то той предметной области, в которой вы пытаетесь программировать, знать надо! Унарные операции - это операции, производимые над одним операндом. Юрий имел ввиду унарный минус (изменение знака выражения) и унарный плюс (по сути, пустая операция, но допустимая синтаксически для симметрии с унарным минусом).
Кстати, судя по всему, вы даже не понимаете разницы между унарным и бинарным минусом. А берётесь писать калькулятор. Это всё равно что я, не знающий разницу между дебетом и кредитом, взялся бы писать бухгалтерскую программу.
> Может быть, Вы говорите о sin(3,1415926)+++1? Я считаю эту
> запись неверной, также, как и sin(2)+----+1, но только это
> - особенность обработки. Мне не стоило ее указывать в списке
> допустимого.
Надо сначала привести этот самый список допустимого, о чём вам уже говорили. То, что написано в [45], таким описанием не является, потому что там не написано, что, например, 2+2 является допустимым выражением. Надо либо привести весь список допустимых выражений (а он, как вы понимаете, бесконечен), либо привести правила, по которым мы однозначно можем сказать про любое выражение, допустимо ли оно.
А если несколько унарных операций подряд у вас являются недопустимыми, то почему вычисляется выражение ---5? (см. [155]). Тут уж либо такая последовательность допустима, либо нет, а избирательное применение закона ни к чему хорошему не приводит.
> <function>::=После имени идут либо скобки, либо число, либо
> функция, либо константа.
> Преоритеты:
> 1) "^"
> 2) "*", "/", отсутствие операции(расценивается, как умножение).
> 3) "+", "-"
Это не спецификация. Это [вырезано цензурой. А то модераторы удалят]. Знак "::=" должен описывать не то, что идёт после функции, а то, как синтаксически распознать функцию. Например, 2*(3+4) - это функция? После "2*" идут скобки, а в "спецификации" нигде не написано, что "2*" не может быть именем функции. Выражение "2+(-2)" допустимо? А выражение "2*(/2)"? Ваша "спецификация" не даёт возможности ответить на эти вопросы. Попытайтесь хотя бы понять ту спецификацию, которую Юрий написал в [83], чтобы понять, чем она отличается от того позорища, которое вы привели.
> Ничего подобного. Спецификация очень важна, т.к. слишком
> много народу ее от меня требует. :) А в теории настолько
> большой нужды нет. Хоть в моем калькуляторе и было (и, может
> быть, будет) много глюков, но он универсальнее калькулятора,
> написанного по теории. Чтобы добавить в калькулятор, сделаный
> по теории, новую операцию с новым преоритетом, нужно модифицировать
> алгоритм (в той теории, котроую мне рассказал отец, после
> того, как я сделал этот калькулятор), а у меня надо только
> добавить новый элемент в массив. По затратам времени мой
> путь и путь по теории (изучение + кодинг) примерно равны.
> Я не знаю, как описать по спецификации некоторые вещи, так
> что опишу словами.
Мне объяснили алгоритм калькулятора в школе. 45 минут на объяснение, следующие 45 - на кодирование. И всё работает. А у вас пока глючит не по-детски, да ещё и вы, автор, не можете толком сказать, какие выражения калькулятор поймёт, а какие - нет. И это - после примерно 7 (если не ошибаюсь) часов работы.
← →
calm © (2004-07-27 16:30) [194]
> Хоть в моем калькуляторе и было (и, может быть, будет) много
> глюков, но он универсальнее калькулятора, написанного по
> теории
Это как это? поясните пожалуйста. Мне отчего-то кажется, что с точностью до наоборот.
> Чтобы добавить в калькулятор, сделаный по теории, новую
> операцию с новым преоритетом, нужно модифицировать алгоритм
>
Ой ли?
> в той теории, котроую мне рассказал отец
Ваш отец тоже писал подобные калькуляторы? :-)
P.S. не сочтите за переход на личности, не в обиду..
← →
calm © (2004-07-27 16:33) [195]> Хоть в моем калькуляторе и было (и, может быть, будет) много
> глюков, но он универсальнее калькулятора, написанного по
> теории
> Чтобы добавить в калькулятор, сделаный по теории, новую
> операцию с новым преоритетом, нужно модифицировать алгоритм
>
Кстати, а как вы можете утверждать подобное, не владея теорией?
← →
pasha_golub © (2004-07-27 16:36) [196]Оффтоп: только что еще раз поглядел на описание грамматики Объектного Паскаля. Насколько же красиво!!! Да, определенно в математике (не будем придираться к слову :0) ) есть своя красота, особая. Даже слов нету.
← →
Григорьев Антон © (2004-07-27 16:40) [197]
> pasha_golub © (27.07.04 16:36) [196]
> Оффтоп: только что еще раз поглядел на описание грамматики
> Объектного Паскаля. Насколько же красиво!!! Да, определенно
> в математике (не будем придираться к слову :0) ) есть своя
> красота, особая. Даже слов нету.
И это при том, что грамматика Паскаля, в отличие, например, от грамматики Оберона, не полностью поддаётся формальному описанию :))
← →
pasha_golub © (2004-07-27 16:42) [198]Григорьев Антон © (27.07.04 16:40) [197]
Ы-ы-ы, можно носом ткнуть?
← →
Юрий Зотов © (2004-07-27 16:49) [199]> GrayFace
Хорошо, давайте сделаем так. Вполне понятно, что если человек не изучал теорию языков, то самому написать спецификацию языка для него будет затруднительно. Поэтому предлагаю помощь - я приведу пример такой спецификации, а Вы посмотрите, как это делается и либо примете ее, либо напишете свою. Но после того, как какая-то спецификация языка будет Вами принята, калькулятор обязан СТРОГО ей соответствовать и любое отклонение рассматривается, как глюк. Иначе калькулятором будет просто невозможно пользоваться - он окажется непредсказуем.
Годится?
← →
DiamondShark © (2004-07-27 16:51) [200]
> И это при том, что грамматика Паскаля, в отличие, например,
> от грамматики Оберона, не полностью поддаётся формальному
> описанию :))
С этого места подробнее.
← →
Григорьев Антон © (2004-07-27 16:53) [201]
> pasha_golub © (27.07.04 16:42) [198]
> Григорьев Антон © (27.07.04 16:40) [197]
> Ы-ы-ы, можно носом ткнуть?if ... then
if ... then
...
else
...
В терминах формальной грамматики невозможно описать, относится ли else к первому if или ко второму.
← →
pasha_golub © (2004-07-27 16:55) [202]Ко второму. Почему не возможно?
← →
calm © (2004-07-27 16:59) [203]
> Почему не возможно?
Попробуйте.
← →
pasha_golub © (2004-07-27 17:01) [204]calm © (27.07.04 16:59) [203]
Не могу. Но чувствую, что где-то подвох. И дело только в моем незнании. :0)
← →
Григорьев Антон © (2004-07-27 17:07) [205]
> pasha_golub © (27.07.04 16:55) [202]
> Ко второму. Почему не возможно?
Потому что формальное описание синтаксиса if выглядит так:
<Условный оператор>:==if <Условие> then <Оператор> [else <Оператор>]
При этом <Условный оператор> - частный случай <Оператор>. Мы можем рассматривать внешний if как if без else, а внутренний - как if c else, или наоборот - оба этих варианта удовлетворяют указанному описанию. Возникает неоднозначность. Поэтому приходится вводить правило о том, что else относится к ближайшему if, не имеющему else, и это правило не описывается никакой грамматикой.
Это как в C/C++: выражение a+++b допустимо трактовать как (a++)+b и a+(++b). Не помню, какая из трактовок считается правильной, но суть в том, что формальные грамматики этого не описывают.
Проблема эта давно известная, и в разных языках её решают по-разному. Например, в Алголе просто запретили вложенный if, если он не является частью составного оператора. А в Обероне и многих других языках отказались от идеи составного оператора, и грамматика if выглядит следующим образом:
<Условный оператор>:==if <Условие> then <Список операторов>
[{elseif <Условие> then <Список операторов}]
endif
← →
pasha_golub © (2004-07-27 17:09) [206]Ну про С, я наслышан. А вот про Паскаль, так слышу в первый раз. Или не в первый, просто должного внимания не уделил.
← →
Игорь Шевченко © (2004-07-27 17:17) [207]Григорьев Антон © (27.07.04 16:53) [201]
http://www.moorecad.com/standardpascal/pascal.y :)
← →
Юрий Зотов © (2004-07-27 17:28) [208]> Григорьев Антон
> В терминах формальной грамматики невозможно описать, относится
> ли else к первому if или ко второму.
Неоднозначность устраняется, если точку с запятой (или иной оконечный символ) сделать обязательной принадлежностью самого оператора, а не разделителем в списке операторов.
if ... then
if ... then ... ;
else ... ; // else относится к первому if
if ... then
if ... then ...
else ... ; // else относится ко второму if
То есть, формальная грамматика все же позволяет описывать такие констпукции. Пусть непаскалевская, но все равно позволяет.
← →
Григорьев Антон © (2004-07-27 17:37) [209]
> Юрий Зотов © (27.07.04 17:28) [208]
Не понял. То, что у тебя обозначено многоточием, тоже является оператором, поэтому тоже должно заканчиваться точкой с запятой. И тогда мы меняем шило на мыло - неоднозначность того, к чему относится else, заменяется на неоднозначность того, к чему относится точка с запятой. В С/C++ точка с запятой - это обязательная принадлежность оператора, а неоднозначность с if"ом остаётся.
> Игорь Шевченко © (27.07.04 17:17) [207]
Эта грамматика не реализуется конечным автоматом:
open_if_statement : IF boolean_expression THEN statement
| IF boolean_expression THEN closed_statement ELSE open_statement
;
пока анализатор не дойдёт до ELSE (или до того места, где должно быть ELSE, но его нет), он не сможет разобраться, требуется statement или closed_statement. Для разбора таких выражений требуется усложнённый вариант конечного автомата (не помню, как он называется).
← →
Игорь Шевченко © (2004-07-27 17:40) [210]Григорьев Антон © (27.07.04 17:37)
> Эта грамматика не реализуется конечным автоматом:
Она реализуется YACC"ом, может быть, этого достаточно ? :)
Кстати, в C та же самая запись оператора if, и точно так же else относится к последнему if.
← →
Юрий Зотов © (2004-07-27 17:43) [211]> Григорьев Антон © (27.07.04 17:37) [209]
> Не понял. То, что у тебя обозначено многоточием, тоже является
> оператором, поэтому тоже должно заканчиваться точкой с
> запятой.
Совершенно верно. И тогда в конце условного оператора в полном соответствии с формальным описанием будут идти две точки с запятой подряд - что и устраняет неоднозначность.
← →
Murkt © (2004-07-27 17:46) [212]>Меня, кстати, тоже интересует этот вопрос. GrayFace и Кулясищще пытаются доказать, что теория для написания калькулятора не нужна. А что хотите доказать вы?
А я хочу доказать, что у меня калькулятор лучше чем у Михея (Кулясища) и GrayFace, написанный за меньшее время ;)
Теория при написании очень желательна. ИМХО. Хотя свой калькулятор я написал без теории. Просто на написание нормального парсера, который делал, например, обратную польскую запись у меня ушло бы времени побольше. Хотя точно я не знаю, не пробовал, может получится быстро.
← →
Anatoly Podgoretsky © (2004-07-27 19:01) [213]Григорьев Антон © (27.07.04 17:07) [205]
Я сильно был обижен на Вирта, что не сделал такую конструкцию IF в Паскале.
← →
Огромное Кулясищще © (2004-07-27 19:06) [214]>А я хочу доказать, ... чем у Михея (Кулясища)
Давайте не будем загадывать.
← →
Огромное Кулясищще © (2004-07-27 19:07) [215]И кстати, "Врагу не сдаётся наш гордый Варяг!!!"
P.S.: "- Если идти все прямо да прямо, далеко не уйдешь..." (c) Маленький Принц
← →
nikkie © (2004-07-27 19:40) [216]>Огромное Кулясищще
разъясни, плиз, что за смысл ты вкладываешь в сей PS...
← →
Anatoly Podgoretsky © (2004-07-27 19:44) [217]Нормальные герои всегда идут в обход.
← →
DiamondShark © (2004-07-27 20:19) [218]
> Anatoly Podgoretsky © (27.07.04 19:01) [213]
> Григорьев Антон © (27.07.04 17:07) [205]
> Я сильно был обижен на Вирта, что не сделал такую конструкцию
> IF в Паскале.
Он быстро исправился. В Модуле она уже была.
← →
Огромное Кулясищще © (2004-07-27 21:01) [219]>разъясни, плиз, что за смысл ты вкладываешь в сей PS...
Думай. Думай много.
← →
Murkt © (2004-07-27 22:10) [220]Огромное Кулясищще © (27.07.04 19:06) [214]
А смайлика никто и не заметил.
← →
nikkie © (2004-07-27 22:20) [221]>Думай. Думай много.
у меня думалка еще такая не отросла.Он помолчал в раздумье, потом сказал:
- Очень хорошо, что ты дал мне ящик: барашек будет там спать по
ночам.
- Ну конечно. И если ты будешь умницей, я дам тебе веревку, чтобы
днем его привязывать. И колышек.
Маленький принц нахмурился:
- Привязывать? Для чего это?
- Но ведь если ты его не привяжешь, он забредет неведомо куда и
потеряется.
Тут мой друг опять весело рассмеялся:
- Да куда же он пойдет?
- Мало ли куда? Все прямо, прямо, куда глаза глядят.
Тогда Маленький принц сказал серьезно:
- Это не страшно, ведь у меня там очень мало места.
И прибавил не без грусти:
- Если идти все прямо да прямо, далеко не уйдешь...
думаю вот. явно где-то кому-то тесно. то ли мыслям в чьей-то голове, то ли операторам в чьей-то программе... но вот, что ты имел в виду, когда эту цитату вставлял?
← →
Огромное Кулясищще © (2004-07-27 22:29) [222]2 nikkie:
Отлично, электронный век даёт нам быстрый и удобный поиск.
← →
nikkie © (2004-07-27 22:36) [223]ну и ладно. не хочешь объяснять, не надо.
не будем отвлекаться от темы. ты собирался калькулятор написать.
← →
Cobalt © (2004-07-27 23:18) [224]Насчёт
Else
- если поразмыслить, то он должен соответствовать последнему предстоящемуif
.
(if <усл1>
then
[if <усл2>
then
{if <усл3>
then
else (для 3-го) }
else (для 2-го)]
else (для 1-го))
И по другому никак не сделаешь - как же можно описать случай, когда количество else меньше кол-ва if?
ну, разве что считать, что последний else ссответствует первому if, предпоследний else ссответствует второму if и т.д.
Но это уже как-то не очень...
← →
Юрий Зотов © (2004-07-27 23:45) [225]> Cobalt © (27.07.04 23:18) [224]
> как же можно описать случай, когда количество else меньше
> кол-ва if?
Например, так:
if <усл1> then
if <усл2> then
if <усл3> then <оператор> ; ; ; // Вот оно!
else (для 1-го) ;
Перед "Вот оно": первая точка с запятой завершает <оператор>, вторая - if <усл3>, а третья - if <усл2>.
То есть, достаточно сделать точку с запятой принадлежностью самого оператора (ведь if - тоже оператор). И все сразу получается, причем строго по грамматике.
← →
Сергей Суровцев © (2004-07-28 09:52) [226]>Думкин © (27.07.04 09:08) [159]
>А вот передергивать не надо. Стыдно должно быть при таком
>коверкании. Речь не об этом, поэтому прочитай внимательно и
>остынь, о эльф лесной.
Почему нет? Ты сам обобщил, я лишь утверждаю что от этого намного больше пользы, чем вреда. А про эльфа - мне картинка понравилась, хотя Баромир получился лучше. :))
>И не надо про иные вечные. вопрос идет о вполне явном вечном >двигателе 1-го рода. Не надо, перед детьми не стыдно?
Надеюсь ты не о себе?..
>Рамиль © (27.07.04 09:15) [161]
>Отвечу за Думкина:) Нет никакой подмены понятий, "даровый"
>двигатель он и есть даровый. Классический вечный двигатель не
>должен черпать энергию из вне, будь то хоть природные явления
>или пресловутый эфир, которого не существует.
Очень даже есть. Изначально вечный двигатель - это устройство, работающее само по себе, без приложения к нему энергии тем, кто его создал. Но это не значит, что эта энергия берется "ниоткуда", это значит, что источник энергии доступен устройству напрямую, без посреднических услуг человека. И тогда этот двигатель (способный производить работу) ограничен только сроком службы деталей. То что Вы называете "классическим" - это не утопия, это болное безумие, оно невозможно по самому приведенному определению. Отсюда и подмена понятий - общее направление искусственно разделено на два, бредовому оставлено старое название, а реальному придумано новое. А сделано это чтобы в очередной раз доказать - классики не ошибаются, даже если они ошибаются.
>А на основе гравитации ни вечного, ни дарового двигателя не
>получится как на основе постоянного магнитного поля.
Уже несколько десятков конструкций. Запатентованых. С рабочими моделями. Видимо эти люди не знали, что это невозможно... :))
>Cobalt © (27.07.04 10:31) [177]
>1/3sin(3,1415926)
>результат - 0,333333333333333}{0,0523359562429438
>Почему у тебя результат - не число, а строка? что это ещё за
>варианты???
Это не просто калькулятор, а вероятностный калькулятор. Результат означает 0,333333333333333, ну в крайнем случае 0,0523359562429438 :))
>GrayFace (27.07.04 16:02) [189]
><function>::=После имени идут либо скобки, либо число, либо
>функция, либо константа.
После имени функции ВСЕГДА и без всяких "либо" идет открывающая скобка.
И вообще - в военное время значение синуса может доходить до четырех.
← →
Gero © (2004-07-28 09:55) [227]
> После имени функции ВСЕГДА и без всяких "либо" идет открывающая
> скобка.
function a;
← →
Anatoly Podgoretsky © (2004-07-28 09:56) [228]Так может ни к чему так мучиться, может сразу Result := Random;
← →
Думкин © (2004-07-28 10:03) [229]> [226] Сергей Суровцев © (28.07.04 09:52)
> Почему нет? Ты сам обобщил, я лишь утверждаю что от этого
> намного больше пользы, чем вреда.
При таком подходе мы бы только и делали, что каждый раз изобретали палки заново. Именно об этом речь в этой ветке. И именно это я вкладывал в весь пост. Эксперементировать и что-то делать новое - кто ж против. Только вот что? Я могу заниматься триссекцией хоть до помутнения, равно как и удвоением куба. Но после ознакомления с опытом прежних людей и ознакомившись с их трудами - только в пьном виде. Или создам свою математику. Только создав, ибо в этой - ну никак. Конечно, синдром Кристобаля Хозеивича иногда находит на многих, но вполне заслужено получаем гнев Федора Симеоновича.
Про двигатели. Так вот то что вы пишите это совсем иное и вы подменяете понятия. И с подменнными понятиями набрасываетесь. Это верно?
Все-таки речь идет о том(у меня во всяком случае) что чел. создает "вечный двигун" и для доказательства его вечности (именно в первоначальном смысле - классическом) он использует теоритическую физику. Не свою заметьте, а ту в которой доказано, что сие нельзя. Я не против пусть строит и получает, только пусть обоснования ищет иные.
Нельзя в той математике что имеем получить 2+2=5, только поменяв понятие 4 на 5. Что вы с успехом и продемонстрировали заменив "вечный двигатель" на некое псевдо, и разведя говорильню.
Извиняюсь за резкость. Да, Боромир неплох. :)
← →
Григорьев Антон © (2004-07-28 10:20) [230]
> Игорь Шевченко © (27.07.04 17:40) [210]
> Григорьев Антон © (27.07.04 17:37)
>
>
> > Эта грамматика не реализуется конечным автоматом:
>
>
> Она реализуется YACC"ом, может быть, этого достаточно ?
> :)
Перечитал дома учебник, вынужден признать свою неправоту. if в Паскале описывается грамматикой Бекуса-Наура и, следовательно, реализуется конечным автоматом.
Вот, кстати, ещё одна причина учить теорию: чтобы Игорь Шевченко не поймал на глупой ошибке :))
Подробный комментарий для тех, кого заинтересовал спор на эту тему. Рассмотрим упрощённый Паскаль, в котором из структурных операторов имеется только if. Грамматика для него в этом случае запишется следующим образом:
<Оператор>::=<Согласованное_выражение> | <Несогласованное_выражение>
<Согласованное_выражение>::=if <условие> then <Согласованное_выражение> else <Согласованное_выражение> | любое выражение, не содержащее if
<Несогласованное_выражение>::=if <Условие> then <Оператор> | if <Условие> then <Согласованное_выражение> else <Несогласованное_выражение>
Такая грамматика позволяет однозначно определить, к какому if относится else. Недостатки этой грамматики по сравнению с грамматикой Оберона (см. [205]) следующие:
1) Человеку разобраться в ней сложнее.
2) Конечный автомат, реализующий такую грамматику, имеет больше состояний и, следовательно, сложнее. Кроме того, при левостороннем разборе, типичном для компиляторов, терминальный символ if не позволяет анализатору определить, согласованное ли это выражение или нет, поэтому приходится вводить в автомат ещё одно состояние: "if, но неизвестно, какой", или реализовывать не левосторонний, а более сложный разбор.
3) В Паскале присутствуют и другие операторы, и возможны конструкции типа for ... do if ... then ... [else ...], поэтому для операторов for, while, with приходится тоже вводить согласованную и несогласованную форму, а это ещё больше усложняет грамматику, а вместе с ней и анализатор.
P.S. Кого заинтересовала эта тема, могу посоветовать книгу http://www.delphikingdom.com/asp/book.asp?BookID=63
← →
GrayFace (2004-07-28 10:25) [231]>Выражение: 2e + 5e (именно так - с пробелами)
>Результат: 7 (!!!)
>Выражение: --23e--1
>Результат: 24
Нет. --23e--1=22. Очень странно, что FloatToStr("2e")=2 и FloatToStr("23e-")=23. Это они должны создавать exception, отсекая подобные случаи. Я сделаю проверку правильности чисел, но к алгоритму это не имеет отношения.
Юрий Зотов © (27.07.04 16:11) [190]
> GrayFace (27.07.04 16:02) [189]
>Это не спецификация. В спецификации должны быть четко определены ВСЕ понятия языка,
>а у Вас нет даже определения числа. Вот, скажем, 5E - это число, или синтаксическая ошибка?
Я описал только проблемные моменты. Остальное почти сооьветствует обычной спецификации.
Юрий Зотов © (27.07.04 16:49) [199]
>Но после того, как какая-то спецификация языка будет Вами принята, калькулятор обязан СТРОГО ей соответствовать и любое отклонение рассматривается, как глюк.
Придется делать унарный плюс. :o(
Григорьев Антон © (27.07.04 16:29) [193]
>Кстати, судя по всему, вы даже не понимаете разницы между унарным и бинарным минусом.
Конечно. Я не знаю, что такое бинарный минус.
>А берётесь писать калькулятор. Это всё равно что я, не знающий разницу между дебетом и кредитом,
>взялся бы писать бухгалтерскую программу.
Эти 2 слова - часть теории, ничуть не помогающая писать калькулятор, она нужна только для общения с теми, кто теорию знает.
>Попытайтесь хотя бы понять ту спецификацию, которую Юрий написал в [83], чтобы понять,
>чем она отличается от того позорища, которое вы привели.
Я не пытался написать спецификацию.
>А у вас пока глючит не по-детски, да ещё и вы, автор, не можете толком сказать, какие выражения калькулятор поймёт,
>а какие - нет. И это - после примерно 7 (если не ошибаюсь) часов работы.
Уже не глючит. Примерно 6 часов.
calm © (27.07.04 16:33) [195]
>Кстати, а как вы можете утверждать подобное, не владея теорией?
Я же сказал:
> в той теории, котроую мне рассказал отец
Хотя я не прав: если сделать конечный автомат, разбирающий спецификацию, то он будет гораздо универсальнее. Но если просто запрограммировать спецификацию (одна функция - для <factor>, другую -для и т.д. третью - для и т.п...), то добавлять новые операции с новыми преоритетами будет не так просто.
← →
Григорьев Антон © (2004-07-28 10:47) [232]
> GrayFace (28.07.04 10:25) [231]
> Я описал только проблемные моменты. Остальное почти сооьветствует
> обычной спецификации.
После такой фразы очевидно, что вы вообще не понимаете, зачем нужна спецификация. Она нужна не человеку - человек и так знает, как вычислять выражения. Она нужна компьютеру. Спецификация - это формальное описание тех правил, которые вы собираетесь заложить в свой анализатор. И слова "обычная спецификация" здесь не прокатят - компьютер не знает, что это такое. Нормальная спецификация должна быть основана на тех понятиях, которые однозначно распознаются компьютером (например, символ "+"), и любая абстракция в этой спецификации должна сводиться к комбинации этих понятий. Спецификация - это не столько набор того, что допустимо на входе анализатора, сколько описание его алгоритма.
> Я не знаю, что такое бинарный минус.
Без комментариев.
← →
Юрий Зотов © (2004-07-28 10:48) [233]> calm © (27.07.04 16:33) [195]
> Но если просто запрограммировать спецификацию (одна функция -
> для <factor>, другую -для и т.д. третью - для и т.п...), то
> добавлять новые операции с новыми преоритетами будет не так
> просто.
А новые операции добавлять и не нужно. Поддерживаемый любым языком набор операций полностью покрывает все, что может потребоваться прграммисту и поэтому заведомо известно, что новые операции просто никогда не будут нужны. И изменение приоритетов операций тоже никогда не потребуется (более того, оно просто недопустимо - иначе программа, написанная в одной версии языка может начать глючить в другой версии того же языка).
Вот набор операций Delphi:
- операции отношения
< = > <= <> >=
- логические и побитовые операции
and or not xor shl shr
- арифметические операции
+ - * / div mod
- прочие операции
@ in is as
Попробуйте предложить сюда еще что-нибудь ДЕЙСТВИТЕЛЬНО недостающее (сразу говорю, что возведение в степень ДЕЙСТВИТЕЛЬНО недостающей операцией не является).
← →
Игорь Шевченко © (2004-07-28 10:51) [234]
> Уже не глючит.
Ссылочку на неглючный в студию :)
Григорьев Антон © (28.07.04 10:20)
> Вот, кстати, ещё одна причина учить теорию:
Я, честно говоря, сам ее здорово подзабыл, ту самую теорию, благо последний раз читал 15 лет назад, причем, неплохую книжку Гриса.
Кстати, пользуясь случаем, спрошу, нету ли у тебя случайно книги
"Ф.Льюис, Д.Розенкранц, Р.Стирнз, Теоретические основы проектирования компиляторов" и "Генератор компиляторов У. Маккиман, Дж. Хорнинг, Д. Уортман" (книжки старые, я на авось спрашиваю...) :))
← →
pasha_golub © (2004-07-28 10:53) [235]Да, по поводу книжек я бы тоже спросил. Но вот в электронном виде, ибо...
← →
Cobalt © (2004-07-28 10:57) [236]2 GrayFace
А ссылку на калькулятор? по адресу http://www.hot.ee/gelphi/Calculator.zip размер архива не изменился ни на байт, mainUnit.pas - тоже (exe-ник я пересобираю из исходников)
1/3sin(1) - выдаёт 0,333333333333333}{0,0174524064372835
← →
Григорьев Антон © (2004-07-28 11:03) [237]
> Игорь Шевченко © (28.07.04 10:51) [234]
> Кстати, пользуясь случаем, спрошу, нету ли у тебя случайно
> книги
> "Ф.Льюис, Д.Розенкранц, Р.Стирнз, Теоретические основы проектирования
> компиляторов" и "Генератор компиляторов У. Маккиман, Дж.
> Хорнинг, Д. Уортман" (книжки старые, я на авось спрашиваю...)
> :))
К сожалению, нет. Я тоже до недавнего времени считал, что обойдусь и без теории, поэтому моя библиотека пока очень бедна и в ней есть только новые книги.
← →
Calm © (2004-07-28 11:05) [238]>>Хотя я не прав: если сделать конечный автомат, разбирающий спецификацию, то он будет гораздо универсальнее.
Колькуляторописатели сдают свои позиции :((
← →
GrayFace (2004-07-28 11:09) [239]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Math;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type TOperator=function(v1,v2:extended):extended;
TFunction=function(v:extended):extended;
TFunc=record
f:pointer;
name:string;
end;
TConst=record
v:Extended;
name:string;
end;
TBracketFunc=record
f:pointer;
left:string;
right:char;
end;
TOper=record
f:pointer;
name:string;
prior:integer;
end;
function Mul(v1,v2:extended):extended;
begin
Result:=v1*v2;
end;
function Div1(v1,v2:extended):extended;
begin
Result:=v1/v2;
end;
function Add(v1,v2:extended):extended;
begin
Result:=v1+v2;
end;
function Dec(v1,v2:extended):extended;
begin
Result:=v1-v2;
end;
function Stepen(v1,v2:extended):extended;
begin
Result:=exp(ln(v1)*v2);
end;
function Sin1(v:extended):extended;
begin
Result:=sin(v);
end;
function Cos1(v:extended):extended;
begin
Result:=cos(v);
end;
function Tg(v:extended):extended;
begin
Result:=tan(v);
end;
function Ctg(v:extended):extended;
begin
Result:=CoTan(v);
end;
function aSin(v:extended):extended;
begin
Result:=arcsin(v);
end;
function aCos(v:extended):extended;
begin
Result:=arccos(v);
end;
function aTg(v:extended):extended;
begin
Result:=arctan(v);
end;
function aCtg(v:extended):extended;
begin
if v=0 then Result:=pi/2
else Result:=arcTan(1/v);
end;
function Modul(v:extended):extended;
begin
Result:=abs(v);
end;
const Opers:array[0..4] of TOper=((f:@Add; name:"+"; Prior:10),(f:@dec; name:"-"; prior:10),(f:@Mul; name:"*"; prior:20),(f:@Div1; name:"/"; prior:20),(f:@stepen; name:"^"; prior:30));
OpMul:TOper=(f:@Mul; name:"*"; prior:20);
Funcs:array[0..7] of TFunc=((f:@sin1; name:"sin"),(f:@cos1; name:"cos"),(f:@tg; name:"tg"),(f:@ctg; name:"ctg"),(f:@asin; name:"arcsin"),(f:@acos; name:"arccos"),(f:@atg; name:"arctg"),(f:@actg; name:"arcctg"));
BracketFuncs:array[0..0] of TBracketFunc=((f:@Modul; left:"|"; right:"|"));
Consts:array[0..0] of TConst=((v:pi; name:"pi"));
procedure DoString(From,Tom:PChar; var s:string);
var i:integer;
begin
SetLength(s,integer(tom)-integer(from)+1);
for i:=1 to length(s) do
begin
if from^="." then s[i]:=DecimalSeparator
else s[i]:=from^;
inc(from);
end;
end;
function cmp(const s:string; p:PChar):boolean;
var s1:string; l:integer;
begin
l:=length(s);
SetLength(s1,l);
CopyMemory(@s1[1],p,l);
Result:=AnsiCompareText(s,s1)=0;
end;
function GetOper(var s:PChar; sep:Char; prior:integer; var done:byte; v1:extended):extended; forward;
{----------------------------------------------}
function GetNumber(var s:PChar):Extended;
var from,tom:PChar; step:integer;
begin
from:=pointer(s);
tom:=nil;
step:=0;
while true do
begin
if (s^="e") or (s^="E") then
begin
if step=1 then step:=2 else break;
end else
if (s^="-") then
begin
if (step and 1)<>0 then break;
end else
if (s^="+") then
begin
if (step and 1)<>0 then break;
end else
if (ord(s^)>=ord("0")) and (ord(s^)<=ord("9")) or (step<2) and ((s^=".") or (s^=DecimalSeparator)) then
begin
step:=step or 1;
tom:=s;
end else break;
inc(s);
end;
if (tom=nil) then raise Exception.Create("Syntax error");
if (step and 1)=0 then
begin
s:=pointer(from);
raise Exception.Create("Syntax error");
end;
s:=tom;
inc(s);
DoString(from,tom,s1);
try
Result:=StrToFloat(s1);
except
s:=pointer(from);
raise Exception.Create("Syntax error");
end;
end;
var s1:string; i:integer; Len:integer; Br:char; // vloz:integer=0;
← →
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-1089499317/ .
← →
Anatoly Podgoretsky © (2004-07-28 13:54) [281]Плохо будет соотносится, но в то же время реальность.
Вторую книгу очень хочется, был у меня Мартин, но куда то пропал.
← →
VMcL © (2004-07-28 14:15) [282]>>Юрий Зотов © (28.07.04 13:46) [279]
Точно не скажу, но, ИМХО, если распространять не в коммерческих целях, то это не настолько плохо, как в коммерческих :-D
← →
Григорьев Антон © (2004-07-28 14:48) [283]
> Юрий Зотов © (28.07.04 13:46) [279]
> Я тоже "за", но как это будет соотноситься с авторским правом
> и копирайтами? Спрашиваю, потому что сам в этих делах не
> спец.
Как ты ловко перевёл тему, лишь бы на [246] не отвечать ;-)
← →
Юрий Зотов © (2004-07-28 15:11) [284]> Григорьев Антон
Я просто проглядел.
Нет таких критериев, естественно. Все определяется разработчиками. Решили они, что именно такой набор операций удобен и достаточен - и все. Решили, что операции вообще не нужны - и тоже все. Решили еще как-то - и тоже все.
Кстати, раз уж пошел разговор о языках, то вот какая мысль пришла в голову. В языках, где оконечный символ есть обязательная принадлежность самого оператора (Си, PL/1...), а условный оператор определен, как
if <условие> then <оператор> [else <оператор>]
наблюдается такое противоречие.
Этот самый if должен:
- либо сам НЕ быть оператором;
- либо завершаться, как минимум, двумя оконечными символами.
Если же он завершает ОДНИМ оконечными символом (что на деле и есть), то получается, что он противоречит формальному описанию языка.
← →
Сергей Суровцев © (2004-07-28 15:26) [285]>Думкин © (28.07.04 13:31) [276]
>Можешь мне еще про Букварь лекции почитать.
Ну раз ты просишь... Букварь, дорогой Думкин, это такая
книжка, в которой в увлекательной форме разбирается
алфавит, соответствие звуков буквам, производится обучение
чтению...
Это, кажется, с lib.ru просто интереса ради.
К.Комаров. Путь изобретателя
Кое что есть здесь:
http://monsite.wanadoo.fr/perpetuum/page1.html
и здесь:
http://jnaudin.free.fr/html/permotr.htm
Но если что, грубо не ругаться! Первое что под руку подвернулось.
Было еще несколько, если найду, выложу.
И еще, если не ошибаюсь:
Из работающих, чисто на магнитах, моторов известен мотор Джонсона.
Реальный и обоснованный. Он работает, но мощности не создаёт.
При весе 25кг останавливается рукой. Но работать-то все равно
работает. (ссылку пока не нашел, сплошные лодочные моторы
предлагают :)) ).
← →
Cobalt © (2004-07-28 15:36) [286]http://skyzone.al.ru/tech/4151431.html
← →
Григорьев Антон © (2004-07-28 15:43) [287]
> http://monsite.wanadoo.fr/perpetuum/page1.html
Про эту ссылку могу сказать, что автор этого "мотора" несколько месяцев назад появлялся в конференции сайта www.skeptik.net и показал себя там абсолютным дилетантом. Убеждал всех, что двигатель был и работал, но из-за безденежья он его разобрал. А вообще, если зайти на станицу http://monsite.wanadoo.fr/perpetuum/page7.html где описание этого двигателя дано по-русски, убогость текста просто поражает. Особенно замечательна фраза "Этот двигатель (02 00723) не проверен и не расчитан, но я думаю что он должен работать...".
Короче, хватит фигнёй страдать и всякую ерунду постить. Те, кто действительно перевернул науку (Эйнштейн, Бор и т.п.), прекрасно разбирались в том, что было сделано до них. Не было в истории науки ни одного дилетанта, который ничего не знал, но сделал бы то, что считалось невозможным.
← →
DiamondShark © (2004-07-28 15:49) [288]
> Он работает, но мощности не создаёт.
LOL
← →
Григорьев Антон © (2004-07-28 15:50) [289]
> Cobalt © (28.07.04 15:36) [286]
Чушь. Не написано, откуда берётся энергия. А между тем, такой вопрос возникает. Либо надо указать источник, либо признать, что факт работы двигателя противоречит известным законам. А делать вид, что такой проблемы вообще не существует - типичный приём шарлатанов.
← →
Anatoly Podgoretsky © (2004-07-28 15:51) [290]Юрий Зотов © (28.07.04 15:11) [284]
Поэтому предпочитаю языки где
if <условие> then <блок> [else <блок>] end[if]
А пользоваться призодится, чем есть.
← →
Григорьев Антон © (2004-07-28 16:04) [291]
> Cobalt © (28.07.04 15:36) [286]
Читаю сейчас статью http://skyzone.al.ru/tech/freenrg2.html (приведённая вами ссылка является частью этой статьи). Вот несколько утверждений оттуда:
В 1934 году был продемонстрирован автомобиль конструкции Теслы, который не нуждался во внешних источниках знергии.
В 1921 году Хаббард продемонстировал лодочный мотор, также работающий сам по себе.
И за 80 лет эти вещи не попали в промышленность?!!! Почему? Мы ведь становимся свидетелями, как новые технологии и изобретения, дающие реальный эффект, в считанные годы внедряются и становятся привычными. Ответ может быть только один: эти изобретения до сих пор не внедрены потому, что всё это сказки для дилетантов.
← →
DiamondShark © (2004-07-28 16:08) [292]
> Ответ может быть только один: эти изобретения до сих пор
> не внедрены потому, что всё это сказки для дилетантов.
Нифига. Это заговор нефтяных монополий.
← →
Юрий Зотов © (2004-07-28 16:10) [293]> GrayFace [239, 240]
Результат 20-секундного тестирования последнего варианта калькулятора:
Выражение: -5e-2^2
Результат: Invalid floating point operation at offset 7
Скажите честно - Вам самому еще не смешно?
← →
Григорьев Антон © (2004-07-28 16:17) [294]
> DiamondShark © (28.07.04 16:08) [292]
>
> Нифига. Это заговор нефтяных монополий.
Это тоже сказки. Когда изобрели ДВС, угольные монополии не смогли ничего с ним сделать. И газовые монополии тоже не могли предотвратить замену газового освещения электрическим.
← →
Anatoly Podgoretsky © (2004-07-28 16:24) [295]Юрий Зотов © (28.07.04 16:10) [293]
Если приколами занимается, то на верно по полу от смеха катается, сколько народу развел.
← →
Рамиль © (2004-07-28 16:31) [296]
> Реальный и обоснованный. Он работает, но мощности не создаёт.
Это не то что LOL, это LMD!
Может насчет вечных двигателей ветку отдельную?. А то неудобно как то - не сочетаются с грамматиками и калькуляторами:)
← →
Anatoly Podgoretsky © (2004-07-28 16:36) [297]Предложение правильное, далее с двигателями будем поступать как французкая академия.
← →
GrayFace © (2004-07-29 08:08) [298]Вот новая версия калькулятора: www.grayface.chat.ru/Calk.zip
Спецификация:<Empty> ::=
<Sign> ::="+"|"-"
<Digit> ::="0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
<Operation1> ::="*"|"/"|<Empty>
<Operation2> ::="+"|"-"
<FunctionName>::="sin"|"cos"|"tg"|"ctg"|"arcsin"|"arccos"|"arctg"|"arcctg"
<exponent> ::="e"|"Е"
<Separator> ::="."|<DecimalSeparator>
<Number> ::=[{Digit}][Separator][{Digit}][<Exponent>[Sign]{Gigit}]
<function> ::=<FunctionName><atom>
<atom> ::=<number> | "pi" | <function> | "("<expression>")" | "|"<expression>"|"
<operand> ::=[{Digit}]<atom>
<factor> ::=<operand> | <factor> "^" <operand>
<term> ::=<factor>|<term><Operation1><factor>
<expression> ::=<term>|<expression><Operation2><term>
[]-может не быть {}-может быть много
Юрий Зотов © (28.07.04 11:12) [243]
>5E - это число, или синтаксическая ошибка?
Это Syntax Error ta offset 0
>А знаете, почему так вышло? Потому что изначально программа, естественно, писалась под обычный
>входной язык, но этого не получилось. Надо было как-то выходить из положения - и тогда в
>ход пошли те самые оговорки про "особые случаи". А их просто не должно быть, понимаете?
>Не должно быть никаких особых случаев, да и все тут. Программа должна иметь абсолютно понятный
>пользователю входной язык и однозначно его обрабатывать. Вот это и называется НОРМАЛЬНЫМ калькулятором.
Нет. Она писалась сразу под такой входной язык. В новой версии есть константа EmptyMul - отключите ее и все будет четко. Вы чуть-чуть правы, т.к. если бы я требовал заключения аргументов функций в скобки, мне бы пришлось чуть-чуть по-больше повозится с этим.
Юрий Зотов © (28.07.04 16:10) [293]
>Выражение: -5e-2^2
>Результат: Invalid floating point operation at offset 7
Я криво делал возведение в степень.
Cobalt © (28.07.04 10:57) [236]
Вы смотрике калькулятор Огромного Кулясищща.
Calm © (28.07.04 11:05) [238]
>>>Хотя я не прав: если сделать конечный автомат, разбирающий спецификацию, то он будет гораздо универсальнее.
>Колькуляторописатели сдают свои позиции :((
Ни за что! Это в мои позиции не входит. У меня есть только одна позиция: калькулятор без теории сделать не очень сложно. Тем более см. Anatoly Podgoretsky [241].
← →
Думкин © (2004-07-29 08:21) [299]> [298] GrayFace © (29.07.04 08:08)
<Number> ::=[{Digit}][Separator][{Digit}][<Exponent>[Sign]{Gigit}]
Я так понимаю, что пустое выражение может быть числом?
← →
Ertong © (2004-07-29 08:48) [300]> <term> ::=<factor>|<term><Operation1><factor>
> <expression> ::=<term>|<expression><Operation2><term>
Имхо лучше будет
<term> ::=<factor>{<Operation1><factor>}
<expression> ::=<term>{<Operation2><term>}
← →
GrayFace © (2004-07-29 09:46) [301]Думкин © (29.07.04 08:21) [299]
:( А как же это правильно задать?
Ertong © (29.07.04 08:48) [300]
ИМХО, тоже.
← →
Ertong © (2004-07-29 10:03) [302]Может не идеально, но поидее нормально
<PositiveInteger> ::=<Digit>{<Digit>}
<Number> ::=[<Sign>]<PositiveInteger>[<Separator><PositiveInteger>][<Exponent>[Sign]<PositiveInteger>]
← →
Anatoly Podgoretsky © (2004-07-29 10:11) [303]То есть не разрешаешь такую форму, как E2
← →
Ertong © (2004-07-29 10:15) [304]
> То есть не разрешаешь такую форму, как E2
Всмысле? Паскалть тоже не разрешает.
Я немогу написать Writeln(e2), а Writeln(4e2) без проблем!
← →
Ertong © (2004-07-29 10:35) [305]<operand> ::=<atom>
:)
← →
Ertong © (2004-07-29 10:58) [306]<factor> ::=<operand> | <factor> "^" <operand>
И как ты собираешся написать функцию factor?
99% что ты зациклишся или изменишь синтаксис.
1% что я ошибаюсь :-)
Если 3^2^2=3^4, тогда можно
<factor> ::=<operand> | <operand> "^" <factor>
А если 3^2^2=9^2, то
<factor> ::=<operand> {"^" <operand>}
← →
Anatoly Podgoretsky © (2004-07-29 10:59) [307]Ertong © (29.07.04 10:15) [304]
Это не важно, можно разрешать а можно нет, но тогда для единства стиля не разрешать незначищий нуль и для реальных чисел.
← →
Anatoly Podgoretsky © (2004-07-29 11:08) [308]Ertong © (29.07.04 10:15) [304]
Это ограничение многих языков, поскольку e2 не отличается от метки, требуется префикс, для паскаля $, для ассемблера 0 и суффикс основания системы исчисления.
← →
Ertong © (2004-07-29 11:18) [309]
> [307] Anatoly Podgoretsky © (29.07.04 10:59)
Я не хочу с вами спорить не очем.
Если хотите писать е2, тогда можно так :
<Number> ::=[<Sign>]<PositiveInteger>[<Separator><PositiveInteger>][<Exponent>[Sign]<PositiveInteger>] | <Exponent>[Sign]<PositiveInteger>
Но чесно говоря я опираюсь, на синтаксис паскаля.
P.S. Может кто знает, где можно взять синтаксис паскаля в таком виде записи. Я слышал, что в какой-то книге по интерпретаторам был, но не помню в какой.
← →
Думкин © (2004-07-29 11:21) [310]> [302] Ertong © (29.07.04 10:03)
> [303] Anatoly Podgoretsky © (29.07.04 10:11)
> То есть не разрешаешь такую форму, как E2
Речь видимо, не только о [302], но и о [298] - там такое допускалось.
← →
Ertong © (2004-07-29 11:22) [311]Пишу
Writeln($e2);
Вывод
226
???
← →
Ertong © (2004-07-29 11:23) [312]Пишу
Writeln($e2);
Вывод
226
???
← →
Romkin © (2004-07-29 11:24) [313]Ertong © (29.07.04 11:18) [309]
Delphi Help -> Object Pascal Reference -> Object Pascal Grammar
← →
Anatoly Podgoretsky © (2004-07-29 11:28) [314]Ertong © (29.07.04 11:18) [309]
Речь просто про то разрешаешь опускать незначищий ноль или нет, если не разрешаешь, то к всем числам относишь или это относится только к экспоненте, то есть разрешено писать так E2 и только так 0Е3
Потому что все равно и в этой форме опущено основание 10, 3Е2 означает 3*10^2
← →
Anatoly Podgoretsky © (2004-07-29 11:29) [315]А ,01 -> 0.01
← →
Ertong © (2004-07-29 11:31) [316]
> Речь видимо, не только о [302], но и о [298] - там такое
> допускалось.
Но там допускалось, что <Number>=nil :)
← →
Ertong © (2004-07-29 11:42) [317]
> А ,01 -> 0.01
<Number> ::=[<Sign>]<PositiveInteger>[<Separator><PositiveInteger>][<Exponent>[Sign]<PositiveInteger>] | <Exponent>[Sign]<PositiveInteger> |
[<Sign>]<Separator><PositiveInteger>[<Exponent>[Sign]<PositiveInteger>]
Нормально?
← →
Nous Mellon © (2004-07-29 11:46) [318]
> Пишу
> Writeln($e2);
>
> Вывод
> 226
>
> ???
А что непонятного? С 16ричной системой счисления знаком?
← →
Григорьев Антон © (2004-07-29 11:53) [319]Может, вообще не стоит так заморачиваться на формат представления чисел? Есть функция Val. Пусть числом называется то, что она сочтёт числом.
А вообще, спор можно считать законченным. Та спецификация, которую привёл GrayFace в [298], говорит о знакомстве с основами теории. Следовательно, любой калькулятор, который будет реализовывать эту спецификацию, уже не будет сделан без теории :))
← →
Anatoly Podgoretsky © (2004-07-29 11:56) [320]Кстати стандартный калькулятор Виндоус работает в двух резимах, обычном (последовательном) и инженерном, инженерный является полустрочным и понимает скобки. Результаты вычисления 2+4/4 будут разные в этих режимах 1,5 и 3
← →
Ertong © (2004-07-29 11:59) [321]
>
> А что непонятного? С 16ричной системой счисления знаком?
Знаком, но непонятно.
Я понимаю так :
$e2=$0 * 10^2=0
Но видимо это не так :)
← →
Думкин © (2004-07-29 12:02) [322]$e2 = 14*16 +2 =226
← →
Anatoly Podgoretsky © (2004-07-29 12:18) [323]Ertong © (29.07.04 11:59) [321]
$e2 это шестнадатиричная константа, а не экспонент, экспонент не может быть записана так, поскольку Е это не число, а признак
← →
Nous Mellon © (2004-07-29 12:29) [324]
> Но видимо это не так :)
Ты перепутал два разных понятия. Смотри 322,323.
← →
Ertong © (2004-07-29 12:30) [325]
> $e2 = 14*16 +2 =226
Наверно я сячас сильно туплю:(
← →
Ertong © (2004-07-29 12:31) [326]
> $e2 это шестнадатиричная константа, а не экспонент, экспонент
> не может быть записана так, поскольку Е это не число, а
> признак
Блин! Точно туплю. Сорри! Понял.
← →
Юрий Зотов © (2004-07-29 12:39) [327]> GrayFace
Так как же быть с пустым числом? Пожалуйста, уточните спецификацию, иначе нельзя проводить тестирование. Но только давайте договоримся сразу - как только спецификация будет сформулирована, она становится окончательной, никаким изменениям уже не подлежит и любое отклонение калькулятора от нее рассматривается, как глюк.
Иначе мы снова придем к тому же самому - к подгонке спецификации под получившуюся программу.
Мое предложение:
<unsigned> ::= <digit> | <digit> <unsigned>
<sign> ::= <operation2> | <empty>
<signed> ::= <sign> <unsigned>
<fixed> ::= <signed> |
<signed> <separator> |
<signed> <separator> <unsigned> |
<sign> <separator> <unsigned>
<number> ::= <fixed> | <fixed> <exponent> <signed>
Такая спецификация чисел принята во многих языках (включая и Паскаль), поэтому ее можем принять и мы тоже. Но это только предложение, а последнее слово за Вами - автором.
← →
Григорьев Антон © (2004-07-29 12:59) [328]
> Юрий Зотов © (29.07.04 12:39) [327]
> Такая спецификация чисел принята во многих языках (включая
> и Паскаль)
Нет, в Паскале вот так:
<fixed>::=<signed> |
<signed> <separator> |
<signed> <separator> <unsigned>
А ".5" и "-.5" компилятор за числа не считает.
← →
Юрий Зотов © (2004-07-29 13:32) [329]> Григорьев Антон © (29.07.04 12:59) [328]
Можно и так. В любом случае слово за автором.
← →
GrayFace © (2004-07-29 17:50) [330]Новая спецификация:
<Empty> ::=
<Sign> ::="+"|"-"
<Digit> ::="0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
<Operation1> ::="*"|"/"|<Empty>
<Operation2> ::="+"|"-"
<FunctionName>::="sin"|"cos"|"tg"|"ctg"|"arcsin"|"arccos"|"arctg"|"arcctg"
<exponent> ::="e"|"Е"
<Separator> ::="."|<DecimalSeparator>
<Number> ::={Digit}[Separator][{Digit}][<Exponent>[Sign]{Gigit}] | [{Digit}][Separator][Digit][<Exponent>[Sign]{Gigit}]
<function> ::=<FunctionName><atom>
<atom> ::=<number> | "pi" | <function> | "("<expression>")" | "|"<expression>"|"
<operand> ::=[{Digit}]<atom>
<factor> ::=<operand>[{"^" <operand>}]
<term> ::=<factor>[{<Operation1><factor>}]
<expression> ::=<term>[{<Operation2><term>}]
Григорьев Антон © (29.07.04 11:53) [319]
>А вообще, спор можно считать законченным. Та спецификация, которую привёл GrayFace в [298],
>говорит о знакомстве с основами теории. Следовательно, любой калькулятор, который будет
>реализовывать эту спецификацию, уже не будет сделан без теории :))
Вначале я сделал калькулятор. Потом отец мне показал пример спецификации и сказал, что, когда писал калькулятор, он делал для по функции на каждый ее(не ее, но чего-то похожего) элемент(кроме всяких знаков). Потом я модифицировал калькулятор, мне меняя основу алгоритма, да и вообще мало меняя алгоритм. И, наконец, я увидел два примера спецификаций здесь. Все. Еще я здель видел польскую запись, но понятья не имею, как она может помоч написанию калькулятора. Главное - алгоритм был сделан до получения этих знаний и почти не изменился.
Юрий Зотов © (29.07.04 12:39) [327]
>Но только давайте договоримся сразу - как только спецификация будет сформулирована, она становится окончательной, никаким >изменениям уже не подлежит и любое отклонение калькулятора от нее рассматривается, как глюк.
Нет. Если будут ошибки в спецификации, то я изменю спецефикацию.
← →
GrayFace © (2004-07-29 17:51) [331]А какие правила спецификации наиболее стандартны?
← →
}|{yk © (2004-07-29 18:33) [332]смысл обратной польской записи? Пример (неточный)
a b +
реализуется как
mov st(0),a
mov st(0),b
fadd
a b + sin
реализуется как
mov st(0),a
mov st(0),b
fadd
fsin
Думаю понятно. То есть вычислить по обратной польской записи функции элементарно.
← →
}|{yk © (2004-07-29 18:39) [333]То есть на этапе преобразования ты должен получить массив типа
{(1,number),(3,number),(+,operand),(sin,function)}
Если ты не можешь получить такой массив, значит не нужно выполнять вычислений, ты на этапе преобразования получишь корректность или некорректность выражения. Если же ты получил массив, ты точно,и, главное всегда правильно произведешь операции.
← →
Юрий Зотов © (2004-07-29 18:55) [334]> GrayFace © (29.07.04 17:50) [330]
> Если будут ошибки в спецификации, то я изменю спецефикацию.
Это само собой. Я имел в виду, что спецификация не должна меняться с целью ее подгонки под алгоритм.
В спецификации [330] есть ошибки:
- <Number> допускает пустое число;
- нет унарных операций.
← →
GrayFace (2004-07-29 19:35) [335]Юрий Зотов © (29.07.04 18:55) [334]
Унарные операции есть:<operand>::=[{Digit}]<atom>
. Но теперь я это сделал по-другому.
>Я имел в виду, что спецификация не должна меняться с целью ее подгонки под алгоритм.
Это я тоже не могу гарантировать. Спецификация создавалась по алоритму, а не наоборот, и если я что-то не учел, то это глюк спецификации. Но, вообще, это не проблема - на месте разберемся.<Empty> ::=
<Sign> ::="+"|"-"
<Digit> ::="0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
<Operation1> ::="*"|"/"|<Empty>
<Operation2> ::="+"|"-"
<FunctionName>::="sin"|"cos"|"tg"|"ctg"|"arcsin"|"arccos"|"arctg"|"arcctg"
<exponent> ::="e"|"Е"
<Separator> ::="."|<DecimalSeparator>
<Number> ::={Digit}[Separator][{Digit}][<Exponent>[Sign]{Gigit}] | <Separator>[{Digit}][<Exponent>[Sign]{Gigit}]
<function> ::=<FunctionName><operand>
<operand> ::={Digit}<operand>|<number> | "pi" | <function> | "("<expression>")" | "|"<expression>"|"
<factor> ::=<operand>[{ "^" <operand>}]
<term> ::=<factor>[{<Operation1><factor>}]
<expression> ::=<term>[{<Operation2><term>}]
← →
Юрий Зотов © (2004-07-29 20:08) [336]> GrayFace (29.07.04 19:35) [335]
Унарных операций я все же не увидел. Может, плохо смотрел, но лучше проверить.
> Спецификация создавалась по алоритму, а не наоборот
И, надеюсь, теперь Вы уже понимаете, что наоборот было бы гораздо проще, быстрее и надежнее.
> и если я что-то не учел, то это глюк спецификации
Или все же кода. Никто ведь не может дать гарантию, что любой код безглючен? Никто. Стало быть, теперь отладка программы тоже усложнится, потому что теперь при каждом новом баге Вам нужно будет сначала еще разобраться, чей это баг - спецификации, или кода. А если бы спецификация была составлена с самого начала (что, как Вы теперь уже видите, делается максимум за полчаса), то писать и отлаживать программу было бы намного быстрее и проще.
← →
Ertong © (2004-07-29 21:32) [337]<>
> [335] GrayFace (29.07.04 19:35)
Я тоже не увидел унарных операций.
Так, наверное, будет лучше:<operand> ::={Sign}<operand>|<number> | "pi" | <function>
| "("<expression>")" | "|"<expression>"|"
← →
GrayFace (2004-07-30 10:48) [338]Скачайте новую версию калькулятора.
А как сделать www.grayface.chat.ru/Calk.zip ссылкой?<Empty> ::=
<Sign> ::="+"|"-"
<Digit> ::="0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
<Operation1> ::="*"|"/"|<Empty>
<Operation2> ::="+"|"-"
<FunctionName>::="sin"|"cos"|"tg"|"ctg"|"arcsin"|"arccos"|"arctg"|"arcctg"
<exponent> ::="e"|"Е"
<Separator> ::="."|<DecimalSeparator>
<Number> ::={Digit}[Separator][{Digit}][<Exponent>[Sign]{Gigit}] | <Separator>{Digit}[<Exponent>[Sign]{Gigit}]
<function> ::=<FunctionName><operand>
<operand> ::=[{Sign}]<operand>|<number> | "pi" | <function> | "("<expression>")" | "|"<expression>"|"
<factor> ::=<operand>[{ "^" <operand>}]
<term> ::=<factor>[{<Operation1><factor>}]
<expression> ::=<term>[{<Operation2><term>}]
> Или все же кода. Никто ведь не может дать гарантию,
> что любой код безглючен? Никто. Стало быть, теперь
> отладка программы тоже усложнится, потому что теперь
> при каждом новом баге Вам нужно будет сначала еще
> разобраться, чей это баг - спецификации, или кода. А
> если бы спецификация была составлена с самого начала
> (что, как Вы теперь уже видите, делается максимум за
> полчаса), то писать и отлаживать программу было бы
> намного быстрее и проще.
Разбираться, чей это баг - это несколько милисекунд. Я не спорю, что было бы проще. Мы спорим о том, возможно писать калькулятор без теории или нет.
← →
Gero © (2004-07-30 10:51) [339]
> А как сделать www.grayface.chat.ru/Calk.zip ссылкой?
Ключевое слово - http://
← →
Calm © (2004-07-30 10:53) [340]Разбираться, чей это баг - это несколько милисекунд.
Ну-ну...
Да и вообще, как говорит наша уборщица, работа программиста простая - кнопки нажимать.
← →
Юрий Зотов © (2004-07-30 12:13) [341]> GrayFace
Пожалуйста, не включайте в архив ничего, кроме файлов Project1.dpr, Unit1.pas и Unit1.dfm. Delphi есть у всех и скачивать пару сотен Кб совершенно незачем.
← →
Esu © (2004-07-30 13:08) [342]Разбираться, чей это баг - это несколько милисекунд. Я не спорю, что было бы проще. Мы спорим о том, возможно писать калькулятор без теории или нет.
:) Да уж, на этом форуме главное правильно вопрос поставить Ж)
Вот спросил бы человек как калькулятор писать закидали бы ссылками и забыли, а тут ведь уже сколько теории было высказано, сколько правлено-переправлено, а все равно, цель прежняя "калькулятор пишется без теории" :)
← →
Anatoly Podgoretsky © (2004-07-30 13:16) [343]И после этого можно будет нагло утверждать, даже после приведения нескольких БНФ, а это уже противоречит ранее сказаному.
← →
Anatoly Podgoretsky © (2004-07-30 13:18) [344]Он даже не заметил, что давно себя опроверг. Сейчас уже может стоять речь об написании рабочего калькулятора, ну хотя бы без грубых ошибок в вычислениях, как это быо многократно продемонстрировано.
← →
GrayFace (2004-07-30 14:12) [345]Чуть-чуть изменился интерфейс: http://www.grayface.chat.ru/Calk.zip
Esu [342]
Anatoly Podgoretsky [343-344]
См. в GrayFace [330] ответ Григорьеву Антону. Посмотрите исходники и увидите, что теорией там и не пахнет.
← →
GrayFace (2004-07-30 15:12) [346]Какие правила спецификаций наиболее общеприняты? Это важно, т.к. мне захотелось сделать разбор текста по любой спецификации.
← →
Anatoly Podgoretsky © (2004-07-30 15:23) [347]А я смотрю на GrayFace (29.07.04 19:35) [335] , это уже теория, не написание как получится, а спецификация входного языка, да еще и в виде БНФ. Так что лопнуло твое утверждение "без теории", без теории не получилось, весь вопрос а получится ли что ни будь с теорией, отсень сомневаюсь, ну разве, что попросишь помочь какого ни будь знакомого программиста, а нам не скажещь.
← →
GrayFace (2004-07-30 17:49) [348]Anatoly Podgoretsky © (30.07.04 15:23) [347]
Единственная теория, которую я знаю - это 1 пример спицификации, написанный отцом и два примера, приведенные в этой ветке. Почему вас надо второй раз отсылать к [330] и к исходникам? КАЛЬКУЛЯТОР НАПИСАН КАК ПОЛУЧИТСЯ. После того, как я увидел пример спецификации, я не вносил хоть чуть-чуть серьезных правок в алгоритм. Если сомневаетесь, СМОТРИЕ ИСХОДНИКИ.
БНФ - это что?
> весь вопрос а получится ли что ни будь с теорией,
> отсень сомневаюсь, ну разве, что попросишь помочь
> какого ни будь знакомого программиста, а нам не
> скажещь.
Например, Огромное Кулясищще. ;-)
Почему вы считаете, что я ламер? Я настолько же ламер в программировании, насколько и Вы! (потому, что я - вообще не ламер)
← →
Nous Mellon © (2004-07-30 17:52) [349]
> (потому, что я - вообще не ламер)
А вот и подтверждение обратному. :)
← →
Юрий Зотов © (2004-07-30 18:32) [350]Хочу все же заступиться за GrayFace. Насколько я понимаю, человек он еще совсем молодой - а посмотрите код. Грязноватый, конечно, и не совсем зрелый в плане структурирования, но с точки зрения кодинга - вполне крепкий. Думаю, немногие в его возрасте умеют так кодить.
Далее - посмотрите, насколько парень увлечен и настойчив, но при этом совсем не уперт. Он уже несколько дней насмерть бьется со своим калькулятором, но при этом вполне воспринимает и критику (причем очень спокойно, по-деловому), и новую информацию.
Далее - разве он с кем-то воюет или на кого-нибудь наезжает (что как раз для ламеров и характерно)? Нет. Он честно и трудолюбиво доказывает свою точку зрения ДЕЛОМ, а не криком.
Так какой же он ламер? Елы-палы, да если все бы были такими!
← →
Murkt © (2004-07-30 18:36) [351]>Так какой же он ламер?
Чайникъ :)
>да если все бы были такими!
А что, можно?
>человек он еще совсем молодой
Анкета где, анкета?
← →
Алхимик © (2004-07-30 20:33) [352]
> [351] Murkt © (30.07.04 18:36)
> >человек он еще совсем молодой
>
> Анкета где, анкета?
Где то он сам написал что 17 лет.
← →
Nous Mellon © (2004-07-30 20:43) [353]
> но при этом совсем не уперт
Юрий я честно говоря не знаю вашей методики оценки. Но результат вижу.
Почти 400 постов, а калькулятора все нет (АП). Так что не совсем понятна ваша точка зрения... Или вас интересовала зрелость кода, а не безглючный калькулятор?
← →
Nous Mellon © (2004-07-30 20:44) [354]Но что ГрейФэйсовский калькулятор лучший из представленных это спорить не буду....
← →
Хуан (2004-07-30 20:52) [355]>Юрий Зотов © (30.07.04 18:32) [350]
Молодец, Юрий Зотов.
Я уже начинаю Вас уважать :)))
← →
Gero © (2004-07-30 20:54) [356]
> Где то он сам написал что 17 лет.
Я могу написать, что мне 72...
← →
Алхимик © (2004-07-30 20:59) [357]
> [356] Gero © (30.07.04 20:54)
>
> > Где то он сам написал что 17 лет.
>
> Я могу написать, что мне 72...
Не прокатит. Тебя уже посчитали. :)
← →
Gero © (2004-07-30 20:59) [358]
> Тебя уже посчитали.
Кто, когда и зачем?
← →
Алхимик © (2004-07-30 21:03) [359]
> [358] Gero © (30.07.04 20:59)
>
> > Тебя уже посчитали.
>
> Кто, когда и зачем?
Ключевое слово "посчитали", ибо ветка про калькуляторы.
← →
Gero © (2004-07-30 21:07) [360]
> Алхимик © (30.07.04 21:03)
Да там наверняка ошибки при подсчетах были.
Калькуляторы ведь глюкавые в большинстве своем.
← →
Алхимик © (2004-07-30 21:09) [361]
> [360] Gero © (30.07.04 21:07)
Масдаевским воспользовались. Там по теории (ключевое слово ветки) заговора есть секретная функция.
← →
Юрий Зотов © (2004-07-30 21:16) [362]> Хуан (30.07.04 20:52) [355]
Ба! Дон, это Вы? Неужели Вас лишили дворянского звания?
Если так, то польза налицо... видимо, статус простолюдина все же заставляет приспосабливаться к жизни - ну и, соответственно, быть более проницательным...
:о)
Хотя... если все открытым текстом написано... какая уж тут нужна проницательность?
:о)
← →
Хуан (2004-07-30 21:29) [363]> Юрий Зотов © (30.07.04 21:16) [362]
:)))
> Ба! Дон, это Вы? Неужели Вас лишили дворянского звания?
Сам себя лишил.
← →
GrayFace © (2004-07-30 21:41) [364]
> Анкета где, анкета?
Теперь есть.
> а калькулятора все нет
В выходные увидим...
Юрий Зотов © (30.07.04 18:32) [350]
Спасибо. Давайте поговорим о грязноватостях моего кода. Одну из них я внес в последней версии - оператор goto - его все как-то не любят. Больше я грязноватостей не вижу. А как поступать в моей ситуации:
1) Нужно во многих местах делать одно и то же, а потом выходить, при этом нужно оперировать с Result"ом и параметрами
2) Это не должно исполняться при exeption"ах - try .. finally не подходит
Я выбрал goto.
← →
Огромное Кулясищще © (2004-07-30 21:54) [365]>Например, Огромное Кулясищще. ;-)
Вот только на меня не надо. Никто не сдался и не уступил. Через некоторое время я представлю вторую версию калькулятора.
← →
Nous Mellon © (2004-07-30 22:34) [366]
> Вот только на меня не надо. Никто не сдался и не уступил
Какая битва интеллектов однако :)
> В выходные увидим...
Заметано. Интересно даже не кто победит в споре теория vs без теории.
Тут уже и так все ясно, а кто победит в битве калькуляторов :)
← →
Огромное Кулясищще © (2004-07-30 22:42) [367]>Какая битва интеллектов однако :)
>Заметано. Интересно даже не кто победит в споре теория vs без теории.
>Тут уже и так все ясно, а кто победит в битве калькуляторов :)
Золотой язык года, прям какой-то.
← →
Nous Mellon © (2004-07-30 22:43) [368]
> Золотой язык года, прям какой-то.
Дык, а ты думал
← →
Юрий Зотов © (2004-07-30 22:52) [369]> GrayFace © (30.07.04 21:41) [364]
Тут дело даже не в goto. Не помню, когда я писал его в последний раз, но если ДЕЙСТВИТЕЛЬНО потребуется - использую без всяких колебаний.
Код читать трудно - он слепой. То есть, читать-то его легко, но при первом же взгляде должна схватываться картинка кода, его слепок - а этого нет. Потому что форматирование плохое.
Компилятор выдает варнинги - тоже плохо. Для мелких проектов еще туда-сюда, а для серьезных - недопустимо.
То есть, слабая дисциплина кодинга - а с нее все и начинается. Это как азбука - без нее никуда.
Но главное - структурирование. В выходные посмотрю последнюю версию - скажу подробнее. Хотя предчувствую, что объяснить это будет довольно трудно. Не потому, что Вы не захотите воспринять, а просто потому, что это идет почти на уровне чутья - а оно еще должно прийти.
← →
GrayFace © (2004-07-31 08:37) [370]Огромное Кулясищще © (30.07.04 21:54) [365]
Просто я не верю, что твой калькулятор заработает в ближайшие годы.
Nous Mellon © (30.07.04 22:34) [366]
> Заметано. Интересно даже не кто победит в споре теория vs без теории.
> Тут уже и так все ясно, а кто победит в битве калькуляторов :)
Я. И в споре, и в битве. (ИМХО)
Юрий Зотов © (30.07.04 22:52) [369]
Компилятор выдает варнинги - тоже плохо. Для мелких проектов еще туда-сюда, а для серьезных - недопустимо.
А почему? Много пролистывать, чтобы ошибки увидеть? Как-то мне не нравиться переделывать код, чтобы он нравился компилятору.
← →
Юрий Зотов © (2004-07-31 10:06) [371]> GrayFace © (31.07.04 08:37) [370]
> А почему? Много пролистывать, чтобы ошибки увидеть?
Потому что среди варнингов (и даже иногда среди хинтов) бывают и серьезные, указывающие на потенциальные ошибки в программе. Причем иногда такая ошибка может то возникать, то нет, и ловить такие "плавающие" ошибки очень сложно и очень долго.
Если компиляция проходила чисто, потом мы что-то изменили в коде и появился варнинг, то этот варининг сразу бросится в глаза, будет проанализирован и устранен. А если при компиляции и раньше шла с кучей сообщений, то новый варнинг просто утонет в них и останется незамеченным. Результаты могут быть самыми разными - от никаких до недели бессонных ночей в поисках бага.
> Как-то мне не нравиться переделывать код, чтобы он нравился
> компилятору.
Дело Ваше. Только компилятору, системе и машине, сами понимаете, Ваши чувства абсолютно по барабану. Пару-тройку раз наловитесь серьезных глюков в больших проектах - вот тогда поймете, что к чему. Не Вы первый и не Вы последний через это проходят.
А переделывать код не надо. Его надо СРАЗУ писать аккуратно и грамотно, без всяких переделок.
← →
Nous Mellon © (2004-07-31 10:39) [372]
> Я. И в споре, и в битве. (ИМХО)
:) Тебе ж АП уже подробно объяснил почему ты в споре уже проиграл.
← →
Nous Mellon © (2004-07-31 10:41) [373]
> Как-то мне не нравиться переделывать код, чтобы он нравился
> компилятору.
мдя. Он что по-твовему предупреждения для красного словца что-и пишет?
← →
Anatoly Podgoretsky © (2004-07-31 11:42) [374]Nous Mellon © (31.07.04 10:39) [372]
Ну разуеется не все, кро оаределнеия входного языка, также было дано много теории в обсуждении. Поэтому уже никак. Да и не важно, пусть все таки напишит калькулятор, ему же и польза от этого будет большая, на всю жизнь. Вон и Юрия взялся посмотреть код, наверкно и советы и рекомендации даст.
← →
Anatoly Podgoretsky © (2004-07-31 11:43) [375]GrayFace © (31.07.04 08:37) [370]
Почему такое неверние? А может он также думает про тебя? :-)
← →
Думкин © (2004-07-31 13:01) [376]> [370] GrayFace © (31.07.04 08:37)
> Юрий Зотов © (30.07.04 22:52) [369]
> Компилятор выдает варнинги - тоже плохо. Для мелких проектов
> еще туда-сюда, а для серьезных - недопустимо.
> А почему? Много пролистывать, чтобы ошибки увидеть? Как-то
> мне не нравиться переделывать код, чтобы он нравился компилятору.
Код пишется человеком со всеми вытекапющими. И иногда случается, что человек думает одно, а при кодинге вводит другое. Компилятор иногда предупреждает, например, о том что результат функции неопределен и т.п. То есть вы ошиблись в реализации собственных мыслей. Как такакое не править. И как правило это в конечном итоге касается всех варнингов. Я считаю их присутствие в своей программе личным оскорблением. Поэтому тут я бы не был така категоричен. В остальном у вас пока вссе идет, поэтому было бы неплорхо и в другом. Удачи.
← →
Думкин © (2004-07-31 13:13) [377]Да и поддерживаю о минимизации выкладки. В выходные я пользуюсь GPRS и большие куски тянуть мне неудобно. Поэтому желательно приводя ссылку, указывать объем сжатого файла. Удачи.
← →
GrayFace © (2004-07-31 16:59) [378]Nous Mellon © (31.07.04 10:39) [372]
:) Тебе ж АП уже подробно объяснил почему ты в споре уже проиграл.
Наоборот я уже два раза объяснил, что не проиграл. Не всегда АП нужно верить.
Nous Mellon © (31.07.04 10:41) [373]
мдя. Он что по-твовему предупреждения для красного словца что-и пишет?
Да. Unsafe code и Unsafe type он пишет для красного словца и для чайников.
Anatoly Podgoretsky © (31.07.04 11:43) [375]
GrayFace © (31.07.04 08:37) [370]
Почему такое неверние? А может он также думает про тебя? :-)
Что он думает про меня мне не важно. Я посмотрел его код - он подлежит полному переписыванию.
Думкин © (31.07.04 13:13) [377]
Сейчас 4,7K.
← →
Огромное Кулясищще © (2004-07-31 18:54) [379]>Nous Mellon © (31.07.04 10:39) [372]
>Nous Mellon © (31.07.04 10:41) [373]
КБЗ. (имхо)
← →
Юрий Зотов © (2004-07-31 19:20) [380]Ну что ж, продолжаем.
Выражение: -5^2
Результат: -25
Что будем править? Спецификацию, или код? Или и то, и то другое?
← →
Nous Mellon © (2004-07-31 19:32) [381]
> Наоборот я уже два раза объяснил, что не проиграл. Не всегда
> АП нужно верить.
Нужно всегда думать. АП привел аргументы, а ты нет.
> КБЗ. (имхо)
Боишься проиграть? Ведь пока как ни суди Греевуская наработка куда солиднее. После следующего позора опять придется ник менять, верно?
← →
Огромное Кулясищще © (2004-07-31 20:12) [382]>Боишься проиграть? Ведь пока как ни суди Греевуская наработка куда солиднее. После следующего позора опять придется ник менять, верно?
Добавим "ов" во второе слово - будет понятнее. Проиграть GrayFace - как это возможно? Суть в том, чтобы сделать клаькулятор без знания теории рано или поздно. Будет два калькулятора - отлично. Если кто-то из нас всё-таки напишет правильный калькулятор - тоже отлично. В обоих указанных случаях проигрывает Юрий Зотов.
← →
Nous Mellon © (2004-07-31 20:27) [383]
> Проиграть GrayFace - как это возможно?
Пока у тебя получается
> В обоих указанных случаях проигрывает Юрий Зотов.
Ну Зотов то не проиграет точно. А вот ты лажаешь
← →
Огромное Кулясищще © (2004-07-31 21:46) [384]>Пока у тебя получается
Если поддаваться на твоё злоречие - тогда уж точно.
>Ну Зотов то не проиграет точно. А вот ты лажаешь
Юрий Зотов, Кулясищще, остальные. Какая тебе разница? Это наш спор и как бы тебе не хотелось обратного, ты тут ни при чём. Свои симпатии и антипатии выражай в другом месте. Кроме необоснованного злорадства от тебя здесь ещё никто ничего не услышал. И пожалуйста, не бойся начать изучать программирование, мыслить самостоятельно и немножечко думать, как твои действия выглядят со стороны.
← →
Gero © (2004-07-31 21:53) [385]
> Какая тебе разница? Это наш спор и как бы тебе не хотелось
> обратного, ты тут ни при чём.
На то он и форум, чтобы все обсуждали.
А если не хочешь, чтобы посторонние влазили, для этого есть e-mail, ICQ и прочие полезные вещи.
А ты как думал?
← →
Akha (2004-07-31 22:14) [386]Везет чувакам! ЮЗ им код проверяет, да еще и с пристрастием. И советы дает. Мне бы так.
← →
Огромное Кулясищще © (2004-07-31 22:19) [387]>На то он и форум, чтобы все обсуждали.
А если не хочешь, чтобы посторонние влазили, для этого есть e-mail, ICQ и прочие полезные вещи.
А ты как думал?
Ну, не в этой ветке, значит. Существуют же ветки с пометкой "Опрос". Так и здесь: не для ехидный поддакиваний. Я бы, откровенно говоря, постеснялся бы на GrayFace (30.07.04 17:49) [348] ответить Nous Mellon © (30.07.04 17:52) [349].
← →
Gero © (2004-07-31 22:39) [388]
> Я бы, откровенно говоря, постеснялся бы на GrayFace (30.07.04
> 17:49) [348] ответить Nous Mellon © (30.07.04 17:52) [349].
Ну а NM не постеснялся.
Что не запрещено - то можно.
← →
Nous Mellon © (2004-07-31 22:42) [389]
> Если поддаваться на твоё злоречие - тогда уж точно.
Моя ненависть к тебе вполне обоснована. А тут ты еще сам даешь повод позлорадствовать. Форум - место публичное и я этой возможность воспользуюсь сполна.
> И пожалуйста, не бойся начать изучать программирование,
Благодарю за совет, но не виду ничего страшного в изучении программирования
> остальные. Какая тебе разница? Это наш спор и как бы тебе
> не хотелось обратного, ты тут ни при чём.
Спор публичный. Ты и Грей взялись доказать всем. Так что при чем.
А мне в общем-то хотелось узнать кто победит. Я узнал. Уж больше недели с момента той ветки прошло а калькулятора никто не предоставил.
> немножечко думать, как твои действия выглядят со стороны.
Переадресуй этот совет себе. Может поможет
> Я бы, откровенно говоря, постеснялся бы на GrayFace (30.07.04
> 17:49) [348] ответить Nous Mellon © (30.07.04 17:52) [349].
Стесняйся дальше. Откровенно говоря, по-моему ты никакой грязи неикогда не стеснялся. Так что сомнительно. А там стоял смайл. Хотя в каждой шутке есть лишь доля шутки. Там это было написано к тому что настоящий профессионал никогда не будет строить из себя невесть кого. Но все же это к Грею не относится. Он еще не молод и максималистические настроения ему простительны. Если они, конечно, в меру. Дмитрий О. к примеру настолько перегнул палку самобахвальства что уже просто тошнит.
← →
Nous Mellon © (2004-07-31 22:46) [390]2Gero
Кстати, Михей тут говорит о морали и стеснении. А ты зацени его последний ник. Как думаешь он после этого вообще рот насчет какой-либо морали разевать может?
← →
Gero © (2004-07-31 22:56) [391]
> Nous Mellon © (31.07.04 22:46)
Да Михей вобще очень стеснительный.
Сама робкость.
← →
Огромное Кулясищще © (2004-07-31 22:59) [392]>Моя ненависть к тебе вполне обоснована. А тут ты еще сам даешь повод позлорадствовать. Форум - место публичное и я этой возможность воспользуюсь сполна.
Это показывает твою ничтожную культуру и лишний раз доказывает, что твои сообщения на самом деле пусты и необоснованы.
>Благодарю за совет, но не виду ничего страшного в изучении программирования
Тем не менее похоже, что на этом форуме только ты не умеешь хоть чуть-чуть программировать. Можешь назвать мой калькулятор ламерским, но по крайней мере это хоть какая-то попытка. С твоей стороны никогда никаких попыток не было. Ты просто боишься попробовать. Похоже, что ты самый ненужный человек на этом форуме.
>Спор публичный. Ты и Грей взялись доказать всем. Так что при чем. А мне в общем-то хотелось узнать кто победит. Я узнал. Уж больше недели с момента той ветки прошло а калькулятора никто не предоставил.
Взялись. И пока никто из нас не сказал, что спор окончен, более того, оба сказали, что будет продолжение. Я тебе обещаю, что когда я сдамся, я об этом сообщу, а пока все твои слова о провале объясняются этим: "А тут ты еще сам даешь повод позлорадствовать. Форум - место публичное и я этой возможность воспользуюсь сполна" Злорадствуй, но не скатывайся до абсурда.
>Стесняйся дальше. Откровенно говоря, по-моему ты никакой грязи неикогда не стеснялся. Так что сомнительно.
И буду стесняться. Я, как Огромное Кулясищще, буду олицетворять всё хорошее в Кулясове М. А., а ты - соответсвенно всё плохое и бескультурное.
← →
Огромное Кулясищще © (2004-07-31 23:00) [393]>Ну а NM не постеснялся.
Что не запрещено - то можно.
Можно ли мне предупредить, что у тебя козявка в носу?
← →
Gero © (2004-07-31 23:01) [394]
> И буду стесняться. Я, как Огромное Кулясищще, буду олицетворять
> всё хорошее в Кулясове М. А., а ты - соответсвенно всё плохое
> и бескультурное.
LOL
← →
Gero © (2004-07-31 23:02) [395]
> Можно ли мне предупредить, что у тебя козявка в носу?
Можно.
← →
Огромное Кулясищще © (2004-07-31 23:05) [396]>Можно.
Тады ты прав. Делаю сообщение:
2 Nous Mellon: Я тебя прощаю, и ты меня прости. Пиши что хочешь, это твоё право. Только чур не ругаться.
← →
Gero © (2004-07-31 23:07) [397]
> Я тебя прощаю, и ты меня прости. Пиши что хочешь, это твоё
> право. Только чур не ругаться.
Вот это друое дело.
Да будет мир во всем мире!
← →
Nous Mellon © (2004-07-31 23:15) [398]
> Это показывает твою ничтожную культуру и лишний раз доказывает,
> что твои сообщения на самом деле пусты и необоснованы.
Нет. Это показывает что у тебя на форуме есть только враги. В том числе и я.
А у меня полно друзей. Как ты думаешь почему? Может потому что это именно
ты ничтожен и бескультурен?
> Тем не менее похоже, что на этом форуме только ты не умеешь
> хоть чуть-чуть программировать
Умею или не умею это дело не твое. А мое. И мне по барабану что ты насчет этого думаешь. Мне важно мнение действительно понимающих людей, и я его знаю. А вот доказывать что-то кому-то мне не интересно. Тем более я согласен с ЮЗ, так как столкивался с той же проблемой(пытался писать некоторую математическую вещь без теории и задолбался подставлять код под каждую систему случаев, пока не взял в руки учебник, рекомендованный моим репетитором по математике) Я работаю и зарабатываю( и не только программированием ). И перед тобой отчитваться не собираюсь.
> Похоже, что ты самый ненужный человек на этом форуме.
Тебе да. Надеюсь для тебя таким и остаться. Ты мне тоже нахрен не нужен.
А вот такие люди как Gero Или Murkt или Marser и др. нужны. С ними интересно общаться.
> С твоей стороны никогда никаких попыток не было. Ты просто
> боишься попробовать.
Если тебе нравится так считать, то ради бога.
> Взялись. И пока никто из нас не сказал, что спор окончен,
> более того, оба сказали, что будет продолжение
Ни знаю как ты а Грей в той ветке обещал короткий срок(в часах, а не в неделях). Может ты собрался растянуть это дело в бразильский сериал, но не Грей(надеюсь).
> тебе обещаю, что когда я сдамся, я об этом сообщу,
Я думаю ты как всегда закончишь очередным скандалом и поменяешь ник.
> И буду стесняться
Веьсма странное утверждение. Как будто ты когда-либо стеснялся.
> Я, как Огромное Кулясищще, буду олицетворять всё хорошее
> в Кулясове М. А., а ты - соответсвенно всё плохое и бескультурное.
LOL. Благодарю за заботу, мне пока представители не нужны. Тем более в Эстонии.
> Можно ли мне предупредить, что у тебя козявка в носу?
Ты кажется обещал олицетворять хорошее. Опять лжешь. Того и ждали.
← →
Nous Mellon © (2004-07-31 23:17) [399]
> [396] Огромное Кулясищще © (31.07.04 23:05)
написав 398 я не видел этого сообщения.
Поэтому оно(398) теряет силу.
Ну что ж я всегдя за мир если ты действительно этого хочешь.
Только вот ник все-таки неплохо бы сменит. Хотя это твое дело
← →
Огромное Кулясищще © (2004-07-31 23:19) [400]>Умею или не умею это дело не твое. А мое.
Нет, тут ты не прав. Форум то публичный. Хочешь, я из своей бедной Эстонии в твою прекрасную Пензу пришлю учебник по Delphi?
← →
Огромное Кулясищще © (2004-07-31 23:20) [401]Написав это я не видел:
Nous Mellon © (31.07.04 23:17) [399]
:)))))) Честно.
← →
Gero © (2004-07-31 23:23) [402]
> А вот такие люди как Gero ... нужны.
> С ними интересно общаться.
Помнится раньше ты другое говорил ;)
← →
Nous Mellon © (2004-07-31 23:25) [403]
> Хочешь, я из своей бедной Эстонии в твою прекрасную Пензу
> пришлю учебник по Delphi?
А почему бедная? Говорят хорошая страна...
А Пенза действительно прекрасный и тихий городок. Это я не как житель а по отзывам приезжих говорю.
А какой учебник предлагаешь? У меня есть Кэнту и Арахангельский(тут не ругаться, покупал бывши полным чайником). Если предложишь Тейксеру то можем совершить почт обмен. :) У меня есть еще куча литры ксати, правда по С++, асму, Виндоус и OpenGL. :)))))) Правда подавляющее большиснтво из этого есть в элетронном виде просто не охота глаза ломать
> :)))))) Честно.
Верю на слово
← →
Gero © (2004-07-31 23:25) [404]
> Хочешь, я из своей бедной Эстонии в твою прекрасную Пензу
> пришлю учебник по Delphi?
Мне лучше пришли.
Только что-нидь посерьезнее пожалуйста.
← →
Nous Mellon © (2004-07-31 23:27) [405]
>
> Помнится раньше ты другое говорил ;)
Та, я тоже максималист и вспыльчив слишком. Седня одному мужику по репео лопатой жахнул за оскорбление любимой, сейчас сижу и мучаюсь. Мужик то пьяный был, чего я связался.. :(( Дипломат :( Хорошо хоть не сильно.
← →
Огромное Кулясищще © (2004-07-31 23:28) [406]>А почему бедная? Говорят хорошая страна...
Да просто в фильме одном чуваки откопали неандертальца, привели домой, а родакам сказали, что это их друг из Эстонии приехал.
← →
Nous Mellon © (2004-07-31 23:28) [407]
> Мне лучше пришли.
> Только что-нидь посерьезнее пожалуйста.
Кстати а куда Эстония ближе к Украине или к России?
Прости за необразованность в географии.
← →
Nous Mellon © (2004-07-31 23:30) [408]
> Да просто в фильме одном чуваки откопали неандертальца,
> привели домой, а родакам сказали, что это их друг из Эстонии
> приехал.
Случайно не "Парень из Энсино"?
С таким же успехом можно было бы сказать и про Россию. Например надеть на него ушанку, и сказать что он сибирец. Они это любят. В Голливуде.
Я тут недавно смотрел "Обмануть всех" с Мерфи и Вилсоном. Там очень интересно про нас.
← →
Gero © (2004-07-31 23:32) [409]
Nous Mellon © (31.07.04 23:28)
> Кстати а куда Эстония ближе к Украине или к России?
> Прости за необразованность в географии.
Нашел у кого спросить :)
← →
Nous Mellon © (2004-07-31 23:36) [410]
> Нашел у кого спросить :)
Ну значит - кто первый читает? Шутка. :)
← →
Юрий Зотов © (2004-07-31 23:43) [411]Блин, целых 2 страницы ругани и оффтопика...
:-(
Хлопцы, поберегите размер ветки, а то форум слетит. Она и без того обещает быть о-о-очень длинной...
:о)
← →
Огромное Кулясищще © (2004-07-31 23:44) [412]2 Nous Mellon:
Предлагаю бартер, раз настроение у всех хорошее. Не ругаться, не ссориться - это в порядке вещей. А главное, если комментировать как-то сообщения друг друга так, чтобы поддеть, то обязательно в шутку и помечать смайликом (впрочем, ты так и делаешь). Ну а ник я сменю.
← →
Nous Mellon © (2004-07-31 23:45) [413]
> Блин, целых 2 страницы ругани и оффтопика...
> :-(
просим прощения
> Хлопцы, поберегите размер ветки, а то форум слетит. Она
> и без того обещает быть о-о-очень длинной...
> :о)
Так мы откроем новую, например: "Калькулятор 2. Судный день" или
"Калькулятор. Приемник Санта-Барбары"
← →
Gero © (2004-07-31 23:45) [414]
Юрий Зотов © (31.07.04 23:43)
> Блин, целых 2 страницы ругани и оффтопика...
Да ничего, все уже помирились.
Пора вспомнить про сабж.
← →
Nous Mellon © (2004-07-31 23:46) [415]
> Предлагаю бартер, раз настроение у всех хорошее. Не ругаться,
> не ссориться - это в порядке вещей.
ok
> главное, если комментировать как-то сообщения друг друга
> так, чтобы поддеть, то обязательно в шутку и помечать смайликом
> (впрочем, ты так и делаешь).
ok
> Ну а ник я сменю.
А мы можем поучавтвовать в выборе? Или хотя бы порекомендовать?
← →
Nous Mellon © (2004-07-31 23:48) [416]
> А мы можем поучавтвовать в выборе? Или хотя бы порекомендовать?
В другой ветке ессно
← →
Gero © (2004-07-31 23:49) [417]
> Nous Mellon © (31.07.04 23:48)
Заводи ветку.
← →
Nous Mellon © (2004-07-31 23:50) [418]
> Заводи ветку.
Жду согласия именинника
← →
Mihey_temporary © (2004-07-31 23:51) [419]>А мы можем поучавтвовать в выборе? Или хотя бы порекомендовать?
В принципе да. Я сейчас не хочу использовать Mihey, так как калькулятор горит и ещё проекты.
← →
Думкин © (2004-08-01 06:23) [420]> [378] GrayFace © (31.07.04 16:59)
> Думкин © (31.07.04 13:13) [377]
> Сейчас 4,7K.
> [377] Думкин © (31.07.04 13:13)
> Поэтому желательно приводя ссылку, указывать объем сжатого файла.
Тебе это не трудно, а мне легче, чем носиться по всей ветке.
По этой сслыкее у меня ругается на отсутствие узла и прочие проблемы и не качает:
http://www.grayface.chat.ru/Calk.zip
Возможно дело в моей плохой связи. Попробую позже.
← →
Думкин © (2004-08-01 06:52) [421]-1^2 Ответ: -1
-1^-2 Ответ: 1
И про замечания:
[Hint] Unit1.pas(74): Value assigned to "Stepen" never used
[Warning] Unit1.pas(217): For loop control variable must be simple local variable
[Warning] Unit1.pas(233): For loop control variable must be simple local variable
[Warning] Unit1.pas(241): For loop control variable must be simple local variable
[Warning] Unit1.pas(272): Return value of function "GetValue" might be undefined
[Warning] Unit1.pas(229): Variable "fu" might not have been initialized
[Warning] Unit1.pas(287): For loop control variable must be simple local variable
Мне кажется, что тут есть над чем поработать, благо все замечания крайне просты.
Неплохо бы прикладывать используемую спецификацию или описание. Места занимать будет мало - зато опять же - все в одном флаконе. Насчет постоянной подмены приянятой спецификации, я думаю ее не будет в виду вашей честности и боязни канделябров.
Удачи.
← →
Nous Mellon © (2004-08-01 09:05) [422]
> И про замечания:
Да, и это он называет предупреждениями для чайников.
← →
GrayFace © (2004-08-01 10:50) [423]Юрий Зотов © (31.07.04 19:20) [380]
>Выражение: -5^2
>Результат: -25
>
> Что будем править? Спецификацию, или код? Или и то, и
> то другое?
Изменять "div" на "mod". http://www.grayface.chat.ru/Calk.zip
Огромное Кулясищще © (31.07.04 18:54) [379]
> КБЗ
Че значит КБЗ?
Nous Mellon © (31.07.04 19:32) [381]
> Нужно всегда думать. АП привел аргументы, а ты нет.
(Хотел поругаться, но все такие добрые и померившиеся, поэтому не буду) Он привел 1 аргумент, я привел 2:
1) Алгоритм(всякое возведение в степень к нему не относится) правился минимально, после того, как я увидел пример спецификации.
2) Посмотри мой код
Вот привожу третий, а точнее пояснение ко второму: какой толк от этой теории, если в калькуляторе все делается не по ней?
Больше он никого и ничего не привеводил.
Nous Mellon © (31.07.04 22:42) [389]
> Он еще не молод
??? Мне, как и тебе 17. То, что я не ламер - это не максималистические настроения, а трезвая оценка. Конечно, я еще не профи, но и не ламер.
Огромное Кулясищще © (31.07.04 23:00) [393]
> Можно ли мне предупредить, что у тебя козявка в носу?
LOL
Юрий Зотов © (31.07.04 23:43) [411]
> Блин, целых 2 страницы ругани и оффтопика...
Теперь будут 2 страницы перемирия и взаимных любезностей. :-)
Думкин © (01.08.04 6:52) [421]
> и боязни канделябров.
В каком смысле?? ИМХО, канделябр - это че-то типа подсвечника. А я не боюсь подсвешников.
Nous Mellon © (01.08.04 9:05) [422]
> Да, и это он называет предупреждениями для чайников.
Это - не Unsafe code и не Unsafe type.
← →
Nous Mellon © (2004-08-01 11:16) [424]
> ??? Мне, как и тебе 17
ЭЭЭ. Жирным - убрать нафиг :)
> То, что я не ламер - это не максималистические настроения,
> а трезвая оценка. Конечно, я еще не профи, но и не ламер.
Что ты понимаешь под ламером. Я например понимаю это как воинствующий и уверенный в своем превосходстве чайник.
>
> Это - не Unsafe code и не Unsafe type.
А я и не про них говорил. А то что привел Думкин вполне правильные предупреждения.
> Вот привожу третий, а точнее пояснение ко второму: какой
> толк от этой теории, если в калькуляторе все делается не
> по ней?
ИМХО в этоге все скатится к тому что ты либо используешь теорию либо придусмаешь в итоге свою подобну. Впрочем посмотрим. Моя уверенность 90%.
← →
Anatoly Podgoretsky © (2004-08-01 11:50) [425]Нет было без теории за два часа. И то и другое давно неправда и уже не важно.
← →
Кириешки © (2004-08-01 12:18) [426]Читал ветку почти двадцать минут. Не пора ли открыть новую с таким же названием, или хотите побить рекорд кол-ва ответов?
← →
VMcL © (2004-08-01 13:22) [427]>>Кириешки © (01.08.04 12:18) [426]
>хотите побить рекорд кол-ва ответов?
До "любой темы ветки" этой ветке ой как далеко...
← →
Думкин © (2004-08-01 13:42) [428]> [423] GrayFace © (01.08.04 10:50)
> Думкин © (01.08.04 6:52) [421]
> > и боязни канделябров.
Шуклеров били ими. Речь о простотм. Что вы даете окончательную спецификацию и прикладываете ее к коду в дальнейшем не меняя. А при смене - канделябром. Вот и все.
← →
Esu © (2004-08-01 14:01) [429]
> ??? Мне, как и тебе 17. То, что я не ламер
...
Значит программистами становятся в определенном (+/-) возрасте, как половое созревание :))
← →
GrayFace © (2004-08-01 14:52) [430]Nous Mellon © (01.08.04 11:16) [424]
>Что ты понимаешь под ламером. Я например понимаю это как воинствующий и уверенный в своем превосходстве чайник.
Я тоже.
Anatoly Podgoretsky © (01.08.04 11:50) [425]
> Нет было без теории за два часа. И то и другое давно неправда и уже не важно.
Да где вы эти 2 часа-то увидели? Никогда не говорил, что напишу калькулятор за 2 часа.
Кириешки © (01.08.04 12:18) [426]
> Читал ветку почти двадцать минут. Не пора ли открыть
> новую с таким же названием, или хотите побить рекорд
> кол-ва ответов?
Хотелось бы.
← →
parovoZZ © (2004-08-01 17:15) [431]Ну где Ваша мечта майкрософта?
← →
Mihey_temporary © (2004-08-01 17:38) [432]Одно ясно сейчас уже точно: без теории дольше.
← →
Думкин © (2004-08-01 20:02) [433]0^1 Ответ: Floating point division by zero at offset 3
← →
parovoZZ © (2004-08-01 20:16) [434]Без теории конечно намного дольше. Тогда зачем она была б нужна, эта теория?
← →
Думкин © (2004-08-01 20:25) [435]> [434] parovoZZ © (01.08.04 20:16)
Примерно так. Просто в конкретный момент - теория это концентрация наших представлений о происходящем. Не нечто отвлеченное, а именно сгусток наших представлений. Хотя философы будут пинать ногами возможно.
Меняются представления - меняются теории, все течет, все меняется.
Так и тут. Именно поэтому, если будет написан полноценный калькулятор по современным представлениям он должен будет отражать ту самую теорию, или это будет другой калькулятор, но на...Паскале и противоречащий теории? Это как с тем самым двигателем вечным. :))
← →
parovoZZ © (2004-08-01 20:33) [436]А не проще ли сперва изучить теорию, а потом что-то изобретать? Вы б еще задумали калькулятор для работы с римским цифрами без теории создать. Посмотрел бы я на Вас.
← →
Юрий Зотов © (2004-08-02 00:25) [437]> parovoZZ © (01.08.04 20:33) [436]
Вот об этом и спор. Тут на примере калькулятора пытаются доказать, что теория на фиг не нужна.
← →
Думкин © (2004-08-02 05:49) [438]1.1=1,1
1.1.1 = Syntax error at offset 0
(1.1).1 = 0,11
1.(1.1) = 1,1
ну и т.д
← →
Игорь Шевченко © (2004-08-02 10:03) [439]Ламер - это тот, кто во всех своих бедах обвиняет компилятор, тестировщиков, неудачное расположение звезд, и т.п. Всех, кроме себя и своего глючного кода.
P.S. Я бы за такой код руки бы отрывал. Без скидки на возраст.
← →
GrayFace © (2004-08-02 10:36) [440]УЖАС ! Никогда не думал, что наделаю столько ошибок. Это уже третья ошибка в возведении в степень. :(
http://www.grayface.chat.ru/Calk.zip
Юрий Зотов © (02.08.04 0:25) [437]
> Вот об этом и спор. Тут на примере калькулятора пытаются доказать, что теория на фиг не нужна.
Я не пытаюсь.
← →
Думкин © (2004-08-02 10:46) [441]Я дико извиняюсь, а что именно изменилось?
Два описанных мной бага - живы.
> [433] Думкин © (01.08.04 20:02)
> [438] Думкин © (02.08.04 05:49)
← →
Anatoly Podgoretsky © (2004-08-02 10:50) [442]http://delphimaster.net/view/14-1089499317/
← →
Alx2 © (2004-08-02 10:52) [443]>Думкин © (02.08.04 10:46) [441]
>Я дико извиняюсь
Давно мечтаю посмотреть как это выглядит :))
← →
Anatoly Podgoretsky © (2004-08-02 10:52) [444]Alx2 © (02.08.04 10:52) [443]
Про себя матом кроет.
← →
Думкин © (2004-08-02 11:02) [445]> [443] Alx2 © (02.08.04 10:52)
:))) А как еще тут? Только дико, - нового-то пока тютю. Да и подержки от других не вижу, пишут и пишут уже 4,5 часа.
← →
Nous Mellon © (2004-08-02 11:11) [446]
> [441] Думкин © (02.08.04 10:46)
Видимо началось соревнование: кто найдет больше багов :)
> Я не пытаюсь.
Ну вот уже отказываться начали. Скоро скажем что Юрий Зотов все подстроил и заставил всех писать калькулятор?
← →
Anatoly Podgoretsky © (2004-08-02 11:29) [447]Nous Mellon © (02.08.04 11:11) [446]
А разве нет, двое пишут, третий обещал.
Вот он змей в окне маячит
За спиною тестер прячет
← →
Alx2 © (2004-08-02 11:36) [448]>Anatoly Podgoretsky © (02.08.04 11:29) [447]
>А разве нет, двое пишут, третий обещал.
А кто третий?
← →
Думкин © (2004-08-02 11:41) [449]> [448] Alx2 © (02.08.04 11:36)
Спросил он испуганно? :)
Вроде не ты. Да и ты не калькулятор писал. Что-то у меня к тебе ася не прорывается, ко всем идет, а к тебе нет. :(
← →
Alx2 © (2004-08-02 11:48) [450]>Думкин © (02.08.04 11:41)
>Спросил он испуганно? :)
Ага :))
>Что-то у меня к тебе ася не прорывается,
>ко всем идет, а к тебе нет. :(
Сеть у нас неустойчиво работает что-то
← →
Nous Mellon © (2004-08-02 12:28) [451]
> А разве нет, двое пишут, третий обещал.
Эээ. А разве я что то не так сказал?
Я это и имел в виду
← →
Alx2 © (2004-08-02 12:31) [452]>Nous Mellon © (02.08.04 12:28) [451]
А кто третий? :)
← →
Nous Mellon © (2004-08-02 12:59) [453]
> А кто третий? :)
Может Murkt?
← →
parovoZZ © (2004-08-02 13:03) [454]
> Вот он змей в окне маячит
> За спиною тестер прячет
Ну как, готова мечта мелкософта?)) Пока я только вижу генератор багов. Уже выходные прошли. А ветка на докторскую поди потянет. Нобеля может дадут?
← →
Cobalt © (2004-08-02 14:45) [455]Нобеля - не Нобеля, но если не сделает - Шнобель начистют (хотя бы и виртуально :)
← →
Mihey_temporary © (2004-08-02 14:58) [456]>Ну как, готова мечта мелкософта?)) Пока я только вижу генератор багов. Уже выходные прошли. А ветка на докторскую поди потянет. Нобеля может дадут?
Никто же не сидит ночами и не пишет. Есть время - пишут, нет времени - не пишут.
← →
GrayFace © (2004-08-02 20:22) [457]Думкин © (01.08.04 6:23) [420]
> По этой сслыкее у меня ругается на отсутствие узла и прочие проблемы и не качает:
> http://www.grayface.chat.ru/Calk.zip
Думкин © (02.08.04 10:46) [441]
>Я дико извиняюсь, а что именно изменилось?
> Два описанных мной бага - живы.
[433] умер. [438] - не баг, а фича:
(1.1).1=(1.1)*0.1=0.11
1.(1.1)=1.0*(1.1)=1.1
А вот баг из [441] живет.
Внимание, All, если не работает http://www.grayface.chat.ru/Calk.zip, заходите на http://www.grayface.chat.ru, а оттуда берите Calk.zip
Nous Mellon © (02.08.04 11:11) [446]
> Я не пытаюсь.
>Ну вот уже отказываться начали. Скоро скажем что Юрий Зотов все подстроил и заставил всех писать калькулятор?
Я говорил, что тралить большую часть времени на теорию бессмысленно. Это не значит, что теория не нужна.
← →
Mihey_temporary © (2004-08-02 23:39) [458]2 Юрий Зотов:
>Более того, мне кажется, что проанализировав алгоритм любого написанного без теории строчного калькулятора, всегда можно будет составить выражение, которое этот алгоритм не способен вычислить уже в самом своем принципе. То есть, указать выражение, полностью опровергающее сам алгоритм.
Я считаю, что верный алгоритм уже известен безо всякой теории. Я говорил о нём в одном из постов в самом начале. Если человек может руководствуясь некоторыми правилами посчитать пример на бумажке, то можно ввести эти правила в компьютер и заставить его делать то же самое.
← →
Думкин © (2004-08-03 06:12) [459]> [458] Mihey_temporary © (02.08.04 23:39)
Вся штука в том, что ему для этого может понадобиться счетное множество предложений. А введя нечто сумбурное из головы - он с высокой степенью вероятности нарвется именно на
> Более того, мне кажется, что проанализировав алгоритм любого написанного без теории строчного калькулятора, всегда можно будет составить выражение, которое этот алгоритм не способен вычислить уже в самом своем принципе. То есть, указать выражение, полностью опровергающее сам алгоритм.
Если же он введет конечное множество и сможет доказать его непротиворечивосить - ну что ж, он проделает коллосальную работу и .... у него и возникнет эта самая теория, как побочное и в дальнейшем способствующее в другом, что собственно и происходит в жизни. Теория не для захламления головы и книжных полок - это краткое, ясное, взвешенное описание наших представлений на данный, конкретный момент.
> [457] GrayFace © (02.08.04 20:22)
Фича не фича, но пугает такое.
← →
Юрий Зотов © (2004-08-03 09:12) [460]> Mihey_temporary © (02.08.04 23:39) [458]
> Если человек может руководствуясь некоторыми правилами
> посчитать пример на бумажке, то можно ввести эти правила в
> компьютер и заставить его делать то же самое.
Угу. Правда, есть одна небольшая проблемка - эти правила в компьютер надо еще как-то ввести. Вот в этом "как-то" все дело и есть.
← →
Igorek © (2004-08-03 10:45) [461]Рискну нарваться на обвинение в "писании против ветра". LOL
Только вот был бы ветер. А то так - сквозняки...
Также прошу прощения, если данный подход уже был в ветке.
Итак забудем всякие грамматики и тому подобное.
Упростим также выражения для ясности идеи.
Пусть в выражениях фигурируют только целые числа, +-*/(). Запись префиксная.
Попробуем реализовать тот алгоритм, который обычно использует человек, когда вычисляет такое выражение.
Итак, понятно, что сначала вычисляем то что в скобках. Также следуем приоритету операций.
Вкратце идея состоит в том, что-бы вычислять то, что надо вычислить в первую очередь и заменить кусок исходной строки на число.
Т.е. сначала ищем первую открывающую скобку, после которой нету открывающей. Потом ищем следующую закрывающую. Имеем подстроку. Для вычисления ее найдем первый знак * или /. От этого знака пройдем влево и вправо и найдем числа для операции. Снова имеем подстроку. Вычислим значение. Заменим им подстроку. Повторяем процесс, пока не останется только + или -. Повторим процесс пока останется только число. Заменим им подвыражение в скобках - раскроем скобки. Повторяем процесс, пока скобок не останется. Потом вычислим то что осталось со знаками */+- (см. выше).
Итого в конце получим значение.
---
Можно конечно все оформить в виде набора функций вычисления разных типов выражений и рекурсивных их вызовов. Можно и без рекурсии.
---
Можно еще упростить...
← →
Игорь Шевченко © (2004-08-03 10:46) [462]
> Пусть в выражениях фигурируют только целые числа, +-*/().
> Запись префиксная.
Префиксная - этот как ? Пример, плз
← →
Anatoly Podgoretsky © (2004-08-03 10:56) [463]Юрий Зотов © (03.08.04 09:12) [460]
Без теории, тогда три поля ввода Операнд1 оператор Операнд2
Игорь Шевченко © (03.08.04 10:46) [462]
+ A B
← →
GrayFace © (2004-08-03 11:11) [464]Igorek © (03.08.04 10:45) [461]
Такой подход использовал Михей. Результат - на лице. :))
← →
Игорь Шевченко © (2004-08-03 11:21) [465]Anatoly Podgoretsky © (03.08.04 10:56) [463]
Она же польская не обратная.
← →
False_Delirium © (2004-08-03 12:48) [466]2GrayFace Степень страдает и страдает.
http://rsdn.ru/article/alg/fastpow.xml
Посмотрел калькулятор.
Код "дикий", другого слова не смог подобрать. Наверное GrayFace хочет прибраться в коде после написания программы, раз не сделал во время.
GrayFace, создай ветку "Разбор полётов" и помести туда свой код, откроется ещё одна долгоиграющая тема.:)
← →
Sha © (2004-08-03 12:56) [467]Igorek © (03.08.04 10:45) [461]
Лет так 10 назад попробовал 3 варианта
1. Твой (поиск и раскрытие скобок) Igorek © (03.08.04 10:45) [461]
2. Нисходящий парсер наподобии Ertong © (25.07.04 19:56) [30]
3. Обратная польская запись.
Наиболее простой, интуитивно понятный и расширяемый код получается во втором варианте. Используя его легко написать свой собственный язык и интерпретатор. А есть кое-какие теоретические знания, то и компилятор.
← →
NeyroSpace © (2004-08-03 14:13) [468]Запускаем Calc.exe -> инженерный
Вычислите 2 плюс 2 умножить на 2.
Так что правим баги и пишем конкурента! :-)
← →
NeyroSpace © (2004-08-03 14:15) [469]т.е. не инженерный а обычный :-)
← →
Рамиль © (2004-08-03 14:15) [470]
> Вычислите 2 плюс 2 умножить на 2.
Получается 6. Должно быть что то другое?
← →
Рамиль © (2004-08-03 14:16) [471]
> т.е. не инженерный а обычный :-)
Получается 8. Должно быть что то другое?
← →
NeyroSpace © (2004-08-03 14:18) [472]опс я тормознул...
← →
Anatoly Podgoretsky © (2004-08-03 14:30) [473]NeyroSpace © (03.08.04 14:13) [468]
Читай выще ветки, сказано, что это два разных калькулятора в одно упаковке, строчный (инженерный) и простой по операторный
2+(2*2) и (2+2)*2 результаты соответвуют
← →
Anatoly Podgoretsky © (2004-08-03 14:35) [474]И еще одна особенность, у него очень высокая точность - 32 значащих разряда!!!
ЗЫ: выше скобки только для того, что бы подчеркнуть, что первый строчный и работает с приоритетами операций, а второй одно операционный, соответственно никаких приоритетов, операции выполняются по мере поступления.
← →
Думкин © (2004-08-03 14:37) [475]> [474] Anatoly Podgoretsky © (03.08.04 14:35)
Надо написать новый для 33 разрядов. Даешь арбайтен по стахановски за 5 часов.
← →
Anatoly Podgoretsky © (2004-08-03 14:45) [476]Для начала пусть 18-20 сделают
← →
parovoZZ © (2004-08-03 14:58) [477]Ну а что Вы хотите? Пусть пишут. На ошибках учатся. А сколько не смотри на играющего пианиста играть всёравно не научишся.
← →
Igorek © (2004-08-03 14:59) [478]
> Игорь Шевченко © (03.08.04 10:46) [462]
> > Пусть в выражениях фигурируют только целые числа, +-*/().
> > Запись префиксная.
> Префиксная - этот как ? Пример, плз
Знак операции над двумя операндами стоит между ними. Напр. "2+2".
Впрочем я могу ошибиться - если так, то поправьте.
Просто по аналогии с постфиксной, когда сначала идут оператора, заносятся в стек, а потом операции вытаскивают два из стека и результат пишут в тот же стек.
← →
Sandman25 © (2004-08-03 15:03) [479][478] Igorek © (03.08.04 14:59)
Это инфиксная.
← →
Игорь Шевченко © (2004-08-03 15:21) [480]
> Знак операции над двумя операндами стоит между ними. Напр.
> "2+2".
> Впрочем я могу ошибиться - если так, то поправьте.
Толкование слова "префикс" ни о чем не говорит ?
← →
Mihey_temporary © (2004-08-03 18:40) [481]>Такой подход использовал Михей. Результат - на лице. :))
Да, весьма неприятно вылазили фигурные скобки в результате. Приколите, какие чувства у пользователя, когда в ответ вылазит: "231}{222{22,2". В новой версии я против этого сделал проверялку выходного значения.
← →
Anatoly Podgoretsky © (2004-08-03 18:57) [482]И еще проверялку входного значения
← →
GrayFace © (2004-08-03 19:06) [483]Anatoly Podgoretsky © (03.08.04 14:35) [474]
> И еще одна особенность, у него очень высокая точность - 32 значащих разряда!!!
А как повыстить точность?
← →
GrayFace © (2004-08-03 19:11) [484]Кстати в [457]:
> А вот баг из [441] живет.
Я имелл в виду баг из [420].
← →
Mihey_temporary © (2004-08-03 20:34) [485]>А как повыстить точность?
Эй! Это нечестно. Это уже теория. Пожалуйста, не обсуждай это в этой ветке.
2 Anatoly Podgoretsky: Прошу вас, не отвечайте здесь.
← →
Anatoly Podgoretsky © (2004-08-03 22:48) [486]Я и не собирался, пусть сначала 18 знаков сделает :-)
← →
Юрий Зотов © (2004-08-03 23:38) [487]> Igorek © (03.08.04 10:45) [461]
Наверняка Вы хорошо знакомы с классическим однопроходным рекурсивным алгоритмом, работающим строго по теории, но не транслирующим выражение в польскую запись, а сразу же его вычисляющим (пример см. в Ertong © (25.07.04 19:56) [30]).
Ну так вот - если проанализировать цепочку его рекурсий, то легко убедиться, что он работает именно так, как Вы и написали в [461] - подвыражения вычисляются в порядке понижения приоритета. Но при этом имеет, как минимум, 2 преимущества:
- операнды вычисляются сразу по мере прохода, поэтому не требуется их поиск, откаты, дополнительный анализ и пр.
- строка-подвыражение не удаляется из исходной и не заменяется числом (его значением) - то есть, нет потерь времени на многократное перераспределение памяти под строку и т.п.
← →
parovoZZ © (2004-08-03 23:44) [488]Значит, есть надежда?
← →
VMcL © (2004-08-04 20:43) [489]>>parovoZZ © (03.08.04 23:44) [488]
Есть, на это: "побить рекорд кол-ва ответов" (Кириешки © (01.08.04 12:18) [426])
← →
GrayFace © (2004-08-04 20:54) [490]Нет. В "А не устраивать ли нам небольшие конкурсы по кодингу?" - уже 735 ответов и, наверняка, активно добавляются новые.
← →
VMcL © (2004-08-04 21:17) [491]>>GrayFace © (04.08.04 20:54) [490]
В "любой теме ветки" несколько тысяч было. Точно не помню, было ли пять тысяч, но три, вроде, точно было.
← →
Думкин © (2004-08-05 06:45) [492]> [490] GrayFace © (04.08.04 20:54)
А... результаты будут?
← →
Anatoly Podgoretsky © (2004-08-05 09:34) [493]Ну ты захотел
← →
Murkt © (2004-08-05 09:40) [494]VMcL © (04.08.04 21:17) [491]
АФАИР 55хх
← →
GrayFace © (2004-08-05 11:32) [495]Думкин © (05.08.04 6:45) [492]
А... результаты будут?
Не понял.
Murkt © (05.08.04 9:40) [494]
Не понял.
← →
Думкин © (2004-08-05 11:37) [496]> [495] GrayFace © (05.08.04 11:32)
Есть результаты?
← →
Mihey_temporary © (2004-08-05 18:45) [497]Не дадим ветке умереть! По делу: работы продолжаются успешно, но в связи с хорошей погодой - медленее, чем хотелось. Боюсь, что на этой неделе не успею как планировал. Несмотря на то, что большинство кода уже написано и многие проблемы решены, ещё предстоит отладка (специальный "крэш-тест") и большая вероятность, что выявятся баги, которые придётся устранять.
← →
pavel_pavel © (2004-08-05 21:13) [498]Вы че, еще не закончили??? М-да.
← →
Murkt © (2004-08-05 21:34) [499]>Не понял.
А че тут понимать? Тред "Любая тема ветки" был длинной пять тысяч пятьсот с лишним мессаг.
← →
Anatoly Podgoretsky © (2004-08-05 21:58) [500]Старый сервер больше не выдержал, не по теории написан
← →
GrayFace © (2004-08-06 11:00) [501]Думкин © (05.08.04 11:37) [496]
Какие результаты-то? Калькулятор? Конечно, есть. Уже давно.
Mihey_temporary © (05.08.04 18:45) [497]
> но в связи с хорошей погодой - медленее, чем хотелось.
А у нас погода, наоборот испортилась - вчера шли дожди, сегоня - лужи.
Murkt © (05.08.04 21:34) [499]
Че такое "АФАИР 55хх"??
← →
Думкин © (2004-08-06 11:02) [502]> [501] GrayFace © (06.08.04 11:00)
> Думкин © (05.08.04 11:37) [496]
Это который считает 1.(1.1).1 Но не считает 1.1.1 ?
← →
GrayFace © (2004-08-06 11:12) [503]Думкин © (06.08.04 11:02) [502]
> Это который считает 1.(1.1).1 Но не считает 1.1.1 ?
Нет это вот:
>Думкин © (05.08.04 11:37) [496]
>> [495] GrayFace © (05.08.04 11:32)
>
> Есть результаты?
А по поводу 1.(1.1).1 и 1.1.1 я говорил, что это не глюк. Это умножение при отсутствии знака.
← →
Danilka © (2004-08-06 11:14) [504][500] Anatoly Podgoretsky © (05.08.04 21:58)
А новый - по теории? выдержит в случае чего? :)
← →
Думкин © (2004-08-06 11:16) [505]> [503] GrayFace © (06.08.04 11:12)
А почему тогда 1.1.1 не умножается? Это умножение без знака описано, где?
← →
Anatoly Podgoretsky © (2004-08-06 11:20) [506]Danilka © (06.08.04 11:14) [504]
Новый и так еле дышит, давление 500
← →
GrayFace © (2004-08-06 11:43) [507]Думкин © (06.08.04 11:16) [505]
Да. Я че-то тупил. Скачай новую версию.
← →
GrayFace © (2004-08-06 11:58) [508]Если уже скачал, то еще раз скачай. Я исправил степень.
← →
Calm © (2004-08-06 12:37) [509]
> Если уже скачал, то еще раз скачай
И продолжай скачивать пока не заработает :)
← →
VMcL © (2004-08-06 20:45) [510]Удалено модератором
Примечание: Создание пустых сообщений
← →
Fantasist (2004-08-07 02:41) [511]
> И продолжай скачивать пока не заработает
:D
Новый вариат "сверхупорства" - скачивать калькулятор пока не заработает. (по аналогии с: вводить неправильный пароль, пока система не согласиться)
← →
Mihey_temporary © (2004-08-07 23:21) [512]Урааа! Все технические трудности решены. В результате есть рабочие заготовки, из которых нужно сделать функциональные части и соединить их вместе. Хотя объём работ может показаться большим, но радует то, что эти работы - простые и приносят удовольствие.
← →
Mihey_temporary © (2004-08-10 00:53) [513]Держись ветка на плаву, скоро отчитываться.
← →
GrayFace © (2004-08-10 12:12) [514]Жалко, что ветка дохнет. Так и не выиграем спор.
← →
Думкин © (2004-08-10 12:19) [515]> [514] GrayFace © (10.08.04 12:12)
У тебя надо уже код смотреть. Хотя я бы от неявного умножения отказался.
И неплохо было бы если бы ты написал, что же он у тебя может, чтобы отклонение от этого можно было бы считать ошибкой. А то вдруг ты скажешь, что это фича?
← →
Думкин © (2004-08-10 12:22) [516]Да и код бы причесал, все-таки не тебе смотреть.
← →
Sandman25 © (2004-08-10 12:23) [517][516] Думкин © (10.08.04 12:22)
Форматтер не используешь?
← →
Думкин © (2004-08-10 12:27) [518]> [517] Sandman25 © (10.08.04 12:23)
Это как?
← →
Anatoly Podgoretsky © (2004-08-10 12:30) [519]автоконвектор красоты
← →
Sandman25 © (2004-08-10 12:31) [520][518] Думкин © (10.08.04 12:27)
Нажимаешь комбинацию клавиш, и код в Delphi изbegin
for i:=1 to 15 do s:= s+ 1;
end
становитсяbegin
for I := 1 to 15 do
S := S + 1;
end
Причем вид кода настраивается по желанию.
Есть эксперт для D6 и выше
← →
Sandman25 © (2004-08-10 12:32) [521]Соврал. Написано, что работает, начинаяч с D2
← →
Думкин © (2004-08-10 12:33) [522]Нет, не пользуюсь и не хочу. :)
← →
Sandman25 © (2004-08-10 12:36) [523][522] Думкин © (10.08.04 12:33)
Везет тебе. Мне тут на новом месте дали кучу чужого кода сопровождать. Без форматтера я бы загнулся :)
← →
Думкин © (2004-08-10 12:44) [524]> [523] Sandman25 © (10.08.04 12:36)
Чур меня чур. У меня чужой, как правило, это VCL.
А тебе - Кысмет, однако. :)
← →
GrayFace © (2004-08-11 13:25) [525]Sandman25
А на какой комбинации клавиш этот форматер?
Думкин © (10.08.04 12:19) [515]
> У тебя надо уже код смотреть. Хотя я бы от неявного
>умножения отказался.
> И неплохо было бы если бы ты написал, что же он у тебя
> может, чтобы отклонение от этого можно было бы считать
> ошибкой. А то вдруг ты скажешь, что это фича?
Вот так можно отказаться от неявного умножения:const EmptyMul=false;
В GrayFace (30.07.04 10:48) [338] есть спецификация калькулятора.
← →
Юрий Зотов © (2004-08-11 13:58) [526]> GrayFace © (11.08.04 13:25) [525]
Неявное умножение надо убирать, и из спецификации тоже. Иначе возникает неоднозначность.
Например, 3+3 - это что? Сложение или неявное умножение? Один скажет - сложение, другой - умножение. И оба будут правы, потому что спецификация допускает и то, и другое.
← →
Думкин © (2004-08-11 15:08) [527]1.1.1 - что это?
← →
Юрий Зотов © (2004-08-11 15:39) [528]> Думкин © (11.08.04 15:08) [527]
То же самое, но с еще худшими последствиями: 1.2.3 - это что?
Возможные варианты:
1.0 * 2.0 * 3 = 6
1 * 0.2 * 0.3 = 0.06
1.2 * 0.3 = 0.36
1.0 * 2.3 = 2.3
Спецификация допускает любой вариант. Тестировать невозможно.
← →
Думкин © (2004-08-11 15:48) [529]> [528] Юрий Зотов © (11.08.04 15:39)
Именно. Но получил только:
> не баг, а фича:
> (1.1).1=(1.1)*0.1=0.11
> 1.(1.1)=1.0*(1.1)=1.1
Вот и все. :(
← →
VMcL © (2004-08-11 15:51) [530]>>Думкин © (11.08.04 15:48) [529]
Ого. Скобки, типа, по рэндому расставляются? "Я фигею, дорогая редакция".
← →
Mihey_temporary © (2004-08-11 21:39) [531]М-да, из-за всяких гопников, которые воруют у людей вещи на пляжах, сразу потеряна куча времени. Надеюсь выпустить калькулятор на выходных.
← →
Думкин © (2004-08-12 05:53) [532]> [530] VMcL © (11.08.04 15:51)
Нет, скобки поставил я - и оно посчиталось как написано. Но это непрозрачно и из спецификации мне не очевидно, что должно быть так, хотя возможно и не прав.
← →
Sandman25 © (2004-08-12 09:11) [533][525] GrayFace © (11.08.04 13:25)
А на какой комбинации клавиш этот форматер?
Это эксперт к Delphi, его сначала скачать и установить надо. Поищите DelForEx в какой-нибудь поисковой системе, а то я уже не помню, откуда его скачивал.
← →
GrayFace © (2004-08-12 13:17) [534]Юрий Зотов © (11.08.04 15:39) [528]
Думкин © (11.08.04 15:48) [529]
Ну если читать спецификацию слева на право и пытаться выделить наибольший кусок, подходящий под <Operand>, то будет так, как делает калькулятор.
Вот без неявного умножения:<Empty> ::=
<Sign> ::="+"|"-"
<Digit> ::="0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
<Operation1> ::="*"|"/"
<Operation2> ::="+"|"-"
<FunctionName>::="sin"|"cos"|"tg"|"ctg"|"arcsin"|"arccos"|"arctg"|"arcctg"
<exponent> ::="e"|"Е"
<Separator> ::="."|<DecimalSeparator>
<Number> ::={Digit}[Separator][{Digit}][<Exponent>[Sign]{Gigit}] | <Separator>{Digit}[<Exponent>[Sign]{Gigit}]
<function> ::=<FunctionName><operand>
<operand> ::=[{Sign}]<operand>|<number> | "pi" | <function> | "("<expression>")" | "|"<expression>"|"
<factor> ::=<operand>[{ "^" <operand>}]
<term> ::=<factor>[{<Operation1><factor>}]
<expression> ::=<term>[{<Operation2><term>}]
← →
Григорьев Антон © (2004-08-13 07:59) [535]Вот, кстати, в "Статьях" наткнулся: "Программирование математических приложений, Дьяченко Евгений" (http://www.delphimaster.ru/articles/mathprogramming.html). Там тоже есть алгоритм распознования формулы. Ссылка на полную реализацию этого алгоритма (см. в статье ссылку "Математика v0.5" даёт у меня перманентную 500-ую ошибку, но, судя по тому, что есть в статье, калькулятор тоже без теории написан.
← →
Юрий Зотов © (2004-08-13 10:05) [536]> Григорьев Антон © (13.08.04 07:59) [535]
> судя по тому, что есть в статье, калькулятор тоже
> без теории написан.
Следствием чего стало такое признание автора (примечание курсивом мои - они переводят обтекаемую форму высказываний на "прямую" речь):
"В заключении, хочу отметить, что приведенный алгоритм является не совсем полным (т.е. просто неполным - ЮЗ). Он будет работать с определенными ограничениями (т.е. умеет распознавать лишь какие-то частные случаи формул - ЮЗ). Для того, что бы программа умела работать с абсолютно любыми формулами, необходимо решить огромное количество мелких и достаточно простых проблем (на самом деле количество таких проблем не "огромно", а бесконечно, потому что бесконечно количество самих формул - следовательно, без применения обобщающего (т.е. теоретического) подхода решить их ВСЕ попросту нельзя - ЮЗ), их можно назвать предельными случаями, которые требуют отдельного описания в программе. Основные проблемы возникают со знаком минуса и раскрытием скобок (вот где уж точно не возникает совершенно никаких проблем, если знать, как это делается - ЮЗ). В процессе написания программы эти проблемы быстро решаются, если их обнаружить, что не всегда легко (а говоря без обиняков, обнаружить ВСЕ эти проблемы не просто "не всегда легко", а попросту невозможно, в силу уже отмечавшейся бесконечности их количества - ЮЗ)".
← →
Юрий Зотов © (2004-08-13 10:15) [537]Забыл добавить.
То есть, читать следует так: "Народ, я тут написал нечто такое, что когда-то работает, а когда-то не работает, причем никому точно неизвестно, когда оно работать будет, а когда нет".
← →
Григорьев Антон © (2004-08-13 10:34) [538]
> Юрий Зотов © (13.08.04 10:15) [537]
> Забыл добавить.
>
> То есть, читать следует так: "Народ, я тут написал нечто
> такое, что когда-то работает, а когда-то не работает, причем
> никому точно неизвестно, когда оно работать будет, а когда
> нет".
Именно на это я и намекал :))
← →
Mihey_temporary © (2004-08-14 18:51) [539]Работа над калькулятором в завершающих стадиях. Правда, уже замечен огромный недочёт - малая скорость работы программы (на выражениях определённого вида).
Кроме того, хочу предупредить, что первоначально я код публиковать не буду, а ещё разок пройдусь по нему, подкорректирую и тогда опубликую (и это будет через неделю после выкладывания самого калькулятора).
← →
Mihey_temporary © (2004-08-14 23:17) [540]Завтра, т.е. в воскресенье железно выложу калькулятор. Помнится, была ветка, где кто-то без цели считал степени двойки, вплоть до 2^64. Однако на моём калькуляторе удалось сосчтитать 2 в 256 степени и это число:
115 792 089 237 316 195 423 570 985 008 687 907 853 269 984 665 640 564 039 457 584 007 913 129 639 936
← →
Nous Mellon 22 (2004-08-14 23:44) [541]Я уже пол-России проехал, а воз и ныне там :-)
← →
Думкин © (2004-08-15 06:53) [542]> Mihey_temporary © (14.08.04 23:17)
Я считал. Только намного больще - это занимало несколько строк. Вот степень не помню, но много больше 256. И 1000! приводил тут. :))
← →
GrayFace © (2004-08-15 10:08) [543]Юрий Зотов
Сегодня воскреенье - выходной.
← →
Mihey_temporary © (2004-08-15 23:56) [544]> Cobalt © (26.07.04 23:28) [148]
>1/sin(1,1222-1,22221)
Очекнь странное сообщение выдал - "Два действия подряд! [02А]"
Ничего не понимаю...
P.S. а виндовый калькулятор слопал, выдал -0,10001
Виндовый калькулятор, конечно, работает правильно, не спорю, но и ты забыл кнопочку "=" нажать :).
← →
Mihey_temporary © (2004-08-15 23:57) [545]Упс, поторопился :) просто проверял выражения, ставшие переломными для первой версии и нашёл разногласия.
← →
Mihey_temporary © (2004-08-16 00:12) [546]Звиняйте великодушно. Не успел зарелизить. Калькулятор готов, но не доделаны правила, вылезла ошибка в крэш-тесте на 300+ выражений (ошибка не калькулятора, а самого сравнителя), не успеваю запаковать и выложить :). Видимо, откладывается до завтра.
← →
Mim1 © (2004-08-16 07:22) [547]Чтото мне старичек Эдельвейс спомнился, из "Понедельник наступает в субботу".
← →
Думкин © (2004-08-16 07:51) [548]> [547] Mim1 © (16.08.04 07:22)
Это не там. Это в "Сказке о тройке".
← →
Mihey_temporary © (2004-08-16 16:54) [549]Expression Calculator v.0.2
http://www.hot.ee/gelphi/ExpCalc.zip
Всё-таки зарелизил. Необходимо было ещё 2 часа на то, что не успел вчера.
Несколько слов. Эту версию прошу считать беткой. За парсер я уверен, не совсем уверен за калькулятор - хочу проработать код ещё раз. Тогда и опубликую его. Кроме того, известны несколько глюков:
Не отлавливается ошибочность выражения типа sin2. Точнее, программа сообщает о внутренней ошибке, но я понимаю, что нужно сделать проверку этого дела с выводом более вразумительного сообщения.
При исключениях не исчезает надпись "Считаю". Забыл влепить исчезалку в try...finally...end. Мелочь, но всё же.
Пока что программа не работает с периодами. Т.е. 2/3*3 выдаст 2.000...00001, а не 2, так как промежуточный результат (2/3) был записан ввиде конечной десятичной дроби. В дальнейшем планируется устранить неточность.
И, наконец, внимание! Используйте точку в качестве десятичного разделителя.
← →
Mihey_temporary © (2004-08-16 16:55) [550]Размер архива 250 Кб.
← →
nikkie © (2004-08-16 17:18) [551]удивляет, почему так долго и неточно считает sin.
судя по [540] внутрях реализована длинная арифметика, видимо из-за этого.
sin(3.1415926)
0.0548036642148768366804128756572852742855831
(на calc.exe: 5,3589793238462617732829186571369e-8)
sin(3.1415926535897932384626433832795)
0.0548036651487895308877487135398332038025398
(на calc.exe: 5,0288419841092213655485729692158e-31)
← →
Mihey_temporary © (2004-08-16 17:25) [552]Почему неточно?
sin(3.1415926) выдаёт:
0.054803664 - карманный калькулятор
0,0548036642148768366804128756572853 - калькулятор Windows
0.0548036642148768366804128756572852742855831 - моё творение
← →
nikkie © (2004-08-16 17:44) [553]не заметил я вот этого:
>Аргумент функций sin, cos, tan (или tg) предполагается в градусах.
по поводу неточности возражение снимается. но все-таки долго очень...
27^(1/3) - через 10 минут счета я снял задачу.
может убрать пока длинную арифметику и сделать на Double/Extended + стандартная реализация функций? все-таки длинная арифметика за пределами поставленной задачи.
← →
nikkie © (2004-08-16 17:47) [554](+2))(
Access Violation
← →
Mihey_temporary © (2004-08-16 18:43) [555]
> (+2))(
> Access Violation
Действительно, не учёл, хотя занимался этим. Но, скажем, выражение составлено не по правилам. Больше интересуют ошибки парсера и калькулятора.
← →
Mihey_temporary © (2004-08-16 18:47) [556]Длинную арифметику я тогда сниму пока что.
Кроме того, забыл ещё про один глюк рассказать. Дробная степень реализуется через корень, при этом отсутсвует проверка на корень чётной степени из отрицательного числа.
← →
nikkie © (2004-08-16 18:49) [557]я потратил полчаса на тестирование, обнаруженные глюки описал.
по-моему достаточно для начала. может еще кто изъявит желание потестировать, но мне хотелось бы тестировать тогда, когда 27^(1/3) будет вычислять в пределах 1 секунды.
← →
Mihey_temporary © (2004-08-16 18:55) [558]2 nikkie:
Но пока что нет такого, что правильное выражение (которое можно посчитать) считает неправильно либо не считает вообще. Из глюков обнаружен один.
← →
nikkie © (2004-08-16 19:05) [559]>Дробная степень реализуется через корень
это как?
(-1)^(3.5)
"- is not an integer value"
(-1)^(3.6)
1
(-1)^(3.7)
-4878.3912434420340881330505872785786504673713417
← →
Mihey_temporary © (2004-08-16 20:17) [560]2 nikkie:
Согласен, степень хромает всё же слишком.
← →
Mihey_temporary © (2004-08-16 20:40) [561]2 nikkie © (16.08.04 19:05) [559]:
А ведь всё равно те примеры не считает даже Windows"овский калькулятор. Поэтому ошибки следует отнести в глюки проверки, о чём я предупреждал Mihey_temporary © (16.08.04 18:47) [556].
← →
Mihey_temporary © (2004-08-16 20:45) [562]Версия без длинной арифметики.
http://www.hot.ee/gelphi/ExpCalcShort.zip [250 Kb]
← →
Mihey_temporary © (2004-08-16 22:28) [563]Надеюсь, завтра утром будут результаты тестирования от Юрия Зотова.
← →
Думкин © (2004-08-17 06:16) [564]> [562] Mihey_temporary © (16.08.04 20:45)
1. 3-3.01 = -0.009999999999999999. Но 3+3.01 = 6.01
← →
VMcL © (2004-08-17 10:18) [565]>>Mihey_temporary © (16.08.04 22:28) [563]
Все калькуляторописатели (без ста грамм такое слово и не напишешь, блин) и так Юрию Зотову уже много ящиков пива должны за работу в качестве VVE.
← →
Anatoly Podgoretsky © (2004-08-17 11:10) [566]Думкин © (17.08.04 06:16) [564]
Это нормально, обычная проблема относительной точности
← →
Anatoly Podgoretsky © (2004-08-17 11:15) [567]Единственно, что калькуляторы должни использовать числа с фиксированой запятой, а не плавающей.
← →
Думкин © (2004-08-17 11:31) [568]> [566] Anatoly Podgoretsky © (17.08.04 11:10)
Я понимаю, только был как-то вопрос от автора по поводу таких выражений 4.9999999 - куда его девать. Поэтому ожидал иного.
← →
Anatoly Podgoretsky © (2004-08-17 11:38) [569]Ожидал взаимности
← →
Юрий Зотов © (2004-08-17 11:54) [570]> VMcL © (17.08.04 10:18) [565]
Ящик я не выпью, слабо. Но и не откажусь - "позову я друзей, не сочтите, что это в бреду..."
:о)
P.S.
Э-э-э... сорри за неграмотность... а что такое VVE? Надеюсь, не ругательство какое-нибудь?
:о)
← →
VMcL © (2004-08-17 12:28) [571]>>Юрий Зотов © (17.08.04 11:54) [570]
>а что такое VVE? Надеюсь, не ругательство какое-нибудь?
Ага. Трехтажный мат (если не считать слово `and`): что-то типа "Validation and Verification Engineer", то есть "тестер" в простонародии :-)
← →
Mihey_temporary © (2004-08-17 14:38) [572]
> Думкин © (17.08.04 06:16) [564]
Версия с длинной арифметикой без проблем считает этот пример.
← →
Mihey_temporary © (2004-08-19 00:01) [573]Я так полагаю, что на калькуляторы забили и все остались при своих мнениях. Тоже верно, тема уже достала. Тем не менее своего мнения я не сменил. По-прежнему считаю, что можно написать калькулятор выражений без знания теории. Более того, хочу заметить, что написать парсер выражений довольно легко. Правильный был дан совет мне в этой ветке - сначала подумай, потом берись за написание. При тщательном подходе всё встаёт на свои места.
Итак, без теории программируется дольше.
Гораздо больше проблем возникло со счётом. Средства Delphi дают слишком малую точность, а хотелось как в калькуляторе Windows. И опять без теории, была написана калькулирующая, которая использует строки для хранения чисел.
Это оказалось возможно, но не рационально. Например, пример выражения от nikkie, результата которого он не дожался. Действительно, число сначала возводилось в 3333...333-ю степень, а потом из него извлекался корень 1000000...000-ой степени. Матетически всё правильно, но вот результата нет. Наверное, лет через десять компьютеры достигнут достаточной мощности, чтобы посчитать это число.
Итак, без теории программы работаю медленнее.
И всё же - это можно было обойти, углубившись в дебри математики. Вся эта сложная теория элементарно реализуется от простого к сложному (например, с помощью моего калькулятора вы можете вычислить значение синуса с точностью до 200 и более знаков, достаточно нажать Ctrl+T и ввести соответсвующую точность - это я к тому, что реализовав действия я реализовал более сложное).
В общем, я хочу сказать, что возможно всё.
Исходники, взгляните, как всё просто и примитивно:
http://www.hot.ee/gelphi/Calculator2.rar [100 Kb]
← →
Sergey_Masloff (2004-08-19 00:24) [574]Mihey_temporary © (19.08.04 00:01) [573]
Молодец что не сдаешься!
← →
nikkie © (2004-08-19 13:24) [575]эта, какую версию-то тестировать?
вроде сошлись на стандартной недлинной арифметике.
а где сорсы?
те сорсы, которые выложены (с длинной арифметикой) не работают:
выражение: 2^(-3.1)
результат: "-" is not a valid integer number
← →
Kerk © (2004-08-19 13:27) [576]Не надоело еще? :)
← →
Anatoly Podgoretsky © (2004-08-19 13:35) [577]Давно в анекдот превратилось
← →
nikkie © (2004-08-19 13:38) [578]Действительно, число сначала возводилось в 3333...333-ю степень, а потом из него извлекался корень 1000000...000-ой степени. Матетически всё правильно, но вот результата нет. Наверное, лет через десять компьютеры достигнут достаточной мощности, чтобы посчитать это число.
ты малость оптимист :))
27^333...333 (43 цифры) > 10^(10^42)
чтобы такое число в десятичном виде хранить, надо 10^42 байт памяти иметь. т.е. 10^39 килобайт = 10^36 мегабайт = 10^33 гигабайт = 10^30 терабайт. через 10 лет? вряд ли хранить, не то, чтобы считать...
Итак, без теории программы работаю медленнее.
в виду вышеприведенных выкладок мне кажется, что это скорее "не работает", чем "работает медленно".
← →
Anatoly Podgoretsky © (2004-08-19 13:40) [579]Ну что бы хранить 10^42 нужно от 21 до 42 байт всего (BCD) плюс один на знак
← →
nikkie © (2004-08-19 13:44) [580]кстати, в коде программы я вижу такие сообщения:
Произошла внутренняя ошибка в программе!
Входное выражение записано в файл Error.log.
Ошибка в программе, код 001
<...>
Ошибка с кодом 002
Внутренняя ошибка с кодом [03]!
я полагаю, что если эти сообщения показываются, значит парсер/калькулятор не работает. согласен?
← →
nikkie © (2004-08-19 13:45) [581]>[579] Anatoly Podgoretsky
не 10^42, а 10^(10^42).
← →
Думкин © (2004-08-19 13:45) [582]
> [579] Anatoly Podgoretsky © (19.08.04 13:40)
> 10^(10^42)
← →
Anatoly Podgoretsky © (2004-08-19 13:56) [583]nikkie © (19.08.04 13:45) [581]
Аааааааааааа
← →
Sandman25 © (2004-08-19 14:25) [584]По поводу 10^(10^42) сейчас перечитываю "Занимательную алгебру", так там написано, что число всех электронов Вселенной ничтожно по сравнению с 9^(9^9).
Хотя если перейти к новому формату данных (мантисса * 10 в степени (10 в степени экспонента), то понадобится действительно меньше 100 байт).
← →
Думкин © (2004-08-19 14:32) [585]> [584] Sandman25 © (19.08.04 14:25)
Но точность какая будет?
← →
Mihey_temporary © (2004-08-19 17:07) [586]>кстати, в коде программы я вижу такие сообщения:
Произошла внутренняя ошибка в программе!
Входное выражение записано в файл Error.log.
Ошибка в программе, код 001
<...>
Ошибка с кодом 002
Внутренняя ошибка с кодом [03]!
я полагаю, что если эти сообщения показываются, значит парсер/калькулятор не работает. согласен?
Да, если эти сообщения показываются, значит не работает.
← →
Sandman25 © (2004-08-19 17:23) [587]>Но точность какая будет?
Какая сейчас максимальная длина мантиссы при реальных измерениях? 20, 30, 50?
← →
nikkie © (2004-08-19 17:27) [588]>Да, если эти сообщения показываются, значит не работает.
ну хорошо. тогда начнем:
выражение: 1^^2
результат: Ошибка с кодом 002
выражение: 1^*2
результат: Ошибка с кодом 002
← →
Anatoly Podgoretsky © (2004-08-19 17:36) [589]Mihey_temporary © (19.08.04 17:07) [586]
Я не смотрел твой калькулятор, но Микрософтовский ошибки выводит в дисплей. И при этом говорящии. Это хорошее свойство для калькуляторов.
\Офтопик
Тут http://delphimaster.net/view/14-1089499317/ на стоимоть мобилных переговоров в Эстонии интересуются, а мне кажется у тебя есть мобильник.
← →
Mihey_temporary © (2004-08-19 18:08) [590]2 nikkie © (19.08.04 17:27) [588]:
Это всё замечательно. Но скажи мне, каково значение выражения 1^^2????
← →
nikkie © (2004-08-19 19:12) [591]это некорректное выражение. но программа вместо того, чтобы сообщить, что выражение некорректно, валится с неожиданной ошибкой, честно сообщая об этом пользователю. ты вроде согласился, что такого быть не должно. я бы предпочел, чтобы сообщение не отличалось от
выражение: 1++2
результат: Ошибка со знаками действий или разделителями! Проверьте правильность выражения!
← →
Mihey_temporary © (2004-08-19 19:42) [592]Да, согласен, я упустил возможность двух степеней. По идее должна выводится ошибка о двух действиях подряд.
Но меня больше интересует некоторое правильное выражение вида (-1+0.22/(-3))+((5*4(-2)^(-(+(-1-1-(-1)))))-3) на котором программа крякнется. Но пока такого нету :( а лучше :)
← →
Думкин © (2004-08-19 20:55) [593]> [587] Sandman25 © (19.08.04 17:23)
1. Ну по обсуждаемому предполагалось что все знаки будут значимыми.
2. Запиши в этом виде число 1.
← →
Sandman25 © (2004-08-20 09:08) [594][593] Думкин © (19.08.04 20:55)
1. В современных системах длина мантиссы не слишком велика.
2. 1*10^(10^(-INF)).
← →
Думкин © (2004-08-20 09:11) [595]> [594] Sandman25 © (20.08.04 09:08)
1. Я понимаю, но речь была длинной арифметике
2. А 10^-30 ? Можно несколько поправить формат конечно.
← →
Sandman25 © (2004-08-20 09:29) [596]1. Длинная арифметика тоже имеет ограничения.
2. Не понял. При чем тут +0?
← →
Думкин © (2004-08-20 09:34) [597]> [596] Sandman25 © (20.08.04 09:29)
> 2. Не понял. При чем тут +0?
Я тоже не понял. Какой +0?
← →
Sandman25 © (2004-08-20 09:38) [598]Ответь, при чем тут 10^-30. Тогда мне не придется объяснять, при чем тут +0
← →
Думкин © (2004-08-20 09:40) [599]Ну...
a*(10^(10^b))
как записать 10^-30, 10^-300.
ведь 10^(10^b)>1 для действительных b.
← →
Sandman25 © (2004-08-20 09:44) [600]?a*(?10^(?10^?b)
где ? - знак (+ или -)
← →
Думкин © (2004-08-20 09:48) [601]Согласен. :)
Только с длинной все равно Михей тут штаны порвет. :)
← →
Sandman25 © (2004-08-20 10:06) [602]:) Если по теории, то может и не порвать.
← →
Юрий Зотов © (2004-08-20 14:48) [603]> Mihey_temporary © (19.08.04 19:42) [592]
> Но меня больше интересует некоторое правильное выражение...
> на котором программа крякнется. Но пока такого нету...
Как же "нету"? А [591]?
Что касается диагностики ошибок и прочего:
1. Вот что обязан делать нормальный калькулятор:
1а). Правильно вычислять любое синтаксически допустимое выражение, при вычислении которого не возникает математических ошибок типа деления на ноль, переполнения и пр.
1б). При возникновении математической ошибки (деление на ноль, переполнение и пр.) сообщать о ней.
1в). При обнаружении в выражении синтаксической ошибки точно ее диагностировать (в какой позиции какой символ неверен и почему).
2. А вот чего нормальный калькулятор делать не должен ни при каких обстоятельствах: он не должен валиться. Никогда. И следует учесть, что вот такой способ:try
<вычислить>
except
ShowMessage("Извините, произошла внутренняя ошибка")
end;
выходом не является.
Никаких внутренних ошибок в нормальной программе быть не должно. Допускаются только ошибки юзера и математические ошибки. Причем и те, и другие должны точно диагностироваться и ни в какой ситуации не приводить к сбоям самой программы.
← →
Mihey_temporary © (2004-08-20 15:02) [604]> Как же "нету"? А [591]?
Из 591:
>выражение: 1++2
Это неправильное выражение. Противоречит как нормам математики, так и приведённым в калькуляторе правилам (см. раздел "Про выражение".).
← →
Григорьев Антон © (2004-08-20 15:32) [605]
> Mihey_temporary © (20.08.04 15:02) [604]
> > Как же "нету"? А [591]?
>
> Из 591:
>
> >выражение: 1++2
>
> Это неправильное выражение. Противоречит как нормам математики,
> так и приведённым в калькуляторе правилам (см. раздел "Про
> выражение".).
Вот как раз нормам математики оно не противоречит. Унарный плюс допускается, это выражение читается как 1+(+2), т.е. 1+2.
← →
VMcL © (2004-08-20 15:49) [606]>>Григорьев Антон © (20.08.04 15:32) [605]
AFAIR, по правилам математики два знака подряд идти не должны. То есть правильным будет1+(+2)
, но не1++2
. А то прям C++ какой-то :-)
P.S. Или я ошибаюсь?
← →
Mihey_temporary © (2004-08-20 16:47) [607]
> Григорьев Антон © (20.08.04 15:32) [605]
Напиши 1++2 на бумажке и посмотри, как это выглядит.
← →
Григорьев Антон © (2004-08-20 16:55) [608]
> Mihey_temporary © (20.08.04 16:47) [607]
>
> > Григорьев Антон © (20.08.04 15:32) [605]
>
>
> Напиши 1++2 на бумажке и посмотри, как это выглядит.
А на фига мне бумажка? Я пишу на Паскале a:=1++2; и компилятор это кушает. И правильно вычисляет. А если эта запись тебе кажется неправильной, то это твои личные проблемы. В большинстве императивных языков программирования такая запись допустима и обозначает именно то, что я сказал. Незнание лично тобой этих общепринятых правил не отменяет их.
← →
Суслик © (2004-08-20 16:58) [609]только не вешайте лмд - мой интерпретатор это тоже не есть...
я не знал, что это правильно...
← →
Anatoly Podgoretsky © (2004-08-20 17:06) [610]<sign> Operand operator <sign> Operand
В таком случае и -1 + 2 недопустимая запись, противоречит правилам математики :-)
← →
Соловьев © (2004-08-20 17:10) [611]Посмотрел калькулятор - сделайте плиз вставку функций на кнопки, а то неудобно.
← →
nikkie © (2004-08-20 17:14) [612]не будем бодаться по поводу 1++2.
в правилах написано, что такое недопустимо и ладно.
право разработчика, поскольку ТЗ на калькулятор не было.
вот только описание не формализовано и это плохо.
например, согласно описанию ".1" или "1." - допустимая запись числа?
>[603] Юрий Зотов
абсолютно согласен с описанными требованиями к калькуляторами.
ошибка, когда синтаксически неправильное выражение вычисляется, точно такая же ошибка, как если бы синтаксически правильное выражение не вычислялось или вычислялось неверно.
пункт 1в сейчас не выполняется - позиция ошибки не указывается никогда, я готов дать послабление в этом. главное, чтобы описание ошибки соответсвовало ошибке. "ошибка 002" указывает только место в программе, где произошла ошибка. вызвать ее могут синтаксические ошибки совершенно разных типов.
ЗЫ ждем, пока автор исправит [588]
← →
Юрий Зотов © (2004-08-20 18:22) [613]> nikkie © (20.08.04 17:14) [612]
> позиция ошибки не указывается никогда, я готов дать
> послабление в этом
Я тоже. П. 1в можно переформулировать:
Нормальный калькулятор обязан обнаруживать любые синтаксические в выражении, и в этом случае не вычислять его, а выдавать диагностику.
← →
Mihey_temporary © (2004-08-20 18:51) [614]
> не будем бодаться по поводу 1++2.
> в правилах написано, что такое недопустимо и ладно.
> право разработчика, поскольку ТЗ на калькулятор не было.
> вот только описание не формализовано и это плохо.
> например, согласно описанию ".1" или "1." - допустимая запись
> числа?
Народ, вы в школе учились? Откуда вы понабирали этих 1++2, .5 и т.д.? Меня просили написать калькулятор, а не компилятор. Ещё раз коротко о главном, выдержки из правил: Вводимые числа должны быть введены в обычной разрядной системе. Выражение является простым математическим выражением, использующим разрешённые действия и функции. И всё, всё очень просто. В следующий прежде чем придумывать - предъявляйте цитаты из математических справочников и всякие Юрий Зотов © (26.07.04 16:14) [83] и Anatoly Podgoretsky © (20.08.04 17:06) [610] на меня не действуют.
← →
Mihey_temporary © (2004-08-20 18:58) [615]Для nikkie:
http://www.bymath.net/studyguide/ari/ari12.html
И выдержка:
Если десятичная дробь не содержит целой части, то перед десятичной точкой ставится ноль
← →
Mihey_temporary © (2004-08-20 19:04) [616]Для Григорьева Антона:
http://www.bymath.net/studyguide/ari/ari3.html
Выдержка:
Чтобы указать, в каком порядке должны выполняться действия, пользуются скобками. Если скобки отсутствуют, действия выполняются в следующем порядке:
1) возведение в степень и извлечение корня (в порядке их следования);
2) умножение и деление (в порядке их следования);
3) сложение и вычитание (в порядке их следования).
Так, в записи 1++2 нет скобок, значит идём по схеме. Опускаем пункты 1 и 2 - нет таких действий у нас. Значит мы выполняем сложение и вычитание в порядке их следования. И чему же будет тогда равно (1)+(+)???
← →
Anatoly Podgoretsky © (2004-08-20 19:58) [617]Mihey_temporary © (20.08.04 19:04) [616]
Да не (1)+(+), а (1)+(+2)
операнд1 оператор операнд2
Операнд2 со знаком <sign><number>
стандартный калькулятор спокойно с такой задачкой справляется.
← →
Anatoly Podgoretsky © (2004-08-20 19:59) [618]Заменим порядок операндов, для сложения, вычитания и умножения результат не должен меняться
+2+1, -2+1
← →
Mihey_temporary © (2004-08-20 20:05) [619]
> Anatoly Podgoretsky © (20.08.04 19:58) [617]
Да понимаю я, чего хотят от меня. Но не принимаю такого. Используйте скобки - добъётесь желаемого результат.
← →
Anatoly Podgoretsky © (2004-08-20 20:51) [620]Ты бы опубликовал спецификацию и определение входного языка, тогда бы можно было предметно говорить, а так ничего хорошего для сторон.
← →
Mihey_temporary © (2004-08-20 21:18) [621]В правилах это написано. Даже написано: Такие выражения не допустимы: 5+-3; 1,2*-10; 4++3; Но видать придётся спецификацию ваять, хотя я не понимаю, почему вы, Анатолий, всегда придерживаясь рациональной точки зрения в этой ветке, сменили позицию. Скажите, вы писали в школе (напрягите память! :)) ) что-то вроде 1++.5??? Ну не писали, точно же. Если такая фича нужна - пожалуйста, всё будет сделано, но пока я не вижу никакой практической цели, кроме понтов, а вот сбить с толку такая запись может. Представьте, писал человек 1+1+1, но написал 1++11. Ну вот и будет.
← →
Anatoly Podgoretsky © (2004-08-20 21:20) [622]Писал например так 1/-3
← →
Anatoly Podgoretsky © (2004-08-20 21:21) [623]Да и тогда еще не занимался программированием, с тех пор стал строже.
← →
Mihey_temporary © (2004-08-20 21:57) [624]
> Anatoly Podgoretsky © (20.08.04 21:20) [622]
Вы про дробь, например:
1
-----
-3
или про деление: 1 : -3 ?????
← →
Anatoly Podgoretsky © (2004-08-20 22:02) [625]я про деление
← →
nikkie © (2004-08-22 00:35) [626]>Народ, вы в школе учились?
в школе, между прочим, учат запятую использовать в качестве десятичного разделителя.
Выражение является простым математическим выражением, использующим разрешённые действия и функции.
это фраза ничего не определяет. что такое "простое математическое выражение"? так что ты либо давай правила, по которым однозначно можно определить допустимо выражение или нет, либо не фырчи, когда тебя спрашивают - допустимо ли по-твоему такое выражение или нет.
если меня не обманывает склероз, то фортран допускает пропуск нуля перед десятичной точкой. так что ".1" это не я придумал. хорошо, с ".1" понятно - ты это числом не считаешь. а "1." - нормальное число? паскаль принимает. а твой калькулятор:
выражение: 2+1.
результат: 3
выражение: 1.+2
результат: Ошибка со знаками действий или разделителями! Проверьте правильность выражения!
либо одно, либо другое ошибка.
я все еще жду, когда ты исправишь [588]. теперь еще вот это надо исправить. собираешься вообще?
← →
Юрий Зотов © (2004-08-22 08:31) [627]> Mihey_temporary
1. Чтобы не спорить, какая запись допустима, а какая - нет, нужна четкая и однозначная спецификация входного языка. Любая, но однозначная. Иначе тестировать программу невозможно, потому что непонятно, что есть баг, а что есть фича.
2. То, что написано в [626] не лезет ни в какие ворота. Если вычисляется
2+1.
то обязано вычисляться и
1.+2
Либо оба этих выражения обязаны не вычисляться. Нельзя быть наполовину беременной.
← →
Григорьев Антон © (2004-08-23 07:50) [628]
> Mihey_temporary © (20.08.04 19:04) [616]
> Для Григорьева Антона:
>
> http://www.bymath.net/studyguide/ari/ari3.html
>
> Выдержка:
>
> Чтобы указать, в каком порядке должны выполняться действия,
> пользуются скобками. Если скобки отсутствуют, действия выполняются
> в следующем порядке:
>
> 1) возведение в степень и извлечение корня (в порядке
> их следования);
>
> 2) умножение и деление (в порядке их следования);
>
> 3) сложение и вычитание (в порядке их следования).
>
> Так, в записи 1++2 нет скобок, значит идём по схеме. Опускаем
> пункты 1 и 2 - нет таких действий у нас. Значит мы выполняем
> сложение и вычитание в порядке их следования. И чему же
> будет тогда равно (1)+(+)???
Ты только сложение с унарным плюсом не путай, ладно? Сам даже не знаешь, какие операции бывают, а лезешь писать калькулятор. Подучи сначала матчасть.
← →
GrayFace2 © (2004-08-23 13:28) [629]Тестирование длиннострочного калькулятора:
*0=Лишний знак действия в конце выражения!
Из правил ввода выражений: При этом, унарный плюс и унарный минус перед числом или выражением должны браться в скобки
3*(-)3=Недопустимый знак перед закрывающей скобкой!
Не сответствие правилам, однако.
(Пример из Правил ввода выражений) 6^-1^-2 = 6 по-праведе 36. 6^(-1)^(-2)=6
6^-2^-1 = "-" is not a valid integer value.
6^(-2)^(-1) = "-" is not a valid integer value.
6^(-1)^(-1) = 0.1666666666666666666666666666666666666666667
и т.д.
>Исходники, взгляните, как всё просто и примитивно:
> http://www.hot.ee/gelphi/Calculator2.rar [100 Kb]
Примитивно, но далеко не просто. Посмотри, насколько мой калькулятор меньше твоего. В твоем коде очень сложно разобраться и его, наверняка, очень сложно править.
Григорьев Антон © (23.08.04 7:50) [628]
> Подучи сначала матчасть.
Что это? Как я помню, ты и по поводу WinAPI на матчасть ссылался.
← →
GrayFace © (2004-08-23 13:30) [630]Блин, ник не сменил.
Проверьте мой калькулятор!
← →
Юрий Зотов © (2004-08-23 13:43) [631]> GrayFace © (23.08.04 13:30) [630]
Можно еще раз дать ссылку? А то она уже затерялась глубоко в недрах ветки, долго искать.
← →
Думкин © (2004-08-23 13:48) [632]> [631] Юрий Зотов © (23.08.04 13:43)
> Внимание, All, если не работает http://www.grayface.chat.ru/Calk.zip,
> заходите на http://www.grayface.chat.ru, а оттуда берите
> Calk.zip
← →
VMcL © (2004-08-23 13:49) [633]>Юрий Зотов © (23.08.04 13:43) [631]
Пиво еще не прислали? ;)
← →
Григорьев Антон © (2004-08-23 13:58) [634]
> Григорьев Антон © (23.08.04 7:50) [628]
> > Подучи сначала матчасть.
>
> Что это? Как я помню, ты и по поводу WinAPI на матчасть
> ссылался.
В данном случае матчасть - это предметная область. Как я уже говорил, глупо писать бухгалтерскую программу, не зная, что такое дебет и кредит. Точно так же глупо писать калькулятор, не зная, какие существуют арифметические действия.
← →
nikkie © (2004-08-23 14:53) [635]>[629] GrayFace2
>(Пример из Правил ввода выражений) 6^-1^-2 = 6 по-праведе 36.
тут ты неправ. степени вычисляются справа налево, а не слева направо, как остальные операции. и твой калькулятор считает двойное возведение в степень неправильно.
будешь исправлять - убери неявное умножение. а то получается такое:
1..1.1 = 0,01
1.1..1 = Syntax error at offset 4
← →
Думкин © (2004-08-23 15:01) [636]> [635] nikkie © (23.08.04 14:53)
> будешь исправлять - убери неявное умножение.
Об этом говорится уже 2 недели, но воз и ныне там.
← →
Mihey_temporary © (2004-08-23 15:48) [637]>Ты только сложение с унарным плюсом не путай, ладно? Сам даже не знаешь, какие операции бывают, а лезешь писать калькулятор. Подучи сначала матчасть.
1++2
После единицы идёт именно сложение, а не унарный плюс. А вот вторым слагаемым идёт именно унарный плюс.
← →
Mihey_temporary © (2004-08-23 15:56) [638]>Тестирование длиннострочного калькулятора:
*0=Лишний знак действия в конце выражения!
Это ошибка строки вывода. На самом деле программа передаёт код, соответсвующий ошибке в начале выражения, но сообщение выводится то же, что и про конец (оно было просто скопировано, забыл исправить слово "в конце" на "в начале").
>Из правил ввода выражений: При этом, унарный плюс и унарный минус перед числом или выражением должны браться в скобки
3*(-)3=Недопустимый знак перед закрывающей скобкой!
Не сответствие правилам, однако.
Смехно. Действительно.
← →
Григорьев Антон © (2004-08-23 15:56) [639]
> Mihey_temporary © (23.08.04 15:48) [637]
> После единицы идёт именно сложение, а не унарный плюс. А
> вот вторым слагаемым идёт именно унарный плюс.
Унарный плюс не может быть слагаемым. Унарный плюс - это только часть слагаемого. Из любой нормально составленной грамматики это сразу видно. И любой калькулятор, реализованный в строгом соответствии с такой грамматикой, проблем с подобными выражениями не испытывает. Пример - компилятор Delphi, который такие выражения понимает правильно.
← →
Mihey_temporary © (2004-08-23 15:58) [640]
> Унарный плюс не может быть слагаемым. Унарный плюс - это
> только часть слагаемого. Из любой нормально составленной
> грамматики это сразу видно. И любой калькулятор, реализованный
> в строгом соответствии с такой грамматикой, проблем с подобными
> выражениями не испытывает. Пример - компилятор Delphi, который
> такие выражения понимает правильно.
... и ссылка на мат. справочник?
← →
Суслик © (2004-08-23 16:04) [641]о чем вы спорите?
Если о том, что без знания теории можно построить калькулятор, то согласен с обоими.
Если долго мучиться, что-нибудь получится. Если же знать теорию, то получится и быстрее и качественнее.
← →
Григорьев Антон © (2004-08-23 16:36) [642]
> Mihey_temporary © (23.08.04 15:58) [640]
> ... и ссылка на мат. справочник?
Это не в матсправочнике надо искать, а в учебниках по теории построения компиляторов. Например, здесь: http://www.delphikingdom.com/asp/book.asp?BookID=63
А ещё это видно из формальной грамматики Паскаля, ссылку на которую уже приводил Игорь Шевченко: http://www.moorecad.com/standardpascal/pascal.y
Более того, 1+++2 - тоже допустимое в рамках этой грамматики выражение :)) Трактуется как 1+(+(+(2)))
Лично я предлагаю следующие выводы:
1. Общепринятая грамматика - именно такая, независимо от того, нравится это кому-то или нет.
2. Если лично тебе такие выражения не нравятся, то реализовывать калькулятор без них - твоё право. Но только опиши непротиворечивую грамматику, которую будешь реализовывать. Тебе уже сто раз сказали, что без формального описания грамматики никто не знает, что есть фича, а что есть баг, но на тебя это, похоже, не действует.
← →
Mihey_temporary © (2004-08-23 18:22) [643]Похоже на вас не действует. Я писал калькулятор с той целью, чтобы он правильно считал математические выражения в том виде, в котором они записываются в реальной, не компьютерной, математической практике, известной любому со времён школы и начальных классов. Никакая грамматика не нужна. Всё. Не прикидывайся, что ты чего-то не понимаешь. Ты прекрасно понимаешь, можно ли писать ++1, можно ли писать .2 или 4.. Не надо прикидываться, всё. Вопрос закрыт окончательно и навеки вечные.
← →
Григорьев Антон © (2004-08-23 18:48) [644]
> Mihey_temporary © (23.08.04 18:22) [643]
Вопрос не закрыт, пока не приведена грамматика в нормальном виде. Ссылки на какие-то общепринятые школьные правила не пройдёт, потому что до тех пор, пока они не формализованы, всегда остаётся место для разночтений. Я, например, в школе не писал "1." и ".5", и мне лично эта запись очень глаз режет. А запись "1++2" мне глаз не режет, хотя я в школе так не писал. И сколько будет людей, столько будет мнений, пока вместо нормальной не допускающей разночтений грамматики мы будем аппелировать к каким-то невнятным школьным правилам, которые всяк волен трактовать по-своему.
Короче, я для себя вывод сделал: ты просто не способен сформулировать грамматику и написать анализатор, который чётко следует ей. И сам это прекрасно понимаешь, вот и пытаешься выкручиваться.
← →
nikkie © (2004-08-23 19:32) [645]>Не надо прикидываться, всё. Вопрос закрыт окончательно и навеки вечные.
похоже ты решил в непонятку сыграть. повторюсь.
1. пока нет четких правил, невозможно определить корректное выражение или нет. с моей точки зрения "1." - совершенно нормальное выражение. если твой калькулятор не принимает такое - твое право, но это должно быть четко описано. либо давай правила, либо отвечай на бесконечные вопросы, про каждое конкретное выражение. про "1." ты мне так и не ответил.
2. требования к калькулятору описаны в [603], см. также [613]. он не должен считать некорректные выражения, а должен идентифицировать ошибку пользователя.
3. в настоящий момент были указаны следующие ошибки (в виду описанных требований):
[588]
выражение: 1^^2
результат: Ошибка с кодом 002
выражение: 1^*2
результат: Ошибка с кодом 002
[626]
выражение: 2+1.
результат: 3
выражение: 1.+2
результат: Ошибка со знаками действий или разделителями! Проверьте правильность выражения!
либо одно, либо другое ошибка.
4. если ты желаешь продолжать, то ты должен исправить эти ошибки и выложить исходники. иначе считаем, что ты сдался.
>[629] GrayFace
>6^-2^-1 = "-" is not a valid integer value.
>6^(-2)^(-1) = "-" is not a valid integer value.
это поведение калькулятора Михея с длинной арифметикой. мы согласились, что возведение в степень не работает, поэтому тестируем только версия с обычной арифметикой.
← →
Mihey_temporary © (2004-08-23 19:49) [646]>Вопрос не закрыт, пока не приведена грамматика в нормальном виде. Ссылки на какие-то общепринятые школьные правила не пройдёт, потому что до тех пор, пока они не формализованы, всегда остаётся место для разночтений. Я, например, в школе не писал "1." и ".5", и мне лично эта запись очень глаз режет. А запись "1++2" мне глаз не режет, хотя я в школе так не писал. И сколько будет людей, столько будет мнений, пока вместо нормальной не допускающей разночтений грамматики мы будем аппелировать к каким-то невнятным школьным правилам, которые всяк волен трактовать по-своему.
Короче, я для себя вывод сделал: ты просто не способен сформулировать грамматику и написать анализатор, который чётко следует ей. И сам это прекрасно понимаешь, вот и пытаешься выкручиваться.
А может это ты не можешь найти баг и придираешься? Вопрос для меня ЗАКРЫТ. Так будут работать все последующие версии (специально в наказание вам).
2 nikkie:
Сегодня или завтра сдам версию без этих глюков.
← →
Рыба © (2004-08-23 20:48) [647]Не понял, кто, кому и что доказывает.
← →
VMcL © (2004-08-23 22:55) [648]>>Mihey_temporary © (23.08.04 19:49) [646]
ИМХО, критика Антона Григорьева и nikkie конструктивна, и я, например, с ней вполне согласен.
P.S.
Ох, останешься ты вечным `temporary`...
← →
GrayFace © (2004-08-24 17:09) [649]nikkie © (23.08.04 14:53) [635]
> тут ты неправ. степени вычисляются справа налево, а не
> слева направо, как остальные операции. и твой
> калькулятор считает двойное возведение в степень
> неправильно.
Сомневаюсь. Numlock Calkulator, виндовский инженерный, счетают, что 6^1^2=36. Я и моя спецификация тоже так счетаем.
Неявное умножение уберите сами - это константа на 29 строчке.
> Похоже на вас не действует. Я писал калькулятор с той
> целью, чтобы он правильно считал математические
> выражения в том виде, в котором они записываются в
> реальной, не компьютерной, математической практике,
> известной любому со времён школы и начальных классов.
Это, как раз, сделал я: неявное умножение, функции без скобок...
← →
Григорьев Антон © (2004-08-24 17:35) [650]
> Mihey_temporary © (23.08.04 19:49) [646]
> А может это ты не можешь найти баг и придираешься? Вопрос
> для меня ЗАКРЫТ. Так будут работать все последующие версии
> (специально в наказание вам).
Ой, боюсь, боюсь... :))
Ты одну простую вещь пойми: ты в конечном итоге не мне должен объяснить, какие выражения считать правильными, а компьютеру. А компьютер в школе не учился, для него не существует выражений, правильность или неправильность которых ему очевидна. И всё, что от тебя хотят - чтобы ты в формализованном виде записал то, чему ты собираешься учить компьютер. И если ты не понимаешь, насколько это важно - прими мои соболезнования.
← →
Mihey_temporary © (2004-08-24 17:40) [651]
> Ты одну простую вещь пойми: ты в конечном итоге не мне должен
> объяснить, какие выражения считать правильными, а компьютеру.
> А компьютер в школе не учился, для него не существует выражений,
> правильность или неправильность которых ему очевидна. И
> всё, что от тебя хотят - чтобы ты в формализованном виде
> записал то, чему ты собираешься учить компьютер. И если
> ты не понимаешь, насколько это важно - прими мои соболезнования.
Дубль три. Вы - домохозяйка. Вам нужен калькулятор в компьютере. Есть такой. Запускаем, пишем 1+(+0.5), жмём кнопку, читаем ответ, закрываем. Что вам ЕЩЁ от меня надо???
← →
GrayFace © (2004-08-24 18:21) [652]Григорьев Антон © (24.08.04 17:35) [650]
Ты одну простую вещь пойми: ты в конечном итоге не мне должен объяснить, какие выражения считать правильными, а компьютеру. А компьютер в школе не учился, для него не существует выражений, правильность или неправильность которых ему очевидна.
И с какой это стати что-то объяснять компьютеру?? Компьютер - это не собеседник, чтобы ему что-то объяснять. Он написал программу - чем не оьъяснение компу?
← →
Mihey_temporary © (2004-08-24 21:24) [653]Заявление: парсер калькулятора не верен в корне. Версию считать нерабочей.
← →
Mim1 © (2004-08-24 21:44) [654]Рационизировать и утилизировать. Тащите круглую печать.
← →
Думкин © (2004-08-25 06:22) [655]"А он че было, то и полюбила"
"Я сЕжу на берегу
не могу поднять ногУ
не ногУ а нОгу
блин, усе рано не могУ."
← →
GrayFace © (2004-09-01 18:03) [656]Не дадим ветке умереть!
← →
Mihey_temporary © (2004-09-01 18:51) [657]Никто не сдался. Спор продолжается.
← →
VMcL © (2004-09-02 10:44) [658]Не вижу нормально работающего сабджа, особенно, если учесть [653].
← →
Igorek © (2004-09-02 12:25) [659]Я в шоке. Да выложите вы сюда исходники. Надеюсь их не много.
← →
GrayFace © (2004-09-03 16:34) [660]VMcL © (02.09.04 10:44) [658]
Не вижу нормально работающего сабджа, особенно, если учесть [653].
Мой! Мой! И еще раз мой!
(Что мыть - сам не знаю)
← →
VMcL © (2004-09-03 17:28) [661]>>GrayFace © (03.09.04 16:34) [660]
Как-то лениво мне шесть сотен постов читать... ты эта... выложи ссылку на исходники со спецификацией входных выражений, может на выходные погоняю (на всякий случай: у меня D6).
P.S. Если доберусь до Delphi то "мыть" буду твой кальк по полной программе :o)
← →
GrayFace © (2004-09-05 08:14) [662]Ссылка на версию:
> если не работает http://www.grayface.chat.ru/Calk.zip,
> заходите на http://www.grayface.chat.ru, а оттуда берите
> Calk.zip
В нем есть неявное умножение(2pi, 2sin2, например), в связи с которым возникло много споров.
Чтобы отключить неявное умножение, измените константу EmptyMul на 29 строчке.
Спецификация с неявным умножением:<Empty> ::=
<Sign> ::="+"|"-"
<Digit> ::="0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
<Operation1> ::="*"|"/"|Empty
<Operation2> ::="+"|"-"
<FunctionName>::="sin"|"cos"|"tg"|"ctg"|"arcsin"|"arccos"|"arctg"|"arcctg"
<exponent> ::="e"|"Е"
<Separator> ::="."|<DecimalSeparator>
<Number> ::={Digit}[Separator][{Digit}][<Exponent>[Sign]{Gigit}] | <Separator>{Digit}[<Exponent>[Sign]{Gigit}]
<function> ::=<FunctionName><operand>
<operand> ::=[{Sign}]<operand>|<number> | "pi" | <function> | "("<expression>")" | "|"<expression>"|"
<factor> ::=<operand>[{ "^" <operand>}]
<term> ::=<factor>[{<Operation1><factor>}]
<expression> ::=<term>[{<Operation2><term>}]
Без неявного умножения:<Operation1> ::="*"|"/"
← →
Mihey_temporary © (2004-09-05 12:05) [663]<Number> ::={Digit}[Separator][{Digit}][<Exponent>[Sign]{Gigit}] | <Separator>{Digit}[<Exponent>[Sign]{Gigit}]
:)
← →
GrayFace © (2004-09-06 15:35) [664]:)
← →
VMcL © (2004-09-06 17:50) [665]>>GrayFace © (05.09.04 08:14) [662]
Теперь уже на следующие выходные, раньше почти наверняка не смогу.
← →
Marser © (2004-09-12 02:19) [666]
> Nous Mellon © (31.07.04 23:15) [398]
>
> > Это показывает твою ничтожную культуру и лишний раз доказывает,
>
> > что твои сообщения на самом деле пусты и необоснованы.
>
> Нет. Это показывает что у тебя на форуме есть только враги.
> В том числе и я.
> А у меня полно друзей.
Сорри за оффтоп. Не сочти за наезд или подколку. Меня ты к друзьям причисляешь?
← →
Sergey Kaminski © (2004-09-12 03:31) [667]Ох, а я думал, что ихний калькулятор какой-никакой уже готов давно. А он, оказывается, все пишется и пишется, глюк за глюком устраняется :)
Авторам - зря в свое время не прислушались к Ю.З.
Им же: пора бы уже и признаться, что тот спор давно-о-о проигран. А то флейму уже на целое дьявольское число;)
(Кажется, вначале речь шла о нескольких часах, потом днях... вот до сих пор что-то упорно доказываем) :(
← →
Nous Mellon © (2004-09-12 08:32) [668]
> Сорри за оффтоп. Не сочти за наезд или подколку. Меня ты
> к друзьям причисляешь?
а как же :)
Ну бывает, конечно, ты иногда отчебучишь чего-нибудь, но мы же знаем что в душе ты хороший :)
← →
Mihey_temporary © (2004-09-12 13:57) [669]
> Sergey Kaminski © (12.09.04 03:31) [667]
Ищите баг в калькуляторе от Grayface.
← →
VMcL © (2004-09-12 13:57) [670]>>GrayFace © (05.09.04 08:14) [662]
[Unit1.pas: 06.08.2004, 14:50]
Глюков в функциональности не нашел (может плохо искал :)
Но вот как насчет ввести новую функцию? Скажем, понадобилось реализовать новую функциюcos2(x) = cos(x) + 20
. После того, как введешь вычисли такие выражения:cos2
cos2(2)
cos-2+1
← →
VMcL © (2004-09-12 13:59) [671]>>Mihey_temporary © (12.09.04 13:57) [669]
>VMcL © (12.09.04 13:57) [670]
LOL
← →
Marser © (2004-09-12 15:08) [672]
> Nous Mellon © (12.09.04 08:32) [668]
>
> > Сорри за оффтоп. Не сочти за наезд или подколку. Меня
> ты
> > к друзьям причисляешь?
>
> а как же :)
> Ну бывает, конечно, ты иногда отчебучишь чего-нибудь, но
> мы же знаем что в душе ты хороший :)
:-))
← →
GrayFace © (2004-09-12 18:42) [673]Sergey Kaminski © (12.09.04 3:31) [667]
Ну если бы я тестировал калькулятор не левой задней (чтобы поменьше времени потратить), все бы давно закончилось. Хотя уже 2 недели мой калькулятор ждет тестирования.
VMcL © (12.09.04 13:57) [670]
cos2 = Syntax error at offset 4
cos2(2) = 19,5838531634529
cos-2+1 = 0,583853163452858 - а при чем тут это?
По-моему вполне нормально, хоть и неоднозначно. Главное - неразрешимых коллизий нет. cos2 спокойно используется, а если надо взять cos(2), то надо писать скобки.
← →
Mihey_temporary © (2004-09-12 22:15) [674]
> LOL
А баги то где?
← →
VMcL © (2004-09-14 19:31) [675]>>GrayFace © (12.09.04 18:42) [673]
>а если надо взять cos(2), то надо писать скобки.
Перечитай свою же спецификацию. Скобки МОЖНО ставить, но НЕОБЯЗАТЕЛЬНО. Вот так вот.
>cos2(2) = 19,5838531634529
Понимаешь ли, спецификация калькулятора должна включать в себя таблицу приоритетов операций. У тебя её нет. Вот мне теперь интересно, как калькулятор в вышеприведенном случае "угадает", что я, как пользователь, захотел вычислить: функцию cos2 от аргумента "2" или удвоенный косинус от аргумента "2"?
← →
VMcL © (2004-09-14 19:32) [676]P.S.</>
>По-моему вполне нормально, хоть и неоднозначно.
А должно быть "адназначна" © сам знаешь
← →
VMcL © (2004-09-24 09:53) [677]>>GrayFace ©
Ку?
← →
GrayFace © (2004-09-27 16:29) [678]Ку.
← →
Kerk © (2004-10-03 16:02) [679]Была лаба на сабжевую тему. Наваял кое-что. Зацените. :)
http://kerk.mail2k.ru/postfix.zip
← →
VMcL © (2004-10-03 20:04) [680]>>Kerk © (03.10.04 16:02) [679]
Та ну тебя. Задолбали эти куркуляторы. Давайте лучше компиляторы писАть...
← →
Mihey_temporary © (2004-10-03 21:26) [681]Я на своё забил. Действительно, невозможно написать без знания теории.
← →
Anatoly Podgoretsky © (2004-10-03 21:27) [682]Mihey_temporary © (03.10.04 21:26) [681]
Молодец, хватило сил признать, уважаю.
← →
Ihor Osov'yak © (2004-10-03 21:38) [683]Да уж.. Почти хиппи енд. Нужно веточку сохранить, молодым да рьяным иногода показывать, поучительная..
← →
Nous Mellon © (2004-10-03 22:17) [684]
> Молодец, хватило сил признать, уважаю.
Он вообще сильно изменился за последнее время
← →
Kerk © (2004-10-04 13:21) [685]
> >>Kerk © (03.10.04 16:02) [679]
>
> Та ну тебя. Задолбали эти куркуляторы. Давайте лучше компиляторы
> писАть...
Опять без теории? :)))))
А насчет куркулятора все же интересно мнение общественности... Ну да ладно... хрен с ним...
← →
bar (2004-10-04 14:43) [686]Извините все сообщения не прочитал, но решил пролистать до конца и добавить свое в поддержку Огромное Кулясищще и прочих энтузиастов кодирования без изучения теории.
>>Юрий Зотов
Написать калькулятор без знания теории можно.
Это я знаю из собственного опыта написания калькулятора для лабораторной по программированию на втором курсе одного ВУЗА (это было года два назад). Хотя совсем без теории не обошлось. Пришлось самому теории выдумывать. История вкратце такая...
Все писали что то вроде виндовского калка, но только с четыльмя действиями, а я решил выпендриться и заставить калк считать любое выражение записанное по определенным правилам.
Сначала четко задал в каком виде можно задавать выражение (сделал как в делфи или бейсике: основные действия +*-/ функции ИМЯ(арг,агр...) никаких sin5 или 5+--8).
Далее долго парился и врезультате получился рекурсивный интерпретатор выражений безо всяких преобразований в польскую и прочии записи. Отсутствовала в чистом виде стадия лексического и синтаксического анализа. Была функция, которая искала в выражении подстроку между операторами с одним приоритетом, затем рекурсивно вызывала себя с этой подстрокой в качестве параметра и так до тех пор пока в качестве парамера не передоволось либо число, либо вызов функции. Если это было число или вызов ф-ции, то возвращлся результат. Что то вроде этого.
function doOper(str:String):real;
begin
если str число то возвращаем его в качестве результата
если str вызов функции, то вычисляем результат и возвр. его.
выделяем левую часть выражения left, правую rich и оператор между ними oper
...
if oper="*" then result:=doOper(left)*doOper(rich);
if oper="+ then result:=doOper(left)+doOper(rich);
....
end;
например для строки (10+4)*(sin(2*3)-1)
вызывалось
doOper("(10+4)*(sin(2*3)-1)");
doOper("(10+4)")*doOper("(sin(2*3)-1)");
(doOper("10")+doOper("4"))*(doOper("sin(2*3)")-doOper("1"));
и так далее...
Точно алгоритм не помню, поскольку дело было давно, сам исходник не сохранился. Но есть работающий exe-шник. И он вычисляет любое вырожение написанное в соответствии с определёнными правилами.
И вопреки
{Юрий Зотов © (24.07.04 18:18) [1] } я не нашёл такого выражения которое он не мог вычислить. Была либо синтаксическая, либо арифметическая ошибка.
Желающим могу выслать приложение (весит килобайт 500), это не вершина кодинга, но калькулятор был первым моим настояшим приложением поэтому я себе прощаю некоторые недочеты допущенные в нем. Но то, что я написал калькулятор не зная теории автоматов, и прочего это правда. Уж поверьте мне на слово.
Так, что написать калькулятор без знания теории, можно, нужно лишь придумать свою теорию :).
Удачи всем.
← →
Думкин © (2004-10-04 14:47) [687]> [686] bar (04.10.04 14:43)
> И вопреки
> {Юрий Зотов © (24.07.04 18:18) [1] } я не нашёл такого
> выражения которое он не мог вычислить. Была либо синтаксическая,
> либо арифметическая ошибка.
....
> Так, что написать калькулятор без знания теории, можно,
> нужно лишь придумать свою теорию :).
Если все-таки внимательно прочитать:
> [1] Юрий Зотов © (24.07.04 18:18)
> я уже дважды писал: "До тех пор, пока не будет привлечена теория, ВСЕГДА найдется такое выражение, которое такой калькулятор распознать и выполнить не сможет".
Вы ее привлекли или нет? В чем вы увидели противоречие?
← →
bar (2004-10-04 15:36) [688]>>Думкин © (04.10.04 14:47) [687]
Насколько я понял Зотова он говорит о теории автоматов, лексического анализа.
Такие теории в готовом виде я не использовал.
Но если Зотов говорил о теории вообще, то никакого противоречия нет. Поскольку что такое теория.
Теория это некоторое предположение, требующее доказательства. Наример, я предпологаю, что для вычисления выражения нужно то-то и то-то. Доказательством этого будет рабочий код.
В этом случае написание любой программы основывается на теории, что для решения задачи, нужно выполнить то-то и то-то.
← →
Юрий Зотов © (2004-10-04 21:09) [689]> bar (04.10.04 14:43) [686]
> Извините все сообщения не прочитал...
> Написать калькулятор без знания теории можно.
> ...
> Хотя совсем без теории не обошлось. Пришлось самому теории
> выдумывать.
А если бы Вы прочитали ВСЕ сообщения, то увидели бы, что я несколько раз говорил: "до тех пор, пока либо не будет использована готовая терия, либо не будет придумана своя".
Вы придумали свою. Можно говорить о том, верная Ваша теория или нет, лучше она существующей или хуже - но теорию Вы все равно использовали, это факт.
Так что - никакого противоречия.
P.S.
И в общеизвестной теории использование польской записи для калькулятора совершенно не обязательно. Можно и без нее.
P.P.S.
Согласитесь, что если бы на момент написания калькулятора Вы знали бы уже готовую теорию, то написали бы программу гораздо быстрее. А ведь спор с этого и начался, это уже потом на калькуляторы перешли, просто в качестве примера.
← →
GrayFace © (2004-10-10 16:27) [690]Mihey_temporary © (03.10.04 21:26) [681]
Я на своё забил. Действительно, невозможно написать без знания теории.
Я написал. Ошибок найти никто не может. И чтобы ни говорил АП, теорию я не использовал. И что бы ЮЗ не говорил, мой алгоритм - это не теория. Определение теории по Ожегову: "Совокупность обобщенных положений, образующих науку или раздел какой-н. науки, а также совокупность правил в области какого-н. мастервтва.
"
Kerk©(03.10.04 16:02) [679]
Читер! Сдесь не место теористам! Мы пишим калькуляторы БЕЗ ТЕОРИИ! :)
← →
Nous Mellon © (2004-10-10 16:31) [691]
> а также совокупность правил в области какого-н. мастервтва."
УУу зря опубликовал, тебе щас люой адгоритм под это положение подведут :)
← →
Defunct © (2004-10-10 18:48) [692]>> Я на своё забил. Действительно, невозможно написать без знания теории.
> И что бы ЮЗ не говорил, мой алгоритм - это не теория.
2 GrayFace
В вашей программе Вы использовали как минимум:
ТЕОРИЮ ИНФОРМАЦИИ И КОДИРОВАНИЯ
ТЕОРИЮ ПРОГРАММИРОВАНИЯ
ТЕОРИЮ СИСТЕМ
← →
Mihey_temporary © (2004-10-10 19:18) [693]2 GrayFace:
Например, в твоём калькуляторе 0^0 = 1. На самом деле операция не определена.
← →
Defunct © (2004-10-10 19:43) [694]> Например, в твоём калькуляторе 0^0 = 1. На самом деле операция не определена
Брехня, 0^0 = 1, любое число в степени 0 равно единице.
← →
Nous Mellon © (2004-10-10 19:52) [695]
> [694] Defunct © (10.10.04 19:43)
Тебя в школе учили? Или это подколка?
← →
Defunct © (2004-10-10 20:21) [696]> Nous Mellon
0! = 1 - аксиома.
0^0 = 1 - тоже аксиома.
(все знают, что это не так, но тем не менее все это используют даже MatCad и калькулятор в Windows).
Если вы пользуетесь в своих рассуждениях такими материалами
http://aldebaran.ru/kid/levsh/levsh4/index.shtml?2 ,
тогда спорить бесполезно.
← →
Nous Mellon © (2004-10-10 20:27) [697]
> 0! = 1 - аксиома.
> 0^0 = 1 - тоже аксиома.
> (все знают, что это не так, но тем не менее все это используют
> даже MatCad и калькулятор в Windows).
>
> Если вы пользуетесь в своих рассуждениях такими материалами
> http://aldebaran.ru/kid/levsh/levsh4/index.shtml?2 ,
> тогда спорить бесполезно.
Я не пользуюсь никакими материалами кроме тех скромных знаний которые мне дал мой преподаватель. И мне по барабану чего там использует каклькулятор Виндоус. Я просто знаю про классическу неопределенность.
Не я ее придумал. Мой сосед Вася вообще в математике не разбирается, что и мне забить?
← →
Defunct © (2004-10-10 20:39) [698]> И мне по барабану чего там использует каклькулятор Виндоус.
Ну раз по-барабану, тогда нечего тут поклепы на GrayFace делать, сперва разберись почему так.
> Я просто знаю про классическу неопределенность.
Докажи неопределенность.
← →
Nous Mellon © (2004-10-10 20:44) [699]
> Ну раз по-барабану, тогда нечего тут поклепы на GrayFace
> делать, сперва разберись почему так.
Я делал на него поклепы? Вовсе нет. Я делал на тебя поклепы потому что твой псевдоматематический бред и неграмотность прут неудержимо.
> Докажи неопределенность.
Зачем изобретать велосипед.
← →
Mihey_temporary © (2004-10-10 20:51) [700]В прицнипе, 1 или не определено (хотя всё же не определено - http://www.hot.ee/mvps12/screen1.jpg) - это не так уж важно, так как ошибка явно не алгоритмическая. Но пока GrayFace будет исправлять (если будет), есть время поискать другие баги.
← →
Alx2 © (2004-10-10 21:02) [701]>Defunct © (10.10.04 20:39)
Результат от операции 0^0 можно получить разными путями, как и 0/0. Причем, этот результат может быть совершенно произвольным, либо, напротив, заданным заранее. Просто классическая "неопределенность", которую можно приручить, например, рядами :). Но для общего случая рецепта нет.
Про 0! хорошо расскажет гамма-функция, хотя, судя по вашим перлам, у нее это вряд-ли получится.
← →
Defunct © (2004-10-10 21:25) [702]> Я делал на него поклепы? Вовсе нет.
Делал - [693].
> Я делал на тебя поклепы потому что твой псевдоматематический бред и неграмотность прут неудержимо.
В чем это проявилось?
В свои 17 нет необходимости грубить.
>> Докажи неопределенность.
> Зачем изобретать велосипед.
Не изобретай велосипед умник ты наш, приведи ссылку или общепризнанный программный продукт в котором 0^0 <> 1.
> так как ошибка явно не алгоритмическая. Но пока GrayFace будет исправлять (если будет), есть время поискать другие баги.
В этом отношении ему нечего исправлять.procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Format("%F",[Power(0,0)]));
end;
Проверте также в MathCad и в Calc поставляемым с Windows
> Результат от операции 0^0 можно получить разными путями, как и 0/0.
Покажите, как можно получить рез-тат 0^0 (0^0 = 1 аксиома, см. справочник по математике).
И покажите как можно получить рез-тат 0! (0! = 1 аксиома).
← →
Mihey_temporary © (2004-10-10 21:30) [703]
> Покажите, как можно получить рез-тат 0^0 (0^0 = 1 аксиома,
> см. справочник по математике).
Я же привёл фотку из справочника по математике.
← →
Nous Mellon © (2004-10-10 21:31) [704]
> Делал - [693].
Ты чего слепой? Ты на ник вообще смотришь?
> Покажите, как можно получить рез-тат 0^0 (0^0 = 1 аксиома,
> см. справочник по математике).
Тебе ж только что ссылку дали!
Шарка что-ли процитировать
← →
Alx2 © (2004-10-10 21:34) [705]>Defunct © (10.10.04 21:25)
Пример для 0^0:
Поищем предел для (1/n)^(1/ln(n)) при n->infinity
Странно, что результат = exp(-1) ? :-)
Про факториал нуля наглядного пока ничего не нашел. Сорри.
← →
Mihey_temporary © (2004-10-10 21:35) [706]Впрочем, я нашёл ошибку посерьёзней (версия последняя).
2^2^3 = 64 (а не 256)
Очевидно, степень считается в калькуляторе сначала, тогда как сама запись по идее должна быть идентичной:
3
2 = 8 =
2 2 256
Если, конечно, для калькуляторов кроме 0^0 не приняты ещё и другие правила относительно порядка вычисления степени, то тогда действительно ошибка.
← →
Nous Mellon © (2004-10-10 21:39) [707]
> 3
> 2 = 8 =
> 2 2 256
Тут как раз ИМХО 2 в шестой и будет как ни крути или я чего не понял?
← →
Alx2 © (2004-10-10 21:50) [708]>Nous Mellon © (10.10.04 21:39)
Возведение в степень некоммутативно. Скобки нужны.
← →
Nous Mellon © (2004-10-10 21:52) [709]
> Возведение в степень некоммутативно. Скобки нужны.
Да. Я их подразумевал.
← →
Mihey_temporary © (2004-10-10 21:56) [710]Однако наверное я поторопился.
← →
Defunct © (2004-10-10 21:59) [711]> Я же привёл фотку из справочника по математике.
А я привел функцию из модуля math, также общеизвестные и признанные программные продукты. Как ни странно, только ссылка на статью для детей совпадает со страницей из вашего справочника, может такой справочник?
Nous Mellon © (10.10.04 21:31) [704]
С хамами лучше вообще не разговаривать.
Alx2 © (10.10.04 21:34) [705]
lim(x^n) = -(1/x)*(0-x) = x/x = 1
n->0
← →
Mihey_temporary © (2004-10-10 22:03) [712]Гм, хотя и другие калькуляторы выражений дают 64, но всё же...
Почему считают 2^2^3 как (2^2)^3, а не 2^(2^3)??? Ведь если представить, что значок ^ - это эдакий push up на строчку выше, то должно быть 2 в степени 2^3.
← →
Alx2 © (2004-10-10 22:08) [713]>Defunct © (10.10.04 21:59)
> lim(x^n) = -(1/x)*(0-x) = x/x = 1
> n->0
Это, простите, как получилось? Я, конечно, согласен, что
-(1/x)*(0-x) = x/x при x<>0. Но не более того.
-------------
А мой пример вас не убедил? :)
Тем примером я хотел сказать, что если по-разному устремлять к нулю некоторые последовательности, можно добиться произвольных значений предела.
Еще раз:
Предел (1/n)^(-ln(a)/ln(n)) = exp(ln(a))=a.
А значение "a" мы можем выбирать весьма произвольно. И, соответственно, весьма произвольно можем получить значение "0^0".
Вероятно, мы недопонимаем друг друга, так как у меня возникает чувство, что я объясняю таблицу умножения.
← →
Mihey_temporary © (2004-10-10 22:10) [714]Ну хорошо, теперь GrayFace попался (щас окажется, что меня вообще глючит, все подумают, что я обкурился и начнётся потеха).
-1^2 = 1
Низачто! -1^2 = -1*1^2 = -1. Проверил на Adexpression (готовый калькулятор с Torry.net, по нему ориентируюсь).
← →
Defunct © (2004-10-10 22:17) [715]> Это, простите, как получилось?
Разложив x^n в ряд тейлора.
> -(1/x)*(0-x) = x/x при x<>0. Но не более того.
Это почему же, мы ведь ищем предел.
При поиске предела:
Lim(x/x) = 1
x->бесконечность
Lim(x/x) = 1
x->0
> Вероятно, мы недопонимаем друг друга, так как у меня возникает чувство, что я объясняю таблицу умножения.
Возможно. так у меня такое же чувство..
← →
Alx2 © (2004-10-10 22:20) [716]>Defunct © (10.10.04 22:17) [715]
Если не против, предлагаю продолжить в личной переписке (ICQ).
← →
Думкин © (2004-10-11 06:04) [717]> Defunct ©
Штука в том, что ряд вещей можно дополнять не получая никаких проблем. Имеем натуральные числа - из них рациональные, и далее 3-я способами можем ввести действительные. Но что самое замечательное, то что эти 3 оказываются логически непротиворечивыми и эквивалентными(Вейерштрасс, Кантор, Дедекинд). После этого мы можем распространить на эти числа операции введенные для натуральных, целых а затем и рациональных чисел по непрерывности. Далее мы можемм вввести комплексные числа и опять распростанить операции. И уже никого не смущает sqrt(-1). Но вот в отношении 0^0 этого никак не удается, на что вам и намекает Alx2, ибо классические подходы приводят к некорректности данной конструкции. А то, что там говоритMathCad - ну кто без греха?
← →
Kerk © (2004-10-11 14:20) [718]
> Kerk©(03.10.04 16:02) [679]
> Читер! Сдесь не место теористам! Мы пишим калькуляторы БЕЗ
> ТЕОРИИ!
Сперва прочитал "здесь не место террористам"... удивился... потом перечитал.. со второго раза понял.. :)))
← →
Defunct © (2004-10-11 16:24) [719]Думкин © (11.10.04 06:04)
Это все понятно,
сойдемся просто на мнении
0^0 = 1 удобно, и не противоречит 0^0 Є D.
Точно также как и 0!
← →
Mihey_temporary © (2004-10-11 20:56) [720]Так как насчёт [714]? Вы с этим согласны?
← →
Nous Mellon © (2004-10-11 21:08) [721]
> Так как насчёт [714]? Вы с этим согласны?
-1^2 = -1*-1 = 1. Я чего-то недопойнял?
← →
Mihey_temporary © (2004-10-11 22:26) [722]
> -1^2 = -1*-1 = 1. Я чего-то недопойнял?
Минус не при единице, а при 1^2.
Проверь, например, через:
http://www.math.sc.edu/cgi-bin/sumcgi/calculator.pl
← →
Думкин © (2004-10-12 06:31) [723]> [719] Defunct © (11.10.04 16:24)
> Точно также как и 0!
Тут немного не так, все-таки. Ну да ладно. :)
← →
Думкин © (2004-10-12 06:35) [724]> [719] Defunct © (11.10.04 16:24)
По вашей логике можно написать и так:
A/0 = A удобно, и не противоречит A/0 Є D.
Ведь так?
← →
Defunct © (2004-10-12 06:59) [725]> Думкин © (12.10.04 06:35) [724]
> По вашей логике можно написать и так:
> A/0 = A удобно, и не противоречит A/0 Є D.
> Ведь так?
нет, внесу небольшую коррективу к высказыванию [719]. Так сказать подкреплю ;)
Разложим функцию x^n в в окресности 0, получим [711]lim(x^n) = -(1/x)*(0-x) = x/x = 1
n->0
lim(x/x) = 1
x->0
А вот:lim(A/0) = бесконечность
A = const, A<>0
← →
Думкин © (2004-10-12 07:33) [726]> [725] Defunct © (12.10.04 06:59)
Это не катит. Можно ведь и так:lim(x^n) = 0
x->+0, n>0
lim(x^n) = inf
x->+0, n<0
lim(0) = 0,inf,???
n->0
← →
Alx2 © (2004-10-12 07:36) [727]>Defunct © (12.10.04 06:59) [725]
>Разложим функцию x^n в в окресности 0, получим [711]
>lim(x^n) = -(1/x)*(0-x) = x/x = 1
>n->0
Все-таки как разложили? Можно подробнее?
← →
VMcL © (2004-10-12 07:53) [728]>>Defunct © (12.10.04 06:59) [725]
Может всё-такиlim(n^n) = ...
n->0
?
>... = x/x = 1
только при x <> 0, поскольку это уже не предел при x -> 0, а обычное выражение.
← →
Dmitriy O. © (2004-10-12 08:26) [729]А что калькулятор уже написан или нет ?
← →
Defunct © (2004-10-12 21:27) [730]Думкин © (12.10.04 07:33) [726]
Alx2 © (12.10.04 07:36) [727]
VMcL © (12.10.04 07:53) [728]
Я пытаюсь объяснить почему во всех продуктах 0^0 = 1 (не от фонаря же выбрали именно единицу). Не нравится объяснение, наздоровье. От этого ни matcad, ни calc, ни функция power работать по-другому не начнут.
← →
VMcL © (2004-10-13 12:51) [731]>>Defunct © (12.10.04 21:27) [730]
Если пытаешься "объяснить почему..." математически, то придерживайся математических правил. Если же просто интересно, почему так, то это, наверное, вопрос не к математикам, а программистам, которые используют равенство "0^0 = 1".
← →
Mihey_temporary © (2004-10-13 16:31) [732]Так а как же тот глюк с -1^2. Хотелось бы публичного признания, а то закончится дело бесславно.
← →
Григорьев Антон © (2004-10-13 16:40) [733]
> Mihey_temporary © (13.10.04 16:31) [732]
Кстати, по спецификации [662] это не глюк. Там минус относится именно к единице, а не к операции возведения в степень в целом.
← →
GrayFace © (2004-10-18 18:49) [734]Defunct © (10.10.04 18:48) [692]
В вашей программе Вы использовали как минимум:
ТЕОРИЮ ИНФОРМАЦИИ И КОДИРОВАНИЯ
ТЕОРИЮ ПРОГРАММИРОВАНИЯ
ТЕОРИЮ СИСТЕМ
Можно примеры? А то я ни одного из этих словосочетаний не знаю.
Mihey_temporary © (10.10.04 20:51) [700]
Но пока GrayFace будет исправлять (если будет), есть время поискать другие баги.
Ладно, исправил. Заодно добавил (-8)^(1/3)=-2.
Alx2 © (10.10.04 21:34) [705]
Думкин © (12.10.04 7:33) [726]
А можно считать, что o(1)^o(1)=NAN(Not a number), но 0^0=1.
Mihey_temporary © (10.10.04 21:35) [706]
Мы же об этом уже говорили - виндовский калькулятор считает так, как я, Numlock Calculator считает так, как я, моя спецификация считает так как я... Но по уму надо, как ты говоришь.
Defunct © (10.10.04 21:59) [711]
А я привел функцию из модуля math, также общеизвестные и признанные программные продукты.
Насчет признанности калькулятора можно поспорить - это как признанность Paint.
Mihey_temporary © (10.10.04 22:10) [714]
-1^2 = 1
Низачто! -1^2 = -1*1^2 = -1. Проверил на Adexpression (готовый калькулятор с Torry.net, по нему ориентируюсь).
А я проверял на Numlock Calculator.
Страницы: 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];
Память: 2.84 MB
Время: 0.064 c