Редактирование и вычитка книги

Книга адресована школьникам средних и старших классов, желающим испытать себя в «олимпийских схватках». Может быть полезна студентам-первокурсникам и преподавателям информатики.

Модераторы: Oleg_D, Модераторы

Re: Редактирование и вычитка книги

Сообщение artischev » 03.01.2013 20:41:58

Ответы на некоторые задания из секции «А слабо?», редакция 12-C от 2012-09-18. Задание 32-Б.
Перечислимые типы и диапазоны строятся на базе других типов данных (Byte, ShortInt и так далее). Какие типы данных, по вашему мнению, будут положены в основу следующих диапазонов:
Код: Выделить всё
var
N : -10..10; {byte }

А по-моему shortint.

Добавлено спустя 29 минут 42 секунды:
Ответы на некоторые задания из секции «А слабо?», редакция 12-C от 2012-09-18.
Задание 32-В.
В предложенном ответе использовано ключевое слово type, которое описывается только в следующей главе.
artischev
новенький
 
Сообщения: 12
Зарегистрирован: 27.12.2012 11:17:22

Re: Редактирование и вычитка книги

Сообщение Oleg_D » 03.01.2013 22:08:18

Оба замечания принимаю, спасибо!
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Глава 33, программа для исследования точности вещественных ч

Сообщение artischev » 08.01.2013 21:41:51

Теперь исследуем точность представления чисел разными типами данных.
Код: Выделить всё
{ Программа для исследования точности вещественных типов }
var
F0 : Real;
F1 : single;
F2 : double;
F3 : extended;
begin
F0:= 1/3;
F1:= 1/3;
F2:= 1/3;
F3:= 1/3;
Writeln('Single = ', F1:23:18);
Writeln('Real = ', F0:23:18);
Writeln('Double = ', F2:23:18);
Writeln('Extended= ', F3:23:18);
end.

Десятичное представление дроби 1/3 нам известно, — это бесконечная
последовательность троек, а результат вычислений по этой программе перед вами:
Single = 0.333333343267440796
Real = 0.333333333333484916
Double = 0.333333333333333315
Extended= 0.333333333333333333

У меня компьютер насчитал иначе:

Single = 0.3333333433
Real = 0.333333333333333
Double = 0.333333333333333
Extended= 0.33333333333333333
artischev
новенький
 
Сообщения: 12
Зарегистрирован: 27.12.2012 11:17:22

Re: Редактирование и вычитка книги

Сообщение Oleg_D » 08.01.2013 22:43:14

artischev писал(а):У меня компьютер насчитал иначе

Мои числа были получены на Borland Pascal, на Free надо будет перепроверить.

Добавлено спустя 11 часов 10 минут 44 секунды:
Испытал на Free при разных Compiler mode, результат не зависит от настройки.
Для полноты картины проверил ещё на двух компиляторах:

Код: Выделить всё
Free:
-----
Single  =            0.3333333433
Real    =       0.333333333333333
Double  =       0.333333333333333
Extended=     0.33333333333333333

Delphi:
-------
Single  =    0.333333343267440800
Real    =    0.333333333333333310
Double  =    0.333333333333333310
Extended=    0.333333333333333330

PascalABCNet:
-------------
Single  =    0.333333343267441000
Real    =    0.333333333333333000
Double  =    0.333333333333333000
Extended= (этот тип данных не предусмотрен)

Думаю указать в книге, что использован компилятор Borland Pascal, а в других компиляторах результаты немного отличаются.
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Редактирование и вычитка книги

Сообщение bormant » 09.01.2013 10:45:23

Oleg_D писал(а):Мои числа были получены на Borland Pascal
Строго говоря, для него должно было быть больше одного варианта:
{$N+,$E-} -- сопроцессор (аппаратный)
{$N+,$E+} -- библиотека эмуляции сопроцессора, умолчание для $N+
{$N-} -- только Real
(директивы $N, $E -- глобальные, если правильно помню).
Oleg_D писал(а):Думаю указать в книге, что использован компилятор Borland Pascal, а в других компиляторах результаты немного отличаются.
"результаты могут немного отличаться". Разумное решение.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Редактирование и вычитка книги

Сообщение Oleg_D » 09.01.2013 10:57:32

Согласен
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Редактирование и вычитка книги

Сообщение bormant » 09.01.2013 11:41:06

