Помощь - Поиск - Пользователи - Календарь
Полная версия: Прим. прога
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
suriv
Вот,сделал програмку типа калькулятора,ради интереса да и проверить свои силы в паскале.
Так вот что в это программе лишнее или как можно её улучшить:
program l;
uses crt;
var
a,b,z:real;
d,r:char;
g:boolean;
begin
clrscr;
highvideo;
writeln(' CALCULATOR ');
write(' by -=[SuRiV]=- ');
delay(2000);
clrscr;
g:=false;
repeat
normvideo;
writeln;
write('‚ўҐ¤ЁвҐ ЇҐаў®Ґ зЁб«® ');
readln( a );
write('‚ўҐ¤ЁвҐ ўв®а®Ґ зЁб«® ');
readln( b );
write('‚ўҐ¤ЁвҐ §­ Є ¤Ґ©бвўЁп ');
readln(d);
case d of
'+': z:=a+b;
'-': z:=a-b;
'*': z:=a*b;
'/': z:=a/b;
else
g:=true;
write('Ќ ¤® Ўл«® ўўҐбвЁ §­ Є ¤Ґ©бвўЁп!');
delay(2000);
halt;
end;
writeln('ЋвўҐв:',a:5 :1,d,b:5 :1,' = ',z:5 :2);
write('…йс а §®Є(Y/N)');
readln®;
if r='n' then
begin
write('Љ «мЄг«пв®а § ўҐаи Ґв бў®о а Ў®вг...');
g:=true;
end;
until g;
readln;
end.

:p2:
volvo
suriv

Сразу бросается в глаза - нет проверки деления на ноль ...
suriv
Hy A TEIIEPb:
program l;
uses crt;
var
a,b,z:real;
d,r:char;
g:boolean;
begin
clrscr;
highvideo;
writeln('                          CALCULATOR                     ');
write('                            by -=[SuRiV]=-                     ');
delay(2000);
clrscr;
g:=false;
repeat
normvideo;
writeln;
write('‚ўҐ¤ЁвҐ ЇҐаў®Ґ зЁб«® ');
readln(a);
write('‚ўҐ¤ЁвҐ ўв®а®Ґ зЁб«® ');
readln(b);
if b=0 then halt;
write('‚ўҐ¤ЁвҐ §­ Є ¤Ґ©бвўЁп ');
readln(d);
case d of
'+': z:=a+b;
'-': z:=a-b;
'*': z:=a*b;
'/': z:=a/b;
else
g:=true;
write('Ќ ¤® Ўл«® ўўҐбвЁ §­ Є ¤Ґ©бвўЁп!');
delay(2000);
halt;
end;
writeln('ЋвўҐв:',a:5 :1,d,b:5 :1,' = ',z:5 :2);
write('…йс а §®Є(Y/N)');
readln®;
if r='n' then
begin
write('Љ «мЄг«пв®а § ўҐаи Ґв бў®о а Ў®вг...');
g:=true;
end;
until g;
readln;
end.

Altair
Ну зачем сразу выход? Впринципе проверку на нуль надо делать только в операции деления... (ну если всего только 4 операции).
И еще, если решишь сделать что-то круче (что будет теоретически долго считать), используй другие вещественные типы, они в 1,5 раза быстрее работают. Даже почти в 2.
Это я доказывал, если интересно, загляни в прикрепленную тему об ускорении работы программ.
suriv
Хмм
пишу

program l;
uses crt;
begin
sound(120);
delay(60);
nosound;
readln;
end.

И нифига не пищит unsure.gif

Как надо делать?
volvo
suriv

Ты бы Delay увеличил ... хотя бы до 5000...
Altair
даи частоту звука.... а то кряхтеть будет smile.gif)
suriv
program l;
uses crt;
begin
sound(120);
delay(9999);
nosound;
readln;
end.

Нифига не работает sad.gif

delay и 5000 и 999 2400 нифига
volvo
Попробуй :

program l;
uses crt;
begin
 sound(1200);
 delay(10000);
 nosound;
 readln;
end.
Altair
А у тебя системный спикер (как в госдуме спикер ЛОЛ) есть?
suriv
Блин напишите как шоб был красивый чистый (хотя чистым он никогда не будет) звук. Кокда биос загружается(В смысле комп врубаю) он пищит а как пишу так он зараза пищать не хочет.

Добавлено (5.11.04 14:16):
Вот многие говорят: типа использовать goto неправильно и нерационально.
чем же эт непавильно. huh.gif
Altair
Цитата
Вот многие говорят:типа использовать goto неправильно и нерационально.

Нифига подобного smile.gif
Гото просто запрещен в рамках ООП. Но так это очень быстрая конструкция,а циклы на его основе супер быстры, и по скорости такие-же как и wile.
К тому же оператор гото, как всегда говорит Сквозной, философская конструкция smile.gif
Вобщем испольуй если надо, но не показывай никому smile.gif
А так, математически доказанно, что без него можно обойтись..
suriv
Блин Ещё одна хрень пишу в BP7:
program l;
uses crt;
begin
sound(1200);
delay(5000);
nosound;
readln;
end.

Пишет 'Division by zero'
Ну я поменял turbo.tpl но всё равно вылезает ошибка.

Добавлено:
ээй это ведь из-за того что turbo.tpl старый или что
Altair
Да именно. Из-за этого.
Digitalator
Goto пакость совершенная - что называется ни рыба ни мясо.
Если мы пишем на паскале, то это должен быть четкий, понятный и строгоструктурированный код, а используя goto мы все эти прелести испортим.
Если мы гонимся за скоростью и у нас оптимизацомания, то пишем asm, а за ним хоть jmp, хоть jn или jne, и на каждый бит регистра флагов по два собственных jmp найдется...
xds
Применение goto оправдано при выходе из нескольких вложенных циклов:
for i := 1 to n do
 for j := 1 to m do
   if a[i, j] = x then
     begin
       Writeln('Found.');
       goto Done;
     end;
Writeln('Not found.');
Done:

Digitalator
неоправдано, то же самое:
Код

exit:=false;
i:=1;
j:=1;
while not(exit) do
 begin
 if a[i,j] = x then
   begin  
   writeln('Found. ');
   exit:=true;
   end else
   begin
   inc(j);
   if j>m then
     begin
     j:=1;
     inc(i)
     if i>n then
        begin
        writeln('No found');
        exit:=true;
        end;
     end;
   end;
 end;

и не надо говорить что с goto код короче и т.д. и т.п. мы пишем на структурированом, а не суррогатном языке
xds
Цитата(Digitalator @ 5.11.04 19:02)
мы пишем на структурированом, а не суррогатном языке

Мы пишем не только примеры для статей и книжек, но еще и практически используемые приложения.

P. S. Структурированность... Сравним время, необходимое человеку для анализа семантики первого и второго вариантов кода...

P.P.S. А что же такое "суррогатный язык"? ;)
Altair
Цитата
Сравним время, необходимое человеку для анализа семантики первого и второго вариантов кода...

Вот-вот...
между прочим, в некоторых книгах советуют использовать гото, елси от этого улучшится читаемость кода..
Цитата
Мы пишем не только примеры для статей и книжек, но еще и практически используемые приложения.

Вот в том-то и дело... иногда получается, что куча циклов, сильно тормозящих работу, можно убрать а использовать ГОТО.

ЗЫ: хотя я сам не пользуюсь, гото, однако вижу в нем и положительные моменты...
Dark
гото - конструкция, интегрируемая из асма

А не советуют ее применять идеологи ГРАМОТНОГО ПРОГРАММИРОВАНИЯ =)
Altair
lol.gif
xds
Цитата
гото - конструкция, интегрируемая из асма

О, боже!..

Цитата
А не советуют ее применять идеологи ГРАМОТНОГО ПРОГРАММИРОВАНИЯ =)

Я нарушил великую заповедь. Каюсь!

lol.gif lol.gif lol.gif
Digitalator
Я уже писал - если у нас оптимизацомания, то пишем на асме, а если нет - то берем пас без всяких goto и пишем нормальную прогу. Если че современные процы с их архитектурой оптимизировны под языки высокого уровня, и их алгоритмы предсказания и конвейеры работают куда быстрее без дополнительных, не предусмотренных структурой языка, джампов.

Цитата
А что же такое "суррогатный язык"?

Вы не знаете что значит слово суррогат?


Цитата
Мы пишем не только примеры для статей и книжек, но еще и практически используемые приложения.

И что из этого? скажите пжлста какие вы написали практически используемые приложения, в которых использование goto было большим облегчением работы?
Я вообще не вижу чем структурированый код сложнее для написания и понимания, кода с goto....
а если вы пишите большие циклы/условия большой вложености, то ипользование goto будем нарушать видимую структуру. Если вам так уж нужно сделать какой-то сверх-сложный и запутаный алгоритм, то можете использовать case-структурное програмирование без всяких goto
Altair
В принципе я согласен с Digitalator, видимо у него есть опыт написания больших систем, чего нет скажем у меня еще... unsure.gif
APAL
Digitalator
Цитата
...современные процы с их архитектурой оптимизировны под языки высокого уровня...

Ничего не путаешь? Может все таки "низкого уровня"? <_<
Никогда не слышал, чтобы процы были оптимизированы под Паскаль или C...
Altair
наверное он имеет ввиду,ч то современные процы умеют предсказывать ветвления и делать прочую предобработку...
APAL
Это "предсказание" используется не только в современных процах. Это было с самого начала.
Если не ошибаюсь, в архитектуре CISC+RISC процов ....
надо попробовать старые конспекты найти...

К тому же, считаю это бредом про оптимизацию для высокоуровневых языков.
Это утверждение было бы более правильным по отношению к компиляторам, которые и переводят все в машинный код.
Altair
Хм....
ну вобщем конечно оптимизация под высокий уровень ... <_<

это что-то не то.
Ведь команды языка высокого уровня это набор команд низкого и компиляторы все по разному переводят их ... так что возможно он не прави в этом..
xds
Цитата
Никогда не слышал, чтобы процы были оптимизированы под Паскаль или C...

Такая ситуация наблюдалась в конце 70-х - начале 80-х годов XX века. Например в процессорах мини-ЭВМ семейства VAX от DEC одной инструкцией были реализованы не только пролог функции и копирование строки символов, но и операции с односвязным списком. Вот пример одной из команд этой архитектуры: INDEX <b>, <l>, <h>, <s>, <i>, <a> - вычисление адреса элемента массива (<b> - адрес массива, <l> и <h> - границы индекса, <s> - размер элемента, <i> - индекс элемента, <a> - место, куда будет помещён результат). Операции С "++" и "--" - не что иное, как режим адресации с инкрементом/декрементом - характерная черта системы команд PDP (именно на этой архитектуре родился указанный язык). Для такого подхода существовали вестские причины: дело было на заре теории трансляции, недостаток вычислительных мощностей не позволял реализовывать достаточно гибкие алгоритмы оптимизации. Желание помочь разработчикам компиляторов было оправдано.
Сегодня мы имеем ситуацию, противоположную указанной. Производители процессоров не стремятся "заточить" систему команд под ЯВУ: задача оптимизации генерируемого кода практически полностью перешла в руки разработчиков компиляторов. В x86 только две инструкции были добавлены исключительно на благо ЯВУ: это ENTER и LEAVE (пролог и эпилог, функции; ни та, ни другая не используются в BP). Современные аппаратные средства оптимизации расcчитаны на повышение эффективности выполнения произвольного (в смысле источника генерации, но не семантики) кода.
APAL
Т.е. о "современных процах" речь даже не идет...
Так что же имел в виду Digitalator ???
Digitalator
На самом деле именно языки Паскаль, Си и им подобные я и имел ввиду...
Если посмотреть повнимательней, то на выходе компиллятора структурный код if, while, case и т.д. почти идентичны (ну одна фирма делает как никак), современные процессоры Intel P3/4 или AMD k7 имеют сложные и большое количество конвейров и алгоритмы предсказания ветвлений, а т.к. последние много лет разработка приложений ведется в основном на Си и Паскале, их алгоритмы предсказания улучшались в соответсвии и с ними.

PS: Еще одна мысль про гото: при использование этой штуки, наша программа/подпрограмма перестает быть функцией в математическом понимании.
Digitalator
Вот что в институте проходят по этому поводу
Цитата
Цель курса - дать представление об различных подходах, используемых при создании современных ЭВМ. Основное внимание уделяется традиционным архитектурам (CISC и RISC). Рассматриваются взаимосвязи архитектуры и компиляторов языков высокого уровня.
Rothmans
Если рассматривать программу вцелом, то применение локального GOTO оставит её функцией. Любой цикл - комбинация GOTO и IF (jz например). Явный переход иногда полезен при отладке. Но даже в BASIC для красоты стараются делать GOSUB. А программирование, для многих - эстетическое наслаждение.

Под языки высокого уровня оптимизируются не процессоры, а компиляторы. Та же Intel их регулярно выпускает.

i:=0;j:=0;
repeat
 Inc(i);
  repeat
     Inc(j);
  until (a[i,j]=x) or (j:=m);
until (a[i,j]=x) or (i:=n);
if a[i,j]=x then writeln('Found') else writeln('Not found');



и, вроде, не длинно.
Rothmans
Sorry, ошибочка. Под until не :=, а = конечно.
volvo
Rothmans

А кнопка "Редактировать" зачем?
:D
Rothmans
Любую задачу можно решить разными путями. "Редактировать" вовремя не заметил, поэтому выпустил патч. smile.gif
Digitalator
попробуйте записать с помощью обычных математических записей функцию содержащую goto. Без него любую функцию можжно представить конечным числом математических выражений.

ЗЫ: j перед вторым repeat-ом обнулять нада smile.gif
Atos
Цитата(xds @ 5.11.04 15:54)
Применение goto оправдано при выходе из нескольких вложенных циклов:
for i := 1 to n do
 for j := 1 to m do
   if a[i, j] = x then
     begin
       Writeln('Found.');
       goto Done;
     end;
Writeln('Not found.');
Done:



OK:=false;
i:=0;
repeat
inc(i);
j:=0;
   repeat
   inc(j);
   OK:=(a[i,j]=x);
   until OK or (j=m);
until OK or (i=n);

if OK then writeln('found.') else writeln('Not found.');



Имхо, примерно то же самое и по размеру, и по читабельности...
В принципе, в таких простых случаях можно и goto ставить, если уж так нравится.
GoodWind
ИМХО паскаль программа с goto - уже Бейсик-программа lol.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.