Andrey Stolyarov

Андрей Викторович Столяров: сайт автора

ПРОГРАММИРОВАНИЕ: ВВЕДЕНИЕ В ПРОФЕССИЮ

краудфандинговый проект

Программирование: введение в профессию. Задачи и этюды

taskbook cover

Аннотация

Сборник задач, упражнений и программистских этюдов в поддержку учебника «Программирование: введение в профессию»; содержит 12 глав, соответствующих 12 частям учебника.

Публикация в бумажном варианте

Опубликован издательством МАКС Пресс в 2022 году. ISBN 978-5-317-06732-8. Мягкая обложка.

Электронная версия

Электронная версия, идентичная печатному изданию, доступна здесь: http://www.stolyarov.info/books/pdf/progintro_taskbook.pdf

Errata

Стр.ПоложениеСодержание, комментарий
911 строка снизунаписано «путь даже», должно быть «пусть даже»
1212 строка снизунаписано «восмеричной», должно быть «восьмеричной» (пропущен мягкий знак)
132 строка сверхув условии примера 1.38(c) должно было быть 7,23(259), а не 7,2(325), как сейчас
173 строка снизу«7» не тот шрифт
185 строка снизув примере 2.06(c) условие цикла должно было быть «i = 0»
1911,12 строки сверхудопущена ошибка в нумерации пунктов задачи 2.09: "второй" пункт (f) должен быть пунктом (g), и так далее до предпоследнего пункта, который должен быть пунктом (k), а не (j); в ответах к этой задаче (на стр. 149) пункты были перенумерованы правильно
2110 строка снизунаписано «семи строк», должно быть «шести строк»
215 строка снизунаписано «по 14 символов», должно быть «по 12 символов»
2212 строка сверхуточка вместо запятой после слова «так»
2917 строка сверхув условиях задачи 2.42 написано «Hympty Dumpty», должно быть, конечно, «Humpty Dumpty»
3112 строка сверхунаписано «обозначется», должно быть «обозначается»
33в таблицецифры набраны не тем шрифтом, по смыслу должен быть моноширинный
36пример 3.01 (c,e)константы «db9fe3h» и «c9h» нужно снабдить лидирующим нулём
3716 строка снизув тексте примера 3.06(l) второй строчкой должна быть команда not eax, а не neg eax, как там сейчас написано
3812, 20 строки сверху«10» не тот шрифт
417 строка сверху«EAX» не тот шрифт
416 строка снизу«CDECL» не тот шрифт
4212 строка снизу«1», «2» не тот шрифт
48пример 4.01 h)написано «17 / 15», предполагалось наоборот «15 / 17»
488 строка снизупропущена точка после «"Hello"»
526 строка снизунаписано «см. стр. 2.26», должно быть «см. стр. 25»
53-54задача 4.29стоит убрать "лишние" точки с запятой после пунктов
569 строка снизунаписано «содержать в ходе анализа слова», должно быть «содержать слова, полученные в ходе анализа»
564-5 строки снизуполя структуры сдвинуты на три пробела вместо четырёх
7620 строка снизу«FIFO» не тот шрифт
777 строка сверхунаписано «ввода-ввода», пропущена буква «ы»
7710 строка снизунаписано «texttt», это должна была быть команда, включающая моноширинный шрифт для слов unknown command
7916 строка сверхупропущены запятые при перечислении символов
8010 строка снизунаписано «в на», должно быть просто «на»
89-90задачи 10.01--10.03в первых фразах всех трёх задач «main» не тем шрифтом
90-91задачи 10.03, 10.05, 10.06открывающая фигурная скобка после заголовка main должна быть снесена на следующую строку
9112 строка сверхунаписано «целочисленнцю», должно быть «целочисленную»
92нижняя строканаписано «потребуется вам в», должно быть «потребуется только в»
945,6,16 сроки сверхудля единообразия стоит убрать скобки при именах методов Volume, Mass и ф-и main
9417 срока сверхуоткрывающая фигурная скобка после заголовка main должна быть снесена на следующую строку
94,95в текстах ф-и mainв форматной строке ф-и printf используется несуществующая директива %lf, должно быть просто %f
9918 строка сверхунаписано «неразличими», должно быть «неразличимы»
9921 строка сверху«13» не тот шрифт
101нижняя строканаписано «#f», надо для единообразия «#F»
10211 строка сверхунаписано «стр. 2.19», должно быть «стр.22» (не та команда)
10713 строка сверхунаписано «Join1», должно быть «Twist»; там же: лишняя закрывающая круглая скобка
1077 строка снизунаписано «стр. 2.19», должно быть «стр.22» (не та команда, copy-paste must die)
1272 строка сверху«extern» набрано не тем шрифтом
127во фрагменте кодадве пустые строки многовато
127указания к задачам 5.12 и 5.14 указания к задачам 5.12 и 5.14 перепутаны местами
1272 строка снизунаписано «т.;е.», должно быть «т.е.»
1367 строка сверхудопущен выход за полосу, надо убрать один из cat'ов в примере
13715 строка снизунаписано «'b'», должно быть «'\b'»
13918 строка сверхунаписано «дескриптор 1», должно быть 0
1396 строка снизу«FIFO» не тот шрифт
1402 строка сверхудана рекомендация сначала открывать тот конец канала, который на запись; в действительности в рассматриваемой ситуации так делать не просто нежелательно, а вообще нельзя
1406 строка сверхунаписано «дескриптор 1», должно быть 0
14014 строка снизулишний дефис после тире
14621 строка сверхудля однозначности смысла следует поменять «запускать, при этом» на «запускать;» (с точкой с запятой)
14717-18 строки снизуперепутаны местами ответы к задачам 1.23 и 1.24
148верхняя строкав ответе к примеру 1.38(b) написано 183/55, должно быть 194/55
1482 строка сверхуверный ответ к примеру 1.38(с) в том виде, в котором он напечатан — 72253/9990, а не то, что написано, но в действительности это опечатка в условии примера, там должно было быть 7,23(259)
14816 строка сверхув ответе к примеру 1.44(j) между "не x" и "не у" должен быть сокращённый пробел, чтобы знаки отрицания не сливались
14817-18 строки снизуответы к примерам 1.52 (b), (c) и (d) даны неверные, должно быть для (b): log_2 (27/19), для (c): 3 + 3 log_2(3), для (d): 2 log_2 (3) - 1
1487-8 строки снизуответ к примеру 2.06(c) в том виде, в котором пример напечатан, должен быть «одна строка "abrakadabra"», но на самом деле это ошибка в условии примера
149таблицаДля комбинаций 0001 и 0011 примеры даны верно, но словесное описание ошибочно, см. коммент
14912 строка снизуВ ответе к задаче 2.39 написано p^.x, должно быть p^.t^
1498 строка снизуВ ответе к примеру 3.02, f) должно быть 7b, а не 79.
1504 строка сверхув ответе к задаче 3.05 написано о невозможности получить одновременно установленными ZF и CF, имелись в виду, конечно, ZF и SF (ZF и CF получаются тривиально)
15011-16 строки снизу"ответ" к задаче 4.07 не имеет никакого отношения к делу; это будет исправлено в электронном переиздании задачника
15314 строка снизуНаписано «три», должно быть «Три»

