LINUX.ORG.RU

Вышло издание 2,92 книги «Программирование: введение в профессию» А. В. Столярова

 , , ,

Вышло издание 2,92 книги «Программирование: введение в профессию» А. В. Столярова

4

5

Тихо и незаметно 30 апреля 2026 года вышло издание 2.92, которое наконец включает в себя читаемый текстовый слой.

Исправлены опечатки и ошибки, обнаруженные в предыдущих изданиях, в частности 2.91 (где введена кликабельная навигация) и 2.9 (первое чисто электронное издание).

Книга предназначена для самообучения основам программирования и в отличии от многих других изданий предполагает фундаментальный подход — вначале основы дискретной математики и использования GNU/Linux или BSD с командной строкой, затем паскаль, потом ассемблер и только потом Си, системное программирование и альтернативные парадигмы (функциональное, логическое и так далее).

Автор книги считает, что только такой порядок обеспечивает полноценное обучение программированию, и обосновывает такой подход в методическом предисловии к первому тому.

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

>>> Ссылка на страницу издания

>>> Альтернативные способы скачивания

>>> Новость на сайте автора

★★★★★

Проверено: dataman ()
Последнее исправление: CrX (всего исправлений: 10)
Ответ на: комментарий от liksys

Нет.

В качестве упражнения, я предлагаю тебе формально доказать корректность каждого из алгоритмов, и затем сравнить доказательства. Понятно, что свой код кажется проще, но длина доказательства это объективная метрика, в отличие от «я так вижу».

quantum-troll ★★★★★
()
Ответ на: комментарий от vM

как чуть выше пояснено

нет ибо проблема у нечётных чисто от того что последний делитель чистая степень базы - если смесь то частное всегда меньше базы

qulinxao3 ★☆
()
Ответ на: комментарий от Xenius

Что сохранил то и напечатает - побайтово. А всякие кодировки это уже проблемы редактора и консоли, а никак не языка программирования.

firkax ★★★★★
()
Ответ на: комментарий от firkax

мысль ваще что код это данные ( и даже без необходимости самомодификации)

т.е при наличие функции sign и индексов всякий if ( и изначальный трёхпутный фортрана )

это call

[proc_1,proc0,proc1][sign(SomeExpretion)]  # что то на псевдо коде почти Python
т.е стандартное инь-янь апликативщины из лиспения - зачем императивить операторами если можно структурить данные и вызовы от результат предыдущего вычисления :)

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 2)
Ответ на: комментарий от unC0Rr

Это не «закидоны», это основы составления алгоритмов. Надо с самого начала показывать именно их, а не «декларативно» обрезанный код, иначе плохому научишь и это будет сложно исправить потом.

firkax ★★★★★
()
Ответ на: комментарий от Xenius

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

firkax ★★★★★
()
Ответ на: комментарий от firkax

при правильном обучении стоит синхроно(и даже чуть раньше чем seq/if/loop - хотя по мне лучше seq/def/call/вычислимый_call) ознакамливать с концепцией хранимой и модифицируемой памяти и из этого переменных тогда через модификацию состояние более внятный подход формируется

как одно путевой конвеер с модификацией по ходу

чем дерево конвееров с выполнением всего действия на терминальных состояниях

т.е. лулз что синтаксическая хохлома проверок для первоначальной классификации для однократного применения это атавизм из «патерн-мэтчинга» когда сначала классифицируй потом действуй

а ряд модификаций состояния это более программисткий подход

qulinxao3 ★☆
()
Ответ на: комментарий от Xenius

По-моему у тебя браузер глючит - не учитывает кодировку сайтов при копировании между вкладками. Программирование тут ни при чём. Кстати, в фф весьма давно сломали нормальный выбор кодировки, и частично сломали её определение, это очень плохо с их стороны.

firkax ★★★★★
()
Ответ на: комментарий от ptah_alexs

Никак нет, лучше начать с выбора другого рода занятий. Если ему не 5 или меньше лет, конечно.

