LINUX.ORG.RU

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

 , , ,

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

4

6

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

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

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

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

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

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

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

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

★★★★★

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

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

if a>b then
  if a>c then
    writeln(a)
  else
    writeln(c)
else
  if b>c then
    writeln(b)
  else
    writeln(c)

Кстати ты ещё не учитываешь ленивость and из-за которой сравнений по факту будет не шесть.

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

Это требования для любого языка программирования. Представь себе у тебя редактор сохраняет в KOI8-R, а в консоли ISO8859-5, например. Или наоборот.

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

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

То что вы изначально написали имеет квадратичную сложность. Если вы до сих пор не видите проблему - я попросил бы найти максимум их 4х элементов, потом из пяти, и так пока вы не увидите ущербность используемого подхода. Последняя версия тоже не сильно лучше, но не с точки зрения числа сравнений, а по code duplication and extensibility. Зато за оформлением следим, как и завещал великий столяров.

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

Решается это вот так

Господи, ну и трешанина. Дамы и господа, результат обучения программированию по-столяровски.

В программах не должно быть не-ascii символов.

Потому что столяров так сказал, или есть какая-то внятная и обоснованная причина?

Если требуется ввод кириллицы например, то её надо подгружать из внешнего файла с локализацией.

Чтобы что?

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

То что вы изначально написали имеет квадратичную сложность.

O(1) там, циклов нет.

я попросил бы найти максимум их 4х элементов, потом из пяти,

Тогда надо уже брать цикл и если числа надо сохранять, то массив. Циклы — тема 7, массивы — тема 8.

Можно сделать за один проход (хранить только текущее и максимум) или за два (вначале записать в массив, потом пройтись за максимумом), Будет O(n).

Это задание к теме 5, поэтому я сделал с использованием только того, что описано в темах 1-5.

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

А если у меня нет консоли.

И в системе совсем нет ASCII, а есть какой-нибудь EBCDIC или вообще платформозависимый набор символов в проприетарной кодировке?

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

Так ты заводишь лишнуюю переменную. Я хотел обойтись без этого.

Господи, ну и трешанина.

Я писал, чтобы было понятно школьнику, прочитавшему 89 страниц.

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

Потому что столяров так сказал, или есть какая-то внятная и обоснованная причина?

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

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

А если у меня нет консоли.

А куда ты тогда будешь {read,write}{,ln} делать?

И в системе совсем нет ASCII, а есть какой-нибудь EBCDIC или вообще платформозависимый набор символов в проприетарной кодировке?

Тогда готовь колоду перфокарт.

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

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

Чтобы что? С переменной код выглядит чище читаемее, в нем меньше условий и он воспринимается с одного взгляда.

Будет обоснование чем это плохо?

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

Ответ был двумя сообщениями выше над твоим

Просто используй юникод.

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

O(1) там, циклов нет.

Это не O(1). У тебя количество условий растет нелинейно от количества переменных.

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

куда ты тогда будешь {read,write}{,ln} делать?

В файлы input и output с паскалевским типом text

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

Это не O(1). У тебя количество условий растет нелинейно от количества переменных.

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

if a<b then a:=b;
if c<d then c:=d;
if a>c then
  writeln(a)
else
  writeln(c)

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

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

Тут на( трёх числах) даже переменная не нужна,

Достаточно того что abs стандартная функция в подвале, т.е для решения задания 5.5 достаточно min выразить через школьную арифметику и подставить в выражение от трёх входов

Проблема современного образования программистов их качать предполагая что они не знают арифметики - очень гумманитарно

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

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

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

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

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

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

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

Код исполняется ограниченное время при любых начальных данных. А переменных там всегда три.

Тебе говорят не об этом, а о том, что при увеличении количества переменных твой подход будет не O(1).

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

а в книге до этого есть пример, как получить максимум из 2 чисел?

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

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

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

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

Тебе говорят не об этом, а о том, что при увеличении количества переменных твой подход будет не O(1).

Я это понял, но разве это делает плохим конкретно эту программу? Если бы задача стояла иначе, я бы написал иначе. Для трёх переменных мне нравится именно этот подход.

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

Для учащегося - сойдет, но требует дообучения, чтобы он больше так не писал.

Для реального применения - нет, потому что этот кусок кода банальном перегружен. Ты ухитрился наваять говнокод даже в такой тривиальной задаче, выполняя ее от своего лица, а не от лица студента. Как видно, понимание побочных эффектов по столярову вообще никак не помогает научить человека программировать хорошо: оно дает только понимание побочных эффектов по столярову.

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

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

Для реального применения - нет, потому что этот кусок кода банальном перегружен.

В общем вкусовщина. Ты думаешь, ты мне глаза открыл, когда показал свой вариант? Я вначале как раз у нейронки попросил по примеру школьника, она написала именно как ты, мне не понравилось и я переписал по-своему.

Только нейронка зачем-то ещё uses crt; и clrscr; впаяла в начало программы. Интересно, ты бы это тоже сделал, если бы писал на паскале и полностью?

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

В общем вкусовщина.

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

Я вначале как раз у нейронки попросил по примеру школьника, она написала именно как ты, мне не понравилось и я переписал по-своему.

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

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

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

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

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

const bool has_edid = (sw_g_video_state[port].valid || port == (SW_ALL_PORTS - 1));
const bool has_5v = sw_g_io_state[port].hdmi_5v_sens;
const bool has_usb = (sw_g_usb_has_updev && sw_g_usb_has_uplink);
const bool port_ready = (has_edid && has_5v && has_usb);
const bool go = (port_ready && (sw_g_io_hdmi_uplink_hpd || sw_g_quirk_ignore_hpd));
sw_io_hdmi_uplink_set_5v(port_ready);
sw_io_rd_set_awaken(go);
sw_io_hdmi_set_hpd(port, go);
liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от liksys

Просто используй юникод.

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

$ cat 02_04.txt
������ 2.4. ������ � ����� real
Program Optel;
var
   A,B,C: real;
begin
   A:=3.5;
   B:=7.6;
   C:=A+B;
   writeln('�����=',C)
end.
Xenius ★★★★★
() автор топика
Ответ на: комментарий от Xenius

Ты нормальный, скажи пожалуйста? Я тебе говорю про юникод - ты мне про однобайтовое барахло. Если бы примеры были в юникоде, никаких проблем бы не было.

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

Так ты заводишь лишнуюю переменную. Я хотел обойтись без этого.

Определи функцию `max(x, y)` тогда.

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

Если пример будет в юникоде, то там будут нулевые байты после каждой ASCII-буквы и ещё BOM в начале, не факт что компилятор это схавает.

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

Решается это вот так:

Нет, это решается иначе. Нужно писать через ветвление if then else, то есть будет вложенность ещё. Но суть не в этом. Книга - 320 страниц. Может быть страницы экономили и поэтому простых(элементарных) заданий мало, сразу даётся то, что ставит в ступор и начинает злить. Скорее всего причина в том, что это первое моё прикосновение к программированию, и из за этого затупы. Для меня, как новичка, или можно представить ШКОЛЬНИКА, это довольно тяжело, вот так вот составлять эти логические конструкции с ветвлением.

А где ты берёшь Claude

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

Неужели так сложно

Именно. Вот есть задание, надо выразить его в алгоритме. Правильно выстроить ветвление, правильно подобрать условия, выдержать последовательность. И если это какие то простые задания, то нормально. Но как только начинается что то глубокое, где нормально так логики, вот тогда и зависаешь. Хорошо бы помог в этом случае задачник, где ПОСТЕПЕННО, планомерно увеличивается сложность, что бы банально накопить опыт, нейронные связи, для решения таких вот задач без затупов(зависаний).

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

Нет, это решается иначе. Нужно писать через ветвление if then else, то есть будет вложенность ещё.

Никакая вложенность в данной задаче не требуется. Можно как я сделать, можно вот так:

program MaxOfThree;
var
  A, B, C, Max: Integer;

begin
  Write('Enter A: '); ReadLn(A);
  Write('Enter B: '); ReadLn(B);
  Write('Enter C: '); ReadLn(C);

  Max := A;
  if B > Max then
    Max := B;
  if C > Max then
    Max := C;
  WriteLn('Maximal number: ', Max);
end.

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

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

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

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

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

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

Ладно, я просто намекал, что юникод бывает не только UTF-8, но и UTF-16 и UTF-32, причём в разновидностях с BOM и без BOM и в Little Endian и Big Endian, и это ещё не считая UTF-7 и прочих.

Кстати в книге упоминается Turbo Pascal (в книге 2011 года издания), так что ещё была бы проблемка перекодировки между cp1251 (файлы архивов примеров) и cp866 (в TP под DOS/ntvdm).

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

Никакая вложенность в данной задаче не требуется

По книжке, это должно быть вот так:

program fuck;
var
	a,b,c:	integer;
begin
	write('Введите три числа: ');
	readln(a,b,c);
	if a > b then
		if a > c then
			writeln(a)
		else
			writeln(c)
	else
		if b > c then
			writeln(b)
		else
			writeln(c);
end.

Вчера это заняло у меня три часа, что бы именно ПОНЯТЬ, почему оно работает. При этом, мне пришлось использовать клода, что бы он буквально на пальцах, на метафорах объяснил, как это всё работает и почему оно работает. То есть без репетитора или клода - было бы невозможно понять. Если бы к этому заданию была бы подводка, было бы легче. Сейчас по памяти написал это за пару минут.

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

Нет никаких проблем распознать кодировку. А BOM не нужен сам по себе.

Кстати в книге упоминается Turbo Pascal

Проблемы мёртвых языков.

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

(пример кода)

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

По книжке, это должно быть вот так:

С чего бы? Кто сказал? Это же задание, его можно делать как угодно, если работает. Или в книге есть ответы?

Вчера это заняло у меня три часа, что бы именно ПОНЯТЬ, почему оно работает.

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

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

С чего бы? Кто сказал? Это же задание, его можно делать как угодно, если работает. Или в книге есть ответы?

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

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

Так у меня есть ветвления и в этой (1) и в этой (2) версии. Булевы функции там проходят, я посмотрел. Так что and тоже можно.

Просто они без ветки else, но в данном случае она и не требуется. Кстати тебе как по понятности, вариант 1 или 2 понятнее из этих двух?

А вообще я не понимаю претензий к книге, честно говоря. Это же 5 тема, более простые задания должны были быть в первых четырёх. Их ты решил?

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

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

При этом, мне пришлось использовать клода, что бы он буквально на пальцах, на метафорах объяснил, как это всё работает и почему оно работает.

Ну метафоры тут не нужны на самом деле:

program fuck;
var
	a,b,c:	integer;
begin
	write('Введите три числа: ');
	readln(a,b,c);
	if a > b then
		// Здесь a > b
		if a > c then
			// Здесь a > c
			// И a > b
			// Следовательно, a наибольшее из чисел
			writeln(a)
		else
			// Здесь неверно, что a > c
			// Поэтому a <= c
			// Но всё ещё a > b
			// Так как a больше b, а c равно или больше а, то
			// c это наибольшее из чисел
			writeln(c)
	else
		// Здесь a <= b
		if b > c then
			// Здесь a <= b и b > c
			// Следовательно, b наибольшее из чисел
			writeln(b)
		else
			// Здесь a <= b и b <= c
			// Следовательно, c наибольшее из чисел
			writeln(c);
end.

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

А вообще я не понимаю претензий к книге, честно говоря. Это же 5 глава, более простые задания должны были быть в первых четырёх главах. Их ты решил?

Тебе дали гаечные ключи и показали как ими пользоваться. И ты вроде бы понял, это рожковый, это накидной, это размеры ключей. Потом тебе сказали: «Иди сними кпп на вон той машине». Ты залез под машину и офигел. А как её снимать то?

Выше человек правильно заметил - знать синтаксис это одно. А уметь в декомпозицию задания - это другое. Если я просидел за заданием три часа, если пришлось использовать ии, значит что? Значит в книге экономили страницы и решили сразу дать вот такое задание, без подводки к нему. Вот и вся претензия. Возможно, у кого лучше работает голова в плане логики, решили бы его быстрее и с меньшим напряжением.

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

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

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

1.я(моя) согласен(сна)

2. Ту реально сложный вопрос экономии усилий и вообще какая телеология.

2.1... например использование цикла для сумы последовательности норм но когда арифметическая - есть жи формула ;( Али факториал для демы рекурсии при том что фун Аккермана она без сверх усилий( которые произвольную рекурсию переводят в обход в приоритетную ширину ;) т.е реальный стог сена на котором б орден оголодал мы дресируем трюкам? Али индоктринируем целостной картинкой мира?

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

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

Вчера это заняло у меня три часа, что бы именно ПОНЯТЬ, почему оно работает

«Как страшно жить!..» ©

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

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

Он считает, что разработка FreePascal не туда свернула, некоторые баги долго не чинятся и т.п, команда слабая по его мнению. Но это всё потенциальные проблемы, если серьёзные проекты делать, а для обучения и практических задач студента, что не так с FreePascal?

anonymous_incognito ★★★★★
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.