From danone (unverified) Tue Sep 10 15:11:35 2024 UTC pencil

Подпрограммы в ассемблере до стека

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

parent From Andrey V. Stolyarov profile Tue Sep 10 16:18:00 2024 UTC pencil

userpic

Re: Подпрограммы в ассемблере до стека

Условие задачи 3.20 содержит исчерпывающие указания на то, что конкретно там "предполагается"; нет, никаких подпрограмм там не ожидается, преобразовывать эти фрагменты кода в обособленные подпрограммы предлагается позже в задаче 3.24.

Отмечу ещё два момента, хотя напрямую к ответу на вопрос они не относятся:

  1. стек при работе с подпрограммами удобен, но совершенно никоим образом не обязателен; больше того, если заведомо не предполагать повторновходимости и рекурсии, стек окажется не нужен — от него только лишние усложнения;
  2. вообще-то я консультирую только в рамках менторинга.

From Дмитрий (unverified) Fri Aug 9 11:50:58 2024 UTC pencil

Задача 2.30

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

parent From Andrey V. Stolyarov profile Fri Aug 9 12:02:25 2024 UTC pencil

userpic

Re: Задача 2.30

Я, когда задачу придумывап, предполагал, что с обеих сторон будет изменение синхронно, но тут дело в чём — если вы сделаете с одной стороны, задача по своим характеристикам практически не проиграет, в том смысле что "накатка" навыков будет такая же.

From asb (unverified) Mon Jul 29 14:34:21 2024 UTC pencil

ответ к задаче 4.07

Добрый день.

стр. 150. В ответе на задачу 4.07 попало решение из предыдущей задачи.

parent From Andrey V. Stolyarov profile Mon Jul 29 18:29:50 2024 UTC pencil

userpic

Re: ответ к задаче 4.07

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

Спасибо.

From Vladimir (unverified) Fri May 17 10:44:25 2024 UTC pencil

2.42

Здравствуйте. В задачнике, на странице 29 (задание 2.42) опечатка в слове "Hympty".

parent From Andrey V. Stolyarov profile Tue Jul 30 19:27:46 2024 UTC pencil

userpic

Re: 2.42

Вы абсолютно правы, спасибо.

From Леонид (unverified) Mon May 13 19:10:13 2024 UTC pencil

1.16 (решение, стр. 147), 3.01 (указание, стр. 120)

1. Ответ к задаче 1.16 (стр. 147, 20 строка снизу). Чтоб были заметны изменения, пишу их словами.

4 + ((4*3)/2 + 4) + (4*3*2/6 + 4*3/два + 4) = двадцать восемь

В пояснении к задаче (стр. 116, 17 строка сверху) говорится: «…так мы изначально игнорируем порядок…». Как раз поэтому и надо «доделить» на два.

2. Указание к задаче 3.01 (стр. 120, 19 строка снизу).

«…констант в разных системах счисления (см. 3.2.1)». Надо «см. 1.3.2».

Очень надеюсь, что сам ничего не напутал.

P.S. Спасибо (за эту роскошь, за щедрость)!

parent From Andrey V. Stolyarov profile Mon Jul 29 10:48:25 2024 UTC pencil

userpic

Re: 1.16 (решение, стр. 147), 3.01 (указание, стр. 120)

> 4*3/два

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

> ...констант в разных системах счисления (см. 3.2.1)». Надо «см. 1.3.2».

Правила записи констант в разных системах счисления для ассемблера NASM рассмотрены именно в параграфе 3.2.1 (целиком он посвящён директивам резервирования памяти, но там есть и про это).

From Vasily (unverified) Fri Feb 9 19:29:01 2024 UTC pencil

Задача 2.52

Здравствуйте, Андрей Викторович!

В задаче написано, что недопустимо использовать тип string. Как без этого типа получать имена файлов через аргументы командной строки?

parent From Andrey V. Stolyarov profile Thu Feb 15 13:47:49 2024 UTC pencil

userpic

Re: Задача 2.52

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

From Nikita (unverified) Sat Jan 27 22:01:49 2024 UTC pencil

задача 10.07

Здравствуйте, Андрей Викторович! В задаче 10.07, возможно, требуется обернуть подключение stdio.h в extern C?

parent From Andrey V. Stolyarov profile Sat Jan 27 23:20:03 2024 UTC pencil

userpic

Re: задача 10.07

Нет, не требуется — ни здесь, ни где-либо ещё.

From ilya (unverified) Sun Jan 7 14:47:27 2024 UTC pencil

Задача 3.01 (стр. 36)

Здравствуйте, Андрей Викторович. Проходя задание обнаружил две ошибки:

1. В пункте C: к константе db9fe3h следует добавить ноль в начало. 2. В пункте E: такая же ошибка в константе c9h.