firkax ★★★★★
()
Ответ на: комментарий от quantum-troll

Могу расписать, но не хочу спойлерить Xenius решение (он ещё не ответил на мой вопрос).

По-моему я и так всё доказал. Чтобы число делилось на 110, оно должно делиться и на 11 и на 10, а остаток от деления четырёхзначного на 1001 не будет делиться на 10, если первая и последняя цифра не одинаковые, так как нахождение остатка можно представить как последовательное вычитание 1001. Если первая цифра меньше, то она исчерпается раньше, в конце что-то останется, если она больше, то в конце получится ноль, но вычитание будет повторяться пока первая цифра не обнулится и в последней будет опять не ноль. Значит mod 1001 сбривает первую и последнюю цифру тогда и только тогда, когда они равны. А дальше mod 110 сравнивает две оставшиеся цифры.

С пятизначным числом будет (n>=10000) and (n<100000) and (n mod 10001 mod 1010 = 0) и вроде тогда выловятся только палиндромы.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от quantum-troll

тогда вопрос

можно ли так разбить ряд 1(единиц) длины изучаемых палиндромов (для чётных достаточно ряда пар -но может есть меньшее количество подходящих делителей?) на группы позиций возможно различных количеств что бы последовательным примененим mod к остаткам всегда иметь нулевой для палиндомов и иное для не.

ну и минимизировать размеры таких наборов - т.е обойтись наименьшим количеством mod

выше чисто пример что можно для длины 2n достаточно n пар Для 4 это 41 и 23 в позициях для 2 это 12 для 6 это 61 25 34

можно ли обойтись меньшим набором - например для 6 (чисто для пояснения это не подходящий набор) 631 и 542 т.е. 100101 и 11010

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 4)
Ответ на: комментарий от firkax

По-моему у тебя браузер глючит - не учитывает кодировку сайтов при копировании между вкладками. Программирование тут ни при чём. Кстати, в фф весьма давно сломали нормальный выбор кодировки, и частично сломали её определение, это очень плохо с их стороны.

Я скопировал из консоли, там же видно. Там специально cat без iconv чтобы показать, что кириллица в коде — зло.

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

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

Xenius ★★★★★
() автор топика
Ответ на: комментарий от algo

Почему нет? Не у всех мания обновляторства, и если проект писался под данный компилятор то лучше его им и компилировать, чем тратить потенциально кучу времени на отлов багов после переезда.

firkax ★★★★★
()
Ответ на: комментарий от liksys

Ну VLA то и правда муть. Если так уж хочется переменный массив в стеке разместить - можно alloca использовать, более алгоритмически прозрачное, и с возможностью проверить «длину массива» на корректность перед тем как вслепую его аллоцировать.

firkax ★★★★★
()
Ответ на: комментарий от CrX

На это есть разные причины. Основная — так исторически сложилось.

Нет. Основная и единственная - что иначе вместо страницы формул у тебя будет 10 страниц формул, которые во всех отношениях сложнее в поддержке.

firkax ★★★★★
()
Ответ на: комментарий от anonymous_incognito

UINT64_MAX * 10

Что-то у меня подозрение что тут будет арифметическое переполнение, а в переменную с тайпкастом до 128 бит запишется уже обрезанное ранее до 64 бит значение.

firkax ★★★★★
()
Ответ на: комментарий от quantum-troll

Не нужно пытаться натянуть сову на глобус.

liksys ★★★★
()
Ответ на: комментарий от liksys

Там комментарий будет в 5-10 раз длиннее формулы. Формула, конечно, не очевидна прямо сразу, но если чуть подумать (отвлечься от серьёзной математики и рассмотреть её с позиций начальной школы) то как раз всё становится понятно.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Я принципиальлно ставлю лишние {}, чтобы исключить возможность дописать еще одну строку, которая по ошибке не войдет в условие, и минимизировать размер диффов при следующих изменениях. Это уже привычка.

liksys ★★★★
()
Ответ на: комментарий от Xenius

Я скопировал из консоли, там же видно. Там специально cat без iconv чтобы показать, что кириллица в коде — зло.

Ну значит не браузер а комбинация браузера+эмулятора терминала (не знаю кто там должен отвечать за сопоставление кодировок, но обе проги точно знают какая у них сейчас выбрана).

firkax ★★★★★
()
Ответ на: комментарий от liksys

Это если код на отдельной строке, а если вся строка одна if(...) ...; то ещё одну строку некуда дописывать. Учитывая что тут всё максимально короткое, делить на 2 строки странно.

Ну разве что для диффов понятно, но по мне так неоправданная плата за такое. Хотя с другой стороны этот if на отдельной строке съест 1 строку контекста диффа, что в некоторых случаях может привести к двусмысленному патчу (когда его можно применить в разным местам кода, если номера строк сдвинулись).

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 3)
Ответ на: комментарий от firkax

Это всё справедливо, но это же не повод клеймить стандарт целиком.

liksys ★★★★
()
Ответ на: комментарий от firkax

Я в какой-то момент почти перестал однострочные конструкции с ифами писать - только прям в ооочень редких случаях для проверки кучи чего-то однотипного. Не вижу смысла экономить строчки, если честно.

liksys ★★★★
()
Ответ на: комментарий от firkax

не знаю кто там должен отвечать за сопоставление кодировок, но обе проги точно знают какая у них сейчас выбрана

В обоих UTF-8, зато файл в cp1251, неужели не понятно?

Xenius ★★★★★
() автор топика
Ответ на: комментарий от liksys

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

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Xenius

Ну значит ты неправильно вывел файл в терминале. И файлы локализаций, даже если отдельные, точно так же могут оказаться в не той кодировке.

firkax ★★★★★
()
Ответ на: комментарий от liksys

Ссылкой куда? Какая ещё теорема? Он тупо через остаток от деления убирает одинаковые цифры с двух концов. Это арифметика 2-3 класса школы.

firkax ★★★★★
()
Ответ на: комментарий от Xenius

С пятизначным числом будет (n>=10000) and (n<100000) and (n mod 10001 mod 1010 = 0) и вроде тогда выловятся только палиндромы.

Ага, только не все, ещё надо сделать mod 100, но тогда ловятся лишние. Вот так правильно:

Program palindrome_test;

Var
	i, j: longint;

Begin
	for i := 10000 to 99999 do begin
		j := i mod 10001 mod 1010;
		if (j<1000) and (j mod 100 = 0) then
			writeln(i)
	end
End.
Xenius ★★★★★
() автор топика
Ответ на: комментарий от qulinxao3

При n<=9 точно нельзя (там может быть 9 разных цифр и каждую надо убирать индивидуально), при n>9 скорее всего тоже нельзя.

firkax ★★★★★
()
Ответ на: комментарий от vM

upd однострока:

print('no '*((a:=open(0).splitlines()[0],)and any(a[i]!=a[~i]for i in range(len(a)//2)))+'pali')

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 3)
Ответ на: комментарий от bloody_enterprise

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

firkax ★★★★★
()
Ответ на: комментарий от firkax

Не надо себя пересиливать и мучиться

Если вы начинаете заниматься НОВЫМ для себя делом, то всегда это будет трудно, иначе, это дело не ново и уже есть наработанный опыт. Опыт нарабатывается практикой. То, от чего болит голова на первых шагах, через часы практики будет выполнятся автоматически. Если бы все бросали свои дела столкнувшись с трудностями - то и не было бы никаких достижений.

bloody_enterprise
()
Ответ на: комментарий от firkax

Ну значит ты неправильно вывел файл в терминале. И файлы локализаций, даже если отдельные, точно так же могут оказаться в не той кодировке.

Программа может работать без файлов локализации, оставаясь читабельной и юзабельной. А вот если в программе будут комментарии, хуже того строки или ещё хуже того имена переменных/функций не в той кодировке — то нет.

А файл я вывел правильно, через cat. Это файл неправильный.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Xenius

Видел, но это ещё не мой уровень. Я просто иду по книжке. И что бы голова начала лучше работать, сейчас выполняю 100 заданий на «if then else», «case» с операциями сравнениям «> < = <>» и логическими операторами and or xor not. Закончу и дальше будет цикл.

bloody_enterprise
()
Ответ на: комментарий от bloody_enterprise

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

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

firkax ★★★★★
()
Ответ на: комментарий от bloody_enterprise

По какой именно книжке? Если Паскаль для Школьника - то почему не Столяров? Правда у него упражнений куда как меньше. Ну и есть отдельный задачник ещё, но тоже небольшой.

100 заданий на «if then else»

Не знаю, я бы сдох от скуки делать задания, которые мне самому ни нафиг не нужны. Вот сейчас я думаю как написать программу, которая будет печатать на мой принтер, чтобы не гонять тяжелый cups, а просто my_print file.name > /dev/lp0

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Xenius

я бы сдох от скуки делать задания

Потому, что вы уже знаете как их делать. Есть опыт и знания. Для меня важно закрепить материал в новых нейронных связях - это возможно только через практику.

Если Паскаль для Школьника - то почему не Столяров

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

паскаль -> асемблер -> си -> си++

Но сам материал, где раскрывается предмет, брать других авторов. Каких? Тех, которых рекомендует большинство. В конечном итоге у меня будет собеседование, будут тестировать мой уровень знаний. Никого не будет волновать политика или философия. Работодатель платит деньги за знания, навыки и опыт. Если ограничиться ТОЛЬКО Столяровым, то есть высокий риск это собеседование не пройти.

bloody_enterprise
()
Ответ на: комментарий от bloody_enterprise

Потому, что вы уже знаете как их делать. Есть опыт и знания.

На самом деле нет, я забываю даже то, что знал. А как писать на SDL вообще не знал. Но всё-таки написал же.

Слишком много критики в его адрес.

И что? Просто не считай его слова истиной в последней инстанции. Но и критиканам особо не верь. Но в целом по существу у него почти всё верно написано. Думаю, что это лучше, чем книга 2011 года выпуска про Turbo Pascal.

Надеюсь, ты хотя бы не пишешь под TP в 2026-м году?

Если ограничиться ТОЛЬКО Столяровым, то есть высокий риск это собеседование не пройти.

Естественно никто не предлагает ограничиваться только Столяровым, даже сам Столяров. Ещё нужно читать мануалы, то есть документацию к компилятору, используемым функциям и так далее, как минимум. Но это уже не совсем основы.

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

Ассемблера по Столярову тебе не хватит, там только 32-битный, так что, когда/если освоишь его, почитаешь потом как дёргать системные вызовы из 64-битного кода, там передача параметров через другие регистры, а инструкции в целом такие же. Только в место eax, rax например и самих регистров больше.

Но 32-битный тоже надо знать, думаю.

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 3)
Ответ на: комментарий от bloody_enterprise

Идти лучше чем стоять

Вместе с тем есть вот дядька Чарльз Северанс начинает с питона дальше рекомендует Сяшку (для оптимизации и импортировать в питон) его учебник по питону есть на русском .

А то что вы сейчас осваивает( ботаник прорешкой для набития и ставить руку) это алгоритмика она во всех императивных языках начиная эдак с 1965 одинаковая

У Паскаля относительно питона есть даже не коммерческие а именно алго недостатки, в питоне есть декораторы в частности тот же @cache один два 100 раз можно конечно самому писать забивая на подкормку реализацию мемоизации но это реально чисто для олимпиад при ограничениях импорта а в целом же трата времени повторно делать то что уже не просто есть а уже самим и сделано и понято,

Настоящая проблема что многие не достаточно успешно используют компоненты потому что не достаточно уделили времени и внимание на понимание как что устроено - забывая что чёрные ящики могут отличаться кардинально при тех же самых интерфейсах апи и выдаваемых результатах

qulinxao3 ★☆
()
Ограничение на отправку комментариев:
Тема будет перемещена в архив .