|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Serg Belyaev 2:5020/400 26 Feb 2002 23:19:18 To : Oleg I. Khovayko Subject : Re: imho нелегкий алгоритм, но нужен... -------------------------------------------------------------------------------- Привет! OK> Крутые школьники пошли, что ни говори... OK> OK> Hо согласись, что приведенный тобой пример может написать далеко OK> не всякий школьник. А именно школьник, всерьез увлеченный OK> программированием. Школьники, конечно, разные - большинство и в университет не пойдет учиться. А некоторые великолепно программируют и без в.о. OK> А спрашивают решение с человека, увлекавшегося в школьные годы OK> физикой, а не программерством (раз он уж на физфак пошел). OK> И требовать от физика знания чисто программистских приемов - ну OK> явный перебор! Это все равно, если я буду тебе задачки подсовывать OK> на расчет тепловых полей, да чтобы решил не численно, а в аналитическом OK> виде - что ты скажешь? И правильно скажешь! Потому что программисту OK> в матфизику влазить незачем. Тебе дают в школе теплопроводность OK> для одномерного случая, чтобы имел понятие - и хватит. Если продолжать в таком духе, то до точки зрения Митрофанушки дойдешь. OK> Точно так же надо давать программирование для физиков. Общие OK> понятия, численные методы, и тп. Обработка же строк и рекурсия OK> явно никаким боком к физике не относится. Поэтому для физика OK> бесполезна и неинтересна. Так же как для тебя - постоянная Хаббла, OK> диаграммы Феймана, предел Чандарсекера или уравнение Ферми-Дирака. Hу, про постоянную Хаббла должны знать даже филологи. Про белых карликов могут задать вопрос в какой-нибудь игре. Про стат.физику можно и не говорить - она вплотную примыкает к теории информации. Можно было бы согласиться, что неспециалистам не нужны диаграммы Фейнмана. Hо ... они включены в краткий курс теор.физики для неспециалистов (Ландау и Лифшиц - маленький 2-х томник) OK> И пусть каждий занимается своим делом - физик пишет формулы, а OK> программист - программы. А требовать от физика знания тезиса Черча OK> или от программиста - тензорного анализа прост глупо... Один мой одноклассник после окончания МФТИ со временем переключился на алгебраическую геометрию (сейчас он, вроде, доктор наук). Кто знает, чем придется заниматься нынешнему выпускнику универа! Американский подход к образованию никогда себя не оправдывал (см. статью Арнольда, которая недавно была в ru.math). OK> Компактно и изящно. Можно, конечно, напрячся и пооптимизиповать - но OK> лучше, наверное, употребить свои силы к более "вечным" задачам... Так-то оно так, но, что считать "вечным"? "Школьные" задачи тем и хороши, что они обычно интереснее, часто и сложнее. Принятый в данной конференции стиль изложения алгоритмов часто очень поверхностен, а черт прячется в деталях. Hебольшие изменения приведены ниже - очень неприятно было наблюдать в предыдущем варианте строки, забивающие стек. Рекурсия хороша, но требует аккуратности. Проверка деления на 0 была ошибочной - старый вариант выдавал чепуху при исходных данных "6 2002". Ошибки переполнения пока остались. Скорость выросла примерно в 2 раза, но, "что мешает сделать порох непромокаемым"? ----------------с----------------- const ops:array[1..4] of char='+-*/'; var x,i:integer;s,ss:string; function solv(sum,term:real;op:char;a:integer):boolean; var i,j,y:integer;ssum,sterm:real; begin y:=0;ss[a]:=op; for i:=a to length(s) do begin y:=10*y+byte(s[i])-byte('0'); if i>a then ss[i]:='_'; solv:=true; if op='+' then begin ssum:=sum+term;sterm:=y end else if op='-' then begin ssum:=sum+term;sterm:=-y end else if op='*' then begin ssum:=sum;sterm:=term*y end else if (op='/') then if (y<>0) then begin ssum:=sum;sterm:=term/y end else break; if i<length(s) then for j:=1 to 4 do if solv(ssum,sterm,ops[j],i+1) then exit else else if (ssum+sterm)=0 then exit end; solv:=false; end; begin write('Введи число и строку: ');readln(x,s); while s[1]=' ' do delete(s,1,1); while s[length(s)]=' ' do dec(s[0]);ss:=s; if not solv(-x,0,'+',1) then begin writeln('Hет решения');exit end; write(x,'=',s[1]); for i:=2 to length(s) do if ss[i]='_' then write(s[i]) else write(ss[i],s[i]); writeln; end. ----------------с----------------- <SVB> --- ifmail v.2.15dev5 * Origin: Gamma NNTP server Moscow Russia (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/75911cad190a.html, оценка из 5, голосов 10
|