LINUX.ORG.RU

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

 , , ,

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

4

5

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

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

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

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

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

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

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

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

★★★★★

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

эээ очень забавное определение реальной ос :)

в целом 16 бит достаточно что-бы взорвать мозг какой либо вырвиглазной реализацией - в том числе оси - если вполную расчехлить все изыски Древних - в частности начиная с самомодифицирующего кода(данные всегда)

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

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

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

Потому что MINIX и книга написаны во второй половине 1980-х, когда ещё использовались 16-разрядные ЭВМ и простые системы для них, вроде RT-11.

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

Ты ведь в курсе, что и миникс, и курсы танненбаума постоянно обновляются, чтобы идти в ногу со временем? У «Современных ОС» сейчас уже пятое издание. В предыдущих он выкидывал инфу о неактуальных технологиях, и добавлял об актуальных. Обновлял курс по линуксу, по виндам и прочему.

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

Маловато адресного пространства для усложнений. Максимум, можно изобрести изощрённую систему оверлеев.

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

Ты просто не нырял в разгул(хуже назгула) кутежа тех(ещё до Кнута) лет когда и 4к октета памяти это рай

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

Всё еще понятна и обозреваема в рамках учебного курса.

liksys ★★★★
()

https://ibb.co/jF9Nvg3

Не знаю, как учит программированию Столяров, но я точно знаю, как НЕ НАДО этого делать. Книжка называется «Паскаль для ШКОЛЬНИКОВ», автор Ушаков. Ничего не предвещало беды и было нормально до первых заданий. А что в них не так? А ты сидишь как дибил и пялишься в задание, не понимая как его решить. Просто не можешь написать код, не можешь составить алгоритм. А почему? А потому, что все предыдущие объяснения автора, все примитивы, не дают тебе нужного опыта… Кроме того, автор для заданий использует такую дичь, от которой начинает болеть голова. Заканчивается это тем, что смотришь в книгу, нихера не понимаешь как надо сделать, психуешь от злости, задаёшь 1000 вопросов клоду, и уже отчаявшись просишь написать его код. Он пишет, ты смотришь и ахиреваешь. Ахиреваешь и спрашиваешь себя «А как я до этого всего мог додуматься?!» А никак.

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

Насколько я понял, синтаксис и востребованность языка на рынке, вообще значения не имеет. Надо уметь именно думать. Уметь составлять логику(алгоритм) и переводить в код.

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

я точно знаю

Это вряд ли... :))

Иначе бы не путал книжку из категории «ненаучно-непопулярная литературка» c учебником, и не ожидал бы чего-то серьёзного от откровенно «бульварного чтива»... :)

И без ии ты до его выполнения не додумаешься

«Интеллект» искусственный помогает там, где недостаёт интеллекта «природного»... :))

Надо уметь именно думать

Да, именно так!.. :)) А иначе «смотришь в книгу, нихера не понимаешь как надо сделать»...

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

Паскаль для ШКОЛЬНИКОВ

Хм, есть ещё Попов с тем же названием.

https://ibb.co/jF9Nvg3

А сразу дать текстом слабо́́? Возьми любой OCR и вставляй текстом. Ладно, сделал это за тебя, правда Алиса переформулировала, но и так понятно:

Задание 5.4. Ввести три числа A, B, C и определить максимальное из них. Требуется нарисовать блок-схему алгоритма и написать программу.

Для этого понадобится if ... then begin ... end else begin ... end; Хочешь сказать до этой задачи не было описано как пользоваться if?

Задание 5.5. Ввести четырехзначное целое число и определить, является ли оно палиндромом (например, числа 6666 и 3223). Для выделения разрядов числа используются операции div и mod.

Чуть сложнее. Но с div и mod разбираешь число на разряды, которые можно засунуть в массив [1..4] или переменные a b c d какие-нибудь, если массивы ещё не изучали. Дальше просто if и ещё понадобится знать and

Задание 5.6. Ввести три числа A, B, C. Если ни одно из чисел не равно нулю, то в переменную K записать среднее арифметическое трех чисел.

Опять же, просто if и and и одно выражение с присваиванием.

Задание 5.7. Ввести значение X и, используя график функции, определить значение Y. Требуется заполнить блок-схему алгоритма.

Вот это без сам графика не получится. Если график дан например в картинке и нужно её распознать в коде на паскале — это уже довольно интересное задание. Но мне кажется, там как-то попроще.

задаёшь 1000 вопросов клоду, и уже отчаявшись просишь написать его код

А где ты берёшь Claude? Есть бесплатно?

Он пишет, ты смотришь и ахиреваешь. Ахиреваешь и спрашиваешь себя «А как я до этого всего мог додуматься?!» А никак.

Неужели так сложно? Там должна получиться пара-тройка строчек. Сейчас попробую скормить эти задания Claude в duck.ai, там правда старый 4.5.

Но книга Столярова написана вроде несложно, попробуй, только вводную часть тоже прочитай. Я-то читал уже зная паскаль, не могу 100% оценить.

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

Я посмотрел книгу, там if и логика рассказывается до этого задания, судя по содержанию. Решается это вот так:

program max_abc;
var a, b, c: integer;
begin
	write('Enter A B C: ');
	readln(a, b, c);
	write('Maximum number: ');
	if (a >  b) and (a >  c) then writeln(a);
	if (b >= a) and (b >  c) then writeln(b);
	if (c >= a) and (c >= b) then writeln(c)
end.

В программах не должно быть не-ascii символов. Если требуется ввод кириллицы например, то её надо подгружать из внешнего файла с локализацией. Скажи мне пожалуйста, в чём тут сложность? Вроде же элементарно решается с логическим оператором and, if и операциями сравнения.

По стилю: насколько я помню, Столяров рекомендует выносить на отдельную строчку тело if, while и тд, даже если оно из одного оператора или пустое. Но в данном случае тут чёткая повторяющаяся структура и мне кажется, что она лучше читается на идущих подряд строках.

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 3)
Ответ на: комментарий от 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 ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)