parent From Andrey V. Stolyarov profile Sun Jan 7 15:11:31 2024 UTC pencil

userpic

Re: Задача 3.01 (стр. 36)

Про пункт (c) ошибка была уже давно в списке, но, как ни странно, никто при этом не заметил пункт (e). Спасибо!

From Anonymous (unverified) Sun Dec 17 13:37:22 2023 UTC pencil

Задача. 1.15.

Все верно простите

From Anonymous (unverified) Sun Dec 17 12:11:06 2023 UTC pencil

Задача. 1.15.

Почему ответ 15, а не 64, у нас же 4 шарика, а не 3. Она же ничем не отличается от задачи с башнями из примера в книге.

parent From Andrey V. Stolyarov profile Sun Dec 17 13:02:53 2023 UTC pencil

userpic

Re: Задача. 1.15.

Ответ для этой задачи дан верный, т.е. да, именно 15. Дальше сами, я индивидуальных консультаций не провожу.

From Alejandro profile Sat Nov 4 10:10:30 2023 UTC pencil

Опечатка

с. 52, 6 строка снизу — "см. стр. 2.26"

parent From Andrey V. Stolyarov profile Sun Aug 4 19:53:34 2024 UTC pencil

userpic

Re: Опечатка

Факт, спасибо

From Anonymous (unverified) Fri Nov 3 14:08:38 2023 UTC pencil

Опечатка в задаче 2.42

Здравствуйте! Нашел опечатку в задаче 2.42 на стр. 29. На ввод программы подается "Hympty Dumpty sat on a wall", а на выходе получается "wall a on sat Dumpty Humpty". По смыслу задачи, кажется, после обработки строки должно быть Dumpty Hympty, либо просто произошла опечатка, т.к. Шалтай-Болтай переводится на английский как Humpty Dumpty. Если вдруг где-то уже вносили эту опечатку, прошу прощения за повтор, не нашел ее в этой или других ветках.

parent From Andrey V. Stolyarov profile Tue Jul 30 19:26:36 2024 UTC pencil

userpic

Re: Опечатка в задаче 2.42

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

From Denis (unverified) Tue Aug 22 13:37:22 2023 UTC pencil

Опечатка с. 152, задача 4.01, пункт h.

Ответ 0, должно быть 1.

parent From Andrey V. Stolyarov profile Sun Aug 4 19:43:29 2024 UTC pencil

userpic

Re: Опечатка с. 152, задача 4.01, пункт h.

Вы правы, но это опечатка в условиях, см. в эррате комментарий к стр. 48

From A. (unverified) Thu Aug 10 11:22:49 2023 UTC pencil

Ошибка в таблице с перечнем ошибок :) и опечаток (Errata) ответ к 1.38 с)

Правильный ответ к 7.23(259) = 180634/24975 = 7+5809/24975

P.S. 72253/9990 = 7.23(253)

parent From Andrey V. Stolyarov profile Wed Jul 31 16:06:12 2024 UTC pencil

userpic

Re: Ошибка в таблице с перечнем ошибок :) и опечаток (Errata) ответ к 1.38 с)

> 5809/24975

тут числитель и знаменатель делятся на 37, после сокращения получится 157/675; если целую часть внести в числитель, будет ровно то, что в ответе — 4882/675.

К чему постскриптум, я не совсем понял.

From Anonymous (unverified) Fri Jul 21 03:06:39 2023 UTC pencil

Змейка.

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

parent From admin profile Fri Jul 21 11:28:45 2023 UTC pencil

userpic

Re: Змейка.

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

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

parent From Anonymous (unverified) Fri Jul 21 15:43:13 2023 UTC pencil

Re: Re: Змейка, точнее дело не совсем в ней.

"в части про Паскаль принципиально не рассматриваются динамические массивы" Про задачник я узнал уже во время чтения части про Си. В части про Паскаль полноэкранные программы меня не так сильно зацепили, а вот про ncurses я слышал когда ещё не знал что значит библиотека в программировании, но использовал программы и игры сделанные с её помощью. Само название закрепилось в памяти, как и факт того что на этом сделаны разные крутые штуки. Было приятно научиться использовать его самому, это сразу почувствовалось как протянутая нить между тем чем я раньше только пользовался и тем что я могу сделать сам. Это как ничто другое вдохновляет учиться. "Змейка ведь по сути очередь, так что там надо элементы добавлять с одной стороны, а убирать с другой" В самой простой реализации это логичнее и проще всего, но я задумался несколько наперёд: при таком раскладе каждый элемент списка являет собой не определённый кусочек тела змейки существующий всю её игровую жизнь, а, в самом деле, некую независимую позицию в очереди: он должен в один момент появиться и, когда придёт его очередь, исчезнуть. Концептуально это похоже не на ползущую змею, а на путеукладчик, убирающий секцию рельс позади себя и кладущий новую перед собой. Когда это может быть важно? Допустим, будут введены правила игры по которым каждый сегмент тела змейки будет важен как отдельно взятая вещь. Например, игра будет окончена не сразу при попытке "съесть" себя, а, допустим, после двух укусов в одно и то же место — у каждого элемента будет своё "здоровье". Не лучше ли в таком случае реализовать змейку как стек, а не список? Я об этом задумался, откровенно говоря, не из-за какой-то змейки, а потому что стал часто спотыкаться при проектировании своих программ на вопросе как мне реализовать ту или иную вещь, не зная что мне в будущем может от неё понадобиться. В книге было сказано про об "агностической" реализации (возможно именно такого слова там не было, но я его точно слышал где-то ещё в подобном контексте), но она возможна не всегда, как я понимаю (хотя вполне возможно что просто НЕ понимаю). Стоит не бояться сделать так как лучше для решения минимальной задачи и в случае чего потом переделать, или лучше сразу думать наперёд? Просто боюсь что с увеличением размера программ количество таких тупняков возрастёт нелинейно.

parent From admin profile Fri Jul 21 15:56:12 2023 UTC pencil

userpic

Re: Змейка, точнее дело не совсем в ней.

Всё более-менее понятно. Вся эта ваша ересь про "я задумался несколько наперёд" не имеет никакого отношения к реальности, но дело даже не в этом. Всё окончательно становится ясно вот на этом:

как стек, а не список?

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

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

parent From Anonymous (unverified) Wed Jul 24 23:18:30 2024 UTC pencil

Re: Re: Змейка.

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

Вначале создаётся статический массив размером например 80*25=2000 элементов, или какой там размер поля и переменные, указывающие на начало и конец змеи, затем просто при каждом шаге змеи приращиваются или обе переменные, или только конечная, если змея что-то съела. Как только переменные доползут до конца массива, всё врапается на начало. Если конец змейки меньше начала — значит нужно дойдя конца массива, дорисовать кусок из начала, если конец больше - не нужно.

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

Хотя для Денди неприемлемо, там 2 килобайта RAM было всего на всё про всё.

parent From Andrey V. Stolyarov profile Thu Jul 25 00:24:40 2024 UTC pencil

userpic

Re: Змейка.

> или какой там размер поля

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

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

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

Про размер памяти Денди вы, видимо, что-то путаете. Даже на БК-0010 было 32КB памяти, в обычном режиме 16 пользовательских и 16 видеопамять, но был специальный режим, когда под видеопамять оставлялось всего 4 KB, остальное отдавалось пользовательской программе. При этом к тому времени, когда появилась Денди, БК-0010 была уже прошлым веком.

parent From Anonymous (unverified) Fri Jul 26 06:21:05 2024 UTC pencil

Re: Re: Змейка.

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

Ну сделать при запуске один вызов malloc, при завершении один вызов free. Хотя некоторые говорят, что при завершении всей программы можно память и не освобождать. Или да, выделить сразу 128 килобайт на максимальный теоретический размер поля 256x256, но это жирновато уже будет.

> При этом к тому времени, когда появилась Денди, БК-0010 была уже прошлым веком.

Famicom появился в 1983 году, а БК-0010 в 1985. Именно Денди как импортированный в Россию китайский ремейк конечно же появилась позже лет на 10, но сути это не меняет. В википедии тоже написано что 2 килобайта, так что я правильно запомнил.

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

parent From Andrey V. Stolyarov profile Fri Jul 26 09:09:04 2024 UTC pencil

userpic

Re: Re: Re: Змейка.

> Ну сделать при запуске один вызов malloc, при завершении один вызов free

Речь идёт о программе на том подмножестве Паскаля, которое рассматривается в книге. Там нет аналога malloc, и динамические массивы (которые во Free Pascal'е есть) в книге не рассматриваются, поскольку решаемая учебная задача — научиться работать с указателями, а придумать такие этюды, в которых массив не годится, а список годится, и при этом этюд доступен по сложности новичку — ну, я вот не могу такое придумать.

From Anonymous (unverified) Thu Jul 20 20:24:49 2023 UTC pencil

Задача 3.06 l)

В тексте задачи l) не хватает строчки "inc eax", без нее ответ должен быть 0

parent From Andrey V. Stolyarov profile Sun Aug 4 20:07:48 2024 UTC pencil

userpic

Re: Задача 3.06 l)

Всё проще, там должна была быть команда not, а не neg.

From Anonymous (unverified) Mon Jul 3 10:41:50 2023 UTC pencil

Опечатки

Страница 9, "путь даже небольшой" вместо "пусть".
Страница 12, "записанные в восмеричной системе" вместо "восьмеричной".

parent From Andrey V. Stolyarov profile Sun Aug 4 20:03:56 2024 UTC pencil

userpic

Re: Опечатки

Факт, спасибо

From Anonymous (unverified) Sun Jul 2 15:26:42 2023 UTC pencil

Странность в задаче

Страница 19, задача 2.09d. Не нашёл в книге объяснения, почему 0 в выражении "not 0" это обязательно целое со знаком, а не byte, например. Заранее прошу прощения, если плохо искал.

parent From admin profile Sun Jul 2 18:29:45 2023 UTC pencil

userpic

Re: Странность в задаче

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

From Osse (unverified) Sat Jun 17 20:21:49 2023 UTC pencil

Возможная ошибка

Доброго времени суток!
В задании 3.06, пункт l) - если я правильно понял, исходя из ответа, то вместо команды neg должна быть команда not. Ну либо ответ поменять на 0 нужно. Только учусь по вашим учебникам, если не прав, поправьте пожалуйста.

parent From Andrey V. Stolyarov profile Sun Aug 4 19:47:20 2024 UTC pencil

userpic

Re: Возможная ошибка

Да, вы абсолютно правы, neg с нулём ничего не сделает, там так и будет ноль. Спасибо.

From Anonymous (unverified) Fri May 26 18:40:07 2023 UTC pencil

Задача 2.26

Можете уточнить условие задачи. Звёздочка должна бегать по средней строке слева направо и наоборот; и в скобках "кроме крайней правой позиции" т.е если x равно screenWidht-1, то пора двигаться в обратном направление?

parent From admin profile Fri May 26 20:38:16 2023 UTC pencil

userpic

Re: Задача 2.26

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

Чему там будет равен этот ваш икс — думайте сами, в книге дано достаточно информации, чтобы это понять.

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

From Anonymous (unverified) Fri Apr 14 13:29:33 2023 UTC pencil

Почему %lf не существет? Существует!

> 94,95 в текстах ф-и main в форматной строке ф-и printf используется несуществующая директива %lf, должно быть просто %f

Начиная с C99 %lf для double, %f для float.
%lf придуман не из воздуха. Это от `long float` из K&R.

parent From admin profile Fri Apr 14 16:03:43 2023 UTC pencil

userpic

Тьфу

%lf существует только для scanf и его семейства, но никак не для printf. По одной, между прочим, весьма простой причине: в функцию технически невозможно передать значение типа float, точно так же, как и char, и short — эти последние автоматически превращаются в int, а float точно так же автоматически превращается в double.

