«Практикум по алгоритмизации и программированию на Python И. А. Хахаев Москва Альт Линукс 2011 УДК 004.432 ББК 22.1 Х27 Хахаев И. А. Х27 Практикум по алгоритмизации и программированию на Python: / И. А. Хахаев М. : Альт ...»
В серии: Библиотека ALT Linux
Практикум по алгоритмизации
и программированию на Python
И. А. Хахаев
Москва
Альт Линукс
2011
УДК 004.432
ББК 22.1
Х27
Хахаев И. А.
Х27 Практикум по алгоритмизации и программированию
на Python: / И. А. Хахаев М. : Альт Линукс, 2011. 126 с.
: ил. (Библиотека ALT Linux).
ISBN 978-5-905167-02-7 Учебно-методический комплекс Практикум по алгоритмизации и программированию на Python предназначен для начального знакомства с основными алгоритмами и с программированием на языке Python в интегрированных средах разработки (IDE) Geany и Eric. Комплекс состоит из учебного пособия, в котором рассматриваются типовые задачи в рамках базового курса информатики для средней школы (с учётом требований ЕГЭ), алгоритмы их решения и реализация этих алгоритмов на языке Python, и методических указаний для учителей, где описываются особенности IDE Geany и IDE Eric, а также причины и особенности обучения программированию на Python. Кроме того, комплекс дополняется примерами программ по каждому разделу учебного пособия (32 файла с примерами вариантов разобранных задач.).
Дополнительно в пособии описываются основы моделирования и программирования графики в Python с использованием модуля turtle и кросс-платформенной библиотеки Tkinter.
Сайт книги: http://books.altlinux.ru/PythonSchool/ Книга адресована преподавателям и учащимся средних и высших учебных заведений, а также широкому кругу читателей, интересующихся программированием.
УДК 004. ББК 22. По вопросам приобретения обращаться:
В компанию Альт Линукс : (495) 662-3883. E-mail: [email protected] Internet-магазин: http://shop.altlinux.ru Материалы, составляющие данную книгу, распространяются на условиях лицензии GNU FDL. Книга содержит следующий текст, помещаемый на первую страницу обложки: В серии “Библиотека ALT Linux”. Название: Практикум по алгоритмизации и программированию на Python. Книга не содержит неизменяемых разделов. Авторы разделов указаны в заголовках соответствующих разделов. ALT Linux торговая марка компании ALT Linux. Linux торговая марка Линуса Торвальдса. Прочие встречающиеся названия могут являться торговыми марками соответствующих владельцев.
c Хахаев И. А., ISBN 978-5-905167-02- c ALT Linux Оглавление Глава 1. Язык Python и его особенности 1.1 Общие сведения о языке....................... 1.2 Типы и структуры данных...................... 1.3 Средства программирования на Python............... 1.4 Ввод и вывод в Python........................ 1.5 Структура программы......................... 1.6 Справочная система и получение информации о Python..... 1.7 Контрольные вопросы........................ Глава 2. Основные алгоритмы и их реализация на Python 2.1 Линейные алгоритмы. Операции с числами и строками...... 2.2 Ветвления и оператор выбора.................... 2.3 Циклические алгоритмы....................... 2.4 Обработка двумерных массивов (матриц)............. 2.5 Работа с ассоциативными массивами (таблицами данных).... Глава 3. Графика в Python и задачи моделирования 3.1 Управление исполнителем черепашка.............. 3.2 Пользовательские подпрограммы и моделирование. Модуль Tkinter................................. Глава 4. Методические указания для учителей и преподавателей 4.1 Введение. Почему Python?...................... 4.2 Требования к программной конфигурации............. 4.3 Основные понятия и определения (глоссарий)........... 4.4 Использование IDE Geany...................... 4.5 Использование IDE Eric........................ 4.6 Особенности работы с приложениями Tk и Tkinter........ 4.7 Использование примеров скриптов................. Глава Язык Python и его особенности 1.1 Общие сведения о языке Эта глава полезна для общего развития, её можно прочитать, но совершенно необязательно сразу пытаться понять. Лучше вернуться к ней ещё раз после выполнения всех практических заданий.
В основном Python используется как интерпретатор, хотя существуют средства компиляции Python-программ.
Интерпретатор Python позволяет выполнять команды и операции средствами интерактивной оболочки Python (см. далее).
Python объектно-ориентированный язык. Программные модули и структуры данных могут использоваться как объекты, т.е. имеют свойства и методы.
Подпрограммы в Python оформляются только как функции, но эти функции могут не возвращать значений, а могут возвращать несколько значений в виде структур данных.
Функции, оформленные по определённым правилам, объединяются в модули (библиотеки функций). Модули (или некоторые функции из модулей) по мере необходимости подключаются к пользовательским программам. Такой подход позволяет экономить память вычислительной системы и не занимать её ненужным кодом.
Модули подключаются в начале программы с помощью команды:
import имя_модуля А отдельные функции с помощью команды:
from имя_модуля import функция1,... функцияN Присваивание в Python обозначается знаком =, а равенство знаком В Python разрешены цепочки присваиваний и сравнений, однако присваивания и сравнения нельзя смешивать. Выражения a=b=c=4 и a>>. Ввод каждой операции завершается нажатием на клавишу, после чего Python выполняет эту операцию и выдаёт результат или сообщение об ошибке. После присваивания результата операции какой-нибудь переменной никакой результат не выдаётся, а чтобы его увидеть, нужно набрать имя переменной и нажать.
Однако в интерактивной оболочке неудобно работать с файлами программ.
Кроме того, полезно видеть текст программы одновременно с результатами её выполнения. Такие функции (и часто многие другие) обеспечивают интегрированные среды разработки (IDE Integrated Development Environment). Одним из достоинств IDE является подсветка синтаксиса команды, строки, числа и другие элементы программ и данных выделяются цветом или начертанием шрифта.
Самая простая IDE для Python называется IDLE (рис. 1.2). В этой среде можно редактировать тексты программ в окне редактора и запускать их на выполнение. Результаты выполнения отображаются в окне выполнения, которое одновременно является окном интерактивной оболочки Python (т.е. в этом окне также можно выполнять команды).
Рис. 1.2: Интегрированная среда разработки IDLE Пункт Options главного меню IDLE позволяет выбрать, какое окно будет открываться при запуске программы окно редактора или окно оболочки. Для выполнения программы, набранной в окне редактора, нужно нажать. Если файл с текстом программы не сохранён, IDLE выдаст соответствующее сообщение и предложит сохранить файл. Если окно оболочки при этом отсутствует, оно автоматически откроется и покажет результаты выполнения программы.
Недостатком IDLE является бедный и не локализованный (только на английском) интерфейс, а достоинством то, что реализации IDLE существуют для всех распространённых операционных систем.
Также специально для Python разработана IDE Eric (рис. 1.3), которая обладает большим количеством настроек и возможностей отладки программ и больших программных проектов. Однако эту среду разработки (точнее, её внешний вид) можно существенно упростить и сделать её более понятной для начинающих (рис. 1.4).
Важно обратить внимание, что в Eric также имеется окно редактора и окно выполнения (окно интерактивной оболочки).
Рис. 1.6: Текст программы и процесс её выполнения в редакторе Kate Интерес представляет также кросс-платформенная IDE Geany (рис. 1.5), в которой, кроме Python, можно работать со многими другими языками программирования.
Кроме того, для создания и выполнения программ на Python (как и многих других языках программирования) можно использовать текстовые редакторы для программистов, в частности, редактор Kate, входящий в состав интегрированной среды KDE (рис. 1.6).
Для запуска программы используется команда python имя_файла.py в окне терминала Kate.
1.4 Ввод и вывод в Python 1.4.1 Диалоговый режим При работе с интерактивными оболочками или в процессе организации взаимодействия программы с пользователем ( диалога ) для ввода чисел и, соответственно, определения значений переменных будем использовать функции input () и raw_input(). В качестве аргумента этих функции рекомендуется использовать строку-подсказку (приглашение для ввода), в которой кратко описывается, какие данные и как необходимо сообщить программе. Дальше будут показаны примеры использовальзования этих функций.
Если в строке-подсказке используются символы кириллицы (русские буквы), то нужно предварительно указать кодировочную таблицу (см. раздел 1.5).
Строка-подсказка может быть в двойных или в одиночных кавычках. Для выполнения операций input () или raw_input() интерпретатор останавливает програмВвод и вывод в Python му и после строки-подсказки требуется ввести требуемое значение переменной и нажать. Если строка подсказки отсутствует, будет показан курсор оболочки в пустой строке окна выполнения. Если требуется ввести несколько значений, их нужно вводить через запятую и нажимать только после последнего введённого значения.
Рассмотрим примеры ввода данных и вывода результатов команд в сеансе интерактивной облочки.
В последующих примерах обозначение >>> используется в качестве приглашения интерактивной оболочки, обычный шрифт показывает то, что следует набирать на клавиатуре, полужирным шрифтом показан вывод интерпретатора (то, что пишет Python), а символ # означает комментарий (пояснение).
При использовании функции input () числовые значения пишутся как обычно, а строковые нужно писать в кавычках (двойных или одиночных).
Примеры:
>>> >>> a=i n p u t ( ’ Введитезначение a : ’ ) # вариант с подсказкой >>> >>> a, b, c=i n p u t ( ’ Введитедлинысторонтреугольникачереззапятую : ’ ) # вариант для нескольких чисел Введите длины сторон треугольника через запятую: 3, 4, >>> формирование кортежа со строковыми элементами ’bob’ >>>t (5, ’bob’, -3, ’dno’) >>> Список таким образом ввести не получается (при вводе нескольких значений функция input () возвращает кортеж), но список можно получить с помощью функции list ().
Для ввода только строковых значений в Python используется функция raw_input(). Её особенности во многом совпадают с функцией input (). Есть одна деталь строковые значения при их вводе не нужно заключать в кавычки. Если с помощью raw_input() вводить числа, они преобразуются в строки.
Примеры:
>>> name=raw_input ( ’ Кактебязовут? ’ ) Как тебя зовут? Вася >>> name ’Вася’ >>> age=raw_input ( ’ Сколькотебелет? ’ ) Сколько тебе лет? >>> age ’12’ >>> Для вывода результатов работы используется инструкция print, которая не является функцией. Использование инструкции (команды) print позволяет производить вычисления на лету и выводить одновременно (одним оператором) строки и числа.
Примеры:
==-stroka-== >>> >>> t =(a, b, c, d )=i n p u t ( ’ Введитеэлементы : ’ ) (5, ’bob’, -3, ’dno’) >>> пояснением Получились значения (5, ’bob’, -3, ’dno’) >>> При выводе нескольких значений через запятую print автоматически добавляет проблеы между значениями переменных.
>>> t =(a, b, c, d )=i n p u t ( ’ Введитеэлементы : ’ ) Итоговый кортеж (5, ’bob’, -3, ’dno’, 1, 2, 3) >>> 1.4.2 Чтение из файла и запись в файл Будем рассматривать только самый простой вариант работа с текстовыми файлами в текущем каталоге без указания формата данных.
Для работы с файлом прежде всего нужно создать специальный объект – дескриптор файла, а потом использовать методы этого дескриптора для чтения и записи данных.
При создании дескриптора нужно указать строку с именем файла и строку с описанием варианта доступа. Вариантов доступа бывает три ’ r ’ (только чтение), ’w’ (запись) и ’a’ (дополнение).
Чтение возможно только из существующего файла. Если при открытии на запись или дополнение указано имя несуществующего файла, он будет создан.
Рассмотрим несколько примеров.
Пусть имеется файл с данными с именем 1.dat abc Создадим дескриптор для чтения данных из этого файла:
Прочитаем строки из файла:
>>> s ’1 2 3\na b c’ >>> Как видно, все данные из файла прочитались в одну строку. Поскольку в Pyrhon отсутствуют формальные ограничения на длину строки, этот способ годится для любых разумных файлов данных, особенно используемых и учебных целях. Далее с помощью функций и методов строк можно получить значения переменных.
Здесь нужно обратить внимание на сочетание ’\n’. Это специальная комбинация символов, означающая переход на новую строку (перевод строки new line). Её можно использовать в своих интересах.
Применение метода split () позволяет сформировать список с исходными данными.
[’1 2 3’,’a b c’] Теперь, чтобы получить числа из фала с данными, следует применить метод split () к первому элементу списка lst. а потом выполнить преобразование типов в зависимости от вида требуемого числа (целое или вещественное).
[’1’,’2’,’3’] >>> b Для прекращения работы с файлом ( высвобождения дескриптора ) используется метод close ():
Есть ещё два полезных метода для чтения данных из файла. Метод readline () читает из файла строку, а при повторном использовании следующую строку:
’1 2 3\n’ ’a b c’ Метод readlines () читает из файла все строки и формирует из них список. Тогда легко узнать количество строк в файле:
[’1 2 3\n’, ’a b c’] Далее попытаемся записать что-нибудь в этот файл. Для этого нужно создать дескриптор для записи данных, сформировать строку и использовать метод write (), как показано ниже.
В результате содержимое файла заменится на строку ’cde’, а то, что было в файле раньше, сотрётся. Метод close () обеспечивает применение изменений в файле и запись этих изменений на диск.
Теперь рассмотрим случай создания файла и добавления данных в него.
Здесь как раз использована комбинация ’\n’ для перехода на новую строку. В результате получим файл 2.dat следующего содержания:
cde 1.5 Структура программы Программа на Python представляет из себя последовательность команд для ввода данных, вычислений и других операций с данными и вывода результатов.
Простые команды (операторы) принято записывать по одной строке на оператор.
В составных операторах (с которыми ещё предстоит познакомиться) большую роль играют пробелы в начале строки (отступы).
Программа создаётся в виде текстового файла в любом текстовом редакторе.
Использование интегрированных сред разработки (IDE) обеспечивает подсветку синтаксиса и выделение особенностей структуры программы, а также упрощает поиск ошибок в написании команд. Файл с программой должен иметь расширение.py (например, my_program.py).
Первую строку программы необходимо оформить как комментарий, в котором указывается кодировочная таблица ( кодировка ) данных файла, в противном случае Python не сможет правильно интерпретировать любые символы, встретившиеся в тексте программы и выходящие за пределы основной латиницы (в том числе кириллицу). Указанная в этом комментарии кодировка должна соответствовать действительной кодировке файла.
Пример простейшей программы:
# -*- coding: utf-8 -*name=raw_input ( ’ Кактебязовут? ’ ) p r i n t ’ Здравствуй, ’, name, ’ ! ’ Для выполнения программы из командной строки следует вызвать интерпретатор Python, указав в качестве аргумента имя файла с программой, например p y t h o n my_program. py Каждая IDE для Python предлагает свой способ выполнения программы. В IDLE для этого нужно в окне редактора нажать клавишу, а в Eric клавиши 1.6 Справочная система и получение информации о Python Основой справочной системы Python является сам Python и команда help, которую можно использовать в интерактивной оболочке.
>>> Для дальнейшего взаимодействия со справочной системой Python требуется некоторое знание английского языка или помощь друга. Встроенная справка Python существует только на английском языке.
Будет считать, что с английским особенных проблем нет, и последуем рекомендации.
g i v e n word help> Из результатов работы команды help () можно узнать, во-первых, версию Pyhton, во-вторых, адрес сайта с документацией, а в-третьих, получить названия основных разделов справки модули Python ( modules ), ключевые слова Python ( keywords ) и темы справки ( topics ).
После выполнения команды help () Python переходит в режим интерактивной справки, соответственно изменяя приглашение оболочки.
Попробуем узнать список ключевых слов, чтобы случайно не использовать их в качестве имён переменных.
Рис. 1.7: Интерактивная справка по Python в браузере help.
>>> Для выхода из интерактивной справки используется команда quit.
Справку по Python в виде гипертекста (рис. 1.7) и тоже на английском языке можно получить, открыв в любом браузере файл /usr/share/doc/ python-doc-x.y.z/index.html, где x.y.z версия Python (например, /usr/ share/doc/python-doc-2.5.2/index.html).
Основные учебные материалы, электронные и печатные книги по Python перечислены в разделе Литература.
1.7 Контрольные вопросы 1. Почему операция вида a 0:
p r i n t ’ Суммаположительных : ’, SP p r i n t ’ Суммаотрицательных : ’,SN Рис. 2.14: Алгоритм сортировки методом пузырька 2.3.1 Сортировка массива Задача сортировки, а также задача поиска максимального или минимального элемента в массиве встречается довольно часто. Средствами Python такие задачи решаются очень просто, но тем не менее рассмотрим общую задачу сортировки массива.
Под сортировкой понимается процедура, в результате выполнения которой изменяется исходный порядок следования данных. Причём новый порядок их следования отвечает требованию возрастания или убывания значений элементов одномерного массива. Например, при сортировке по возрастанию из одномерного массива [3 1 0 5 2 7] получается массив [0 1 2 3 5 7]. Возможны и более сложные критерии сортировки. Символьные данные обычно сортируются в алфавитном порядке.
Один из наиболее наглядных методов сортировки метод пузырька.
Пусть необходимо упорядочить элементы массива A из N элементов по возрастанию.
Просматривая элементы массива слева направо (от первого элемента к последнему), меняем местами значения каждой пары соседних элементов в случае неравенства A[i] > A[i + 1], передвигая тем самым наибольшее значение на последнее место. Следующие просмотры начинаем опять с первого элемента массива, последовательно уменьшая на единицу количество просматриваемых элементов. Процесс заканчивается после N 1 просмотра.
Метод получил такое название, потому что каждое наибольшее значение как бы всплывает вверх.
Фрагмент блок-схемы алгоритма показан на рис. 2.14.
Действие A[i] A[i + 1] означает перестановку значений элементов массива.
Текст соответствующего фрагмента программы на псевдоязыке :
ввод N, A нц для m от N1 до 1 шаг вывод A В этом фрагменте для перестановки значений элементов массива используется промежуточная переменная.
Задача поиска максимального элемента в массиве решается следующим образом. Пусть maxA требуемое значение максимального элемента. Сначала присваиваем переменной maxA значение первого элемента массива, потом сравниваем первый элемент со следующим. Если следующий элемент (второй) больше первого, присваиваем его значение переменной maxA, а если нет переходим к следующему (третьему элементу) и т. д.
Аналогично решается задача поиска минимального элемента в массиве.
В Python эти алгоритмы уже реализованы в функциях max(), min() и в методе sort () (метод sort () сортирует список по возрастанию значений элементов).
2.3.2 Задачи для самостоятельного решения 1. Составьте блок-схему поиска максимального элемента в одномерном массиве.
2. Нарисуйте полную блок-схему алгоритма сортировки массива методом пузырька.
3. Дан одномерный массив числовых значений, насчитывающий N элементов.
Поменять местами элементы, стоящие на чётных и нечётных местах: A[1] 4. Дан одномерный массив числовых значений, насчитывающий N элементов.
Выполнить перемещение элементов массива по кругу вправо, т. е. A[1] 5. Дан одномерный массив числовых значений, насчитывающий N элементов.
Поменять местами первую и вторую половины массива.
6. Дан одномерный массив числовых значений, насчитывающий N элементов.
Поменять местами группу из M элементов, начинающихся с позиции K с группой из M элементов, начинающихся с позиции P.
7. Дан одномерный массив числовых значений, насчитывающий N элементов.
Вставить группу из M новых элементов, начиная с позиции K.
8. Дан одномерный массив числовых значений, насчитывающий N элементов.
Сумму элементов массива и количество положительных элементов поставить на первое и второе место.
9. Дан одномерный массив числовых значений, насчитывающий N элементов.
Исключить из него M элементов, начиная с позиции K.
10. Дан одномерный массив числовых значений, насчитывающий N элементов.
Исключить все нулевые элементы.
11. Дан одномерный массив числовых значений, насчитывающий N элементов.
После каждого отрицательного элемента вставить новый элемент, равный квадрату этого отрицательного элемента.
12. Дан одномерный массив числовых значений, насчитывающий N элементов.
Определить, образуют ли элементы массива, расположенные перед первым отрицательным элементом, возрастающую последовательность.
13. Дан одномерный массив числовых значений, насчитывающий N элементов.
Определить, образуют ли элементы массива, расположенные перед первым отрицательным элементом, убывающую последовательность.
14. Дан одномерный массив числовых значений, насчитывающий N элементов.
Из элементов исходного массива построить два новых. В первый должны входить только элементы с положительными значениями, а во второй только элементы с отрицательными значениями.
15. Дан одномерный массив числовых значений, насчитывающий N элементов. Добавить столько элементов, чтобы элементов с положительными и отрицательными значениями стало бы поровну.
16. Дан одномерный массив числовых значений, насчитывающий N элементов.
Добавить к элементам массива такой новый элемент, чтобы сумма элементов с положительными значениями стала бы равна модулю суммы элементов с отрицательными значениями.
17. Дан одномерный массив числовых значений, насчитывающий N элементов.
Дано положительное число T. Разделить это число между положительными элементами массива пропорционально значениям этих элементов и добавить полученные доли к соответствующим элементам.
18. Дан одномерный массив числовых значений, насчитывающий N элементов.
Исключить из массива элементы, принадлежащие промежутку [B; C].
19. Дан одномерный массив числовых значений, насчитывающий N элементов. Вместо каждого элемента с нулевым значением поставить сумму двух предыдущих элементов массива.
20. Дан одномерный массив числовых значений, насчитывающий N элементов.
Определить, имеются ли в массиве два подряд идущих нуля.
21. Дан одномерный массив числовых значений, насчитывающий N элементов.
Подсчитать количество чисел, делящихся на 3 нацело, и среднее арифметическое чисел с чётными значениями. Поставить полученные величины на первое и последнее места в массиве (увеличив массив на 2 элемента).
22. Заданы M строк символов, которые вводятся с клавиатуры. Найти количество символов в самой длинной строке. Выровнять строки по самой длинной строке, поставив перед каждой строкой соответствующее количество звёздочек.
23. Заданы M строк символов, которые вводятся с клавиатуры. Из заданных строк, каждая из которых представляет одно слово, составить одну длинную строку, разделяя слова пробелами.
24. Заданы M строк слов, которые вводятся с клавиатуры. Подсчитать количество гласных букв в каждой из заданных строк.
25. Заданы M строк слов, которые вводятся с клавиатуры (в каждой строке – одно слово). Вводится слог (последовательность букв). Подсчитать количество таких слогов в каждой строке.
26. Заданы M строк слов, которые вводятся с клавиатуры (в каждой строке – одно слово). Вводится слог (последовательность букв). Удалить данный слог из каждой строки.
27. Заданы M строк символов, которые вводятся с клавиатуры. Напечатать все центральные буквы строк нечетной длины.
28. Заданы M строк символов, которые вводятся с клавиатуры. Каждая строка содержит слово. Записать каждое слово в разрядку (вставить по пробелу между буквами).
29. Задана строка символов, в которой встречается символ.. Поставить после каждого такого символа системное время ПК.
30. Заданы M строк, которые вводятся с клавиатуры. Подсчитать количество пробелов в каждой из строк.
31. Заданы M строк символов, которые вводятся с клавиатуры. Каждая строка представляет собой последовательность символов, включающих в себя вопросительные знаки. Заменить в каждой строке все имеющиеся вопросительные знаки звёздочками.
32. Последовательно вводятся числа. Определить сумму чисел с нечётными номерами и произведение чисел с чётными номерами (по порядку ввода).
Подсчитать количество слагаемых и количество сомножителей. При вводе числа 55555 закончить работу.
33. Определить сумму вводимых положительных чисел. Причём числа с нечётными номерами (по порядку ввода) суммировать с обратным знаком, а числа с чётными номерами перед суммированием возводить в квадрат. Подсчитать количество слагаемых. При вводе первого отрицательного числа закончить работу.
34. Даны число P и число H. Определить сумму чисел меньше P, произведение чисел больше H и количество чисел в диапазоне значений P и H. При вводе числа равного P или H, закончить работу.
35. Суммировать вводимые числа, среди которых нет нулевых. При вводе нуля обеспечить вывод текущего значения суммы. При вводе числа 99999 закончить работу.
36. Вводятся положительные числа. Определить сумму чисел, делящихся на положительное число B нацело. При вводе отрицательного числа закончить 37. Для вводимых чисел определить процент положительных и отрицательных чисел. При вводе числа 65432 закончить работу.
2.4 Обработка двумерных массивов (матриц) Двумерные массивы являются аналогами матриц и имеют прямоугольную (табличную) структуру. Описываются массивы так же, как одномерные. Разница состоит в том, что у элемента двумерного массива две координаты (два индекса) номер строки и номер столбца, в которых находится элемент.
Ввод массива осуществляется построчно при помощи двух циклов. Пусть M количество столбцов, N количество строк. Элементы массива обозначим как mas[i, j ], первый индекс номер строки, второй номер столбца.
ввод M, N нц для i от 1 до N Вывод массива на экран осуществляется при помощи аналогичных циклов.
нц для i от 1 до N Здесь пустой оператор вывода обеспечивает переход на новую строку.
В Python для работы с многомерными (когда используется два и более индексов) массивами можно использовать вложенные списки (списки списков, списки списков списков и т. д.).
Однако Python предоставляет более удобный инструмент создания и преобразования многомерных массивов библиотеку numpy (Numeric Python).
Создание двумерного массива в Python может выглядеть так:
# -*- coding: utf-8 -*import numpy n=i n p u t ( ’ Количествострок : ’ ) m=i n p u t ( ’ Количествостолбцов : ’ ) # Создаём ”нулевую” матрицу a=numpy. z e r o s ( [ n 1,m1]) # Заполняем матрицу Сначала с помощью функции (метода) numpy.zeros() создаётся двумерный массив (матрица), заполненный нулями, а потом вместо нулей подставляются реальные значения. Индексы элементов, так же как в строках, кортежах и списках, начинаются с 0 (первый верхний левый элемент матрицы в Python имеет индекс [0,0]). Оператор print выводит индексы очередного элемента матрицы, который нужно ввести.
Задача 1. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Найти среднее арифметическое элементов массива.
Постановка задачи:
n количество строк в массиве;
m количество столбцов в массиве;
A[i, j] элемент массива;
i, j индексы элемента массива.
S сумма элементов массива (сумма всех A[i, j] при всех i и j) K количество элементов в массиве (K = m n) C среднее арифметическое элементов массива (C = S/K) Рис. 2.15: Блок-схема алгоритма вычисления среднего значения матрицы Блок-схема алгоритма решения показана на рис. 2.15.
Текст программы на псевдоязыке :
ввод n,m S= нц для i от 1 до n K=nm C=S/K вывод C Текст программы на Python:
# -*- coding: utf-8 -*import numpy n=i n p u t ( ’ Количествострок : ’ ) m=i n p u t ( ’ Количествостолбцов : ’ ) S=0. # Создаём нулевую матрицу a=numpy. z e r o s ( [ n 1,m1]) # Заполняем матрицу K=nm C=S/K p r i n t ’ Среднеезначениепострокам : ’,C 2.4.1 Задачи для самостоятельного решения 1. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Найти наибольший элемент столбца матрицы A, для которого сумма абсолютных значений элементов максимальна.
2. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Найти наибольшее значение среди средних значений для каждой строки матрицы.
3. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Найти наименьший элемент столбца матрицы A, для которого сумма абсолютных значений элементов максимальна.
4. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Найти наименьшее значение среди средних значений для каждой строки матрицы.
5. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Определить средние значения по всем строкам и столбцам матрицы. Результат оформить в виде матрицы из N + 1 строк и M + 6. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Найти сумму элементов всей матрицы. Определить, какую долю в этой сумме составляет сумма элементов каждого столбца.
Результат оформить в виде матрицы из N + 1 строк и M столбцов.
7. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Найти сумму элементов всей матрицы. Определить, какую долю в этой сумме составляет сумма элементов каждой строки. Результат оформить в виде матрицы из N строк и M+1 столбцов.
8. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Определить, сколько отрицательных элементов содержится в каждом столбце и в каждой строке матрицы. Результат оформить в виде матрицы из N + 1 строк и M + 1 столбцов.
9. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Определить, сколько нулевых элементов содержится в верхних L строках матрицы и в левых К столбцах матрицы.
10. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Перемножить элементы каждого столбца матрицы с соответствующими элементами K-го столбца.
11. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Просуммировать элементы каждой строки матрицы с соответствующими элементами L-й строки.
12. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Разделить элементы каждой строки на элемент этой строки с наибольшим значением.
13. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Разделить элементы каждого столбца матрицы на элемент этого столбца с наибольшим значением.
14. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Разделить элементы матрицы на элемент матрицы с наибольшим значением.
15. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Все элементы имеют целый тип. Дано целое число H.
Определить, какие столбцы имеют хотя бы одно такое число, а какие не 16. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Исключить из матрицы строку с номером L. Сомкнуть строки матрицы.
17. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Добавить к матрице строку и вставить ее под номером 18. Выполнить обработку элементов квадратной матрицы A, имеющей N строк и N столбцов. Найти сумму элементов, стоящих на главной диагонали, и сумму элементов, стоящих на побочной диагонали (элементы главной диагонали имеют индексы от [0,0] до [N,N], а элементы побочной диагонали – от [N,0] до [0,N]).
19. Выполнить обработку элементов квадратной матрицы A, имеющей N строк и N столбцов. Определить сумму элементов, расположенных параллельно главной диагонали (ближайшие к главной). Элементы главной диагонали имеют индексы от [0,0] до [N,N].
20. Выполнить обработку элементов квадратной матрицы A, имеющей N строк и N столбцов. Определить произведение элементов, расположенных параллельно побочной диагонали (ближайшие к побочной). Элементы побочной диагонали имеют индексы от [N,0] до [0,N].
21. Выполнить обработку элементов квадратной матрицы A, имеющей N строк и N столбцов. Каждой паре элементов, симметричных относительно главной диагонали (ближайшие к главной), присвоить значения, равные полусумме этих симметричных значений (элементы главной диагонали имеют индексы от [0,0] до [N,N]).
22. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Исходная матрица состоит из нулей и единиц. Добавить к матрице еще один столбец, каждый элемент которого делает количество единиц в каждой строке чётным.
23. Выполнить обработку элементов квадратной матрицы A, имеющей N строк и N столбцов. Найти сумму элементов, расположенных выше главной диагонали, и произведение элементов, расположенных выше побочной диагонали (элементы главной диагонали имеют индексы от [0,0] до [N,N], а элементы побочной диагонали от [N,0] до [0,N]).
24. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Дан номер строки L и номер столбца K, при помощи которых исходная матрица разбивается на четыре части. Найти сумму элементов каждой части.
25. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Определить, сколько нулевых элементов содержится в каждом столбце и в каждой строке матрицы. Результат оформить в виде матрицы из N + 1 строк и M + 1 столбцов.
2.5. Работа с ассоциативными массивами (таблицами данных) 26. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Дан номер строки L и номер столбца K, при помощи которых исходная матрица разбивается на четыре части. Найти среднее арифметическое элементов каждой части.
27. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Все элементы имеют целый тип. Дано целое число H. Определить, какие строки имеют хотя бы одно такое число, а какие не 28. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Исключить из матрицы столбец с номером K. Сомкнуть столбцы матрицы.
29. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Добавить к матрице столбец чисел и вставить его под 30. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Добавить к элементам каждого столбца такой новый элемент, чтобы сумма положительных элементов стала бы равна модулю суммы отрицательных элементов. Результат оформить в виде матрицы из N + 1 строк и M столбцов.
31. Выполнить обработку элементов прямоугольной матрицы A, имеющей N строк и M столбцов. Добавить к элементам каждой строки такой новый элемент, чтобы сумма положительных элементов стала бы равна модулю суммы отрицательных элементов. Результат оформить в виде матрицы из N строк и M + 1 столбцов.
2.5 Работа с ассоциативными массивами (таблицами Ассоциативный массив лучше всего описывается табличным представлением данных, когда каждая строка таблицы описывает характеристики какого-то объекта из множества однородных объектов (типичный пример список учеников, их домашних телефонов и адресов). Таким образом, по значению из первого столбца такой таблицы (ключу) можно однозначно определить значения из остальных столбцов, т. е. значение ключа ассоциируется с остальными характеристиками объекта (в случае ученика по фамилии можно найти другую информацию).
Если в ассоциативном массиве только два столбца ( ключ и значение ), то такой массив называется хэш. Такие ассоциативные массивы очень часто используются в современных информационных системах (например, пары логин пароль ).
В области моделирования процессов и явлений часто встречаются задачи, в которых значению ключа соответствует несколько параметров (например, номеру химического элемента однозначно соответствует название, атомный вес, валентность, количество протонов и пр.). В таких задачах простые хэш-массивы использовать уже неудобно.
Эффективный алгоритм обработки ассоциативных массивов (поиска значений, добавления и удаления значений и ключей, сортировки и пр.) в значительной степени зависит от используемого языка программирования и определённых в этом языке типов и структур данных. Так, в языке программирования Basic ассоциативный массив образуется из нескольких согласованных одномерных массивов. В языке программирования Pascal для представления ассоциативных массивов используется структура данных запись (record). В Python для ассоциативных массивов определена специальная структура данных словарь, но мы рассмотрим работу с ассоциативными массивами с помощью списков и функций работы со списками.
Рассмотрим задачу из области экономического анализа.
Оценить экономическую деятельность нескольких предприятий. Известны названия предприятий, значения планового объёма розничного товарооборота и значения фактического объёма розничного товарооборота.
Требуется определить:
1. процент выполнения плана каждым предприятием;
2. количество предприятий, недовыполнивших план;
3. наибольший плановый товарооборот;
4. упорядочить предприятия по возрастанию планового товарооборота.
Обозначим количество предприятий как k и сформируем три списка список названий предприятий (пусть он называется name), список значений планового товарооборота (назовём его plan), список значений фактического товарооборота (с именем fact ). На основании этих данных создадим список значений процентов выполнения плана (пусть он называется procent).
Количество предприятий, недовыполнивших план, будем определять в результате сравнения процента выполнения со 100 процентами в цикле по всем предприятиям.
Текст программы на Python может выглядеть, как показано ниже.
# -*- coding: utf-8 -*k - количество предприятий # name - список названий предприятий # plan - список значений планового товарооборота # fact - список значений фактического товарооборота # procent - список значений % выполнения плана 2.5. Работа с ассоциативными массивами (таблицами данных) k=i n p u t ( "Количествопредприятий : " ) name = [ ] plan =[] f a c t =[] for i in range ( k ) :
n=raw_input ( "Название : " ) plany. sort () p r i n t 16 "=" p r i n t "Процентвыполненияпланакаждымпредприятием : " nedo= for i in range ( k ) :
p r i n t "Количествопредприятий, недовыполнившихплан : ", nedo p r i n t "Наибольшийплановыйтоварооборот : ", max ( p l a n ) p r i n t "Предприятияповозрастаниюплана : " for i in range ( k ) :
Здесь с помощью функции map() и одноразовой lambda-функции создаётся список процентов выполнения плана и с помощью функции zip () формируется два итоговых ассоциативных массива. Сортировка таких ассоциативных массивов производится по первому столбику, поэтому важен порядок аргументов в функции zip (), а также порядок индексов при выводе результатов.
Пример решения задачи показан на рис. 2.16.
Рис. 2.16: Пример решения задачи с ассоциативным массивом 2.5.1 Задачи для самостоятельного решения возрастанию цены. Вывести отсортированный вариант списка блюд.
2. Имеется список учеников и результаты трёх тестов (баллы от 0 до 100).
Определить средний балл каждого ученика по трём тестам, вывести список учеников по убыванию среднего балла.
3. Известны данные о количестве мальчиков и девочек в нескольких классах. Отсортировать названия классов по возрастанию процента мальчиков, определить количество классов, в которых мальчиков больше, чем девочек, и вывести названия этих классов отдельно.
2.5. Работа с ассоциативными массивами (таблицами данных) 4. Решить задачу, связанную с оценкой экономической деятельности группы предприятий на основе известных данных:
• название предприятий;
• плановый объем розничного товарооборота;
• фактический объем розничного товарооборота.
Требуется определить:
a) процент выполнения плана каждым предприятием;
b) количество предприятий, недовыполнивших план на 10% и более;
c) наименьший плановый товарооборот;
d) упорядочить предприятия по убыванию планового товарооборота.
Глава Графика в Python и задачи моделирования Python может работать с несколькими графическими библиотеками, обеспечивая создание сложных приложений с развитым графическим пользовательским интерфейсом. В этой части мы научимся пользоваться самыми простыми графическими возможностями Python управлять исполнителем черепашка для создания графических примитивов и перемещаться на плоскости и использовать методы модуля Tkinter для задач моделирования математических функций и физических явлений.
3.1 Управление исполнителем черепашка Исполнитель черепашка управляется командами относительных ( вперёдназад и направо-налево ) и абсолютных ( перейти в точку с координатами... ) перемещений. Исполнитель представляет собой перо, оставляющее след на плоскости рисования. Перо можно поднять, тогда при перемещении след оставаться не будет. Кроме того, для пера можно установить толщину и цвет. Все эти функции исполнителя обеспечиваются модулем turtle ( черепаха ).
Приведённый ниже код создаёт графическое окно (рис. 3.1) и помещает перо ( черепашку ) в исходное положение.
# -*- coding: utf-8 -*import t u r t l e # Инициализация t u r t l e. reset () # Здесь могут быть вычисления и команды рисования # turtle._root.mainloop() # для Python 2.4.x и 2.5.x # Эта команда показывает окно, пока его не закроют Как видно из этого примера, способ вызова метода mainloop() для показа графического окна зависит от версии Python. Поэтому если не работает один вариант, смело используйте другой. В остальных примерах будет использоваться вариант для Python 2.6.
Полученное окно имеет фиксированный размер, который зависит от версии Python, перо позиционируется в центре. Идея рисования заключается в перемещении пера ( черепашки ) в точки окна рисования с указанными координатами или в указанных направлениях на заданные расстояния, а также в проведении отрезков прямых, дуг и окружностей.
Текущее направление перемещение пера (соответствующее направлению вперёд ) указывается остриём стрелки изображения черепашки.
Полный список команд управления черепашкой (и, соответственно, рисования), а также функций, обеспечиваемых модулем, можно получить, набрав в окне выполнения любой системы программирования на Python команду help( ’ turtle ’ ).
Список этот довольно длинный, а среди предоставляемых функций имеются также математические, поскольку они могут быть востребованы при вычислении параметров отрезков, дуг и окружностей.
Команды, обеспечивающие рисование, приведены ниже.
goto(x,y) координатами x, y в системе ко- turtle.goto(50,20) color ( ’цвет’ ) circle (r) окружность рисуется против часовой стрелки, если отрицательно по часовой стрелке.
circle (r,k) чек и углом k единиц. Вариант ll ( ag ) ется ( ag =0) режим закрашиваturtle. circle (50) write ( ’строка’ ) При выключенном режиме отображения указателя черепашки рисование происходит значительно быстрее, чем при включённом.
Нужно заметить, что хотя углы поворота исполнителя изначально интерпретируются в градусах, при использовании тригонометрических функций модуля turtle (например, turtle. sin ()) аргументы этих функций воспринимаются Проделаем упражнение с целью определить систему координат окна рисования. Приведённый ниже код формирует картинку, показанную на рис. 3.2.
# -*- coding: utf-8 -*import t u r t l e t u r t l e. reset () x= y= t u r t l e. write ( coords ) x= y= t u r t l e. write ( coords ) x= y= t u r t l e. write ( coords ) x= y= t u r t l e. write ( coords ) x= y= t u r t l e. write ( coords ) x= y= t u r t l e. write ( coords ) t u r t l e. mainloop () Здесь строка с координатами формируется в лоб, путём конкатенации преобразованных в строки значений координат.
Картинка, показанная на рис. 3.3, сформирована нижеследующим кодом.
3.1. Управление исполнителем черепашка # -*- coding: utf-8 -*import t u r t l e t u r t l e. reset () t u r t l e. width (2) x= y= t u r t l e. color ( ’ black ’ ) x= y= x= y= x= y= turtle. width (3) turtle. down ( ) turtle. c o l o r ( ’#aa0000 ’ ) turtle. c i r c l e (80,90) turtle. up ( ) turtle. r i g h t (135) x= y= turtle. goto ( x, y ) turtle. width (2) turtle. color ( ’ black ’ ) turtle. down ( ) turtle. forward (100) turtle. mainloop () Для того, чтобы изобразить улыбку, потребовалось после перемещения пера в начальную точку дуги (левую) повернуть перо на 45 градусов. Дело в том, что изначально направлением вперёд для пера является направление вправо (как показано на рис. 3.1). Окружности и дуги рисуются как касательные к этому вектору, начинаясь в точке с текущими координатами пера. Поэтому для улыбки потребовалось изменить направление вектора.
Далее, перо, первоначально сориентированное на 45 градусов вправо, после прохождения дуги в 90 градусов соответственно изменило своё направление. Поэтому для получения вертикальной линии его пришлось дополнительно повернуть.
Можно поэкспериментировать с рисованием домиков, солнышка и более сложных композиций. Однако для формирования сложных кривых (например, 3.2. Пользовательские подпрограммы и моделирование. Модуль Tkinter графиков функций) с помощью этого модуля придётся многократно выполнять команду goto(x,y). В этом легко убедиться, попытавшись нарисовать, например, график параболы.
3.1.1 Задания и упражнения 1. Как в примерах кода, формирующего изображения на рис. 3.2 и 3.3, применить кортежи?
2. Напишите код для создания изображения домика (квадрат под треугольником) без подъёма пера при условии однократного перемещения по каждой линии.
3. Рассчитайте координаты и напишите код для создания изображения солнца (круг и расходящиеся от него отрезки) так, чтобы лучи начинались на расстоянии 2 точки от круга (не менее 8-ми лучей).
4. Напишите код для построения графика степенной функции (y = axb ) с началом координат в левой нижней четверти окна рисования так, чтобы кривая проходила практически через всё окно.
3.2 Пользовательские подпрограммы и моделирование.
Гораздо более серьёзными возможностями, чем модуль turtle, обладает модуль Tkinter. Основное предназначение этого модуля создание графических интерфейсов (GUI Graphical User Interface) для программ на Python. Но благодаря наличию элемента графического интерфейса (или, как говорят, виджета ) canvas ( холст ) Tkinter можно применять для рисования на основании координат, рассчитанных по формулам, используя доступные элементы векторной графики кривые, дуги, эллипсы, прямоугольники и пр.
Рассмотрим задачу построения графика некоторой функции по вычисляемым точкам с помощью Tkinter.
Поскольку Tkinter позволяет работать с элементами GUI, создадим окно заданного размера, установим для него заголовок и цвет фона холста, а также снабдим окно программной кнопкой. На холсте определим систему координат и нарисуем косинусоиду.
# -*- coding: utf-8 -*import T k i n t e r import math b u t t o n [ " t e x t "]="Закрыть" b u t t o n [ "command"]= t k. q u i t ay = y0 = x0= x1 = dx= y_axe = [ ] yy =(x0, 0 ) y_axe. append ( yy ) yy =(x0, y0+ay ) y_axe. append ( yy ) x_axe = [ ] xx =(x0, y0 ) x_axe. append ( xx ) xx =(x1, y0 ) x_axe. append ( xx ) tk. mainloop () 3.2. Пользовательские подпрограммы и моделирование. Модуль Tkinter Посмотрим на результат (рис. 3.4), и разберём текст примера.
Итак, первые три строки программы понятны устанавливается кодовая страница и подключаются библиотеки. Поскольку в примере должны использоваться тригонометрические функции, необходимо подключить модуль math.
Затем создаётся так называемое корневое окно говоря научным языком, экземпляр интерфейсного объекта Tk, который представляет собой просто окно без содержимого. Для этого окна устанавливается значение свойства title (создаётся заголовок).
Далее начинается заполнение окна интерфейсными объектами ( виджетами widgets). В данном примере используется два объекта кнопка и холст.
Для размещения объекта в окне используется метод pack(), а порядок объектов определяется порядком выполнения этой функции.
Кнопка создаётся как экземпляр объекта Button модуля Tkinter, связанный с корневым окном. Для кнопки можно установить текст надписи (свойство text) и связать кнопку с выполнением какой-либо команды (функции или процедуры), установив значение свойства command.
В приведённом примере кнопка связана с командой закрытия окна и прекращения работы интерпретатора, однако ничто не мешает также закрывать окно нашего приложения обычным образом с помощью стандартной кнопки закрытия окна в верхнем правом углу.
После создания и размещения кнопки создаётся холст. Для элемента (объекта) canvas указываются высота, ширина, цвет фона и отступ от границ окна (таким образом, размеры окна получаются несколько больше, чем размеры объекта canvas). Размеры окна автоматически подстраиваются так, чтобы обеспечить размещение всех объектов (элементов интерфейса).
Прежде чем приступать к рисованию, исследуем систему координат. Поскольку размеры окна уже нами заданы, полезно определить, где находится точка с координатами (0, 0). Как видно из попыток вывести значения координат с помощью метода canvas.create_text(), начало координат находится в верхнем левом углу холста.
Теперь, определившись с координатами, можно выбрать масштабные коэффициенты и сдвиги и сформировать координаты точек для рисования кривой.
При использовании метода canvas. create_line () в качестве координат требуется список пар точек (кортежей) (x,y). Этот список формируется в цикле с шагом dx.
Для линии графика устанавливаются цвет и режим сглаживания. Сглаживание обеспечивает некоторую плавность кривой. Если его убрать, линия будет состоять из отрезков прямых. Кроме того, для линий можно устанавливать толщину, как это показано на примере осей координат.
3.2.1 Моделирование математических функций Пусть требуется построить график функции, выбираемой из заданного списка. Здесь потребуется уже использование дополнительных интерфейсных элементов модуля Tkinter, а также создание собственных (пользовательских) процедур или функций для облегчения понимания кода.
Результат решения задачи (вариант внешнего вида приложения ) показан на рис. 3.5.
Для выбора вида математической функции используется раскрывающийся список, после выбора вида функции и нажатия на кнопку Нарисовать на холсте схематически изображается график этой функции. Кнопка Закрыть закрывает наше приложение. Теперь посмотрим на код.
# -*- coding: utf-8 -*import T k i n t e r import math # Пользовательские процедуры def plot_x_axe ( x0, y0, x1 ) :
3.2. Пользовательские подпрограммы и моделирование. Модуль Tkinter Рис. 3.5: Построение графика для функции, выбираемой из списка def plot_y_axe ( x0, y0, y1 ) :
y_axe. append ( yy ) y_axe. append ( yy ) b=1+((y0y1 ) / ( x1x0 ) ) 3.2. Пользовательские подпрограммы и моделирование. Модуль Tkinter def DrawGraph ( ) :
# Основная часть # Верхняя часть окна со списком и кнопками menuframe=T k i n t e r. Frame ( t k ) # Надпись для списка l b l [ " t e x t "]="Выбор : " # Инициализация и формирование списка f s p i s =T k i n t e r. OptionMenu ( menuframe, f u n c, # Кнопка управления рисованием btnOk=T k i n t e r. Button ( menuframe ) btnOk [ " t e x t "]="Нарисовать" btnOk [ "command"]= DrawGraph # Кнопка закрытия приложения b u t t o n=T k i n t e r. Button ( menuframe ) b u t t o n [ " t e x t "]="Закрыть" b u t t o n [ "command"]= t k. q u i t # Область рисования (холст) tk. mainloop () Основная часть программы (интерфейсная) начинается с момента создания корневого окна (инструкция tk=Tkinter.Tk()). В этом окне располагаются два интерфейсных элемента рамка (Frame) и холст (canvas). Рамка является контейнером для остальных интерфейсных элементов текстовой надписи (метки Label), раскрывающегося списка вариантов (OptionMenu) и двух кнопок. Как видно, кнопка закрытия стала объектом рамки, а не корневого окна, но по-прежнему закрывает всё окно.
Для получения нужного расположения элементов метод pack() используется с указанием, как именно размещать элементы интерфейса (к какой стороне элемента-контейнера их нужно прижимать ).
Есть некоторые тонкости в создании раскрывающегося списка. Для успешного выполнения этой операции нужно предварительно сформировать строку (а точнее, объект Tkinter. StringVar ()) и определить для этого объекта значение по умолчанию (это значение будет показано в только что запущенном приложении).
Затем при определении объекта OptionMenu() список значений дополняется. При 3.2. Пользовательские подпрограммы и моделирование. Модуль Tkinter выборе элемента списка изменяется значение именно этой строки и для дальнейшей работы нужно его анализировать, что и делается в процедуре DrawGraph().
Вычислительная часть, а именно, все процедуры и функции, обеспечивающие вычисления координат точек и рисование линий, вынесена в начало текста программы.
Определение каждой пользовательской подпрограммы обеспечивается составным оператором def. Поскольку эти подпрограммы занимаются только рисованием, они не возвращают никаких значений (т.е. результаты выполнения этих подпрограмм не присваиваются никаким переменным).
Собственно подпрограмма рисования графика DrawGraph() вызывается при нажатии кнопки Нарисовать, и имя этой подпрограммы является командой, которая сопоставляется кнопке.
Эта подпрограмма берёт значение из списка (метод get()), выбирает первый символ получившейся строки и в зависимости от этого символа вызывает другие подпрограммы для построения конкретных графиков с установленными масштабными коэффициентами.
Перед рисованием следующего графика математической функции холст очищается командой canvas. delete (" all ").
Для построения графика каждой функции вычисляются собственные масштабные коэффициенты, поэтому их вычисление включено в код соответствующей подпрограммы. Кроме того, для графика нужны целые значения координат, поэтому в каждой подпрограмме выполняются соответствующие преобразования с помощью функции int ().
Для каждого графика требуется нарисовать оси, и действия по рисованию осей также вынесены в отдельные подпрограммы.
Таким образом, оказывается, что программу нужно читать с конца, и писать тоже.
3.2.2 Моделирование физического явления: тело, брошенное под Теперь создадим небольшое приложение для моделирования движения тела, брошенного под углом к горизонту. Физическая задача формулируется следующим образом:
Тело брошено под углом к горизонту с начальной высоты h0 = 0 и с начальной скоростью v0. Определить величину угла, при которой дальность полёта тела будет максимальной. Сопротивлением воздуха пренебречь.
Основные обозначения для решения задачи показаны на рис. 3.6.
Напишем формулы, по которым определяются координаты тела x и y в зависимости от времени.
Рис. 3.6: Обозначения для задачи о теле, брошенном под углом к горизонту Выразив время через координату x (на основании формулы 3.1) и подставив выражение для времени в формулу для координаты y, получим уравнение траектории y(x):
Поскольку сопротивление при движении тела отсутствует, горизонтальная составляющая скорости изменяться не будет, а изменение вертикальной составляющей определяется влиянием ускорения свободного падения.
Время t0, через которое будет достигнута наивысшая точка траектории, найдём из условия vверт = 0.
Максимальную высоту подъёма H найдём из уравнения вертикального движения (формула 3.2) в момент времени t0.
Полное время полёта T очевидно, равно 2t0, поэтому дальность полёта S определим как Все эти формулы понадобятся для вычисления координат точек траектории и параметров траектории при моделировании.
Текст программы с пользовательскими подрограммами приведён ниже.
3.2. Пользовательские подпрограммы и моделирование. Модуль Tkinter # -*- coding: utf-8 -*Моделирование задачи о теле # брошенном под углом к горизонту import T k i n t e r import math def plot_x_axe ( x0, y0, x1 ) :
def plot_y_axe ( x0, y0, y1 ) :
def DrawGraph ( ) :
# Получаем и пересчитываем параметры # Очищаем область для текста # Считаем g=10, v0 подбираем, чтобы всё влезало в canvas # Собственно график # Параметры графика # Основная часть t k. t i t l e ( "Моделированиеполёта" ) # Верхняя часть окна со списком и кнопками menuframe=T k i n t e r. Frame ( t k ) # Надпись для списка l b l [ " t e x t "]="Выборцвета : " # Инициализация и формирование списка c s p i s=T k i n t e r. OptionMenu ( menuframe, c l i s t, # Кнопка управления рисованием btnOk=T k i n t e r. Button ( menuframe ) btnOk [ " t e x t "]="Нарисовать" btnOk [ "command"]= DrawGraph # Кнопка закрытия приложения b u t t o n=T k i n t e r. Button ( menuframe ) b u t t o n [ " t e x t "]="Закрыть" b u t t o n [ "command"]= t k. q u i t # Надпись для шкалы углов l b l 2 [ " t e x t "]="Угол, градусы : " # Шкала углов # Область рисования (холст) # Установки осей координат x0 =50. y0 =300. x1 =450. y1 =50. # Оси координат plot_x_axe ( x 0 i, y 0 i, x 1 i ) plot_y_axe ( x 0 i, y 0 i, y 1 i ) tk. mainloop () Результат работы с моделью показан на рис. 3.7.
Реализация модели имеет ряд особенностей. Во-первых, величина ускорения свободного падения g принята как 10. Во-вторых, модуль начальной скорости выГлава 3. Графика в Python и задачи моделирования Рис. 3.7: Поиск угла для достижения максимальной дальности на модели бран так, чтобы при любых значениях угла вся траектория попадала в область графика. Не совсем правильно с точки зрения принципа разделения программ и данных установка значений для g и v0 прямо в коде, но такое решение значительно упрощает работу с моделью.
Ползунок на шкале установки углов показывает значения в градусах, а для правильных вычислений в тригонометрических функциях эти значения нужно перевести в радианы.
Высота и дальность полёта пишутся для каждой траектории соответствующим цветом в прямоугольнике в верхнем правом углу. Для каждой следующей траектории этот прямоугольник рисуется заново и текст переписывается.
В этой главе рассмотрены лишь некоторые базовые возможности модуля Tkinter и использования Python для создания моделей. Если возникнет желание более подробно познакомиться с применением объектом и методов этого модуля, можно изучить оригинальную документацию и другие примеры, используя ресурсы Интернет.
3.2.3 Задачи и упражнения 1. Для примера, показанного на рис. 3.4, нанесите на оси метки и проставьте значения в масштабе графика.
3.2. Пользовательские подпрограммы и моделирование. Модуль Tkinter 2. Напишите подпрограмму формирования строки со значениями координат для примера, показанного на рис. 3.2.
3. Напишите подпрограммы для нанесения меток и вывода значений по горизонтальной и вертикальной осям для примера моделирования математических функций.
4. В модели тела, брошенного под углом у горизонту, напишите подпрограммы вывода метки точки падения и метки максимальной высоты для каждой траектории.
5. Модифицируйте код для моделирования полёта так, чтобы можно было изменять начальную скорость, а график автоматически масштабировался в области рисования.
Глава Методические указания для учителей и преподавателей 4.1 Введение. Почему Python?
Выбор в пользу того или иного языка программирования является следствием огромного количества факторов от требований эффективного использования ресурсов вычислительной системы до наличия в нужное время подходящей книжки.
Поэтому, чтобы избежать непродуктивного и спорного сравнения различных языков программирования друг с другом (к тому же, такое сравнение провести крайне трудно ввиду их огромного количества и разнообразия параметров сравнения), рассмотрим только аргументы в пользу выбора языка Python (общепринятое произношение Пит`н, хотя допускается и П`йтон ).
1. Python сравнительно молодой язык. Создавая его в 1990 1991 годах, его автор Гвидо ван Россум (Guido van Rossum) учёл все достоинства и недостатки предшествующих языков программирования.
2. Python имеет достаточно долгую историю развития и использования (почти 20 лет). В настоящее время Python поддерживается обширным международным сообществом разработчиков.
3. Python развивающийся язык, используемый в реальных проектах. Это означает, что его изучение не пройдёт напрасно.
4. Средства для работы с Python относятся к категории свободно распространяемого программного обеспечения (СПО). Это гарантирует во-первых, от каких-либо претензий относительно использования интеллектуальной собственности, а во-вторых, от превращения Python в обозримом будущем в мёртвый язык (вспомните популярный Turbo Pascal).
5. Python имеет обширную область применения. Так, на Python создаются расширения к графическому редактору GIMP, на Python можно программировать в офисном пакете OpenOce.org, на Python пишутся сценарии для пакета 3D-моделирования Blender, на Python написаны системы управления контентом Plone и MoinMoin Wiki, Python активно используется при создании компьютерных игр.
6. Python интерпретируемый язык, что очень удобно при обучении программированию. Интерпретатор Python входит в большинство дистрибутивов GNU/Linux (и разумеется, в ПСПО для школ).
7. Существует множество средств, облегчающих процесс создания программ на Python. Это и специализированные лексические анализаторы, и редакторы для программистов (например, Kate и Bluesh), и интегрированные среды разработки (IDE).
8. Наконец, многие средства для работы с Python являются кросс-платформенными, а в конструкциях языка поддерживаются многобайтные кодировки (Unicode), поэтому программы на Python легко переносятся с одной среды функционирования на другую.
4.2 Требования к программной конфигурации Для успешного проведения практикума по алгоритмизации и программированию на Python на рабочих местах должны быть установлены собственно Python (версия не ниже 2.4), модули Tkinter и NumPy, среды разработки на Python IDLE, Eric или Geany, а также какие-либо эмуляторы терминалов xterm, rxvt и т.п.
В сборке от ALT Linux следует проверить наличие в системе следующих пакетов • python-base • python-doc • python-module-numpy • python-modules • python-modules-encodings • python-modules-tkinter • python-tools-idle Некоторые из перечисленных пакетов будут установлены по зависимостям при установке Python, Eric и Geany с помощью менеджера пакетов, остальные нужно установить вручную.
94 Глава 4. Методические указания для учителей и преподавателей При создании программ (этот процесс обозначается звучным словом разработка ) удобно одновременно видеть текст программы и результаты её выполнения. Хорошо также, если при этом по-разному выделяются ключевые слова, названия функций и их аргументы, а также сразу же показываются строки, содержащие ошибки. Кроме того, бывает полезно выполнять программу по шагам и при этом следить за значениями каких-то переменных. Все эти возможности реализуются в так называемых интегрированных средах разработки (Integrated Development Environment, IDE).
Современные IDE, входящие в дистрибутивы Linux, могут работать с разными языками программирования. Существует IDE, лучше всего приспособленные для работы с одним конкретным языком, которые с другими языками работают, так сказать, факультативно. Кроме того, существуют IDE, которые одинаково успешно обеспечивают работу с самыми разными языками, как в режиме интерпретатора, так и в режиме компилятора.
В зависимости от версии ALT Linux удобно пользоваться либо Geany, либо Eric. Далее будут рассмотрены особенности работы в обоих IDE.
4.3 Основные понятия и определения (глоссарий) В дальнейшем часто придётся использовать термины, связанные с процессом разработки и функционирования программ, поэтому здесь приведён краткий словарик, чтобы уже не возвращаться к проблеме определений. Для составления этого словаря использованы в основном материалы сайта Глоссарий.Ру (http://glossary.ru).
4.3.0.1 Алгоритм Алгоритм точное предписание исполнителю совершить определённую последовательность действий для достижения поставленной цели за конечное число шагов.
4.3.0.2 Данные Данные сведения:
• полученные путём измерения, наблюдения, логических или арифметических операций; и • представленные в форме, пригодной для постоянного хранения, передачи и (автоматизированной) обработки.
4.3.0.3 Тип данных Тип данных характеристика набора данных, которая определяет:
• диапазон возможных значений данных из набора;
• допустимые операции, которые можно выполнять над этими значениями;
• способ хранения этих значений в памяти.
Различают:
• простые типы данных: целые, действительные числа, символы, строки, логические величины;
• составные типы данных: массивы, файлы и др.
4.3.0.4 Программа Программа согласно ГОСТ 19781-90 данные, предназначенные для управления конкретными компонентами системы обработки информации в целях реализации определённого алгоритма.
4.3.0.5 Алгоритмический язык (язык программирования) Язык программирования искусственный (формальный) язык, предназначенный для записи алгоритмов. Язык программирования задаётся своим описанием и реализуется в виде специальной программы: компилятора или интерпретатора.
4.3.0.6 Транслятор языка программирования Транслятор в широком смысле программа, преобразующая текст, написанный на одном языке, в текст на другом языке.
Транслятор в узком смысле программа, преобразующая: программу, написанную на одном (входном) языке в программу, представленную на другом (выходном) языке.
Транслятор языка программирования программа, преобразующая исходный текст программы на языке программирования в машинный язык вычислительной системы, на которой эта программ должна выполняться.
4.3.0.7 Интерпретатор Интерпретатор транслятор, способный параллельно переводить и выполнять программу, написанную на алгоритмическом языке высокого уровня.
4.3.0.8 Компилятор Компилятор программа, преобразующая текст, написанный на алгоритмическом языке, в программу, состоящую из машинных команд. Компилятор создаёт законченный вариант программы на машинном языке.
96 Глава 4. Методические указания для учителей и преподавателей 4.3.0.9 Константа Константа в программировании элемент данных, который занимает место в памяти, имеет имя и определённый тип, причём его значение никогда не меняется.
4.3.0.10 Переменная Переменная в языках программирования именованная часть памяти, в которую могут помещаться разные значения. Причём в каждый момент времени переменная имеет единственное значение (или единственный набор значений). В процессе выполнения программы значение переменной может изменяться.
Тип переменных определяется типом данных, которые они представляют.
4.3.0.11 Подпрограмма Подпрограмма самостоятельная часть программы, которая разрабатывается независимо от других частей и затем вызывается по имени.
4.3.0.12 Функция Подпрограмма, которая на основе некоторых данных (аргументов функции) вычисляет значение некоторой переменной ( функция возвращает значение ).
4.3.0.13 Объект Понятие объектно-ориентированного программирования, программный модуль, объединяющий в единое целое данные и программы, манипулирующие данными. Объект характеризуется свойствами, которые являются параметрами объекта и методами, которые позволяют воздействовать на объект и его свойства.
4.3.0.14 Метод Действие в виде процедуры, которое выполняется объектом (иногда говорят – выполняется над объектом).
4.3.0.15 Идентификатор Идентификатор символьное имя переменной или подпрограммы, которые однозначно идентифицируют их в программе.
4.3.0.16 Выражение Выражение конструкция на языке программирования, предназначенная для выполнения вычислений. Выражение состоит из операндов, объединённых знаками операций. Различают арифметические, логические и символьные выражения.
4.3.0.17 Операнд Операнд константа, переменная, функция, выражение и другой объект языка программирования, над которым производятся операции.
4.3.0.18 Арифметическая операция Арифметическая операция вычислительная операция над числами.
Во многих языках программирования определены двуместные арифметические операции: сложения, вычитания, умножения, деления, деления нацело, вычисление остатка от деления.
4.3.0.19 Логическая операция Логическая операция операция над логическими ( булевскими ) операндами, принимающими значения Истина или Ложь. Наиболее распространёнными являются следующие операции:
• многоместное логическое сложение;
• многоместное логическое умножение;
• одноместное логическое отрицание.
( Многоместная операция означает, что в ней может два и более операндов, а в одноместной или унарной операции участвует только один операнд).
4.3.0.20 Операция отношения Операция отношения производит сравнение двух величин. Результат операции отношения является булевской переменной, принимающей значение Истина (True или логическая 1) или Ложь (False или логический 0).
4.3.0.21 Массив (массив данных) Совокупность, как правило, однотипных данных, каждое из которых идентифицируется с именем массива и индексом (индексами).
В зависимости от количества индексов массивы бывают одномерные (линейные), двухмерные и т.д.
98 Глава 4. Методические указания для учителей и преподавателей 4.3.0.22 Индекс Номер (или номера, если массив данных многомерный), добавляемый к имени массива, чтобы идентифицировать каждый элемент данного массива.
Например, a[1, 3] означает, что определён элемент двухмерного массива a с индексом 1,3 (строка 1, столбец 3).
4.3.0.23 Присваивание Операция записи значения в переменную. Во многих языках программирования определён оператор присваивания. Если в переменную записывается новое значение, старое стирается.
4.3.0.24 Цикл Цикл (циклические вычисления) означают многократное выполнение одних и тех же операций. В зависимости от задачи различаются циклы с переменной (со счётчиком, с известным количеством повторений) и циклы с условием (цикл повторяется, пока не выполнится условие завершения цикла).
4.3.0.25 Зацикливание Для циклов с условием ситуация, при которой условие завершения цикла никогда не выполняется.
4.4 Использование IDE Geany Один из вариантов IDE для работы с Python кросс-платформенный пакет Geany. В программном меню Geany обычно находится в разделе Разработка (или Разработка/Прочее ). Внешний вид окна Geany при первом запуске показан на рис. 4.1.
Центральная часть окна предназначена для размещения вкладок с текстами программ, в нижней части размещается несколько вкладок. Некоторые из этих вкладок будут полезны в дальнейшем, а некоторые при работе с Python (например, вкладка Компилятор ) не нужны. В панели инструментов часть кнопок недоступна (кнопки имеют серый цвет). Пока нет текста программы, для этих кнопок нет работы.
В нижней части окна находится несколько вкладок. Вкладка Статус фиксирует историю открытия и закрытия файлов с текстами программ, а на вкладке Компилятор отображаются сообщения компилятора при компиляции исходного текста (компиляция запускается кнопкой Скомпилировать текущий файл в панели инструментов). Понятно, что вкладка Компилятор требуется только для работы с компилируемыми программами (C, Pascal и т. п.).
Вкладка Заметки может использоваться как своего рода блокнот для записи каких-то замечаний и пожеланий, а вкладка Терминал является встроенИспользование IDE Geany ным в Geany эмулятором терминала (Virtual terminal Emulator VTE). Однако в дальнейшем будет использоваться внешний эмулятор терминала xterm.
4.4.1 Первоначальная настройка Первоначальная настройка полезна для создания комфортной среды обитания в IDE. Разумеется, в каждом конкретном случае важны личные предпочтения, а здесь рассмотрим параметры настройки и разумные значения параметров для работы с Python в рамках Практикума.
Для вызова диалога настроек используется команда главного меню Правка/Настройки или комбинация клавиш ++. Диалог содержит несколько вкладок (рис. 4.2) и начинается всё с общих настроек.
На вкладке Общие диалога настройки Geany имеет смысл установить режимы Загрузить файлы из последней сессии и Сохранять позицию и размеры окна. Что касается режима Загружать виртуальный терминал то при использовании внешнего эмулятора терминала (в нашем случае xterm) он не нужен.
Отключение этого режима приведёт к исчезновению вкладки Терминал в нижней части окна Geany, а также к исчезновению вкладки Терминал в диалоге настроек Geany при его последующем вызове.
Режим Включить поддержку плагинов нужен для автоматического вызова интерпретаторов и компиляторов языков программирования. Если для плагинов не указан дополнительный путь, Geany будет использовать пути из системы.
100 Глава 4. Методические указания для учителей и преподавателей Рис. 4.2: Диалог настройки Geany общие настройки Рис. 4.3: Настройки внешнего вида IDE Geany Рабочий каталог и каталог для файлов проекта можно установить (набрав путь в строке ввода или нажав на кнопку Открыть папку справа от строки ввода), но это не обязательно при включённом режиме Загрузить файлы из последней сессии.
За внешний вид Geany отвечают три вкладки диалога настроек – Интерфейс, Панель инструментов и Редактор. На рис. 4.3 показана вкладка Интерфейс.
На вкладке Интерфейс имеет смысл только настроить шрифты для области редактора и других панелей. Диалог выбора шрифтов (рис. 4.4) вызывается нажатием на кнопку с названием шрифта.
Шрифты каждый выбирает для себя, в частности, автор предпочитает для редактирования программ использовать моноширинные шрифты (в именах которых содержится слово Fixed ).
Боковая панель при использовании режимов, показанных на рис. 4.3, будет иметь две вкладки Теги и Документы. На вкладке Документы отображается список открытых документов, а на вкладке Теги при работе с языками программирования отображаются имена переменных с номерами строк, в которых эти переменные определяются и используются, а также имена использованных в программе функций с номерами строк, в которых эти функции определяются и используются.
На вкладке Панель инструментов (рис. 4.5), очевидно, должен быть включён режим Показывать панель инструментов. Включение режима Добавить панель инструментов в меню приведёт к тому, что панель инструментов станет продолжением строки главного меню. В большинстве случаев это нецелесообразно, поэтому такой режим включать не рекомендуется.
Для внешнего вида панели инструментов разумно выбрать вариант Только иконки, а размер иконок выбрать по вкусу.
Если есть желание изменить набор видимых инструментов Geany, можно использовать диалог настройки панели инструментов (кнопка Настроить панель инструментов ). Диалог настройки показан на рис. 4.6.
В этом диалоге можно перемещать доступные элементы из левой панели в область отображаемых элементов (правую панель) кнопкой Стрелка вправо и убирать отображаемые элементы из панели кнопкой Стрелка влево (кнопки находятся в центре окна диалога). Изменение порядка кнопок, как следует из 102 Глава 4. Методические указания для учителей и преподавателей Рис. 4.5: Настройка панели инструментов в Geany Рис. 4.6: Диалог настройки панели инструментов Geany подсказки этого диалога, достигается путём перетаскивания выбранных элементов.
На панели инструментов Geany (рис. 4.1) имеется строка ввода слова для поиска и кнопка поиска, но отсутствуют часто используемые кнопки Вырезать, Копировать и Вставить. Поэтому при начальной настройке имеет смысл убрать строку поиска из панели и добавить нужные кнопки, расположив их примерно так, как показано на рис. 4.7.
Важно не забыть закрыть диалог настройки панели инструментов (кнопка Закрыть и применить сделанные изменения (кнопка Применить на вкладке Панель инструментов диалога настроек Geany).
Вид окна программы после изменений показан на рис. 4.17.
Рис. 4.7: Изменение панели инструментов Geany Рис. 4.8: Geany с отключённым терминалом и модифицированной панелью инструментов 104 Глава 4. Методические указания для учителей и преподавателей Рис. 4.10: Настройки отступов для работы с Python в Geany Вкладка для настроек редактора (рис. 4.9) в свою очередь, является многостраничным диалогом.
На листе Возможности следует проследить, что включены режимы Перенос строк и Включить сворачивание блоков кода. На листе Отступы (рис.
4.10) нужно установить ширину отступа в 4 символа (в соответствии с правилами Python) и тип отступа – Пробелы. Режим Отступ при помощи клавиши Tab можно оставить без изменений.
На листе Завершение (рис. 4.11) при желании можно настроить режимы авто-завершения слов и автоматического создания парных скобок, однако начальные настройки являются достаточно разумными и без особой необходимости их менять не нужно.
Рис. 4.11: Настройки авто-завершения в редакторе Geany Рис. 4.12: Настройка отображения структуры программы в редакторе Geany На листе Отображение в настройках редактора (рис. 4.12) нужно обязательно включить режимы Показывать индикаторы отступа, Показывать чистые пробелы и Показывать номера строк. Кнопка Цвет маркера длинной строки открывает диалог выбора цвета для GTK (рис. 4.13). Этим цветом будет обозначена вертикальная линия в окне редактора (условная правая граница текста).
В диалоге выбора цвета можно крутить треугольник по цветному кольцу, перетаскивая мышью чёрный отрезок и перетаскивать мышью чёрный кружочек в пределах треугольника. Результат тут же будет показан в палитрах HSV ( Тон-Насыщенность-Значение ) и RGB ( Красный-Зелёный-Синий ), а также в виде HTML-эквивалента ( Называние цвета ). И наоборот, можно в помощью 106 Глава 4. Методические указания для учителей и преподавателей Рис. 4.13: GTK-диалог выбора цвета для обозначения правой границы текста в Рис. 4.14: Настройка обработки файлов в Geany полей ввода в диалоге установить нужный цвет и он будет показан в треугольнике соответствующей ориентации. Использование кнопки пипетка позволяет получить цвет с любой точки экрана. Под цветным кольцом с треугольником показывается сравнение выбранного цвета с текущим.
На вкладке Файлы диалога настроек Geany (рис. 4.14) определяются режимы обработки файлов. Здесь можно ничего не менять, только следует обратить внимание на то, что для всех сохраняемых файлов устанавливается одинаковая кодировка. Geany корректно открывает файлы в различных кодировках, но сохраняет всегда в одной и той же.
На вкладке Сервис определяются внешние программы (утилиты), которые используются Geany для обработки исходных текстов (рис. 4.15).
Как раз здесь и определяется программа, которая будет использоваться в качестве эмулятора терминала. Как уже отмечалось выше, будет использоваться xterm.
Оставшиеся вкладки ( Шаблоны, Привязки и Печать ) диалога настроек Geany пока не представляют интереса.
4.4.2 Подключение документации и её использование Очень важно иметь возможность быстро открыть документацию. После установки пакета python-doc оригинальная документация находится в каталоге /usr/share/doc/python-doc-x.y.z, где x.y.z версия Python (например, /usr/share/doc/python-doc-2.5.2).
Самый простой путь подключения документации запустить любой браузер (Konqueror или Firefox), выбрать в главном меню команду Файл/Открыть файл... и в диалоге выбора файлов в иерархии корневого каталога найти /usr/share/doc/python-doc-x.y.z/index.html. После этого в браузере можно добавить этот адрес в закладки.
Общий вид документации по Python в браузере показан на рис. 4.16. Ссылки на документацию по Python на русском языке можно найти в разделе Документация на сайте python.ru. Освоение языка на основе документации из пакета python-doc требует от начинающих значительных усилий, поэтому на начальном этапе рекомендуется пользоваться источниками из прилагаемого к Практикуму списка литературы.
108 Глава 4. Методические указания для учителей и преподавателей Рис. 4.16: Документация по Python (главная страница) Рис. 4.17: Текст программы в окне редактора до сохранения 4.4.3 Сохранение и открытие файлов, запуск выполнения программ Текст программы пишется в окне редактора, и пока он не сохранён, на ярлычке активной вкладки имя файла выделено красным цветом (рис. 4.17). Кроме того, для вновь набранного текста программы отсутствует подсветка синтаксиса, поскольку анализатор синтаксиса пока не знает языка, на котором написан этот файл.
Для сохранения файла используется команда главного меню Файл/Сохранить (или Файл/Сохранить как... при первом сохранении), что равносильно использованию комбинации клавиш +.
Рис. 4.18: GTK-диалог сохранения (открытия) файла Выбор этой команды открывает GTK-диалог сохранения/открытия файла (рис. 4.18). Для получения возможности сохранения файла в каталоге по выбору пользователя нужно щёлкнуть по стрелочке слева от пояснения Просмотреть другие папки. Тогда в диалоге будут показаны дополнительные панели Места и Имя. На панели Места приводится список наиболее часто используемых мест в файловой системе, а на панели Имя показан список каталогов и файлов в выбранном месте. Для переключения на новое место нужен одиночный щелчок левой кнопкой мыши в панели Места, а для открытия папки (каталога) в панели Имя нужен двойной щелчок левой кнопки мыши независимо от настроек пользовательской среды в сеансе.
Если выделить каталог в панели Имя одиночным щелчком левой кнопкой мыши, то его можно добавить в список мест в помощью кнопки Добавить, расположенной под панелью Места.
При сохранении необходимо указать имя и расширение файла (для текстов на Python.py, как показано на рис. 4.18), иначе не будет работать анализатор синтаксиса.
При нажатии на кнопку Сохранить закрывается диалог сохранения и в окне редактора включается подсветка синтаксиса, а также появляется список переменных в панели Теги (рис. 4.19). В списке тегов число в квадратных скобках справа от имени переменной означает номер строки, в которой первый раз определена эта переменная.
110 Глава 4. Методические указания для учителей и преподавателей Рис. 4.19: Подсветка синтаксиса и теги для программы на Python Рис. 4.20: Сообщение интерпретатора об ошибке, связанной с отсутствием указания кодовой страницы Для открытия файла удобно использовать список последних файлов (команда Файл/Недавние файлы ).
Для запуска программы на выполнение (точнее, на трансляцию и выполнение интерпретатором Python) используется клавиша или кнопка Запустить или посмотреть текущий файл в панели инструментов.
4.4.4 Обработка ошибок Самая первая ошибка при создании программы на Python пропуск строки с указанием кодовой страницы. Именно такая ошибка допущена в рассмотренном выше примере. На рис. 4.20 показано сообщение интерпретатора после запуска этого примера. (Закрыть окно терминала можно нажатием на ).
В случае незакрытых кавычек или скобок Geany отмечает цветом символ, не имеющий пары (рис. 4.21).
Ошибки в именах функций, ключевых словах и составных операторах сопровождаются сообщениями интерпретатора при запуске программы на выполнение.
Для каждой ошибки указывается номер строки и (по возможности) причина возникновения ошибки.
Рис. 4.22: Синтаксическая ошибка: неверное имя функции В случае синтаксических ошибок и ошибок времени выполнения ( исключения exception в терминах Python) программа завершается с кодом 1.
Если программа завершается с кодом 0 (в терминале сообщение (program exited with code: 0), но работает неверно, то такая ошибка называется семантической и по сути является ошибкой в алгоритме. Такие ошибки выявляются только при тестировании программы на контрольных примерах.
4.5 Использование IDE Eric Элемент программного меню для вызова IDE Eric также находится в группе программ Разработка. Внешний вид окна Eric при первом запуске показан на рис. 4.25. Центральная часть окна (в которой находится картинка с троллем Эриком) предназначена для размещения вкладок с текстами программ, нижняя часть окно выполнения программы (панель Оболочка ). В окне Eric много 112 Глава 4. Методические указания для учителей и преподавателей Рис. 4.23: Ошибка времени выполнения: несоответствие типов (попытка поделить Рис. 4.24: Ошибка времени выполнения: несоответствие количества элементов различных панелей инструментов, и очень многие кнопки недоступны (закрашены серым). Пока нет текста программы, для этих кнопок нет работы.
4.5.1 Первоначальная настройка Можно упростить вид окна, убрав лишние области ( панели ), такие как панель Просмотрщик проекта слева от изображения Эрика и панель Просмотрщик шаблонов справа от изображения Эрика.
Нажатие кнопки с изображением пустого листа в левой части самой верхней панели инструментов (кнопка Новый ) приведёт к созданию нового документа, а внешний вид окна слегка изменится, и некоторые кнопки в панелях инструментов станут активными (рис. 4.26).
Ещё больше упростить внешний вид можно, убрав лишние панели инструментов. Если открыть пункт главного меню Окно, то во вложенном меню Панели инструментов целесообразно оставить включёнными (с галочками ) панели Закладки, Профили, Редактировать и Файл ( галочки ставятся и убиГлава 4. Методические указания для учителей и преподавателей раются щелчком левой кнопкой мыши). Тогда окно IDE Eric приобретёт совсем простой вид (рис. 4.27, показан пример кода при настроенной подсветке синтаксиса).
Если хочется что-то изменить во внешнем виде программы, можно использовать настройки предпочтений ( Настройка/Предпочтения... в главном меню окна Eric). Настроек очень много (рис. 4.28), но имеет смысл пока изменять только основные настройки редактора (как показано на рис. 4.28) и стиль редактора (рис. 4.29).
В диалоге настройки основных свойств редактора полезно установить режимы показа номеров строк, полосы свёртки, пробелов и линий отступа. Полезно также включить режим подсветки скобок и автоматической проверки синтаксиса (в этом случае известные Eric слова и конструкции Python будут выделяться цветом, а неизвестные не будут), Также полезно использование режима автоматических отступов, которые обсудим позже.
Рис. 4.27: Максимально упрощённый вид IDE Eric Рис. 4.28: Основные настройки редактора в IDE Eric 116 Глава 4. Методические указания для учителей и преподавателей Рис. 4.29: Настройка стиля редактора в IDE Eric В диалоге настройки стилей редактора (рис. 4.29) кнопки Шрифт для номеров строк и Моноширинный шрифт открывают диалоги выбора шрифта, в которых можно выбрать наиболее приятный для пользователя шрифт. Здесь каждый выбирает для себя, в частности, автор предпочитает для редактирования программ и для вывода сообщений IDE использовать моноширинные шрифты (в именах которых содержится слово Fixed ).
Если есть желание изменить вид, размер и цвет подсветки для элементов языка, можно использовать диалог настройки стилей подсветки в Настройках предпочтений, выбрав вариант Python из списка языков, известных лексическому анализатору (рис. 4.30).
4.5.2 Подключение документации и её использование Очень важно правильно настроить параметры помощи и документации (диалог Помощь, рис. 4.31). Здесь указываются варианты просмотрщика помощи IDE Eric, браузера и программы просмотра файлов PDF, а также путь к каталогу с документацией по Python. Нужно заметить, что этот каталог должен существовать, то есть документация по Python (пакет python-doc или что-то похожее) должна быть установлена в системе.
Рис. 4.30: Диалог настройки подсветки синтаксиса Программы для просмотра web и файлов pdf можно выбрать по вкусу, узнав предварительно у администратора (или другого специалиста) как называются эти программы и где они находятся в системе.
Каталог документации по Python также нужно указывать реально существующий.
После завершения настроек попробуем воспользоваться системой помощи IDE Eric (меню Помощь, рис. 4.32).
Выбор пункта Просмотрщик помощи... приводит к появлению пустого окна, в котором можно просматривать любые html-файлы. Фактически это браузер, встроенный в оболочку Eric, и его можно использовать как для работы в web, так и с файлами html в локальных каталогах.
Выбор пункта Документация Eric открывает документацию по пакету Eric (рис. 4.33), которая на данном этапе не нужна.
Выбор пункта Документация Python открывает html-руководство по Python, написанное автором языка, но, к сожалению, на английском (рис. 4.34).
Это та же самая документация из пакета python-doc, которая обсуждаласчь ранее.
118 Глава 4. Методические указания для учителей и преподавателей Рис. 4.31: Настройка помощи и документации Рис. 4.32: Меню Помощь IDE Eric 4.5.3 Сохранение и открытие файлов, запуск выполнения программ Текст программы пишется в окне редактора, и пока он не сохранён, на ярлычке активной вкладки показан значок с изображением листа бумаги и карандаша (рис. 4.35).
Для сохранения файла используется команда главного меню Файл/Сохранить (или Файл/Сохранить как... при первом сохранении), что равносильно использованию комбинации клавиш +S.
Выбор этой команды открывает диалог сохранения/открытия файла (рис.
4.36). Для открытия папки (каталога) в этом диалоге нужен двойной щелчок мышью независимо от настроек пользовательской среды в сеансе.
Для открытия файла удобно использовать список последних файлов (команда Файл/Открыть недавние файлы ).
Для запуска программы на выполнение (точнее, на трансляцию и выполнение интерпретатором Python) используется клавиша, нажатие на которую приводит к открытию диалога запуска программы (сценария, скрипта рис.
4.37).
Здесь можно указать имя файла программы (программа не обязательно должна быть открыта в окне редактора) и при необходимости, аргументы скрипта. Однако для программы, открытой в активной вкладке редактора, можно не указывать имя, а сразу нажать. Таким образом, кратчайший вариант запуска выполнения программы в IDE Eric последовательное нажатие клавиш Если перед запускам пропущен (забыт) этап сохранения изменений Eric напомнит и позволит сохранить последнюю версию программы и выполнить её или выполнить предыдущий вариант программы (рис. 4.38).