Двумерные структуры
Списки: повторение
Индексация и хранение произвольных элементов
Вводить в цикле строки (конец ввода — пустая строка), а затем вывести их в отсортированном порядке
просто складывать в список, а затем либо список.sort(), либо уже когда выводим — цикл по sorted(список)
- Предположим, что несколько строк одинаковой длины — это наш «экран»
- Начальная (нулевая) строка «экрана» — вверху, затем — первая и т. д.
как узнать, какой символ стоит в позиции строка № M, символ № N?
экран[M][N]
Этот экран неудобно менять.
- Как хранить «матрицу» — прямоугольник из чисел, вроде такого?
1 2 3 4 5 6 7 8 9 10 11 12
- Список списков.
модифицировать первое упражнение: ввод списка (числа через запятую) с помощью list(eval(input)) (если не делать list(), то без квадратных скобок получится tuple, а нам нужно его менять), сортировка всего списка списков (сами списки сортировать не надо), вывод
Ввести квадратную матрицу (квадратность гарантируется), вывести её основную диагональ
- Высота матрицы равна длине первой строки. Введём первую строку, возьмём её длину и довведём остальные.
- Диагональ — это просто элементы, у которых номер строки совпадает с позицией в строке
… вывести вторую диагональ (а там какая формула?)
Проход всех элементов двумя вложенными циклами
Ввести матрицу, затем ещё одно число. Проверить, что все элементы матрицы делятся на это число.
Списковые сборки
Вида [выражение for переменная in последовательность]
Вида [[выражение2 for переменная2 in последовательность-выражение] for переменная in последовательность]
Вида [выражение for переменная1 in последовательность1 for переменная2 in последовательность2]
Модифицируем первое упражнение: будем вводить произвольные строки с помощью list(input()) (но без eval), а затем сразу выводить, не сортируя
Какая структура данных получится?
- Проверим себя)
Как вывести такую структуру в виде «экрана»?
Подсказка: у нас есть метод .join(), и нам поможет "".join(строка)
Написать функцию out(экран), в которую передаётся наш экран (т. е. массив массивов односимвольных строк), а она его красиво выводит
Перевернуть, наконец, экран (чтобы координаты [0][0] были слева внизу
Позаписывать в экран произвольные символы в произвольные места и повыводить результат
- Обратите внимание на то, что первая координата — это ордината (Y), а вторая — абсцисса (X)
Как провести диагональ на этом экране? Вторую диагональ?
Как провести горизонтальный отрезок? Вертикальный?
Напишем две функции — hline(x0, y0, x1) и vline(x0, y0, y1)
Как провести произвольную прямую?
$$ w = x_1 - x_0; h = y_1 - y_0; w_2 = x_2 - x_0; h_2 = y_2 - y_0 $$
Пропорция: $$ h/w = h_2/w_2 $$
т. е. $$ h_2 = (h * w_2)/w $$
т. е. $$ (y_2 - y_0) = ((y_1 - y_0) * (x_2 - x_0)) / (x_1 - x_0) $$
и значит $$ y_2 = y_0 + ((y_1 - y_0) * (x_2 - x_0)) / (x_1 - x_0) $$
Вариант решения: пройти по всем $$x_2$$ от $$ x_0 $$ до $$ x_1 $$ и вычислить соответствующий $$y_2$$
Написать функцию для этого
TODO Ещё?
Д/З
Отщёлкать девятое занятие учебника и решить все задачи
Скопировать решения в соответствующие файлы и проверить, что они всё ещё работают!
Имена файлов — от prog_9_1.py до prog_9_6.py
Прислать эти 6 файлов в виде шести приложений к одному письму по адресу <uneexlectures AT cs DOT msu DOT ru>
В поле Subject должно быть «слово» PhilosoPython2022 (другие слова тоже можно ☺)