Программирование: введение в профессию. Задачи и этюдыАннотацияСборник задач, упражнений и программистских этюдов в поддержку учебника «Программирование: введение в профессию»; содержит 12 глав, соответствующих 12 частям учебника. Публикация в бумажном вариантеОпубликован издательством МАКС Пресс в 2022 году. ISBN 978-5-317-06732-8. Мягкая обложка. Электронная версияЭлектронная версия, идентичная печатному изданию, доступна здесь: http://www.stolyarov.info/books/pdf/progintro_taskbook.pdf Errata
|
Программирование: введение в профессиюпояснениеВы находитесь на официальном сайте Андрея Викторовича Столярова, автора учебных пособий по программированию и информационным технологиям. Если вы искали сайт замечательного писателя-фантаста Андрея Михайловича Столярова, то вам, к сожалению, не сюда. Андрей Михайлович Столяров в библиотеке Мошкова |
☞ From danone (unverified) Tue Sep 10 15:11:35 2024 UTC
Подпрограммы в ассемблере до стека
Здравствуйте. Правильно ли я понимаю, что в задачах 3.20 и 3.21 предполагается, что читатель самостоятельно реализует некое подобие процедур чтения и печати десятичных чисел еще до знакомства со стеком и тем как их следует реализовывать?
ответить
From Andrey V. Stolyarov Tue Sep 10 16:18:00 2024 UTC
Re: Подпрограммы в ассемблере до стека
Условие задачи 3.20 содержит исчерпывающие указания на то, что конкретно там "предполагается"; нет, никаких подпрограмм там не ожидается, преобразовывать эти фрагменты кода в обособленные подпрограммы предлагается позже в задаче 3.24.
Отмечу ещё два момента, хотя напрямую к ответу на вопрос они не относятся:
ответить
☞ From Дмитрий (unverified) Fri Aug 9 11:50:58 2024 UTC
Задача 2.30
В задаче 2.30 предполагается увеличивать и уменьшать заполненную прямоугольную область звездочек сразу с двух сторон, т.е. например, по вертикали увеличивать и сверху, и снизу, или только в одном направлении?
ответить
From Andrey V. Stolyarov Fri Aug 9 12:02:25 2024 UTC
Re: Задача 2.30
Я, когда задачу придумывап, предполагал, что с обеих сторон будет изменение синхронно, но тут дело в чём — если вы сделаете с одной стороны, задача по своим характеристикам практически не проиграет, в том смысле что "накатка" навыков будет такая же.
ответить
☞ From asb (unverified) Mon Jul 29 14:34:21 2024 UTC
ответ к задаче 4.07
Добрый день.
стр. 150. В ответе на задачу 4.07 попало решение из предыдущей задачи.
ответить
From Andrey V. Stolyarov Mon Jul 29 18:29:50 2024 UTC
Re: ответ к задаче 4.07
Вы правы, ответ какой-то странный — похоже, я его вёрстку хотел позаимствовать из предыдущего ответа, но что-то меня отвлекло в процессе редактирования.
Спасибо.
ответить
☞ From Vladimir (unverified) Fri May 17 10:44:25 2024 UTC
2.42
Здравствуйте. В задачнике, на странице 29 (задание 2.42) опечатка в слове "Hympty".
ответить
From Andrey V. Stolyarov Tue Jul 30 19:27:46 2024 UTC
Re: 2.42
Вы абсолютно правы, спасибо.
ответить
☞ From Леонид (unverified) Mon May 13 19:10:13 2024 UTC
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. Спасибо (за эту роскошь, за щедрость)!
ответить
From Andrey V. Stolyarov Mon Jul 29 10:48:25 2024 UTC
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
Задача 2.52
Здравствуйте, Андрей Викторович!
В задаче написано, что недопустимо использовать тип
string
. Как без этого типа получать имена файлов через аргументы командной строки?ответить
From Andrey V. Stolyarov Thu Feb 15 13:47:49 2024 UTC
Re: Задача 2.52
Сформулировано не совсем корректно, согласен. В следующем издании, если когда-нибудь оно состоится, вставлю что-нибудь вроде "недопустимо для хранения данных, прочитанных из файлов, использовать тип string".
ответить
☞ From Nikita (unverified) Sat Jan 27 22:01:49 2024 UTC
задача 10.07
Здравствуйте, Андрей Викторович! В задаче 10.07, возможно, требуется обернуть подключение stdio.h в extern C?
ответить
From Andrey V. Stolyarov Sat Jan 27 23:20:03 2024 UTC
Re: задача 10.07
Нет, не требуется — ни здесь, ни где-либо ещё.
ответить
☞ From ilya (unverified) Sun Jan 7 14:47:27 2024 UTC
Задача 3.01 (стр. 36)
Здравствуйте, Андрей Викторович. Проходя задание обнаружил две ошибки:
1. В пункте C: к константе db9fe3h следует добавить ноль в начало. 2. В пункте E: такая же ошибка в константе c9h.
ответить
From Andrey V. Stolyarov Sun Jan 7 15:11:31 2024 UTC
Re: Задача 3.01 (стр. 36)
Про пункт (c) ошибка была уже давно в списке, но, как ни странно, никто при этом не заметил пункт (e). Спасибо!
ответить
☞ From Anonymous (unverified) Sun Dec 17 13:37:22 2023 UTC
Задача. 1.15.
Все верно простите
ответить
☞ From Anonymous (unverified) Sun Dec 17 12:11:06 2023 UTC
Задача. 1.15.
Почему ответ 15, а не 64, у нас же 4 шарика, а не 3. Она же ничем не отличается от задачи с башнями из примера в книге.
ответить
From Andrey V. Stolyarov Sun Dec 17 13:02:53 2023 UTC
Re: Задача. 1.15.
Ответ для этой задачи дан верный, т.е. да, именно 15. Дальше сами, я индивидуальных консультаций не провожу.
ответить
☞ From Alejandro Sat Nov 4 10:10:30 2023 UTC
Опечатка
с. 52, 6 строка снизу — "см. стр. 2.26"
ответить
From Andrey V. Stolyarov Sun Aug 4 19:53:34 2024 UTC
Re: Опечатка
Факт, спасибо
ответить
☞ From Anonymous (unverified) Fri Nov 3 14:08:38 2023 UTC
Опечатка в задаче 2.42
Здравствуйте! Нашел опечатку в задаче 2.42 на стр. 29. На ввод программы подается "Hympty Dumpty sat on a wall", а на выходе получается "wall a on sat Dumpty Humpty". По смыслу задачи, кажется, после обработки строки должно быть Dumpty Hympty, либо просто произошла опечатка, т.к. Шалтай-Болтай переводится на английский как Humpty Dumpty. Если вдруг где-то уже вносили эту опечатку, прошу прощения за повтор, не нашел ее в этой или других ветках.
ответить
From Andrey V. Stolyarov Tue Jul 30 19:26:36 2024 UTC
Re: Опечатка в задаче 2.42
Вы правы, спасибо. Конечно, это банальная опечатка. К сожалению, время, в которое нам довелось жить, довольно сумасшедшее, поэтому приходится реагировать на сообщения об опечатках с годовым лагом.
ответить
☞ From Denis (unverified) Tue Aug 22 13:37:22 2023 UTC
Опечатка с. 152, задача 4.01, пункт h.
Ответ 0, должно быть 1.
ответить
From Andrey V. Stolyarov Sun Aug 4 19:43:29 2024 UTC
Re: Опечатка с. 152, задача 4.01, пункт h.
Вы правы, но это опечатка в условиях, см. в эррате комментарий к стр. 48
ответить
☞ From A. (unverified) Thu Aug 10 11:22:49 2023 UTC
Ошибка в таблице с перечнем ошибок :) и опечаток (Errata) ответ к 1.38 с)
Правильный ответ к 7.23(259) = 180634/24975 = 7+5809/24975
P.S. 72253/9990 = 7.23(253)
ответить
From Andrey V. Stolyarov Wed Jul 31 16:06:12 2024 UTC
Re: Ошибка в таблице с перечнем ошибок :) и опечаток (Errata) ответ к 1.38 с)
> 5809/24975
тут числитель и знаменатель делятся на 37, после сокращения получится 157/675; если целую часть внести в числитель, будет ровно то, что в ответе — 4882/675.
К чему постскриптум, я не совсем понял.
ответить
☞ From Anonymous (unverified) Fri Jul 21 03:06:39 2023 UTC
Змейка.
Змейку захотелось реализовать самому сразу же после знакомства с полноэкранными программами, что я незамедлительно и сделал. Некоторое время спустя я дочитал до задачи где предлагалось змейку же и сделать, и там говорится что "для реализации обязательно потребуется односвязный список". Когда я писал свою змейку это кстати и было первое что мне пришло в голову, но показалось идеей получше сделать переменную с длиной змейки и массив координатных пар, увеличивающийся при достижении критической длины. В этом подходе есть что-то фундаментально неправильное?
ответить
From admin Fri Jul 21 11:28:45 2023 UTC
Re: Змейка.
Разумеется, есть: в книге в части про Паскаль принципиально не рассматриваются динамические массивы, и это отнюдь не случайность. Схватившись за них, вы с хорошей вероятностью отняли у самого себя возможность нормально освоить указатели, с чем вас и поздравляю.
Впрочем, дело не только в этом. Змейка ведь по сути очередь, так что там надо элементы добавлять с одной стороны, а убирать с другой. На массиве это делается исключительно копированием всего содержимого. Конечно, компьютеры нынче быстрые, а змейка не может быть настолько длинной, чтобы всё это копирование стало сколько-нибудь заметно подтормаживать, но зачем же опускаться на столь обезьяний уровень? Ну то есть можно, конечно, сделать полноценный кольцевой буфер, но это уже намного сложнее в реализации, чем список.
ответить
From Anonymous (unverified) Fri Jul 21 15:43:13 2023 UTC
Re: Re: Змейка, точнее дело не совсем в ней.
"в части про Паскаль принципиально не рассматриваются динамические массивы" Про задачник я узнал уже во время чтения части про Си. В части про Паскаль полноэкранные программы меня не так сильно зацепили, а вот про ncurses я слышал когда ещё не знал что значит библиотека в программировании, но использовал программы и игры сделанные с её помощью. Само название закрепилось в памяти, как и факт того что на этом сделаны разные крутые штуки. Было приятно научиться использовать его самому, это сразу почувствовалось как протянутая нить между тем чем я раньше только пользовался и тем что я могу сделать сам. Это как ничто другое вдохновляет учиться. "Змейка ведь по сути очередь, так что там надо элементы добавлять с одной стороны, а убирать с другой" В самой простой реализации это логичнее и проще всего, но я задумался несколько наперёд: при таком раскладе каждый элемент списка являет собой не определённый кусочек тела змейки существующий всю её игровую жизнь, а, в самом деле, некую независимую позицию в очереди: он должен в один момент появиться и, когда придёт его очередь, исчезнуть. Концептуально это похоже не на ползущую змею, а на путеукладчик, убирающий секцию рельс позади себя и кладущий новую перед собой. Когда это может быть важно? Допустим, будут введены правила игры по которым каждый сегмент тела змейки будет важен как отдельно взятая вещь. Например, игра будет окончена не сразу при попытке "съесть" себя, а, допустим, после двух укусов в одно и то же место — у каждого элемента будет своё "здоровье". Не лучше ли в таком случае реализовать змейку как стек, а не список? Я об этом задумался, откровенно говоря, не из-за какой-то змейки, а потому что стал часто спотыкаться при проектировании своих программ на вопросе как мне реализовать ту или иную вещь, не зная что мне в будущем может от неё понадобиться. В книге было сказано про об "агностической" реализации (возможно именно такого слова там не было, но я его точно слышал где-то ещё в подобном контексте), но она возможна не всегда, как я понимаю (хотя вполне возможно что просто НЕ понимаю). Стоит не бояться сделать так как лучше для решения минимальной задачи и в случае чего потом переделать, или лучше сразу думать наперёд? Просто боюсь что с увеличением размера программ количество таких тупняков возрастёт нелинейно.
ответить
From admin Fri Jul 21 15:56:12 2023 UTC
Re: Змейка, точнее дело не совсем в ней.
Всё более-менее понятно. Вся эта ваша ересь про "я задумался несколько наперёд" не имеет никакого отношения к реальности, но дело даже не в этом. Всё окончательно становится ясно вот на этом:
как стек, а не список?
Если бы вы не перепрыгнули часть о Паскале, то подобной ахинеи (противопоставления стека и списка, когда в действительности это слова из разных областей, принципиально друг друга не исключающие и вообще друг на друга не влияющие) здесь бы от вас не поступило.
Ну так вот, тут ровно два варианта: или вы возвращаетесь к части про Паскаль и работаете на Паскале до тех пор, пока у ваших программ не появялся сторонние пользователи (и до той поры даже не помышляете ни о каком Си), или вы выбрасываете мои книги. И уж во всяком случае можете даже не надеяться на то, что ваши комменты тут пройдут премод или я стану отвечать на какие бы то ни было ваши вопросы. Если вы лучше меня знаете, как надо учиться программировать — дело ваше, но я вам тогда не советчик и не помощник.
ответить
From Anonymous (unverified) Wed Jul 24 23:18:30 2024 UTC
Re: Re: Змейка.
Я не автор коммента, но ведь можно сделать и без копирования и без динамических массивов и даже без указателей:
Вначале создаётся статический массив размером например 80*25=2000 элементов, или какой там размер поля и переменные, указывающие на начало и конец змеи, затем просто при каждом шаге змеи приращиваются или обе переменные, или только конечная, если змея что-то съела. Как только переменные доползут до конца массива, всё врапается на начало. Если конец змейки меньше начала — значит нужно дойдя конца массива, дорисовать кусок из начала, если конец больше - не нужно.
Никакого лишнего копирования на каждом шаге, расход памяти вроде и большой, но 4 килобайта (две координаты по 8 бит) - это даже для восьмибитки приемлемо. В переменных начала и конца хранить можно хоть указатели, хоть индексы в массиве, и так и так должно работать.
Хотя для Денди неприемлемо, там 2 килобайта RAM было всего на всё про всё.
ответить
From Andrey V. Stolyarov Thu Jul 25 00:24:40 2024 UTC
Re: Змейка.
> или какой там размер поля
Вообще-то размер поля привязан к (начальному) размеру экрана, который можно узнать, только когда программу запустят на исполнение. Но это ладно, можно ограничить общую длину змейки каким-то "достаточно большим" числом, результат от этого практически не пострадает.
> Как только переменные доползут до конца массива, всё врапается на начало.
Это и есть кольцевой буфер, собственно говоря. И это сложнее в реализации, нежели честный список. Если не верите, попробуйте сами. Ну то есть понятно, что вообще-то и тот, и другой вариант тривиален для людей, умеющих программировать, но для новичков вариант со списком проще.
Про размер памяти Денди вы, видимо, что-то путаете. Даже на БК-0010 было 32КB памяти, в обычном режиме 16 пользовательских и 16 видеопамять, но был специальный режим, когда под видеопамять оставлялось всего 4 KB, остальное отдавалось пользовательской программе. При этом к тому времени, когда появилась Денди, БК-0010 была уже прошлым веком.
ответить
From Anonymous (unverified) Fri Jul 26 06:21:05 2024 UTC
Re: Re: Змейка.
> Вообще-то размер поля привязан к (начальному) размеру экрана, который можно узнать, только когда программу запустят на исполнение.
Ну сделать при запуске один вызов malloc, при завершении один вызов free. Хотя некоторые говорят, что при завершении всей программы можно память и не освобождать. Или да, выделить сразу 128 килобайт на максимальный теоретический размер поля 256x256, но это жирновато уже будет.
> При этом к тому времени, когда появилась Денди, БК-0010 была уже прошлым веком.
Famicom появился в 1983 году, а БК-0010 в 1985. Именно Денди как импортированный в Россию китайский ремейк конечно же появилась позже лет на 10, но сути это не меняет. В википедии тоже написано что 2 килобайта, так что я правильно запомнил.
Самое удивительное что в такой объём влезали вполне себе красочные и играбельные игры, про которые до сих пор помнят и играют. Хотя конечно более поздние игры содержали дополнительную оперативку распаяную внутри картриджа. По-моему кто-то извратился настолько что сделал картридж на основе Raspberry Pi и в итоге получился полноценный комп на линуксе для которого приставка была всего лишь прослойкой ввода-вывода.
ответить
From Andrey V. Stolyarov Fri Jul 26 09:09:04 2024 UTC
Re: Re: Re: Змейка.
> Ну сделать при запуске один вызов malloc, при завершении один вызов free
Речь идёт о программе на том подмножестве Паскаля, которое рассматривается в книге. Там нет аналога malloc, и динамические массивы (которые во Free Pascal'е есть) в книге не рассматриваются, поскольку решаемая учебная задача — научиться работать с указателями, а придумать такие этюды, в которых массив не годится, а список годится, и при этом этюд доступен по сложности новичку — ну, я вот не могу такое придумать.
ответить
☞ From Anonymous (unverified) Thu Jul 20 20:24:49 2023 UTC
Задача 3.06 l)
В тексте задачи l) не хватает строчки "inc eax", без нее ответ должен быть 0
ответить
From Andrey V. Stolyarov Sun Aug 4 20:07:48 2024 UTC
Re: Задача 3.06 l)
Всё проще, там должна была быть команда not, а не neg.
ответить
☞ From Anonymous (unverified) Mon Jul 3 10:41:50 2023 UTC
Опечатки
Страница 9, "путь даже небольшой" вместо "пусть".
Страница 12, "записанные в восмеричной системе" вместо "восьмеричной".
ответить
From Andrey V. Stolyarov Sun Aug 4 20:03:56 2024 UTC
Re: Опечатки
Факт, спасибо
ответить
☞ From Anonymous (unverified) Sun Jul 2 15:26:42 2023 UTC
Странность в задаче
Страница 19, задача 2.09d. Не нашёл в книге объяснения, почему 0 в выражении "not 0" это обязательно целое со знаком, а не byte, например. Заранее прошу прощения, если плохо искал.
ответить
From admin Sun Jul 2 18:29:45 2023 UTC
Re: Странность в задаче
Ну да, целое число по умолчанию считается
integer
, если тем или иным способом не указано иное, и это касается в том числе целочисленных литералов. Вполне возможно, что в тексте книги я это упустил.ответить
☞ From Osse (unverified) Sat Jun 17 20:21:49 2023 UTC
Возможная ошибка
Доброго времени суток!
В задании 3.06, пункт l) - если я правильно понял, исходя из ответа, то вместо команды neg должна быть команда not. Ну либо ответ поменять на 0 нужно. Только учусь по вашим учебникам, если не прав, поправьте пожалуйста.
ответить
From Andrey V. Stolyarov Sun Aug 4 19:47:20 2024 UTC
Re: Возможная ошибка
Да, вы абсолютно правы, neg с нулём ничего не сделает, там так и будет ноль. Спасибо.
ответить
☞ From Anonymous (unverified) Fri May 26 18:40:07 2023 UTC
Задача 2.26
Можете уточнить условие задачи. Звёздочка должна бегать по средней строке слева направо и наоборот; и в скобках "кроме крайней правой позиции" т.е если x равно screenWidht-1, то пора двигаться в обратном направление?
ответить
From admin Fri May 26 20:38:16 2023 UTC
Re: Задача 2.26
Честно говоря, не вполне понимаю, что тут конкретно нужно уточнять. Вот на экране есть некоторое количество знакомест по горизонтали. Нужно, чтобы звёздочка, двигаясь слева направо, дошла до предпоследнего знакоместа в строке, т.е. чтобы между ней и краем экрана осталось ещё одно знакоместо.
Чему там будет равен этот ваш икс — думайте сами, в книге дано достаточно информации, чтобы это понять.
Кстати, причина этой оговорки в скобках довольно проста: если вывести звёздочку в крайнюю правую позицию, можно нарваться на скроллинг.
ответить
☞ From Anonymous (unverified) Fri Apr 14 13:29:33 2023 UTC
Почему %lf не существет? Существует!
> 94,95 в текстах ф-и main в форматной строке ф-и printf используется несуществующая директива %lf, должно быть просто %f
Начиная с C99 %lf для double, %f для float.
%lf придуман не из воздуха. Это от `long float` из K&R.
ответить
From admin Fri Apr 14 16:03:43 2023 UTC
Тьфу
%lf существует только для scanf и его семейства, но никак не для printf. По одной, между прочим, весьма простой причине: в функцию технически невозможно передать значение типа float, точно так же, как и char, и short — эти последние автоматически превращаются в int, а float точно так же автоматически превращается в double.
А вот чего не существует, так это C99. Вообще, в принципе. Впрочем, это ничего не меняет — в спеках C99, как и более поздних, модификатор l к директиве f в printf'ах не применяется.
ответить
☞ From Денис (unverified) Fri Mar 24 10:49:45 2023 UTC
с.21, задача 2.17
Вместо 14 символов в строке должно 12? Всего ведь 96 символов должно быть в таблице
ответить
From admin Fri Mar 24 13:59:05 2023 UTC
Да, вы правы
Совершенно верно; мало того, там ещё утверждается, что исходная программа печатает семь строк, когда на самом деле их шесть.
Спасибо!
ответить
☞ From asb (unverified) Tue Mar 21 20:02:36 2023 UTC
задача 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^"
ответить
From admin Tue Mar 21 21:43:08 2023 UTC
абсолютно верно
Очень досадная опечатка, и вы её нашли первым, за что большое спасибо. Сейчас внесу в табличку.
ответить
☞ From fluorine (unverified) Fri Mar 10 20:02:07 2023 UTC
Не подобрал тему
- стр 149, ответ к задаче 3.02, f)
= указано 79, должно быть 7b, биты правильные
ответить
From admin Sat Mar 11 12:08:37 2023 UTC
Факт
Спасибо, внёс
ответить
☞ From admin Fri Dec 23 14:23:00 2022 UTC
стр.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
страница 19 задача 2.09
Здравствуйте! Там два варианта f?
ответить
From admin Thu Nov 3 10:51:09 2022 UTC
Ага
Да, дрогнула рука при вставке пункта в середину задачи. Ответы правильно перенумеровал, а тут вот, видимо, отвлёкся.
ответить
☞ From Anonymous (unverified) Thu Feb 17 15:29:00 2022 UTC
Вопрос по задаче 2.22
Добрый день, Андрей Викторович!
В задаче 2.22, пункт b, под "не содержат повторяющихся букв" подразумевается "не содержат повторяющихся латинских букв, идущих друг за другом" или в любых позициях не должно быть повторяющихся латинских буквы? Оба варианта пишутся достаточно просто, но возможно в следующем издании этот момент стоит конкретизировать?
ответить
From admin Thu Feb 17 17:43:08 2022 UTC
Извините, я не
Извините, я не вижу. что здесь нужно конкретизировать. В тексте задачи нет ни слова про "друг за другом", "рядом", "подряд" или ещё чего подобного.
ответить
From Anonymous (unverified) Thu Feb 17 21:20:00 2022 UTC
Действительно,
Действительно, что-то меня понесло не туда :)
ответить
☞ From Alejandro Thu Feb 17 04:23:00 2022 UTC
errata
с. 139, задача 6.09, 2 строка и
с. 140, задача 6.11, предпоследняя строка — "дескриптор 1" вместо "дескриптор 0"
с. 140, 2 строка — предлагается первым открывать файл, предназначенный для записи, а не для чтения
ответить
From admin Thu Nov 3 10:55:00 2022 UTC
ах ты ж :(
> "дескриптор 0"
даже интересно, под каким воздействием я пребывал, чтобы дважды допустить такой феерический косяк
Что касается файла, то в неблокирующем режиме лучше открывать именно тот канал, который на запись. Его ведь всё равно желательно перевести в non-blocking, ну то есть для чата это, конечно, не критично (объёмы не те), но если уж совсем правильно всё делать, то нужно.
ответить
☞ From Ворон (unverified) Tue Feb 15 19:51:00 2022 UTC
Опечатка
Стр. 153, ответ к 8.01:"три" написано с маленькой буквы, дожно быть с большой.
ответить
From admin Thu Nov 3 10:49:47 2022 UTC
Факт, спасибо!
.
ответить
☞ From prog_prog (unverified) Tue Feb 15 13:21:00 2022 UTC
Ошибка
В задаче 2.09(стр. 19) написано два примера подряд под буквой f)
ответить
From admin Thu Nov 3 10:36:47 2022 UTC
Да, факт
дрогнула рука при вставке примера в середину задачи
ответить
☞ From prog_prog (unverified) Tue Feb 15 11:40:00 2022 UTC
Ошибка
Ответ к примеру 2.06(C) дан неверно. Слово abrakadabra будет выведено один раз. Если в цикле было бы написано i
ответить
From admin Thu Nov 3 10:11:16 2022 UTC
Вы абсолютно правы
спасибо!
ответить
☞ From fluorine Sat Feb 12 05:02:00 2022 UTC
Кринжанул
Вышел задачник к учебнику А. В. Столярова
https://www.linux.org.ru/news/doc/16779232
Хотел ради прикола прочитать ветку, 8/10 комментов про копирование с книжек. Закрыл. Блин объясните этим людям, что DRM это (вредоносное) программное обеспечение, и что GPL тоже изменять нелязя, блин!
ответить
From admin Sat Feb 12 10:54:08 2022 UTC
опять в интернете кто-то неправ
Бугага.
Там не на содержание надо смотреть, а на количество комментов. Фигак — и за первые сутки полтыщи. Знатно у людей полыхает.
ответить
☞ From Alejandro (unverified) Sat Feb 12 04:21:00 2022 UTC
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 поля, при этом поля, занятые ферзями, считаются битыми.
ответить
From admin Sat Feb 12 18:02:35 2022 UTC
> 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
Страница 150, п.
Страница 150, п. 4.01, h) 0;
Ответ должен быть 1 , так как: 17 / 15 = 1.
ответить
From admin Wed Feb 9 14:01:02 2022 UTC
Вы совершенно
Вы совершенно правы, но опечатка тут, как ни странно, в условии, а не в ответе :-)
ответить
☞ From Alejandro (unverified) Tue Feb 8 16:31:00 2022 UTC
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
ответить
From admin Wed Feb 9 11:51:00 2022 UTC
Thanks!
Тяжело ваши простыни разгребать, честно говоря. Это же не на один час работы, а одним махом такое количество времени есть не всегда.
> 22 - вероятно, лишние "решетки" у кодов
с чего бы? речь идёт о Паскале, там это обозначение символа с заданным кодом
> 53, задача 4.28
"не грузи, да не грузим будешь" (tm)
везде там есть точки с запятой, просто в остальных пунктах они являются частью куска кода
> 59 - "и печатает"
это не ошибка, так что поправил прямо там, в таблицу не буду выносить
> 90 - "Ваши классы" вместо "Ваш класс"
чуть не купился. Между тем в задаче предполагается использование двух классов -- M и I.
> 103, 104 - шрифт у прототипов предикатов (скобок и запятых)
плюс и минус математические, остальное (в том числе скобки и запятые) моноширинное, в упор не вижу, где тут что-то не так
> 72 - "так и должно быть", возможно, должно быть "как" вместо "так"
Ну уж точно это не имелось в виду, там тогда придётся вместо двух отдельных предложений сделать одно сложноподчинённое, то есть это вообще совсем другое.
> 78, 6.15, 7 строка - smtp набрано строчными буквами
в этом контексте (в составе слова "smtp-сервер") мне так больше нравится
Спасибо :-)
ответить
From Alejandro (unverified) Wed Feb 9 17:40:00 2022 UTC
Ну да,
Ну да, накопительство — вещь не самая лучшая.
> просто в остальных пунктах они являются частью куска кода
Но ведь код и перечисления — это разные веши :)
> предполагается использование двух классов -- M и I
Чёрт, и куда я смотрел?!
> шрифт у прототипов предикатов
Посмотрел третий том и понял, что это уже моя память надо мной издевается.
PS: если честно, мне уже интересно, сколько я с декабря успел простыней отправить :D
ответить
From admin Wed Feb 9 18:26:33 2022 UTC
Сколько-сколько...
на странице эрраты ко второму изданию в очереди дожидаются своего часа девять комментов от вас и ещё десятка полтора от других участников
ответить
From Alejandro (unverified) Thu Feb 10 04:34:00 2022 UTC
Совсем забыл
Задача 6.11 — "FIFO", шрифт
ответить
☞ From Anonymous (unverified) Mon Feb 7 06:14:00 2022 UTC
Почему при sub 1a
Почему при sub 1a 1c флаг overflow не выставляется в 1, хотя старший бит изменился?
ответить
From admin Mon Feb 7 10:49:31 2022 UTC
Флаг OF -- это
Флаг OF -- это знаковое переполнение. Где вы тут видите переполнение, объясните хотя бы себе, а? Результат вполне представим знаковым целым данной разрядности (это разнесчастное минус-два, а в 8 бит лезет аж до минус-128), кто тут кого переполнил?
ответить
From Андрей (unverified) Mon Mar 11 16:54:25 2024 UTC
Re: Флаг OF -- это
Почему тогда в варианте f, OF выставлен в единицу, когда 7c - 88 это f4 (-12 в десятичной)? Спасибо!
ответить
From Andrey V. Stolyarov Mon Mar 11 17:20:35 2024 UTC
Re: Флаг OF -- это
7c — это 124, а 88 (шестнадцатеричное) — это -120, при вычитании получается (точнее, должно получиться) 244, что в знаковое восьмибитное уже не лезет. Вместо него получается вот именно что -12. Знаковое переполнение как оно есть.
Между прочим, я индивидуальные консультации провожу только в рамках менторинга, но здесь реально купился — заподозрил, что в задаче что-то не так. А вот нет, всё в задаче "так".
ответить
☞ From Василий (unverified) Sun Feb 6 22:02:00 2022 UTC
Опечатки
Добрый день, спасибо вам за труды!
Обнаружил две опечатки, а страницу с опечатками, посвящённую этой книге, не нашёл, поэтому оставлю их здесь.
Страница 91 целочисленнцю
Страница 99 неразличими
ответить
☞ From Anonymous (unverified) Sun Feb 6 20:54:00 2022 UTC
Задачник
Доброго времени. Какое минимальное пожертвование необходимо перевести, чтобы получить задачник?
ответить
From admin Tue Feb 8 13:51:13 2022 UTC
Сейчас я
Сейчас я предлагаю задачник в качестве "плюшки" всем, кто жертвует от 600 рублей. Вроде на соответствующей странице это написано.
ответить
☞ From Anonymous (unverified) Wed Jan 26 15:05:00 2022 UTC
Стр 112
Не то, что бы прямо ошибка, но небольшая придирка. В англоязычных странах элементарные функции принято обозначать немного по-другому, например тангенс как tan, логарифм по основанию e как log, арксинус как sin^-1 и тд.
Если предполагается не использовать не-ASCII символов в коде и писать только по-английски, то что насчёт математических обозначений в тех местах, где они отличаются?
ответить
From admin Mon Feb 7 11:18:36 2022 UTC
В англоязычных
В англоязычных странах элементарные функции принято обозначать
А ещё там первый абзац после заголовка не имеет отступа, а ещё там титульный лист, оглавление и предисловия не входят в общую нумерацию страниц, а ещё там тире пробелами не выделяют, а ещё там пунктуация совершенно другая, да и вообще язык там английский, а не русский. Так вот, как по-английски говорят, and so fucking what? Книга вроде пока ещё не на английском издана и не в англоязычной стране.
Если предполагается не использовать не-ASCII символов в коде
Есть целый ряд ограничений, которые совершенно очевидны в применении к программному коду, то есть к тексту на языке программирования. Если те же ограничения попытаться распространить на текст книги, то вообще-то эту книгу пришлось бы сначала на английский перевести, а потом уж издавать. И, кстати, печатать моноширинным шрифтом, нехай читатель глаза сломает (ненуачо, с программным кодом реально невозможно работать, если шрифт не моноширинный, давайте всё сделаем моноширинным).
Вы вообще, гм... откуда такие идеи берёте, а? Отсыпьте мне такой травы.
ответить
From Anonymous (unverified) Tue Feb 8 04:27:00 2022 UTC
> А ещё там
> А ещё там первый абзац...
Вы, пожалуйста обратите внимание на заголовок сообщения: Страница 112. Там речь идёт о программе-калькуляторе. Вы утверждете, что программа по умолчанию должна общаться с пользователем на английском языке, так? Значит и обозначения функций она должна использовать принятые в англоязычной литературе. Если бы речь была о другой странице, где задачи именно по чистой математике и обсуждается их решение — вопросов бы не было. Но там речь шла о том, какие строки должны использоваться при задании математического выражения на входе программы. О том, как оформлять основной текст книги никаких комментариев не было.
Это те же соглашения, как и точка vs запятая для разделения целой и дробной части числа. Как думаете, программа-калькулятор должна принимать десятичную точку, десятичную запятую, и то и другое или смотреть на настройки?
Нормально, если консольная программа-калькулятор, написанная русскоязычным программистом, общаться будет с пользователем на английском, но использовать соглашения из России (запятая для отделения дробной части, принятые в России обозначения элементарных функций)?
> Если те же ограничения попытаться распространить на текст книги
Речь шла об ограничениях и обозначениях не для текста книги, а для языка входных выражений для программы-калькулятора, который читателю предлагается написать.
ответить
From admin Tue Feb 8 12:14:47 2022 UTC
Ну вы бы сразу
Ну вы бы сразу сказали, к чему относится замечание, было бы проще. Да, пожалуй, на эту тему можно подумать.
ответить
From Anonymous (unverified) Tue Feb 8 17:12:00 2022 UTC
Знаете, вот
Знаете, вот есть такой эффект: когда пишешь и говоришь что-то кому-то, то кажется, что всё понятно и однозначно. А потом перечитаешь своё сообщение — и нифига подобного.
ответить
From admin Tue Feb 8 17:20:00 2022 UTC
Знаю, есть
Знаю, есть такой эффект. Сам неоднократно напарывался.
ответить
From Anonymous (unverified) Fri Feb 11 17:34:00 2022 UTC
Это только на
Это только на калькуляторах так пишут. Арксинус нигде как sin^{-1} не обозначают, а только как arcsin. Так как sin^{-1} это прообраз функции sin, что совершенно другое. Так же и с логарифмом. Log скорее использую там, где основание не имеет значения.
ответить
From Anonymous (unverified) Sat Feb 12 05:13:00 2022 UTC
Элементарные функции
Вот кстати да, если sin²x = (sin(x))^2, то по идее sin¯¹ должен означать косеканс.
И с логарифмами, ln вроде используют в англоязычной литературе тоже. А вот с что там с тангенсом? tan или tg?
В общем автору прежде чем исправлять что-то или не исправлять стоит куда-нибудь посмотреть, как в каких странах обозначают функции.
А почему на калькуляторах всё-таки ^-1? Экономия места, чтобы 6 букв не писать?
ответить
From Kakapo (unverified) Tue Feb 15 06:00:00 2022 UTC
За
За калькуляторы не скажу, а вот в статьях/учебниках, библиотеках софта и прочих различных средах, где все эти математические функции присутствуют, этого страшного ^-1 не видел ни разу. Обратные тригонометрические функции: asin, acos, atan. Тангенс: tan, котангенс: сot. Натуральный логарифм через ln бывает, но редко и именно в текстах, такого чтобы подобное было в софте - не видел.
На калькуляторах же скорее всего тупо есть место по вертикали, но по горизонтали - нет.
ответить
☞ From Anonymous (unverified) Mon Jan 24 08:02:00 2022 UTC
Задачник, ошибки
Стр 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 пока не брался.
ответить
From admin Wed Feb 9 09:47:38 2022 UTC
thanks
> 1.07b
тут, очевидно, дело в неоднозначности структуры предложения
> 1.08d
что значит "лучше", кому лучше, для чего лучше?! это совершенно другая задача
> 1.44j
не так чтоб ответ неверный, это дефект вёрстки -- "сросшиеся" верхние чёрточки
> 1.45d
я не сказал бы, что импликация вместо ДНФ -- это "упрощение". Скорее наоборот.
> 1.52
да, полный швах — видимо, меня что-то сильно отвлекло
ответить
☞ From пользователем (не проверено) (не проверено) (unverified) Fri Jan 21 21:53:00 2022 UTC
Методика
Интересно, а при решении задач разрешается пользоваться мануалами и поисковиками?
Например, я не помнил наизусть порядок 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
как-то не очень.ответить
From admin Sat Jan 22 00:42:42 2022 UTC
Интересно, а
Интересно, а при решении задач разрешается пользоваться мануалами и поисковиками?
Что значит "разрешается"? Вам что, кто-то оценку ставит? Или выгоняет за списывание? Или что? Вообще какой-то гнилой подход.
Например, если в скрипте на bash будет единственная команда с вызовом интерпретатора perl, python, awk, tclsh или sed с кодом, решающим задачу, это всё ещё считается скриптом на bash?
Нет, не считается. Впрочем, если хотите — считайте, мне-то что? Хотя, конечно, крайне странно. Если вы не хотите знать Bourne Shell, нафига пытаться решать на него задачи? Времени свободного слишком много?
множество ошибок, которые путём тестирования так запросто не обнаружить
Welcome to the real world, Neo
Не все ваши читатели догадаются, что файлы с переводом строк в имени вообще возможно создать.
Ну и что? Какое вообще это имеет отношение к задачам из задачника?
кроме правильной проверки тождественности файла и заданного каталога.
Это не требуется. Вообще. Нужно просто сначала запомнить имена файлов, а потом уже создавать директорию.
ответить
From кем-то (unverified) Sat Jan 22 06:34:00 2022 UTC
realpath и readlink
> Что значит "разрешается"?
Ну, неточная формулировка. Правильнее было использовать слово "предполагается".
> Если вы не хотите знать Bourne Shell, нафига пытаться решать на него задачи?
ОК, значит будем считать, что следует постараться вызывать как можно меньше внешних команд или как минимум минимизировать кол-во запускаемых процессов. Например в одной задаче у меня два варианта решения: в одном используется sed, а в другом всё сделано с помощью самого баша. Видимо, второй вариант лучше, хотя он немного длиннее.
Кстати в задачнике в задачнике ещё и не сказано, требуется ли стараться сделать решение портабельным для любых юникс-подобных ОС или достаточно, дабы оно работало на bash + gnu coreutils, а если не будет работать на чём-то вроде alpine linux с busybox — пофиг. Но, мне кажется, что не требуется, раз написано, что оно именно на bash, а не на sh.
> Какое вообще это имеет отношение к задачам из задачника?
Самое простое решение 1.11, которое мне приходит в голову, даст неверное количество собак, если в текущем каталоге содержатся файлы с переводами строк в имени.
> Нужно просто сначала запомнить имена файлов, а потом уже создавать директорию.
А вот это хитро. Без подсказки я бы даже не подумал, что так можно сделать.
Видимо, надо записать в свою мысленную записную книжку: "Если что-то сложно сделать — подумай, как получить результат, если это не делать". Кстати, мне это правило и раньше помогало решать с виду трудные задачи, но в данном случае я про него забыл.
Хотя, как оказалось, можно применить команды readlink -f или realpath и оставить мой прежний подход к решению.
ответить
From admin Sat Jan 22 10:41:00 2022 UTC
Про переводы
Про переводы строк внутри имён файлов — я не предполагал учитывать возможность этого. Впрочем, то решение, которое я предполагал для задачи 1.11, а равно и любое, какое приходит в голову, если решать на Shell'е, никак от этой возможности не страдает, ибо и команду ls, и сам sh писали всё-таки не идиоты.
А bash в задачнике не упоминается нигде. Напротив, везде говорится про Bourne Shell, это входной язык того самого /bin/sh (в линуксе он обычно синоним bash, но во FreeBSD — нет).
ответить