А вот чего не существует, так это C99. Вообще, в принципе. Впрочем, это ничего не меняет — в спеках C99, как и более поздних, модификатор l к директиве f в printf'ах не применяется.

From Денис (unverified) Fri Mar 24 10:49:45 2023 UTC pencil

с.21, задача 2.17

Вместо 14 символов в строке должно 12? Всего ведь 96 символов должно быть в таблице

parent From admin profile Fri Mar 24 13:59:05 2023 UTC pencil

userpic

Да, вы правы

Совершенно верно; мало того, там ещё утверждается, что исходная программа печатает семь строк, когда на самом деле их шесть.

Спасибо!

From asb (unverified) Tue Mar 21 20:02:36 2023 UTC pencil

задача 2.39

Добрый день, задача 2.39, "С помощью каких выражений в этой процедуре можно обратиться к переменным m.a, m.b, n.a, n.b и x, если имена m, n и x в тексте процедуры недоступны?"
Если я ничего не напутал, часть ответа к задаче неверна, а именно - "p^.x" (стр. 149). По мимо того, что это запрещено условием задачи, такое выражение просто не скомпилируется(fpc 3.2.2), так как поля x у twoptrs нет.
Правильный ответ "p^.t^"

parent From admin profile Tue Mar 21 21:43:08 2023 UTC pencil

userpic

абсолютно верно

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

From fluorine (unverified) Fri Mar 10 20:02:07 2023 UTC pencil

Не подобрал тему

- стр 149, ответ к задаче 3.02, f)
= указано 79, должно быть 7b, биты правильные

parent From admin profile Sat Mar 11 12:08:37 2023 UTC pencil

userpic

Факт

Спасибо, внёс

From admin profile Fri Dec 23 14:23:00 2022 UTC pencil

userpic

стр.149, ответ задачи 3.04

Комбинация флагов 0001 (т.е. взведён только CF) в действительности получается не так, как указано в таблице: например, сумму 381 (так что в результате из-за потери старшего бита получится 125) можно получить как 255+126 или 254+127, и взведён будет действительно только CF, но можно и как 253+128, 252+129 и т.д., в этих случаях будут взведены CF и OF (поскольку, если эти числа рассматривать как знаковые, мы сложением двух отрицательных получаем положительное).

По-видимому, правильный "комментарий" для случая 0001 будет такой: <<сумма операнда от 128 до 255 с операндом от 1 до 127, "истинным" результатом которой является число, превосходящее 256>>.

А для комбинации 0011 (взведены CF и OF) правильный комментарий такой: <<сумма двух беззнаковых операндов, один из которых превосходит 128, а другой — не меньше, чем 128>>.

From Anonymous (unverified) Thu Feb 24 21:31:00 2022 UTC pencil

страница 19 задача 2.09

Здравствуйте! Там два варианта f?

parent From admin profile Thu Nov 3 10:51:09 2022 UTC pencil

userpic

Ага

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

From Anonymous (unverified) Thu Feb 17 15:29:00 2022 UTC pencil

Вопрос по задаче 2.22

Добрый день, Андрей Викторович!
В задаче 2.22, пункт b, под "не содержат повторяющихся букв" подразумевается "не содержат повторяющихся латинских букв, идущих друг за другом" или в любых позициях не должно быть повторяющихся латинских буквы? Оба варианта пишутся достаточно просто, но возможно в следующем издании этот момент стоит конкретизировать?

parent From admin profile Thu Feb 17 17:43:08 2022 UTC pencil

userpic

Извините, я не

Извините, я не вижу. что здесь нужно конкретизировать. В тексте задачи нет ни слова про "друг за другом", "рядом", "подряд" или ещё чего подобного.

parent From Anonymous (unverified) Thu Feb 17 21:20:00 2022 UTC pencil

Действительно,

Действительно, что-то меня понесло не туда :)

From Alejandro profile Thu Feb 17 04:23:00 2022 UTC pencil

errata

с. 139, задача 6.09, 2 строка и
с. 140, задача 6.11, предпоследняя строка — "дескриптор 1" вместо "дескриптор 0"
с. 140, 2 строка — предлагается первым открывать файл, предназначенный для записи, а не для чтения

parent From admin profile Thu Nov 3 10:55:00 2022 UTC pencil

userpic

ах ты ж :(

> "дескриптор 0"

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

Что касается файла, то в неблокирующем режиме лучше открывать именно тот канал, который на запись. Его ведь всё равно желательно перевести в non-blocking, ну то есть для чата это, конечно, не критично (объёмы не те), но если уж совсем правильно всё делать, то нужно.

From Ворон (unverified) Tue Feb 15 19:51:00 2022 UTC pencil

Опечатка

Стр. 153, ответ к 8.01:"три" написано с маленькой буквы, дожно быть с большой.

parent From admin profile Thu Nov 3 10:49:47 2022 UTC pencil

From prog_prog (unverified) Tue Feb 15 13:21:00 2022 UTC pencil

Ошибка

В задаче 2.09(стр. 19) написано два примера подряд под буквой f)

parent From admin profile Thu Nov 3 10:36:47 2022 UTC pencil

userpic

Да, факт

дрогнула рука при вставке примера в середину задачи

From prog_prog (unverified) Tue Feb 15 11:40:00 2022 UTC pencil

Ошибка

Ответ к примеру 2.06(C) дан неверно. Слово abrakadabra будет выведено один раз. Если в цикле было бы написано i

parent From admin profile Thu Nov 3 10:11:16 2022 UTC pencil

From fluorine profile Sat Feb 12 05:02:00 2022 UTC pencil

userpic

Кринжанул

Вышел задачник к учебнику А. В. Столярова
https://www.linux.org.ru/news/doc/16779232

Хотел ради прикола прочитать ветку, 8/10 комментов про копирование с книжек. Закрыл. Блин объясните этим людям, что DRM это (вредоносное) программное обеспечение, и что GPL тоже изменять нелязя, блин!

parent From admin profile Sat Feb 12 10:54:08 2022 UTC pencil

userpic

опять в интернете кто-то неправ

Бугага.

Там не на содержание надо смотреть, а на количество комментов. Фигак — и за первые сутки полтыщи. Знатно у людей полыхает.

From Alejandro (unverified) Sat Feb 12 04:21:00 2022 UTC pencil

104, задача 11.19, 4

104, задача 11.19, 4 строка — "вставления", лучше "подстановки" или что-то вроде этого
127, пример кода — лишний перевод строки
127, предпоследняя строка — "т.;е."
137, задача 5.34, 3 абзац, 5 строка — 'b' вместо '\b'
139, 6 строка снизу — "FIFO", шрифт
140, задача 6.13, 10 строка — "— -"

------------------------------

И ещё три момента :)

127 — почему в примере используется (void*)0 вместо NULL?

136 — вместо того, чтобы убирать один из cat'ов, не лучше ли сократить название файла (например, до prog.c); просто 2 cat'а без параметров подряд смотрятся симпотично :)

Задача 11.23 — на эту задачу, кстати, есть одна интересная вариация: поставить четырех ферзей на доску 8x8 так, чтобы небитыми остались только 2 поля, при этом поля, занятые ферзями, считаются битыми.

parent From admin profile Sat Feb 12 18:02:35 2022 UTC pencil

userpic

> 104, задача 11.19, 4

> 104, задача 11.19, 4 строка — "вставления",

формально не ошибка, так что поправил "прямо там"

Остальное да, факт. Спасибо.

> 127 — почему в примере используется (void*)0 вместо NULL?

а чёрт меня знает :-) почему-то написалось так. Вообще там ведь не про это пример.

> 136 — вместо того, чтобы убирать один из cat'ов

да нет, там имя файла много где, это надо внимательно смотреть, чтобы не разъехалось. Два cat'а рядом трогать не буду, уберу тот, что между следующими grep'ами :)

Про ферзей — интересно, раньше не попадалось.

From Bohdan K._ (unverified) Tue Feb 8 20:52:00 2022 UTC pencil

Страница 150, п.

Страница 150, п. 4.01, h) 0;
Ответ должен быть 1 , так как: 17 / 15 = 1.

parent From admin profile Wed Feb 9 14:01:02 2022 UTC pencil

userpic

Вы совершенно

Вы совершенно правы, но опечатка тут, как ни странно, в условии, а не в ответе :-)

From Alejandro (unverified) Tue Feb 8 16:31:00 2022 UTC pencil

17, 3 строка

17, 3 строка снизу - "7", шрифт
22 - вероятно, лишние "решетки" у кодов
38 - "символ с кодом 10", 10 шрифт (дважды)
41 - "всё тот же EAX", EAX, шрифт
Там же - CDECL, шрифт
42 - 1 и 2 (значения eax), шрифты
53, задача 4.28 - после пункта 'e' есть тоска с запятой, после других - нет
53-54 - лишние точки с запятой
56, 9 строка снизу - "содержать" вместо "получены"
56 - отступы для полей структуры
59 - "и печатает" лучше отодвинуть чуть дальше, а то можно подумать, что печать требуется lseek'ом делать
77 - "textttunknown command", судя по всему, пропущен слеш у команды \texttt
79 - "#, % ^ v" пропущено 2 запятые
89, 90 - main, шрифт (трижды)
90 - "Ваши классы" вместо "Ваш класс"
90 - main, скобки
94 - Volume и Mass, скобки
99 - название игры "13" набрано моноширинным вместо обычного
101, последняя задача - #f и #F, единообразие
103, 104 - шрифт у прототипов предикатов (скобок и запятых)
107 - Join1 вместо Twist

И на всякий случай
72 - "так и должно быть", возможно, должно быть "как" вместо "так"
78, 6.15, 7 строка - smtp набрано строчными буквами

P.S.: Боюсь, Вам всё же придётся завести отдельную страничку :D

parent From admin profile Wed Feb 9 11:51:00 2022 UTC pencil

userpic

Thanks!

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

> 22 - вероятно, лишние "решетки" у кодов

с чего бы? речь идёт о Паскале, там это обозначение символа с заданным кодом

> 53, задача 4.28

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

> 59 - "и печатает"

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

> 90 - "Ваши классы" вместо "Ваш класс"

чуть не купился. Между тем в задаче предполагается использование двух классов -- M и I.

> 103, 104 - шрифт у прототипов предикатов (скобок и запятых)

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

> 72 - "так и должно быть", возможно, должно быть "как" вместо "так"

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

> 78, 6.15, 7 строка - smtp набрано строчными буквами

в этом контексте (в составе слова "smtp-сервер") мне так больше нравится

Спасибо :-)

parent From Alejandro (unverified) Wed Feb 9 17:40:00 2022 UTC pencil

Ну да,

Ну да, накопительство — вещь не самая лучшая.

> просто в остальных пунктах они являются частью куска кода

Но ведь код и перечисления — это разные веши :)

> предполагается использование двух классов -- M и I

Чёрт, и куда я смотрел?!

> шрифт у прототипов предикатов

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

PS: если честно, мне уже интересно, сколько я с декабря успел простыней отправить :D

parent From admin profile Wed Feb 9 18:26:33 2022 UTC pencil

userpic

Сколько-сколько...

на странице эрраты ко второму изданию в очереди дожидаются своего часа девять комментов от вас и ещё десятка полтора от других участников

parent From Alejandro (unverified) Thu Feb 10 04:34:00 2022 UTC pencil

Совсем забыл

Задача 6.11 — "FIFO", шрифт

From Anonymous (unverified) Mon Feb 7 06:14:00 2022 UTC pencil

Почему при sub 1a

Почему при sub 1a 1c флаг overflow не выставляется в 1, хотя старший бит изменился?

parent From admin profile Mon Feb 7 10:49:31 2022 UTC pencil

userpic

Флаг OF -- это

Флаг OF -- это знаковое переполнение. Где вы тут видите переполнение, объясните хотя бы себе, а? Результат вполне представим знаковым целым данной разрядности (это разнесчастное минус-два, а в 8 бит лезет аж до минус-128), кто тут кого переполнил?

parent From Андрей (unverified) Mon Mar 11 16:54:25 2024 UTC pencil

Re: Флаг OF -- это

Почему тогда в варианте f, OF выставлен в единицу, когда 7c - 88 это f4 (-12 в десятичной)? Спасибо!

parent From Andrey V. Stolyarov profile Mon Mar 11 17:20:35 2024 UTC pencil

userpic

Re: Флаг OF -- это

7c — это 124, а 88 (шестнадцатеричное) — это -120, при вычитании получается (точнее, должно получиться) 244, что в знаковое восьмибитное уже не лезет. Вместо него получается вот именно что -12. Знаковое переполнение как оно есть.

Между прочим, я индивидуальные консультации провожу только в рамках менторинга, но здесь реально купился — заподозрил, что в задаче что-то не так. А вот нет, всё в задаче "так".

From Василий (unverified) Sun Feb 6 22:02:00 2022 UTC pencil

Опечатки

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

From Anonymous (unverified) Sun Feb 6 20:54:00 2022 UTC pencil

Задачник

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

parent From admin profile Tue Feb 8 13:51:13 2022 UTC pencil

userpic

Сейчас я

Сейчас я предлагаю задачник в качестве "плюшки" всем, кто жертвует от 600 рублей. Вроде на соответствующей странице это написано.

From Anonymous (unverified) Wed Jan 26 15:05:00 2022 UTC pencil

Стр 112

Не то, что бы прямо ошибка, но небольшая придирка. В англоязычных странах элементарные функции принято обозначать немного по-другому, например тангенс как tan, логарифм по основанию e как log, арксинус как sin^-1 и тд.

Если предполагается не использовать не-ASCII символов в коде и писать только по-английски, то что насчёт математических обозначений в тех местах, где они отличаются?

parent From admin profile Mon Feb 7 11:18:36 2022 UTC pencil

userpic

В англоязычных

В англоязычных странах элементарные функции принято обозначать

А ещё там первый абзац после заголовка не имеет отступа, а ещё там титульный лист, оглавление и предисловия не входят в общую нумерацию страниц, а ещё там тире пробелами не выделяют, а ещё там пунктуация совершенно другая, да и вообще язык там английский, а не русский. Так вот, как по-английски говорят, and so fucking what? Книга вроде пока ещё не на английском издана и не в англоязычной стране.

Если предполагается не использовать не-ASCII символов в коде

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

Вы вообще, гм... откуда такие идеи берёте, а? Отсыпьте мне такой травы.

parent From Anonymous (unverified) Tue Feb 8 04:27:00 2022 UTC pencil

> А ещё там

> А ещё там первый абзац...

Вы, пожалуйста обратите внимание на заголовок сообщения: Страница 112. Там речь идёт о программе-калькуляторе. Вы утверждете, что программа по умолчанию должна общаться с пользователем на английском языке, так? Значит и обозначения функций она должна использовать принятые в англоязычной литературе. Если бы речь была о другой странице, где задачи именно по чистой математике и обсуждается их решение — вопросов бы не было. Но там речь шла о том, какие строки должны использоваться при задании математического выражения на входе программы. О том, как оформлять основной текст книги никаких комментариев не было.

Это те же соглашения, как и точка vs запятая для разделения целой и дробной части числа. Как думаете, программа-калькулятор должна принимать десятичную точку, десятичную запятую, и то и другое или смотреть на настройки?

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

> Если те же ограничения попытаться распространить на текст книги

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

parent From admin profile Tue Feb 8 12:14:47 2022 UTC pencil

userpic

Ну вы бы сразу

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

parent From Anonymous (unverified) Tue Feb 8 17:12:00 2022 UTC pencil

Знаете, вот

Знаете, вот есть такой эффект: когда пишешь и говоришь что-то кому-то, то кажется, что всё понятно и однозначно. А потом перечитаешь своё сообщение — и нифига подобного.

parent From admin profile Tue Feb 8 17:20:00 2022 UTC pencil

userpic

Знаю, есть

Знаю, есть такой эффект. Сам неоднократно напарывался.

parent From Anonymous (unverified) Fri Feb 11 17:34:00 2022 UTC pencil

Это только на

Это только на калькуляторах так пишут. Арксинус нигде как sin^{-1} не обозначают, а только как arcsin. Так как sin^{-1} это прообраз функции sin, что совершенно другое. Так же и с логарифмом. Log скорее использую там, где основание не имеет значения.

parent From Anonymous (unverified) Sat Feb 12 05:13:00 2022 UTC pencil

Элементарные функции

Вот кстати да, если sin²x = (sin(x))^2, то по идее sin¯¹ должен означать косеканс.

И с логарифмами, ln вроде используют в англоязычной литературе тоже. А вот с что там с тангенсом? tan или tg?

В общем автору прежде чем исправлять что-то или не исправлять стоит куда-нибудь посмотреть, как в каких странах обозначают функции.

А почему на калькуляторах всё-таки ^-1? Экономия места, чтобы 6 букв не писать?

parent From Kakapo (unverified) Tue Feb 15 06:00:00 2022 UTC pencil

За

За калькуляторы не скажу, а вот в статьях/учебниках, библиотеках софта и прочих различных средах, где все эти математические функции присутствуют, этого страшного ^-1 не видел ни разу. Обратные тригонометрические функции: asin, acos, atan. Тангенс: tan, котангенс: сot. Натуральный логарифм через ln бывает, но редко и именно в текстах, такого чтобы подобное было в софте - не видел.

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

From Anonymous (unverified) Mon Jan 24 08:02:00 2022 UTC pencil

Задачник, ошибки

Стр 146
1.07b
По-моему ответ в ответах не полный. Я так понимаю, что если установлены и suid и sguid биты, то они будут действовать на всех, в том числе на группу и на владельца, разве нет?
Хотя тут скорее дело в неоднозначности формулировки.

1.08d
Какие-то сомнительные права. Может лучше взять бит t?

Стр 147
Ответы на задачи 1.23 и 1.24 не по порядку.

Стр 148
1.44j ваш ответ неверный
1.45d можно упростить до одной импликации
1.52b ваш ответ отрицательный 4-3log2 3 ≈ −0.755, т.е. неверный
1.52c преобразование логарифов неверное

За часть 2 пока не брался.

parent From admin profile Wed Feb 9 09:47:38 2022 UTC pencil

userpic

thanks

> 1.07b

тут, очевидно, дело в неоднозначности структуры предложения

> 1.08d

что значит "лучше", кому лучше, для чего лучше?! это совершенно другая задача

> 1.44j

не так чтоб ответ неверный, это дефект вёрстки -- "сросшиеся" верхние чёрточки

> 1.45d

я не сказал бы, что импликация вместо ДНФ -- это "упрощение". Скорее наоборот.

> 1.52

да, полный швах — видимо, меня что-то сильно отвлекло

From пользователем (не проверено) (не проверено) (unverified) Fri Jan 21 21:53:00 2022 UTC pencil

Методика

Интересно, а при решении задач разрешается пользоваться мануалами и поисковиками?

Например, я не помнил наизусть порядок suid, sgid и sticky битов в первой цифре восьмеричного кода chmod и потому пришлось посмотреть man chmod. А что делают suid/sgid биты на каталогах пришлось искать в интернете, так как при беглом просмотре man chmod я это не увидел.

В задачах на скрипты на bash, есть ли какие-то ограничения на внешние команды?

Например, если в скрипте на bash будет единственная команда с вызовом интерпретатора perl, python, awk, tclsh или sed с кодом, решающим задачу, это всё ещё считается скриптом на bash?

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

Но ведь существует множество ошибок, которые путём тестирования так запросто не обнаружить — например, те самые bash pitfalls. Некоторые скрипты будут правильно работать почти всегда, но если в каталоге окажется файл содержащий переводы строк, пробелы и/или дефисы в начале имени или пробелы в его конце и что-то подобное, может сломаться.

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

В 1.14 я всё сделал, кроме правильной проверки тождественности файла и заданного каталога. Надо применить что-то вроде [file normalize] из Tcl, но я не нашел аналог этой штуки в баше.

А без этого пользователь может выполнить команду вроде ./symlinker ././../$(basename $PWD)/./foo// и тогда foo, куда предполагается складывать симлинки, будет в текущем каталоге, но как это проверить хоть сколько-нибудь элегантно я не представляю, вызывать tclsh только ради команды file normalize как-то не очень.

parent From admin profile Sat Jan 22 00:42:42 2022 UTC pencil

userpic

Интересно, а

Интересно, а при решении задач разрешается пользоваться мануалами и поисковиками?

Что значит "разрешается"? Вам что, кто-то оценку ставит? Или выгоняет за списывание? Или что? Вообще какой-то гнилой подход.

Например, если в скрипте на bash будет единственная команда с вызовом интерпретатора perl, python, awk, tclsh или sed с кодом, решающим задачу, это всё ещё считается скриптом на bash?

Нет, не считается. Впрочем, если хотите — считайте, мне-то что? Хотя, конечно, крайне странно. Если вы не хотите знать Bourne Shell, нафига пытаться решать на него задачи? Времени свободного слишком много?

множество ошибок, которые путём тестирования так запросто не обнаружить

Welcome to the real world, Neo

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

Ну и что? Какое вообще это имеет отношение к задачам из задачника?

кроме правильной проверки тождественности файла и заданного каталога.

Это не требуется. Вообще. Нужно просто сначала запомнить имена файлов, а потом уже создавать директорию.

parent From кем-то (unverified) Sat Jan 22 06:34:00 2022 UTC pencil

realpath и readlink

> Что значит "разрешается"?

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

> Если вы не хотите знать Bourne Shell, нафига пытаться решать на него задачи?

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

Кстати в задачнике в задачнике ещё и не сказано, требуется ли стараться сделать решение портабельным для любых юникс-подобных ОС или достаточно, дабы оно работало на bash + gnu coreutils, а если не будет работать на чём-то вроде alpine linux с busybox — пофиг. Но, мне кажется, что не требуется, раз написано, что оно именно на bash, а не на sh.

> Какое вообще это имеет отношение к задачам из задачника?

Самое простое решение 1.11, которое мне приходит в голову, даст неверное количество собак, если в текущем каталоге содержатся файлы с переводами строк в имени.

> Нужно просто сначала запомнить имена файлов, а потом уже создавать директорию.

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

Видимо, надо записать в свою мысленную записную книжку: "Если что-то сложно сделать — подумай, как получить результат, если это не делать". Кстати, мне это правило и раньше помогало решать с виду трудные задачи, но в данном случае я про него забыл.

Хотя, как оказалось, можно применить команды readlink -f или realpath и оставить мой прежний подход к решению.

parent From admin profile Sat Jan 22 10:41:00 2022 UTC pencil

userpic

Про переводы

Про переводы строк внутри имён файлов — я не предполагал учитывать возможность этого. Впрочем, то решение, которое я предполагал для задачи 1.11, а равно и любое, какое приходит в голову, если решать на Shell'е, никак от этой возможности не страдает, ибо и команду ls, и сам sh писали всё-таки не идиоты.

А bash в задачнике не упоминается нигде. Напротив, везде говорится про Bourne Shell, это входной язык того самого /bin/sh (в линуксе он обычно синоним bash, но во FreeBSD — нет).


pencil

пояснение


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

Если вы искали сайт замечательного писателя-фантаста Андрея Михайловича Столярова, то вам, к сожалению, не сюда.

Андрей Михайлович Столяров в библиотеке Мошкова

Авторские права © Андрей Викт. Столяров, 2009 — 2024