что такое wing 101

Исследование защиты Wing IDE

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

Доброго здравия! Не удивлюсь, что Вы раньше даже не слышали об этой программе. Как и я, до того дня, когда мне пригодился Python Debugger. Да, знаю, есть pdb, но его функционал и то, как он представлен, мне совершенно не приглянулось. После непродолжительных поисков я наткнулся на этот замечательный продукт. Тут есть все, что может пригодиться в отладке ваших Python приложений (скажу сразу: данный язык я не изучал, поэтому, если какие-то неточности всплывут, просьба не ругаться).

Предостережение: повторяя действия из статьи, вы действуете на свой страх и риск!

Итак, мы начинаем.

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

Первым делом, качаем программу (Wing IDE Professional v 5.1.4). Устанавливаем, осматриваем папку. Главный исполняемый файл находится по адресу ./bin/wing.exe. Запустим его. Ругается на отсутствие Python, поэтому установим и его. Нужен версии 2 (на данный момент это версия 2.7.9). Снова запускаем программу. На этот раз предлагает установить патчи, и перезапуститься. Так и сделаем.

Теперь вылезает окошко с запросом лицензии (т.к. у нас про-версия). Введем какую-нибудь ерунду:

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

Получаем следующий ответ:

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

Что забавно: программа нам сама говорит длину ключа (20, не учитывая дефисов), и символы, с которых он должен начинаться. В принципе, с этого уже можно и начать исследовать защиту — найдем эту строчку в файлах программы.
Дальше — интереснее. Результат поиска нашелся в файле ./bin/2.7/src.zip!

Да-да. Все действительно так: программа идет с исходниками. В них-то нам и придется копаться.

Этап два: роемся в исходниках

Включим в Total Commander поиск по архивам, и найдем ту строку снова. Строка лежит в файле: ./bin/2.7/src.zip/process/wingctl.pyo. PYO-файлы представляют из себя бинарники с «оптимизированным» байт-кодом Python.

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

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

Дожидаемся окончания процесса, и идем осматривать что получилось. А получились на выходе декомпилированные файлы с окончанием _dis. Их мы переименуем в .py. Все бы хорошо, но, выясняется, что имеются также файлы с окончанием _dis_failed, что говорит о том, что эти файлы декомпилятор не осилил. К счастью, файл только один: edit/editor.pyo_dis_failed

Попробуем на него натравить Decompyle++… Та же беда. Не зря я дал ссылку на запасной декомпилятор, т.к. именно он и сделал то, что не удалось другим. Теперь удалим все pyo/pyc файлы из папки src, а .py*_dis переименуем в .py.

Далее повторим все вышеописанное для архива opensource.zip, распаковав его в соседнюю одноименную папку. Архив external.zip я решил не трогать, т.к., осмотрев его, можно увидеть, что там лежат библиотеки, которые можно установить отдельно для нашего Питона. Так и сделаем:

Этапы три и четыре: собственно исходный код. Отладка.

Порыскав по питоновским скриптам, я наткнулся на файлик wing.py в корне папки с программой. И, первый же комментарий нам подсказывает:

В двух словах: если скрипту дать параметр —use-src, то при запуске будут использоваться исходники из папок src, external, opensource корневого каталога с Wing IDE (а не со скриптом).

Заглянув в корневую папку, я обнаружил еще одну папку src, и .py-файлы в ней. Подкинем их в нашу папку src, с перезаписью (здесь все таки оригиналы, а не декомпилированные файлы).

Теперь все три папки (указанные чуть выше), скопируем в корневой каталог программы. Попробуем подебажить…

Далее: откроем в родительском Wing IDE тот файлик, в котором мы нашли ранее строку о плохом license id (wingctl.py), и поставим бряку до этого сообщения:

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

Жмем Continue и попадаем на бабки бряку. Первая же интересная функция: abstract.ValidateAndNormalizeLicenseID(id). Зайдем в нее по F7. Там еще одна: __ValidateAndNormalize(id). Зайдем и в нее.

Первая проверка на валидность:

Видим, что от нас требуют, чтобы символы License ID принадлежали набору textutils.BASE30:

Вроде других проверок в __ValidateAndNormalize(id) нет. Исправляем введенный нами идентификатор и повторяем снова. Проверку на первый символ мы уже прошли:

А вот и второй символ:

Т.к. у нас Professional версия, то второй символ должен быть N — исправляем, и возвращаемся. abstract.ValidateAndNormalizeLicenseID(id) прошелся без ошибок. Прекрасно. Упс:

Фиксим (я выбрал E), и продолжаем. Пробежавшись глазами ниже по коду, ничего дополнительно к предыдущим проверкам я не обнаружил, поэтому смело отпустил отладку далее по F5. Новое окно:

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

Вводим случайный текст, получаем сообщение об ошибке (опять 20 символов, и начинаться код активации должен с AXX), находим его в файлах, ставим бряку:

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

Первая функция проверки: abstract.ValidateAndNormalizeActivation(act). В ней снова проверка на принадлежность BASE30. Проверка на префикс, которую мы уже прошли:

Следующее интересное место:

Заходим в self.fLicMgr._ValidateLicenseDict. Тут формируется хэш от лицензии:

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

Далее из кода активации отрезают три первых символа, убирают дефисы, преобразовывают в BASE16, и дополняют нулями, если нужно:

И вот оно, самое интересное:

Какой-то control вызывает функцию validate, передавая ему lichash (request code), имя операционной системы, для которой делается ключ, версию программы, и преобразованный код активации. Почему я остановил на этом месте внимание? Дело в том, что этот control — это pyd-файл (в чем можно убедиться, добавив имя объекта в watch, и глянув поле __file__), которые представляют из себя обычные DLL с одной экспортируемой функцией (не validate), которая дает Питону информацию о том, что она умеет делать. Ну что же, давайте посмотрим на нее со стороны декомпилятора Hex Rays

Этап пять: это уже не Python

Затащим в IDA Pro наш control (ctlutil.pyd) и посмотрим на экспортируемую функцию initctlutil:

off_10003094 представляет из себя структуру, в которой указаны имена и адрес экспортируемых методов. Вот и наш validate:

Из всего кода, который содержит процедура sub_10001410 самым интересным выглядит этот:

Зайдем и в sub_10001020 тоже. Интересно было бы не на глаз давать имена переменным, а подебажить и обозвать их как следует. Так и сделаем. Настроим отладчик IDA Pro:

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

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

Теперь ставим бряк на начало sub_10001020, и начинаем заглядывать в переменные и входные параметры. После непродолжительного процесса отладки приходим к такому вот листингу функции:

А место вызова этой функции приобретает следующий вид:

Из этого всего можно сделать вывод, что request code преобразовывается с помощью функции convert_reqest_key и сравнивается затем с тем преобразованным кодом активации. Помните то преобразование?

Далее из кода активации отрезают три первых символа, убирают дефисы, преобразовывают в BASE16, и дополняют нулями, если нужно

На выходе получил ключик:

wingide — 2015/05/24 04:03:47 — AXX3Q6BQHKQ773D24P58

Введя его в поле ввода ключа активации, получил заветное:

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

ИТОГИ

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

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

Источник

Wing IDE

Python-программисты ликуют

По традиции, перед тем, как рассказывать о различных «вкусных» штуках, которыми создатели Wing IDE снабдили своё детище, скажу о том, где вот это самое детище на просторах Всемирной паутины можно, так сказать, нарыть. Сделать это совсем не сложно, потому что Wing IDE имеет вполне определённое место дислокации, URL которого таков: www.wingware.com. По этому адресу можно найти дистрибутив этой среды разработки, а также разнообразную информацию, касающуюся как непосредственно Wing IDE, так и языка программирования, для которого эта среда предназначена.

В джентльменский набор поддерживаемых Wing IDE «фишек» входят различные раскладки горячих клавиш, дублирующие аналогичные им раскладки из разных популярных сред разработки для различных платформ: Visual Studio, VI/Vim, Emacs. Так что если, скажем, вы пересаживаетесь на Wing IDE с той же Visual Studio, переход будет более простым за счёт этой полезной особенности Wing IDE. Среди других полезных вещей, которые, как и во всякой приличной среде разработки, имеются в том программном продукте, о котором мы сейчас ведём речь, стоит отметить именованные закладки, возможность быстрого перехода к объявлению заданного идентификатора, возможность столь же быстрого перехода к строке с определённым номером, блочное комментирование кода (оно бывает весьма и весьма полезно при отладке приложений). Если есть желание, можно пронумеровать все строки, но не думаю, что это сильно упростит навигацию по коду. Ещё отдельно стоит упомянуть, пожалуй, поддержку макросов, которые позволяют автоматизировать рутинное набивание однотипного программного кода.

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

Во-первых, отладчик позволяет работать и с GUI, и с Web, и с консольными приложениями. Во-вторых, в него встроены расширенные возможности отладки ввода-вывода программ и имеется даже отдельная консоль для консольного ввода-вывода. В-третьих, поддерживается многопоточная отладка. Это не просто полезно, а жизненно необходимо для отладки синхронизации потоков в многопоточных приложениях. В-четвёртых, имеется возможность удалённой отладки. Про неё можно сказать то же самое, что про отладку многопоточную, только это уже будет относиться не просто к многопоточным приложениям, а уже к приложениям распределённым. Их написание и отладка никогда не относились к особенно лёгким задачам программирования ни в одном языке, и очень хорошо, что хотя бы отладка хоть как-то упрощается благодаря среде разработки. В-пятых, отладчик сам ловит все несловленные программистом исключения, так что потом можно найти все места, где они возникают и устранить такие бреши в программном коде. Эту возможность, правда, сложно назвать нетривиальной для современных отладчиков, но и бесполезной её тоже не назовёшь.


Другие возможности среды

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

Источник

2.1. Начало работы в Python 3 и Wing IDE 101¶

2.1.1. О версиях Python¶

Сейчас существуют две основных ветки (версии) развития языка Python (питон): Python 2 и Python 3. Версия 2 официально считается устаревшей (поддержка версии 2 заканчивается в 2020 году), версия 3 — более новой и современной. Мы будем изучать именно версию 3. Версия 2 существенно отличается от версии 3, мы не будем обсуждать эти отличия.

В пределах как версии 2, так и версии 3 есть «подверсии», например, последняя версия из третьей ветки сейчас (2020 г.) — версия 3.8.2 (не считая тех версий, которые находятся еще в разработке). В принципе, для наших занятий можно использовать более-менее любую версию питона из третьей ветки, лучше как минимум 3.3, но если нет особенных причин, то устанавливайте последнюю доступную вам версию.

2.1.2. Установка Python¶

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

Если вы работаете в другой операционной системе, то разберитесь, как установить питон, самостоятельно. В Linux, например, питон есть в репозиториях всех ведущих дистрибутивов, пакет обычно называется python3 (а просто python — это питон второй версии).

2.1.3. Установка Wing IDE¶

Сам по себе питон — это только интерпретатор кода. Он запускает ваши программы, но не содержит удобного редактора. Поэтому для написания программ я советую вам использовать среду разработки (по сути, продвинутый редактор) Wing IDE.

Wing IDE — это, к сожалению, не свободное ПО, но у него существует официально бесплатная версия для образовательных целей, называется Wing IDE 101. Она доступна как для Windows, так и для Linux и macOS.

Все программы для установки можно скачать с официального сайта Wing IDE (http://wingware.com/, через пункт Download — Wing IDE 101); установщик под Windows также можно скачать со странички курса. Обратите внимание, что вам нужна именно версия 101, а не какая-нибудь другая! Установите Wing IDE с помощью этого установщика, ничего сложного в нем нет.

Wing IDE — это просто среда разработки (IDE) для Python, т.е. удобный редактор программ, позволяющий легко запускать программы с помощью питона (именно поэтому надо отдельно устанавливать сам Python — Wing IDE его не включает в себя). В принципе, вы можете использовать и какую-нибудь другую среду разработки, но тогда разбирайтесь с ней сами. В частности, сам Python включает простенькую среду разработки Python IDLE, ее описание вы можете встретить во многих книжках по Python, но она слишком простая и потому не очень удобная. Так же есть популярная среда PyCharm, но на мой вкус она слишком сложная.

2.1.4. Проверка установки¶

Запустите Wing IDE. Появится следующее окошко:

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

Если у вас не получается, напишите мне [1], указав, куда вы установили питон, и прислав скриншоты основного окна Wing IDE и диалога Edit — Configure Python.

2.1.5. Первая программа¶

В основном меню Wing IDE выберите пункт File — New. Появится окно для редактирования текста программы. В этом окне наберите следующий текст:

(Здесь » — это символ кавычек.)

Должно получиться так:

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

Убедитесь, что опечаток нет. Сохраните программу: нажмите Ctrl-S или выберите пункт меню File — Save As. Wing IDE предложит выбрать имя файла для сохранения, для первой программы можно выбрать любое имя.

Обратите внимание, что Wing IDE раскрашивает вашу программу. Это делается для того, чтобы ее было удобнее читать; на самом деле для питона цвет не важен, он сделан только для того, чтобы вам было удобнее читать. Аналогично, в этом тексте код тоже раскрашен, причем раскраска может быть немного другой (это просто обусловлено системой, которую я использую для написания текста). Но еще раз: цвета только для удобства чтения, никакой больше нагрузки они не несут, в частности, Wing может раскрашивать не так, как вы видите в этом тексте, это не страшно.

После этого запустите программу, нажав на кнопку с зеленым треугольничком—стрелочкой на панели инструментов над текстом программы. Результат выполнения программы появляется в правой нижней части экрана, в панели «Python Shell» А именно, там вы можете увидеть один из двух возможных результатов, показанных на двух рисунках ниже.

Если там появилась надпись «Test 4»:

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

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

Если же там появился длинный текст со словами «Traceback» (в начале) и «Error» (в конце):

что такое wing 101. Смотреть фото что такое wing 101. Смотреть картинку что такое wing 101. Картинка про что такое wing 101. Фото что такое wing 101

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

Позапускайте программу (зеленой стрелочкой) ещё несколько раз и посмотрите на результаты. Вы увидите что, Wing IDE каждый раз печатает строку evaluate. перед запуском программы, потом программа печатает свою строку. Вывод программы перемешивается с выводом Wing IDE — ничего страшного, это нормально.

Можно также запускать программу нажатием на кнопку с картинкой типа красного жучка. Это немного другой режим запуска, более удобный для поиска ошибок. Попробуйте позапускать и так, и так, посмотрите на отличия (основное отличие пока — при запуске через «красного жучка» вывод предыдущих программ затирается).

2.1.6. Ошибки в программе¶

В вашей программе могут быть серьёзные ошибки — такие, что питон «не понимает», что вы от него хотите (а могут быть и не столь серьёзные — программа отработает как бы нормально, но выдаст неверный результат). В случае таких серьезных ошибок питон выдаст сообщение, похожее на сообщение, показанное на рисунке выше. Оно обычно начинается со слова Traceback, а ближе к концу в нем есть слово Error.

С ошибками удобнее разбираться, запуская программу в режиме «красного жучка». В таком случае Wing IDE подсвечивает строку около ошибки красным, а подробную информацию пишет в особом окошке справа.

А пока посмотрите внимательно на строчку с ошибкой (при запуске через жучка питон подсвечивает ее красным, при запуске через стрелочку — только пишет номер строки), и на строчки рядом — и попробуйте понять, что там не так. В примере на рисунке я забыл вторую цифру 2 (в результате чего питону стало непонятно, на что надо умножать). (В примере на рисунке я запускал программу через зеленую стрелочку, а не через «красного жучка», поэтому там нет подсвеченной красным строки.)

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

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

2.1.7. Как работает эта программа¶

Давайте разберём, как эта программа работает. Напомню её текст:

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

Команда print разделяет выводимые элементы пробелами, поэтому между Test и 4 выведен пробел.

2.1.8. Использование питона как калькулятора¶

В выражениях можно использовать следующие операторы:

Кроме того, есть так называемые функции:

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

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

Можно также, как мы видели раньше, смешивать текст (в кавычках) и выражения:

2.1.9. Простейший ввод и вывод. Переменные¶

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

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

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

Если вы запустите программу «красным жучком», то все будет аналогично, только текст вам надо будет вводить в пустом окошке «Debug I/O», которое появится на месте окошка «Python Shell».

Теперь разберем, как эта программа работает.

В программе можно заводить несколько переменных. Простейший вариант может выглядеть так:

Эта программа считывает две строки, которые вводит пользователь, и выводит их, причем сначала вторую, а потом первую.

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

сделает вовсе не то, что вы могли ожидать: питон пока считает, что в a и b могут лежать какие угодно строки, и не понимает, что вы имели в виду числа.

Чтобы объяснить, что вы имеете в виду числа, надо написать так:

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

Чтобы вводить числа через пробел, надо использовать другую конструкцию:

Это пока магия, ее придется запомнить наизусть. Потом вы поймете, что здесь что значит. Обратите внимание, что после слова int тут нет скобок, а вот после input и split есть.

Так можно вводить сколько угодно чисел; например, чтобы считать четыре числа, вводимые в одной строке, надо написать

2.1.10. Присваивания¶

Пока мы умеем записывать в переменные только то, что пользователь ввел с клавиатуры. На самом деле, намного чаще приходится записывать в переменные значения, которые программа сама вычисляет. Для этого есть специальная команда, которая называется присваивание (и на самом деле мы ее уже видели):

обозначает «в переменную a записать 10».

Если в переменной уже было что-то записано, то после присваивания старое значение затирается:

в результате в a лежит 30, а про 20 все забыли.

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

обозначает «в a записать 10, а в b — 20».

Запись a = 10 читается «переменной a присвоить 10», или кратко « a присвоить 10». Не надо говорить « a равно 10», т.к. «равно» — это не глагол, и не понятно, какое действие совершается. Более того, если запись a = a + 1 прочитать с «равно», то получается « a равно a плюс один», что никак не похоже на команду, а скорее на уравнение, которое не имеет решений. Поэтому говорите «присвоить», а не «равно».

2.1.11. Комментарии¶

(Эта информация вам прямо сейчас не нужна, но будет полезна при чтении дальнейших разделов.)

В программе можно оставлять так называемые комментарии. А именно, если где-то в программе встречается символ «решетка» ( # ), то этот символ и все, что идет за ним до конца строки, полностью игнорируется питоном. Таким образом можно в программе оставлять пометки для себя, или для других программистов, которые будут читать вашу программу. Например

Здесь запись # считали число полностью игнорируется питоном, как будто этих символов нет вообще, а запись a = int(input()) работает как и должна.

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

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

2.1.12. Язык программирования как конструктор¶

Выше я рассказал ряд самых основных конструкций языка питон. Теперь ваша задача будет из этих конструкций, как из конструктора, собирать программы. Относитесь к этому именно как к конструктору: все программирование — это сборка больших программ из таких отдельных команд.

2.1.13. Примеры решения задач¶

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

Вася купил \(N\) булочек, а Маша — на \(K\) булочек больше. Сколько всего булочек купили ребята?

Входные данные: Выведите одно число — ответ на задачу.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *