Обсуждение книги Осипова А.В. «PascalABC.NET: Введение в современное программирование»


#1

Здесь - обсуждение книги Осипова А.В. «PascalABC.NET: Введение в современное программирование»

Книга будет выкладываться по главам по мере написания.

В настоящий момент (7.01.19) выложены 8 глав


#2

1.1.1 Тип BigInteger
Позволяет работать с данными, имеющими в записи практически неограниченное количество цифр. Данные этого типа хранятся в виде четырехбитных двоичных кодов десятичных цифр, упакованных по две цифры в байт.

С чего вдруг? BigInteger хранит внутри массив 32-битных чисел, которые вместе выстраиваются цепочку бит готового числа.

Но это поверхностное объяснение, я уже сам плохо припоминаю, но хранение в десятичном формате - это точно бред. По хорошему - надо декомпилировать и нормально посмотреть.


#3

Я не нашел в документации этой фразы. Вообще в книге подобного рода не нужно говорить о том, как хранится внутри такой объект как BigInteger. Это просто абстракция длинного целого. В Python точно никто не говорит, как устроено внутри длинное целое


#4

Ну, все подробности, конечно, указывать не надо. Но дезинформировать тоже плохо.

BigInteger.cs (65,9 КБ)

Вот раздел с не_статичными полями:

        // For values int.MinValue < n <= int.MaxValue, the value is stored in sign
        // and _bits is null. For all other values, sign is +1 or -1 and the bits are in _bits
        internal int _sign;
        internal uint[] _bits;

Думаю, комментариев от разрабов .Net должно быть достаточно чтоб всё понять.


#5

А Д.Кнут-то и не знает! Вы бы ему сообщили заодно, что двоично-десятичная аврифметика многократной точности - это бред.


#6

Скорее всего - да, Вы правы, не нужно. Уже хотя бы для того, чтобы не вызывать дискуссий. Уже убрал, так что как только будет перевыложено, вопрос снимется)))


#7

Залил новую первую главу


#8

Спасибо!


#9

1.4.3:

-2*a+5*b+---+--+++-2*c
((-2)*3) + (5*(-4)) +---+--+++ ((-2)*8)
(-6)+(-20) +---+--+++ (-16)
(-26) +---+--+++ (-16)
(-26) + (-(-(-(+(-(-(+(+(+(-16))))))))))

Унарные операции имеют больший приоритет чем умножение:

type
  t1 = class
    
    static function operator-(a: t1): t1;
    begin
      writeln('-');
      Result := a;
    end;
    
    static function operator*(a: t1; b: integer): t1;
    begin
      writeln('*i');
      Result := a;
    end;
    
    static function operator*(a: integer; b: t1): t1;
    begin
      writeln('i*');
      Result := b;
    end;
    
  end;

begin
  var a := new t1;
  var a1 := -----5*-a;
  writeln('='*30);
  var a2 := -----a*5;
end.

А значит должно быть так:

-2*a+5*b+---+--+++-2*c
((-2)*3) + (5*(-4)) + ((---+--+++-2)*8)
...

#11

2.2.3.

Стоит ещё написать о том, что 0*бесконечность (любую) тоже даёт NaN.
Как и делению 2 бесконечностей (опять же, знаки не важны).


#12

3.1.1.2.

Вы записали моделирование эквивалентности как not (a xor b), но зачем, если a = b не только быстрее и проще, а ещё и более интуитивно, исходя из названия. Ведь эквивалентность и равенство это синонимы.


#13

Да, Вы правы, выражение было разобрано не с учетом приоритета унарных операций над бинарными, я поправил, будет перевыложено (отслеживается датой выкладки файла).

Вы, видимо, имели в виду 2.3.3? Но там речь не о разборе случаев, когда получается NaN (это нам математика подскажет), а объясняются результаты приведенного примера.

Операция “=” - не логическая, а операция отношения. В табличке дается принятая в булевой алгебре система эквивалентных замен одних логических операций комбинацией других. Именно логических операций. Т.е. тут речь не о том, как короче написать, а как правильно заменить.

В булевой алгебре нет понятия “равенство”, так что это не синонимы.

Спасибо за Ваши замечания и предложения, они помогают сделать материал качественнее.


#14

Самый конец 4.1.

В данном случае говорят, что производится обращение к методу Now класса DateTime

Now это свойство. Конечно, в итоге, в IL коде вызывается функция, но коде на паскале - обращение происходит именно к свойству а не методу.

Если не хотите вводить ещё 1 название - приведите, лучше, в пример 1 из функций System.Math, о которых вы говорили в, вроде, первой главе.


#15

Свойство, конечно же. Поправлю, спасибо.


#16

@RAlex, глава 5 - последовательности. Что конкретно там будет раскрыто? Будет дано понятие последовательности и также описание стандартных подпрограмм для работы с ними, или же будет сделан уклон в сторону .Net (описание System.Linq.Enumerable, к примеру)?


#17

Этого точно не будет. Иначе получится очередной бесполезный опус с очередным кривым авторским толкованием документации от Microsoft.

Все они [законы - примечание мое] выражены в самых ясных и простых терминах, и эти люди не отличаются такой изворотливостью ума, чтобы открывать в законе несколько смыслов; писать комментарий к какому-либо закону считается большим преступлением. (Дж. Свифт. “Путешествия Гулливера”)

Не совсем понимаю, для чего такая спешка: часть 5 будет опубликована через день-два. Но если уж так любопытно, вот P3.pdf (302,9 КБ) оглавление этой части, пусть не совсем актуальное, но все же…


#18

Алекс, хотя я считаю, что в данной версии вы зря не пользуетесь планированием, контрольными вопросами и преимуществами электронной версии, а именно - подсказками, схемами и ссылками, однако у меня такой вопрос:

Как вы сами считаете, выкладка соответствует метод. требованиям, чтобы после ознакомления с материалом читатели могли, например,

  1. кратко описать суть своими словами;
  2. пояснить аналогию и взаимосвязи;
  3. привести свои примеры и
  4. решать схожие задачи?

Также хотя повторение и теория иногда полезны, но в данной версии не совсем понятна целевая аудитория - требования к имеющимся знаниям, на основе которых строится дальнейшая целостная картинка. И если насчёт практических заданий пока* рановато, то примеры вида

немного напрягают: ГДЕ такое применяют? НАСКОЛЬКО часто? ЦЕЛЬ именно такого примера?

Кроме того, планируется ли Список рекомендуемой литературы?

Благодарю


#19

Все дело в том, что это вовсе не электронная версия. Это фрагменты полноценной книги, т.е. издания, ориентированного на традиционную полиграфию. В силу определенных обстоятельств приходится выкладывать фрагменты частей книги, набранные в Word. Эти части практически не сверстаны, если говорить о полиграфических требованиях, в них отсутствуют подрисуночные подписи, часть таблиц также не имеет подписей. Ссылки сделаны вручную и при вставке хотя бы одного подраздела все рассыпется. Куда уж тут вести речь о заданиях и т.п.

Далее, это абсолютно не учебник, не методическое пособие и даже не самоучитель в том виде, в каком их привыкли видеть. Скорее, это своеобразный справочник, в определенной степени раскрывающий возможности PascalABC.NЕТ. Это и не поваренная книга в стиле “Если Вам надо то-то - сделайте а) б) в)…”. Поэтому не нужно пытаться отыскать тут какие-то глубинные методики, предметные и межпредметные связи и прочую учительскую, простите великодушно, шелуху. То, что хорошо в учебнике или в аудитории, тут не работает. Все проще и одновременно сложнее.

Попытка написать учебник будет заранее обречена на провал. Авторы PascalABC.NЕТ создали не просто очередной язык программирования, - они создали почти необъятный язык. Который охватывает и то, что традиционно понимается под Паскалем, и большую часть С#, и какие-то идеи из Python и Haskell… По каждому из этих языков написаны толстенные книги, но ни одна из них не учит “всему”. Какой же должна быть тогда книга, охватывающая PascalABC.NЕТ, если делать ее в форме традиционного учебника? Семитомным изданием, где каждый том будет из шестисот страниц? И писать все это нужно будет лет десять? Надеюсь, я понятно объяснил, почему это не учебник.

Написать справочник в чистом виде? Но он не уйдет далеко от Справки, которая уже есть в PascalABC.NЕТ. Да и какова ценность такого справочника?

Важная особенность PascalABC.NЕТ в том, что он соединил, казалось бы, несоединимое, перекинул мостик от традиционно изучаемого в школах и даже на первых курсах многих вузов языка Паскаль, к идеям и технологиям, заложенным в самые современные и востребованные языки. Поэтому и “подавать” этот язык следует, на мой взгляд, несколько нетрадиционно: не в форме учебника или справочника.