В антикварном Turbo Pascal 5.5 результаты выполнения
Код: Выделить всё
const
  opts = '$n' + {$ifopt n+}'+,$e' + {$ifopt e+}'+'{$else}'-'{$endif} {$else}'-'{$endif};
var
  r: real; {$ifopt n+} s: single; d: double; e: extended; {$endif}
begin
  writeln(opts);
  r := 1/3;
  writeln('Real:     ', r:23:18);
{$ifopt n+}
  s := 1/3; d := 1/3; e := 1/3;
  writeln('Single:   ', s:23:18);
  writeln('Double:   ', d:23:18);
  writeln('Extended: ', e:23:18);
{$endif}
end.
Код: Выделить всё
tpc /$n- nums
nums
tpc /$n+/$e- nums
nums
tpc /$n+/$e+ nums
nums
таковы
Код: Выделить всё
$n-
Real:               0.33333333333
$n+,$e-
Real:        0.333333333333484916
Single:      0.333333343267440796
Double:      0.333333333333333315
Extended:    0.333333333333333333
$n+,$e+
Real:        0.333333333333484916
Single:      0.333333343267440796
Double:      0.333333333333333315
Extended:    0.333333333333333333
$E+/$E- не повлияло. Правда запускалось это не на голой железке, а под DosBox 0.74, коей влияние на эксперимент мне пока неизвестно.

Добавлено спустя 1 час 23 минуты 38 секунд:
Кстати, вот и иллюстрация примерного количества точных знаков, которое, как известно, составляет:
single (4 байта): 7-8
real: (6 байт): 11-12
double: (8 байт): 15-16
extended: (10 байт): 19-20
Эх, ещё бы источник сего знания вспомнить :mrgreen:
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Редактирование и вычитка книги

Сообщение artischev » 09.01.2013 14:33:50

Глава 33, задание "А слабо?" 33-А.
А) Напишите две функции, округляющие вещественное число:
· до большего значения (например: 3.1 à 4; 3.9 à 4);
· до меньшего значения (например: 3.1 à 3; 3.9 à 3).

Ответы редакции 12-C от 2012-09-18

Код: Выделить всё
function RoundUp(arg: Extended): Extended;
  begin
    RoundUp:= Round(arg+0.5);
    end;

function RoundDown(arg: Extended): Extended;
  begin
    RoundDown:= Round(arg-0.5);
    end;


Позвольте не согласиться с Вашим изящным решением. Округлим до большего, например, число 2. Должно получиться 2. А Ваша функция выдаст 3. Аналогично, при округлении до меньшего, допустим, числа -3 функция выдаст -4, а должно быть -3. Т.е. Ваши функции некорректно работают с "целыми" вещественными числами.

Предложу свой вариант:
Код: Выделить всё
function fRoundingUp(arg:extended):extended;
  begin
    fRoundingUp:=Trunc(arg);
    if arg-fRoundingUp>0 then fRoundingUp:=fRoundingUp+1;
    end;

function fRoundingDown(arg:extended):extended;
  begin
    fRoundingDown:=Trunc(arg);
    if arg-fRoundingDown<0 then fRoundingDown:=fRoundingDown-1;
    end;
artischev
новенький
 
Сообщения: 12
Зарегистрирован: 27.12.2012 11:17:22

Re: Редактирование и вычитка книги

Сообщение Oleg_D » 09.01.2013 14:59:26

artischev писал(а):Предложу свой вариант:

Да, у вас хорошо.
Только для совместимости со всеми версиями я бы так сделал:

Код: Выделить всё
function fRoundingUp(arg:extended):extended;
begin
  if arg-Trunc(arg) > 0
    then fRoundingUp:= Trunc(arg)+1
    else fRoundingUp:= Trunc(arg);
end;

Но и мой вариант иногда полезен, когда надо не округлить, а именно увеличить или уменьшить до ближайшего целого.
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Редактирование и вычитка книги

Сообщение bormant » 09.01.2013 15:23:39

artischev писал(а):Округлим до большего, например, число 2. Должно получиться 2. А Ваша функция выдаст 3.
Зависит от. Turbo Pascal 5.5, {$N+,$E} -- выдаст 2.
artischev писал(а):Аналогично, при округлении до меньшего, допустим, числа -3 функция выдаст -4, а должно быть -3.
В этой части -- соответствует.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Редактирование и вычитка книги

Сообщение artischev » 09.01.2013 15:48:05

Глава 33, задание "А слабо?" 33-Б.
Б) Ваша процедура принимает строковую переменную, вычисляет среднее
арифметическое кодов её символов и печатает его с двумя цифрами после точки.

Ответы редакции 12-C от 2012-09-18:
function CalcStr(const arg: string): Extended;
var
i : integer;
sum : Extended;
begin
sum:=0;
for i := 1 to Length(arg) do sum:= sum+Ord(arg[i]);
CalcStr:= sum / Length(arg);
end;

begin
Writeln(CalcStr('=abcdef='):10:2);
Writeln(CalcStr('-123456789-'):10:2);
Readln;
end.
artischev
новенький
 
Сообщения: 12
Зарегистрирован: 27.12.2012 11:17:22

Re: Редактирование и вычитка книги

Сообщение Oleg_D » 09.01.2013 16:05:17

Да, функцию я показал, а процедуру пусть ученики сами напишут. Что ж, им всё только готовенькое в рот класть?
:D
В ответах я ограничиваюсь иногда лишь идеей решения, или частью решения.
Но можно и поправить, спасибо за въедливость! :)
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Редактирование и вычитка книги

Сообщение artischev » 09.01.2013 16:23:21

Oleg_D писал(а):Да, функцию я показал, а процедуру пусть ученики сами напишут. Что ж, им всё только готовенькое в рот класть?
:D
В ответах я ограничиваюсь иногда лишь идеей решения, или частью решения.
Но можно и поправить, спасибо за въедливость! :)

Напишу как видно из моего болота. Я сам придумываю решение задачи и добиваюсь его работоспособности. Но потом заглядываю в ответ и нахожу недостатки в своих алгоритме или коде :lol: . Для меня ответ - это блистательный идеал.

Предполагаю, что люди, сперва читающие Ваш ответ, а лишь потом пишущие свой, до 33 главы не доберутся.

Добавлено спустя 4 минуты 45 секунд:
bormant писал(а):
artischev писал(а):Округлим до большего, например, число 2. Должно получиться 2. А Ваша функция выдаст 3.
Зависит от. Turbo Pascal 5.5, {$N+,$E} -- выдаст 2.
artischev писал(а):Аналогично, при округлении до меньшего, допустим, числа -3 функция выдаст -4, а должно быть -3.
В этой части -- соответствует.

Вынужден использовать Linux, потому всё что имею - это FreePascal.
Интересные моменты выявляются, связанные с использованием разных компиляторов.
Вот тебе, бабушка, и переносимость кода. :(
artischev
новенький
 
Сообщения: 12
Зарегистрирован: 27.12.2012 11:17:22

Re: Редактирование и вычитка книги

Сообщение Oleg_D » 09.01.2013 16:36:38

artischev писал(а):Предполагаю, что люди, сперва читающие Ваш ответ, а лишь потом пишущие свой, до 33 главы не доберутся.

С этим абсолютно согласен: не помучаешься, не научишься. Насчёт "блистательного идеала". Хотелось бы, чтобы мои решения ему соответствовали, но бывают мелкие огрехи, не без этого -- с этим боремся. Могут быть и несколько равноценных решений одной задачи, это два. И в третьих, я в своих решениях порой игнорирую такие банальные мелочи, как ввод и вывод данных, даю только идею решения.

Добавлено спустя 5 минут 35 секунд:
artischev писал(а):Вот тебе, бабушка, и переносимость кода.

Честно говоря, не знаю, существуют ли идеально переносимые компилируемые языки (скриптовые не в счёт).
Но в целом Паскали неплохо переносятся, хоть и не идеально.
Oleg_D
постоялец
 
Сообщения: 390
Зарегистрирован: 09.05.2011 11:28:36

Re: Редактирование и вычитка книги

Сообщение bormant » 09.01.2013 17:10:00

artischev писал(а):Вынужден использовать Linux, потому всё что имею - это FreePascal.
Следствие и причина связаны никак (извините за мой английский). Вон там повыше уже писал про DosBox (есть в почти в любом дистрибутиве (или прикручивается несложно)), TP55 раздаётся бесплатно с некоторыми ограничениями по использованию в Embarcadero (ex. Borland, ex. Inprise, ex. опять Borland) Antique Software Museum на офсайте.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Пред.След.

Вернуться в Книга "Песни о Паскале"

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru