Задачи на процедуры и функции

54 задачи
Число у задачи — рейтинг сложности, слово рядом — насколько она трудна по сравнению с другими задачами такого же типа. Шкалы задач с ответом и задач с кодом между собой не сравниваются. Рядом — счётчики попыток: успешные, неуспешные.

Часть 1: Функция «Здание»

Напиши функцию building(width, height, floors, color), которая рисует здание с окнами.

Параметры функции:

  • width — ширина здания
  • height — высота здания
  • floors — количество этажей (рядов окон)
  • color — цвет здания

Как выглядит здание

    ┌────────────┐
    │  ■■    ■■  │  ← этаж 3
    │  ■■    ■■  │  ← этаж 2
    │  ■■    ■■  │  ← этаж 1
    └────────────┘
    ↑
    черепашка начинает тут (левый нижний угол)

Шаг 1: Запоминаем начальную позицию

Перед рисованием сохрани координаты черепашки:

base_x = xcor()
base_y = ycor()

Шаг 2: Рисуем здание

Закрашенный прямоугольник размером width × height цвета color.


Шаг 3: Вычисляем размер окон
window_width = width / 5
window_height = height / (floors * 2)

Шаг 4: Рисуем окна

На каждом этаже по 2 окна.  Используйте данный фрагмент для рисования окон, добавив нужные строки

# floor — номер этажа (0, 1, 2...), window — номер окна на этаже (0 или 1).
# Рисуем окна по этажам
for floor in range(floors):   # проходим по этажам
    for window in range(2):   # проходим по окошкам на этаже
        # Определяем позицию окна
        x = base_x + width / 6 + window * (width / 2)
        y = base_y + window_height / 2 + floor * (height / floors)
        
        # Переходим к окну (в точку (x, y))
        # Этот код напишите сами! 
        # не забудьте поднять перо перед переходом в точку и после перехода опустить

        # Рисуем жёлтое окно
        fillcolor("yellow")
        begin_fill()
        # напишите код рисования квадрата со стороной window_width
        
        end_fill()


В конце функции поднимите перо черепашки! Протестируйте функцию на одном здании! Затем приступайте к части 2.


### Схема расположения окон
    ┌─────────────────────────┐
    │                         │
    │   ■■            ■■      │  floor = 1
    │                         │
    │   ■■            ■■      │  floor = 0
    │   │             │       │
    └───│─────────────│───────┘
    ↑   │             │
 base_x │             └── base_x + width/6 + width/2
        │
        └── base_x + width/6

 


Часть 2: Рисуем улицу

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

Создай четыре списки по таблице ниже и используй их при рисовании улицы.

i widths[i] heights[i] floors_list[i] colors[i]
0 60 120 4 "gray"
1 100 80 2 "beige"
2 50 150 5 "lightblue"
3 80 100 3 "pink"


Первое здание начните рисовать с точки (-300, -200) 
После рисования одного здания изменяйте положение Черепашки по оси x:
x = x + widths[i] + 10

Часть 1

Напиши функцию lantern(size, c), которая рисует фонарик.

Параметры функции:

  • size — диаметр круга (число)
  • c — цвет фонарика (строка)

Порядок рисования

  1. Подвес — коричневый ("brown") закрашенный прямоугольник:
    • ширина: 10
    • высота: 20
  2. Круг — закрашенный круг под подвесом:
    • цвет: параметр c
    • диаметр: параметр size
    • круг рисуется так, чтобы он был по центру подвеса

Часть 2

После функции напиши основную программу, которая рисует гирлянду из 6 фонариков в ряд.
Должна получиться гирлянда из 6 разноцветных фонариков разного размера. Порядок следования фонариков следуюший:
красн жёлт  зелён красн жёлт  зелён
 40    35    45    35    40    35
Первый фонарик рисуется из точки (0, 0), каждый следующий сдвигается по оси х на 50 вправо. 

Пример вызова

lantern(50, "red")    # красный фонарик диаметром 50
lantern(30, "yellow") # жёлтый фонарик диаметром 30

Подсказки

  • Используй begin_fill() и end_fill() для заливки
  • Для круга используй circle(-size/2) — минус нужен, чтобы круг рисовался справа от черепашки
  • Не забудь поднимать и опускать перо (pu(), pd()) в нужных местах

На проверку сдается код, содержащий только описание классов!

Объявите базовый класс Aircraft (самолет), объекты которого создаются командой:

air = Aircraft(model, mass, speed, top)

где __model - модель самолета (строка, private); _mass - подъемная масса самолета (любое положительное число, protected ); _speed - максимальная скорость (любое положительное число, protected); _top - максимальная высота полета (любое положительное число, protected).

В каждом объекте класса Aircraft должны создаваться локальные атрибуты с именами: __model, _mass, _speed, _top и соответствующими значениями. Если передаваемые аргументы не соответствуют указанным критериям (строка, любое положительное число), то генерируется исключение командой:

raise TypeError('неверный тип аргумента')

Изменение и считывание значений атрибута __model должна осуществляться по имени (obj.model = ..., print(obj.model)

Далее, в программе объявите следующие дочерние классы:

PassengerAircraft - пассажирский самолет;
WarPlane - военный самолет.

Объекты этих классов создаются командами:

pa = PassengerAircraft(model, mass, speed, top, chairs)  
# chairs - число пассажирских мест (целое положительное число)

wp = WarPlane(model, mass, speed, top, weapons) 
# weapons - вооружение (словарь); ключи - название оружия, значение - количество

В каждом объекте классов PassengerAircraft и WarPlane должны формироваться локальные атрибуты с именами _chairs (protected)  и _weapons (protected) соответственно. Инициализация остальных атрибутов должна выполняться через инициализатор базового класса.

В инициализаторах классов PassengerAircraft и WarPlane проверять корректность передаваемых аргументов chairs и weapons. Если тип данных не совпадает, то генерировать исключение командой:

raise TypeError('неверный тип аргумента')

Пример создания объектов

pa1 = PassengerAircraft('МС-21', 1250, 8000, 12000.5, 140)
pa2 = PassengerAircraft('SuperJet', 1145, 8640, 11034, 80)
wp1 = WarPlane('Миг-35', 7034, 25000, 2000, {"ракета": 4, "бомба": 10})
wp2 = WarPlane('Су-35', 7034, 34000, 2400, {"ракета": 4, "бомба": 7})

На проверку сдается код, содержащий только описание класса.

Объявите класс с именем ListMath, объекты которого можно создавать командами:

lst1 = ListMath() # должен создаваться пустой список
lst2 = ListMath([1, 2, -5, 7.68]) # список с начальными значениями

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

lst = ListMath([1, "abc", -5, 7.68, True]) # ListMath: [1, -5, 7.68]

В каждом объекте класса ListMath должен быть публичный атрибут:

lst_math - ссылка на текущий список объекта (для каждого объекта создается свой список).

Также с объектами класса ListMath должны работать следующие операторы:

lst = lst + 76 # сложение каждого числа списка с определенным числом
lst = 6.5 + lst # сложение каждого числа списка с определенным числом

Команда print(lst1) - в скобка указывается объект класса - должна выводить элементы массива в одной строку, разделяя элементы одним пробелом. В случае если список не содержит элементов, должна выводиться надпись Cписок пуст.

lst1 = ListMath()
print(lst1)    # Список пуст
lst2 = ListMath([1, "abc", -5, 7.68, True]) 
print(lst2)    # 1 -5 7.68

Объявите класс Furniture (мебель), объекты которого создаются командой:

 f = Furniture(name, weight)

где name - название предмета (строка); weight - вес предмета (целое число).

В каждом объекте класса Furniture должны создаваться защищенные локальные атрибуты с именами __name и __weight. В самом классе Furniture нужно объявить приватные методы:

__verify_name() - для проверки корректности имени;
__verify_weight() - для проверки корректности веса.

Метод __verify_name() проверяет, что имя должно быть строкой, если это не так, то генерируется исключение командой:

 raise TypeError('название должно быть строкой')

Метод __verify_weight() проверяет, что вес должен быть положительным числом (строго больше нуля), если это не так, то генерируется исключение командой:

 raise TypeError('вес должен быть положительным числом')

Данные методы следует вызывать всякий раз при записи новых значений в атрибуты __name и __weight (а также при их создании).

Установка и считывание значений атрибутов должны происходить по их имени следующим образом (через соответствующие сеттеры и геттеры):
obj.name = value
obj.weight = value

На основе базового класса Furniture объявить следующие дочерние классы:

Closet - для представления шкафов;
Chair - для представления стульев;
Table - для представления столов.

Объекты этих классов должны создаваться командами:

obj = Closet(name, weight, tp, doors)   
# tp: True - шкаф-купе; False - обычный шкаф; doors - число дверей (целое число) 

obj = Chair(name, weight, height)       
# height - высота стула (любое положительное число) 

obj = Table(name, weight, height, square) 
# height - высота стола; square - площадь поверхности (любые положительные числа)


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

- в объектах класса Closet: __name, __weight, __tp, __doors
- в объектах класса Chair: __name, __weight, __height
- в объектах класса Table: __name, __weight, __height, __square

Атрибуты __name и __weight должны инициализироваться через базовый класс. Все атрибуты должны быть приватными, считываться и устанавливаться через геттеры и сеттеры. Доступ ко всем атрибутам должен производиться по их имени (см описание в базовом классе)

В каждом классе (Closet, Chair, Table) объявить метод: get_attrs(), который возвращает кортеж из значений локальных защищенных атрибутов объектов этих классов.

При печати объекта каждого класса должна выводиться строка:
Объект: <перечисление значений всех атрибутов через запятую и один пробел>

Например: 
Table: стол, 34, 75, 10

В программе нужно объявить только классы. На экран выводить ничего не нужно.

Что такое функция в контексте программирования на C++?

1. Набор операторов, выполняемых случайным образом.
2. Повторно используемая последовательность операторов, предназначенная для выполнения определенной работы.
3. Уникальный набор операторов, который можно использовать только один раз.
4. Способ хранения данных в памяти программы.
5. Команда для завершения работы программы.
6. Механизм для создания графического интерфейса.
Напишите функцию быстрого возведения в степень. Количество действий должно быть пропорционально двоичному логарифму n.

Входные данные
Вводится 2 числа - a (вещественное) и n (целое неотрицательное).

Выходные данные
Необходимо вывести  значение an.
Напишите "функцию голосования" bool Election(bool x, bool y, bool z) (C/C++), function Election (x, y, z:boolean): boolean (Pascal), возвращающую то значение (true или false), которое среди значений ее аргументов x, y, z встречается чаще.

Входные данные
Вводится 3 числа - x, y и z (x, y и z равны 0 или 1, 0 соответствует значению false, 1 соответствует значению true).

Выходные данные
Необходимо вывести  значение функции от x, y и z.
Напишите функцию
bool Xor (bool x, bool y) (C/C++),
function _Xor (x, y:boolean): boolean (Pascal),
def xor(x, y):(Python)

реализующую функцию "Исключающее ИЛИ" двух логических переменных x и y. Функция Xor должна возвращать true, если ровно один из ее аргументов x или y, но не оба одновременно равны true.

Входные данные
Вводится 2 числа - x и y (x и y равны 0 или 1, 0 соответствует значению false, 1 соответствует значению true).

Выходные данные
Необходимо вывести 0 или 1 - значение функции от x и y.
Напишите функцию double power (double a, int n) (C/C++), function power (a:real; n:longint): real (Pascal), вычисляющую значение an.
Входные данные
Вводится 2 числа - a (вещественное) и n (целое неотрицательное).

Выходные данные
Необходимо вывести  значение an.
Алиса решила, что нужно поставить код доступа к управлению кораблем. Она считает, что код доступа должен иметь вид a:b:c, где a, b и c - натуральные числа. Причем, число a должно быть простым, число b - являться палиндромом, а число c - чётным. Капитан Зелёный придумал код.

Вам поручили задание написать программу, которая бы выводила True, если придуманный код доступа соответствует правилам и False - если не соответствует. Чтобы вашу программу можно было применять для других проверок, капитан просит вас оформить программу, с использованием трех функций:
- isPrime(n) - функция, которая определяет является число n простым или нет;
- isPalindrome(n) - функция, которая определяет является ли число n палиндромом;
- isEven(n) - функция, которая определяет является ли число n четным.

Все проверки числа на простоту, палиндром и четность необходимо осуществлять только с использованием данных функций!

Входные данные
Программа получает на вход одну строку - код доступа, который придумал капитан Зелёный.

Выходные данные
Выведите True, если код доступа соответствует правилам Алисы, в противном случае выведите False.
 
Примеры
Входные данные Выходные данные
1 7:101:14 True
2 101:101:101 False
3 qwerty False
Алиса знает, что если у числа n нет делителя, не превосходящего\(\sqrt n\), то число n - простое и его минимальным простым делителем будет само число n. Вас попросили написать программу, которая будет находить минимальный простой делитель у любого числа.

Решение оформите с использованием функций. Напишите следующие функции:
- функцию isPrime(n), которая будет принимать целое число и возвращать True, если число простое и False - если не простое.
- функцию minDivisor(n), которая будет возвращать минимальный простой делитель.

Основная программа должна содержать ввод числа, вызов функции minDivisor(n) и вывод ответа.

Входные данные
Программа получает на вход натуральное число n > 1.

Выходные данные
Выведите ответ на задачу.
 
Примеры
Входные данные Выходные данные
1 4 2
2 5 5
Пиксельный экран выводит каждую цифру в виде картинки 3х5.
1 2 3 4 5
 *
 *
 *
 *
 *
***
  *
***
*
***
***
  *
***
  *
***
* *
* *
***
  *
  *
***
*
***
  *
***
6 7 8 9 0
***
*
***
* *
***
***
  *
 *
*
*
***
* *
***
* *
***
***
* *
***
  *
***
***
* *
* *
* *
***

На вход программе подается натуральное число n (n <= 109).

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

 
 
Примеры
Входные данные Выходные данные
1 12
 *
 *
 *
 *
 *
***
  *
***
*  
***
Напишите функцию vowels_count, которая принимает строку и подсчитывает количество английских гласных в ней.
Английские гласные буквы: a, e, i, o, u, y.

Используя данную функцию, определите две строки:
s1 - строку с самым большим числом гласных букв (если таких строк несколько, взять ту, которая встретится раньше).
s2 - строку с самым маленьким числом согласных букв (если таких строк несколько, взять ту, которая встретится раньше).


Входные данные
В первой строке подается натуральное число n (1 < n <= 10) - количество строк. Далее идут n строк. Каждая строка состоит из английских маленьких букв и пробелов.

Выходные данные
Выведите на экран две строки: сначала строку s1, затем, с новой строки - s2. Наименьшую из данных строк выровняйте по длине с наибольшей, добавив слева строки символы '*'.
 
Примеры
Входные данные Выходные данные
1 4
mama papa
doughter son
brother sister
grandmama grandpa
grandmama grandpa
********mama papa
 
Программа заменяет в строке s все буквы 'h' на 'H', кроме первого и последнего вхождения. Вставьте пропущенные строки.
 
Примеры
Входные данные Выходные данные
1 In the hole in the ground there lived a hobbit In the Hole in tHe ground tHere lived a hobbit
Определите количество шестизначных «счастливых» чисел. «Счастливым» будем называть такое шестизначное число, в котором сумма его первых трех цифр равна сумме его последних трех цифр. 
Заполните пропуски в программе.

Функция sum3(n) вычисляет сумму цифр трехзначного числа.
Функция happy(n) определяет является ли число n счастливым. Функция happy(n) для своей работы использует функцию sum3(n).
Программа вычисляет значение выражения
\(ans = {2 + \sqrt{2} \over {5 + \sqrt{5}}} + {5 + \sqrt{5} \over {13 + \sqrt{13}}}+{13 + \sqrt{13} \over {8 + \sqrt{8}}}\).

Для вычисления используется функция drop(a, b), которая вычисляет значение одного слагаемого.
Запишите пропущенную строку в этой функции.
Поделиться
Класснуть