Подача материала в форме “У меня есть задача и ее нужно/можно/следует решать так” - это то, что мы сейчас имеем при натаскивании школьников на ОГЭ и ЕГЭ. То, что стремительно ведет к повсеместному отупению учащихся. Вместо размышлений - судорожный поиск наиболее подходящего под задачу “рецепта”. Увы, у меня за последние пять лет образовался огромнейший опыт общения с “типичными школьниками”, озабоченными решением различных задач по информатике и тенденция именно такова: “мы такие задачи решаем вот по такой схеме:…”. Понимаете? “Учитель сказал, что программа всегда начинается с program имя. Если она так не начинается, значит программа неверна”. Спрашиваешь: “Да почему же неверна, если что есть этот program, что нет его - результат одинаков?”. - А потому, что она оформлена неправильно! И этот шаблон из головы выбить почти нереально. И так во всем. Вот что сделала с детьми нынешняя система образования. А Вы задаете вопрос о том, почему подача материала не следует привычному шаблону. Хотите конкретной пользы от приведенного примера, поясняющего, как работает то или иное средство языка. Попробуйте подумать вот над чем: если в примере видна конкретная польза, не станет ли он очередным шаблоном, который по привычке будет истолкован, как рекомендованный к запоминанию и применению? Помните, в магазине манекены ставят без головы или без лица - чтобы не отвлекали от сути - того, что манекен демонстрирует.? Так и здесь: многие примеры намеренно даны нереальными и бестолковыми, чтобы их не пытались брать за образец. В то же время, в последующих частях можно заметить отдельные разделы, где даются именно содержательные примеры по решению тех или иных задач. Своего рода мастер-класс. Но это не система, а исключение.

Список рекомендованной литературы? Рекомендованной кому и с какой целью? С целью дальнейшего изучения языка? Пока рекомендовать, увы, особо нечего. Мы не должны забывать, что язык - это лишь инструмент, позволяющий с определенной степенью надежности, ясности и скорости довести спроектированный алгоритм до процессора. Эти книга - она всего лишь по языку. Инструменту программиста. Какие у этого инструмента особенности и как их можно использовать, чтобы получить результат быстрее и нагляднее, чем с помощью других инструментов. Поэтому целевая аудитория - те, кто хочет попытаться этот инструмент использовать.

Я хочу, чтобы тут была полная ясность: материал выложен в ознакомительных целях, главы неполные (нет запланированных примеров, заданий и ответов для самостоятельной работы), нет справочного раздела, глоссария, перекрестных ссылок, В конечном счете предполагается, что будет “по-взрослому” (т.е. с учетом требований современной полиграфии) сверстана книга, как единое целое. Она будет в открытом доступе в формате pdf (возможно, также в e-pub и fb2). Также, если возникнет потребность, будет возможно делать по предзаказу полноценные бумажные тиражи в указанном объеме, для чего и будет сделана верстка полиграфического уровня.


#20

Хорошо. Допустим, вы планируете обычную книгу, а не интерактивный контент электронного варианта типа CHM. Однако это не объясняет в нынешнем варианте отсутствие (1) плана “урока”, (2) целевой аудитории и (3) цели урока/абзаца/раздела/книги. Не бывает обучения ради обучения – это всего лишь средство достижения чего-то; и чем выше осознание, тем конкретнее.

Далее, ваши личные предпочтения и авторское видение вполне имеют право на самовыражение, однако какой смысл брать именно PascalABC.NEТ с отходом от Паскаля и без опоры (пока что хотя бы на базовые) средства и возможности .NEТ? Разумеется, придётся сравнивать старые и новые универсалии и варианты, уточняя рекомендуемые паттерны и современные тенденции, но это ещё большая степень абстрагирования. В любом случае, это не объясняет (частые? наглядные? полезные?) примеры вроде y:= -2 * a + 5 * b + - - - + - - + + + - 2 * c;

Насчёт ссылок и рекомендаций, вы действительно не читали ни книг, ни справочников, ни статьи, вам ничего не нравится из опубликованного в бумажном или электронном виде (почти за полустолетие), вы добывали знания исключительно эмпирически и нечего не можете посоветовать для дальнейшего ознакомления с конкретной темой или вопросом? Не буду цитировать Станиславского, но что-то не верится…

Ладно, постараюсь делать акцент на сути, а не форме :slight_smile:

P.S. Лично я считаю, что, как и с иностранными языками, в бывшем СССР программирование зря вырывают из предметной области – из математики, физики, химии, биологии, литературы и даже спорта, потому что это не вакуумные кони а-ля экзотические вещи в себе, а межпредметное (почти универсальное) средство решения конкретных задач


#21

Честно говоря, пункт 1.4.3 Игры с унарным плюсом и минусом не имеет отношения к PascalABC.NET и современному программированию

Эта фраза немного непонятна. Вроде книга как раз про PascalABC.NEТ

А каким Вы видите список рекомендуемой литературы учитывая то, что литературы по PascalABC.NET нет?

Да, я бы тоже хотел это уточнить - возможно, во введении.