Текущий архив: 2004.08.15;
Скачать: CL | DM;
Вниз
Подробный и понятный комментарий! Найти похожие ветки
← →
GrayFace © (2004-07-24 14:38) [280]Еще 10 мин. sin сделал, "+" - нет. Вот в чем проблема: при обращении сделал
try
var b:byte; p:PChar; s:string;
begin
b:=0;
s:=Edit1.text;
p:=PChar(s);
Edit2.Text:=FloatToStr(GetValue(p,#0,-MaxInt,b));
except
on E: Exception do
begin
Edit1.SelStart:=integer(p)-integer(@s[1]);
Edit1.SelLength:=0;
Edit1.SetFocus;
E.Message:=E.Message+" at offset "+IntToStr(Edit1.SelStart);
raise;
end;
end;
Почему-то не работает: передаваемый по var параметр p не изменяется, Division by zero не ловится... В чем проблема?
← →
}|{yk © (2004-07-24 14:44) [281]Слушай, почитай умную книгу
Джулиан Бакнелл "Фундаментальные алгоритмы и структуры данных в Delphi"
Глава 10 "Конечные автоматы и регулярные выражения"
Тогда такой калькулятор быстро напишешь
← →
GrayFace © (2004-07-24 14:50) [282]У меня ее нет. Регулярные выражения мне уже не нужны для калькулятора. Почему Division by zero не ловится?
← →
}|{yk © (2004-07-24 14:56) [283]А конечные автоматы?
← →
Юрий Зотов © (2004-07-24 15:00) [284]> }|{yk © (24.07.04 14:44) [281]
Хороший совет, спору нет - но только это будет уже калькулятор именно с привлечением теории.
> GrayFace © (24.07.04 14:50) [282]
У меня ловится (выражение 1/0)
procedure TForm1.Button1Click(Sender: TObject);
var b:byte; p:PChar; s:string;
begin
try
b:=0;
s:=Edit1.text;
p:=PChar(s);
Edit2.Text:=FloatToStr(GetValue(p,#0,-MaxInt,b));
except
on E: Exception do
begin
Edit1.SelStart:=integer(p)-integer(@s[1]);
Edit1.SelLength:=0;
Edit1.SetFocus;
E.Message:=E.Message+" at offset "+IntToStr(Edit1.SelStart);
raise;
end;
end;
end;
← →
GrayFace © (2004-07-24 15:00) [285]Еще 10 мин. Итого 4:05.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Edit2: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type TOperator=function(v1,v2:extended):extended;
POperator=^TOperator;
TFunction=function(v:extended):extended;
PFunction=^TFunction;
TFunc=record
f:PFunction;
name:string;
end;
TOper=record
f:POperator;
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 Sin1(v:extended):extended;
begin
Result:=sin(v);
end;
const opers:array[0..3] of TOper=((f:@Add; name:"+"; Prior:10),(f:@dec; name:"-"; prior:10),(f:@Mul; name:"*"; prior:20),(f:@Div1; name:"/"; prior:20));
funcs:array[0..0] of TFunc=((f:@sin1; name:"sin"));
var OpMul:TOper;
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;
function DoString(From,Tom:PChar):string;
var i:integer;
begin
SetLength(Result,integer(tom)-integer(from)+1);
for i:=1 to length(Result) do
begin
if from^="." then Result[i]:=DecimalSeparator
else Result[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 GetValue(var s:PChar; sep:Char; prior:integer; var done:byte):extended;
var s1:string; i:integer; fu:TFunction; Len:integer; from,tom:PChar;
dn:byte; step:integer;
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);
exit;
end;
len:=0;
for i:=low(Funcs) to high(Funcs) do
begin
if (length(Funcs[i].name)>len) and cmp(Funcs[i].name,s) then
begin
fu:=TFunction(Funcs[i].f);
len:=length(Funcs[i].name);
end;
end;
if len<>0 then
begin
inc(s,len);
dn:=0;
Result:=fu(GetValue(s,sep,MaxInt,dn));
exit;
end;
from:=s;
tom:=nil;
step:=0;
while true do
begin
if IsDigit(s^)=0 then break;
if (s^="e") or (s^="E") then if step<2 then step:=2 else break;
if (s^="-") then if step=2 then inc(step) else break;
if (s^="+") then if step=2 then inc(step) else if step=0
then step:=1 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);
s1:=DoString(from,tom);
Result:=StrToFloat(s1);
finally
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;
function GetOper(var s:PChar; sep:Char; prior:integer; var done:byte; v1:extended):extended;
var i:integer; op:TOper; Len:integer;
begin
while s^=" " do inc(s);
len:=0;
if (s^=sep) or (s^=#0) then
begin
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.FormCreate(Sender: TObject);
begin
OpMul:=opers[2];
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));
except
on E: Exception do
begin
i:=integer(p)-integer(@s[1]);
s:=E.Message;
Edit2.Text:=s;
Edit1.SetFocus;
Edit1.SelStart:=i;
Edit1.SelLength:=0;
end;
end;
end;
end.
← →
app © (2004-07-24 15:11) [286]Все код в ветке больше не будет прниматься, заводи сайт и делай туда ссылку. Здоровье посетителей сайта превыше всего.
← →
Mim1 © (2004-07-24 15:20) [287]
> Итого: 3 ч 45 мин (еще 5 минут - ошибра округления до 3,5
> ч).
Оригинальнос округляете :)
← →
вразлет © (2004-07-24 15:21) [288]Mim1 ©
калькулятором)
← →
app © (2004-07-24 15:24) [289]Да дополнительно прекращаем обсуждать "калькулятор" от GrayFace это не по теме ветки, будет удаляться, он враве создать свою ветку - мой супер калькулятора.
← →
Юрий Зотов © (2004-07-24 15:39) [290]> GrayFace © (24.07.04 15:00) [285]
Выражение: 2+2/3*6/3*3
Результат: Invalid floating point operation.
Потраченное время: не более пары минут.
:о)
P.S.
"До тех пор, пока не будет привлечена теория, ВСЕГДА найдется такое выражение, которое такой компилятор распознать и выполнить НЕ сможет".
(С) Юрий Зотов
:о)
P.P.S.
Пока что, как видите, мне удается найти такое выражение без малейших проблем. И это при том, что пока еще я совершенно не вникал в Ваш алгоритм и набираю выражения просто "с потолка". Естественно, по мере доработки программы это будет делать все сложнее и дольше - и вот тогда я проанализирую код, найду в нем слабое место и уже безо всякого подбора СРАЗУ напишу выражение, на котором программа все равно споткнется. И сколько бы Вы ее ни дорабатывали, так будет ВСЕГДА. Потому что - см. P.S. выше.
:о)
> app © (24.07.04 15:24) [289]
Не обсуждая принятое модератором решение, все же прошу этот постинг не удалять. По той причине, что он неразрывно связан с УЖЕ имеющимся в ЭТОЙ ветке постингом [285], а в другой ветке был бы относящимся непонятно к чему. Пусть будет другая ветка с обсуждением калькулятора (если будет), пусть в ЭТОЙ ветке данный постинг будет последним по калькулятору, но все же ЭТОМУ постингу, IMHO, место все же именно здесь, а не в другой ветке.
← →
Anatoly Podgoretsky © (2004-07-24 15:45) [291]Хорошо Юрий, но это последний постинг, посвященый этому калькулятору, который не будет удален.
Если GrayFace охота по обсуждать это, то пусть заведет отдельнуюю ветку. Право у него никто не отбирает, но здесь будем продолжать только обозначеную тему.
Если же GrayFace попробует далее обсуждать это здесь, то будет удален не только последний постинг но и все предыдущие не по темк, ветка будет жить, поскольку не виновата в том, что кто то рахзводит офтопик.
← →
Palladin © (2004-07-24 15:46) [292]баран не только смотрит на ворота, но и пытается на них что то писать
Подумай, напиши. А не напиши, послушай, исправь, послушай, перепиши, послушай, послан подальше...
← →
app © (2004-07-24 15:48) [293]Примечание, постинг [251] идет как официальный от имени модератора, забыл сменить ник.
← →
app © (2004-07-24 15:48) [294]291 опять поторопился
← →
calm © (2004-07-24 17:01) [295]Если оптимизация приводит к сложности изменения, то, имхо, руки кривые.
Хочешь сказать, что более рациональное должно быть более простым? Бред. Взять хотя бы ту же сортировку Шелла или Хоара...
Для оптимизации есть специальные люди.
Ты, прикладной программист, пишешь суть запроса.
Он, спец, оптимизирует строго формально.
Извините за котегоричность, но это ПОЛНЫЙ БРЕД.
← →
Огромное Кулясищще © (2004-07-24 17:05) [296]Удалено модератором
Примечание: В ветку про написания калькуляторов
← →
Юрий Зотов © (2004-07-24 19:43) [297]Кому интересно - ветка про калькулятор переехала сюда:
http://delphimaster.net/view/14-1090676641/
Господа присяжные заседатели! Заседание продолжается!
(С) Остап Бендер.
← →
Суслик © (2004-07-25 09:54) [298]жуть...
Юрий, вам то зачем это нужно доказывать?
Не пойму...
← →
Юрий Зотов © (2004-07-25 11:56) [299]> Суслик © (25.07.04 09:54) [298]
Вероятно, затем же, зачем тут тратят время и деньги, отвечая на вопросы...
:о)
← →
Суслик © (2004-07-25 11:57) [300]
> Юрий Зотов © (25.07.04 11:56) [299]
СОгласен.
Но вы ничего не докажете :(((
← →
Anatoly Podgoretsky © (2004-07-25 11:59) [301]Ну это жизнь, кто то поймет.
← →
Юрий Зотов © (2004-07-25 12:26) [302]> Суслик © (25.07.04 11:57) [300]
Тем, кому вообще ничего нельзя доказать - да. Я к этому и не стремлюсь.
А тем, кому можно - вполне. Форум читают многие...
Иначе - зачем вообще все это?
:о)
← →
Суслик © (2004-07-25 13:06) [303]
> Иначе - зачем вообще все это?
Это для того чтобы:
1) Учить того, кто хочет учиться
2) Учить того, кто слушает, что говорят старшие
3) Получать удовольствие от сознания того, что сделал умного еще умнее.
← →
Юрий Зотов © (2004-07-25 14:27) [304]> Суслик © (25.07.04 13:06) [303]
Дык... вот Вы сами на свой вопрос и ответили.
:о)
← →
Master Paleva © (2004-07-25 21:59) [305]Вообще, неплохо бы создать такую программу, которая сама бы комментировала код. Технически это, конечно, сделать несложно(в смысле кода). Можно сделать такую программу на основе FAQ. С помощью такой программы можно будет самому прокомментировать код.
← →
Огромное Кулясищще © (2004-07-25 22:11) [306]2 Юрий Зотов © (25.07.04 12:26) [302]:
А если вам докажут обратное? Вы готовы такое допустить и принять?
← →
Cobalt © (2004-07-25 23:27) [307]2 Огромное Кулясищще © (25.07.04 22:11) [306]
Что именно докажут?
← →
Огромное Кулясищще © (2004-07-25 23:29) [308]>Что именно докажут?
Читай ветку.
← →
Денис (2004-07-25 23:37) [309]Григорьев Антон © (24.07.04 09:49) [269]
> Паразитизм - это когда ученик не хочет предпринимать никаких
> усилий для того, чтобы получить знания, и считает, что учитель
> обязан вложить их в него.
А сколько копий сломано на той же самой странице(http://www.delphikingdom.com/asp/answer.asp?IDAnswer=23431), тем же самым неким Антоном Григорьевым, о том, что "Программист нужен для того, чтобы решать те задачи, которые никто до него не решал, и задачи эти обычно достаточно сложные."
И Вы считаете, что учитель может научить этому?
Нет, Вы так не считаете.
А "вложить знания"?
> А обучить можно только того, кто сам этого хочет и на это
> способен. А хотение и способность априори предполагают желание
> и умение самостоятельной работы с книгой (или иным источником).
> Роль же преподавателя - сначала дать базу (чтобы человек
> мог понимать написанное), а затем - контролировать усвоение
> материала и разъяснять непонятные места.
Это уже Юрий Зотов.
Это гораздо ближе к теме.
А что значит "дать базу"?
И чем эта "база" может быть? Общей теорией, примерами, вариантами решений?
Всем чем угодно, это зависит от потребностей и способностей ученика. Лучший подход - индивидуальный.
Скромная, великая, необходимая и достаточная миссия учителя - как раз именно "вложить знания", наилучшим образом.
Было бы во что вкладывать.
Ученик же должен усваивать и анализировать эти знания.
И уже на их основе он сможет учиться правильно мыслить в контексте предмета, составлять и решать новые задачи.
P.S. Остальное же(Григорьев Антон © Денису (24.07.04 09:49) [269]) очень похоже на истерику, с характерным для этого перегибом фактов. Как же я Вас достал, Антон...
Или Вы нездоровы?
В любом случае - прошу прощения.
P.S.S. Может стоит потребовать от школьников самостоятельного доказательства теорем Пифагора?
А что, пойдёт на пользу...
← →
Anatoly Podgoretsky © (2004-07-25 23:47) [310]Ты не преувеличиваешь свою значимость?
← →
Baron © (2004-07-25 23:57) [311]Все спорите? 310 постов. Вот уж точно подробный комментарий. Я грешным делом думал это уже другая тема. Но вы так и не ответили на вопрос - может ли ученик превзойти учителя? Или это только в японских фильмах...
← →
Думкин © (2004-07-26 06:28) [312]> [309] Денис (25.07.04 23:37)
> P.S.S. Может стоит потребовать от школьников самостоятельного
> доказательства теорем Пифагора?
> А что, пойдёт на пользу...
Если он найдет доп. доказательства отличные от предложенных учителем - то это здорово. Во всяком случае история Гаусса по преданию начинается с того, что он посчитал сумму натуральных чисел от 1 до 100 способом, который не предполагал учитель.
> [311] Baron © (25.07.04 23:57)
Может. Но смотря в чем и смотря как. Что касается математики, то в определенном плане я обошел своего школьного учителя, но не в том в чем он работает, а уж из детского сада.
Если же речь о научном(профессиональном) руководителе, то это тоже случается и иногда при жизни учителя, только вот в чем и как? Очень часто потом приходит понимание того, что ты только начал понимать, то что тебе казалось уже понятым. Знания - это же не только набор формул и успешный поиск определенных решений. И неужели активно действующий учитель стоит на месте? А что в японских фильмах? Напомните деревенщине...
← →
Думкин © (2004-07-26 06:40) [313]> Если же речь о научном(профессиональном) руководителе, то
> это тоже случается и иногда при жизни учителя, только вот
> в чем и как
Да и что обходить? Иногда, подняться до одного уровня - это уже. Это не значит, что вы не получите результатов идущих дальше и расширяющих результаты учителя. Но результаты не всегда означают превосходство.
← →
Юрий Зотов © (2004-07-26 12:15) [314]> Огромное Кулясищще © (25.07.04 22:11) [306]
> Вы готовы такое допустить и принять?
Естественно. Дело за малым - доказать раньше, чем я успею благополучно помереть. Потому что вот в этом случае я уже не смогу "допустить и принять". Чисто физически.
:о)
← →
Юрий Зотов © (2004-07-26 12:26) [315]> Baron © (25.07.04 23:57) [311]
> Но вы так и не ответили на вопрос - может ли ученик превзойти
> учителя?
А разве ответ не очевиден и надо отвечать? Конечно, может.
Правда, есть нюанс. Довольно часто бывает так, что ученик ДУМАЕТ, что он УЖЕ догнал (или превзошел) своего учителя. Потому что у ученика уже есть неплохой уровень знаний (скажем, намного выше, чем у его друзей и знакомых), но этих знаний еще не хватает, чтобы он мог понять ДЕЙСТВИТЕЛЬНЫЙ уровень учителя.
И только спустя годы и приобретя еще намного большие знания, он станет способен это понять. И со стыдом подумать о том, как же он был глуп и самонадеян.
Увы, бывает такое. И даже довольно часто.
:о)
← →
pasha_golub © (2004-07-26 12:39) [316]Юрий Зотов © (26.07.04 12:26) [315]
Осознание учеником своей недальновидности - это великий дар, недоступный всем. Тут я с Вами согласен.
← →
Григорьев Антон © (2004-07-26 12:50) [317]
> pasha_golub © (26.07.04 12:39) [316]
> Юрий Зотов © (26.07.04 12:26) [315]
> Осознание учеником своей недальновидности - это великий
> дар, недоступный всем.
Зачем же так пессимистично? Может, сформулировать помягче - доступный не всем?
← →
pasha_golub © (2004-07-26 12:57) [318]Григорьев Антон © (26.07.04 12:50) [317]
Именно так. :0) Спасибо, что подправил.
← →
Игорь Шевченко © (2004-07-26 13:04) [319]Денис (25.07.04 23:37) [309]
А бабушки все падали и падали...(с)
Если не трудно, прочитай(те) пожалуйста:
http://ln.com.ua/~openxs/articles/smart-questions-ru.html
← →
Baron © (2004-07-26 13:42) [320]Юрий Зотов © (26.07.04 12:26) [315]
>Довольно часто бывает так, что ученик ДУМАЕТ, что он УЖЕ догнал
>(или превзошел) своего учителя.
Это точно. Чаще так и бывает.
//
Я вот тут подумал. А стоит ли вообще пытаться достигнуть заоблачных высот? По-моему достаточно знать столько, сколько нужно на сегодня. Ну не знаешь чего-то, а нужно, так подучи. Все одинаково хорошо знать невозможно. Если где-то прибудет, то где-то убудет. Нужно пытаться понять суть, тогда все сразу встает на свои места. «Зри в корень» как говорится.
Страницы: 1 2 3 4 5 6 7 8 9
вся ветка
Текущий архив: 2004.08.15;
Скачать: CL | DM;
Память: 1.11 MB
Время: 0.075 c