Skip to content

Latest commit

 

History

History

lab03

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

Lab 3: Функции, списки, файлы и черепаха

Лаба: http://cs.mipt.ru/python/lessons/lab3.html.

В качестве ДЗ достаточно решить четыре задачи: одну по функциям, две по спискам + файлам (один блок задач по двум темам) и одну по Черепахе.

Функции

Задача Ф1 (График)

Начертите график какой-нибудь функции с помощью функции plot библиотеки matplotlib, но при построении графика задайте:

  • тип линии (например, сплошная или пунктирная)
  • ширину линии
  • цвет линии
  • тип точек, по которым строится график ("маркеры")
  • размер точек
  • цвет точек
  • ширину границы точек
  • цвет границы точек

Result of plt.plot with many params

Пример графика, построенного с помощью plt.plot и кучи параметров.

Задача Ф2 (Сигнатура, или "Шапка" функции)

Напишите функцию f, которая печатает на экране одну строку и которую можно бы было вызывать следующим образом:

# Определение функции f от скольких-то параметров
# ...

f('a', 'b')                 # a b b c a
f('b', 'a')                 # b b a c a
f('a', 'b', 'f')            # a b b f a
f('a', 'b', d='d')          # a d b c a
f('*', '*', '*', '*', '*')  # * * * * *

Задача Ф3* (Непостоянная)

Напишите функцию, которая печатает на экране строку, причём результат (конкретный вывод) чередуется в зависимости от вызова. То есть: первый раз вызвали функцию — на выходе одна строка, второй раз вызвали — другая, ещё один вызов — и функция выводит первоначальную строчку, и так далее.

Пример:

# Определение "непостоянной" функции-флюгера vane_print
# ...

# Использование функции (после вызова в комментарии указан вывод)
vane_print()  # попка
vane_print()  # дурак
vane_print()  # попка
vane_print()  # дурак

Списки + Файлы

Задача СФ1 (Число нулей)

В текстовом файле записана следующая информация: в первой строчке указано количество чисел $n$, и в последующих $n$ строках идут целые числа, по одному на строку.

Напишите программу, которая считает, сколько нулей на конце у самого большого числа, и ответ записывает в новый файл result.txt.

Например, если на вход программе дать файл СФ1.txt, то она должна будет записать в качестве ответа число 2 (так как самое большое число, записанное во входном файле, это 1700, и у него на конце два нуля).

Задача СФ2 (Траты)

Маша не транжира, но деньги тратит часто (и ничего плохого в этом не видит).

В текстовом файле СФ2.txt построчно записаны категории её трат в течение некоторого времени (то есть именно категории, без указания суммы). Напишите программу, определяющую самую частую категорию трат Маши. Ответ запишите в файл result.txt.

Задача СФ3 (Реклама между строк)

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

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

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

Например, пусть входной файл — это файл СФ3.txt со стихотворением Фёдора Тютчева "Она сидела на полу...":

Она сидела на полу
И груду писем разбирала —
И, как остывшую золу,
Брала их в руки и бросала —
Брала знакомые листы
И чудно так на них глядела —
Как души смотрят с высоты
На ими брошенное тело...
И сколько жизни было тут,
Невозвратимо пережитой —
И сколько горестных минут,
Любви и радости убитой…
Стоял я, молча, в стороне
И пасть готов был на колени, —
И страшно-грустно стало мне,
Как от присущей милой тени...

И пусть список рекламных слоганов такой:

adverts = [
    "Пяточками А, пяточками ЗОТ. Все ботинки на АЗОТ. Готовьте пяточки.",
    "Кредит с кешбэком, 10%. Гамма-банк."
]

Тогда результат работы программы:

Она сидела на полу
И груду писем разбирала —
И, как остывшую золу,
Брала их в руки и бросала —
(Пяточками А, пяточками ЗОТ. Все ботинки на АЗОТ. Готовьте пяточки.)
Брала знакомые листы
И чудно так на них глядела —
Как души смотрят с высоты
На ими брошенное тело...
(Кредит с кешбэком, 10%. Гамма-банк.)
И сколько жизни было тут,
Невозвратимо пережитой —
И сколько горестных минут,
Любви и радости убитой…
(Пяточками А, пяточками ЗОТ. Все ботинки на АЗОТ. Готовьте пяточки.)
Стоял я, молча, в стороне
И пасть готов был на колени, —
И страшно-грустно стало мне,
Как от присущей милой тени...
(Кредит с кешбэком, 10%. Гамма-банк.)

Задача СФ4 (Reverse)

В текстовом файле записаны числа, причём в первой строчке указано количество чисел $n$, и в последующих $n$ строках идут уже сами числа, по одному на строку.

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

Например, если на вход программе дать файл СФ1.txt, то она должна будет создать новый текстовый файл reverse.txt следующего содержания:

-256
111
1700
195
20
-100
12

Задача СФ5 (Чётные элементы1)

В текстовом файле — например, в файле СФ5.txt — дан список чисел: первая строка — количество чисел $n$, и далее по числу на каждой из следующих $n$ строк.

Запишите в файл result.txt все чётные числа, по одному на строке. Числа должны идти в том же порядке, что и в исходном файле.

Пример:

# Вход (три числа):
3
1
2
3

# Выход:
2

Задача СФ6 (Больше своих соседей2)

В текстовом файле — например, в файле СФ6.txt — дан список чисел: первая строка — количество чисел $n$, и далее по числу на каждой из следующих $n$ строк.

Определите, сколько в этом списке элементов, которые больше двух своих соседей, и запишите ответ в файл answer.txt. Крайние элементы списка учитывать не надо, потому что у них нет двух соседей.

Пример:

# Вход (три числа):
3
1
3
2

# Выход:
1

Задача СФ7 (Наибольший элемент3)

В текстовом файле — например, в файле СФ6.txt — дан список чисел: первая строка — количество чисел $n$, и далее по числу на каждой из следующих $n$ строк.

Запишите в файл result.txt значение наибольшего числа, а затем на новой строке ещё и индекс этого числа в списке. Если наибольших элементов несколько, выведите индекс первого из них.

Пример:

# Вход (три числа):
3
1
3
2

# Выход (в Питоне индексация начинается с нуля):
3
1

Задача СФ8 (Переставить min и max4)

В текстовом файле — например, в файле СФ8.txt — дан список чисел: первая строка — количество чисел $n$, и далее по числу на каждой из следующих $n$ строк. Все числа различны.

Поменяйте местами минимальное и максимальное число. Результат (список чисел с заменой мест) запишите в файл result.txt, по одному числу на строке.

Пример:

# Вход (три числа):
3
1
3
2

# Выход:
3
1
2

Черепаха

Задача Ч1 (Газ из черепашек)

Упражнение из лабы. (Далее идёт копия условия с сайта.)

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

import turtle
from random import randint


num_turtles = 5
num_steps = 100

spawn_border = 200
turtle_speed = 50
one_step = 2

turtles = []

for i in range(num_turtles):
    new_turtle = turtle.Turtle(shape='turtle')
    turtles.append(new_turtle)

for turtle in turtles:
    turtle.penup()
    turtle.speed(turtle_speed)

    x = randint(-spawn_border, spawn_border)
    y = randint(-spawn_border, spawn_border)
    turtle.goto(x, y)

for i in range(num_steps):
    for turtle in turtles:
        turtle.forward(one_step)

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

Turtle Gas

Газ из черепашек (gif).

Задача Ч2 (Вальс черепашек)

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

Waltz of the Turtles

Вальс черепашек (gif).

Задача Ч3 (Вызов Ктулху)

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

The Call of Cthulhu

Вызов Ктулху (gif).

Задача Ч4 (Заставка Windows)

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

Ещё на "старом Windows" было много популярных вариантов таких заставок. Например, заставка с "трансформирующейся загогулиной". Или заставка с объектом, двигающимся по прямой по экрану и отскакивающим от стенок. В данной задаче с помощью черепашек как раз предлагается реализовать вариант подобной заставки.

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

Ниже показано несколько примеров возможных "черепашьих заставок":

Chemical Flask

Химическая колба (gif).

Flower

Цветочек (gif).

Footnotes

  1. https://pythontutor.ru/lessons/lists/problems/even_elements.

  2. https://pythontutor.ru/lessons/lists/problems/more_than_neighbours.

  3. https://pythontutor.ru/lessons/lists/problems/maximal_element.

  4. https://pythontutor.ru/lessons/lists/problems/swap_min_and_max.

  5. ...Это как? 😅