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

Вниз

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

 
Григорьев Антон ©   (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("&#205;&#224;&#247;&#224;&#235;&#238;. 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]

унарный минус имеет более высокий приоритет



Страницы: 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];

Наверх




Память: 0.68 MB
Время: 0.065 c
1-1097967106
ranetka
2004-10-17 02:51
2004.11.07
Диманический массив как поле класса


14-1098004825
QuasiLamo
2004-10-17 13:20
2004.11.07
Вот, чиста маё мнение


4-1096702312
dir__er
2004-10-02 11:31
2004.11.07
hWindow to hProcess


14-1098309853
Anonimus
2004-10-21 02:04
2004.11.07
Модераторам предложение


4-1096526534
Muhsin
2004-09-30 10:42
2004.11.07
Запуск других приложений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский