10.11 Числа и строки
- Числа
- (Д/З по лекциям):
контекст в decimal
Decimal и float
функция-умножитель
напишите функцию multiplier(x, y, Type), возвращающую результат умножения x на y
x, y - строки; Type - тип, в соответствии с которым нужно интерпретировать x и y; должны поддерживаться варианты: float, Decimal, Fraction; для последних двух вариантов не забудьте выполнить импорт
запустите функцию для каждого из трех вариантов третьего параметра, причем для Fraction задавайте сокращающиеся после умножения дроби, например: "1/6", "2/3"
- Точность вещественных
напишите функцию esum(N, one), вычисляющую число e через сумму ряда: $$ \sum_{n=0}^N\frac{1}{n!} $$
сумма ряда должна считаться с использованием типа float или Decimal, причем тип задается вторым параметром, в виде единицы, типизированной этим типом
для Decimal попробуйте вызывать эту функцию с различной точностью контекста: getcontext().prec = число_знаков_после_запятой
- (Д/З по лекциям):
- Строки
join(), split() и вообще где читать
напишите программу, получающую на вход строку вида "Фамилия Имя Отчество Год Город" (каждое из полей строки не содержит пробелов; разделитель - один или несколько пробелов; корректность ввода гарантируется), и выводящую строку вида "Город, Имя, Фамилия" (разделитель - запятая и один пробел)
Ленивый (ось OX направлена вниз, OY — вправо) график синуса:
- Вводим ширину W и высоту H экрана, A и B
Выводим W×H пробелов или "*" так, чтобы получить график синуса на отрезке [A, B] (включая B )
- В графике минимум H точек (по одной в строке)
- Необходимо масштабирование A…B к 0…H-1, а -1…1 к 0…W-1
- Оно вообще часто необходимо, надо функцию написать!
- Метафора «Текстового экрана» — массив массивов односимвольных строк
Задание экрана [['.'] * Width for i in range(Height)]
Вывод с помощью join() - ов
Неленивый график синуса: ось OX направлена вправо, OY — вверх; диапазон по X: от 0 до 7; размер экрана: 60 по X, 20 по Y, при необходимости растяните терминал
Надо хранить массив массивов, и туда записывать * в нужные места
При выводе всего графика построчно join()-ить
Форматные строки и .format()
Описание языка форматирования; {{}}
выведите таблицу соответствия {bin(i)} = {hex(i)}, центрированную относительно "=", i от 12 до 23
- в каждой строке одно соответствие
пример соответствия, без учета центрирования: 0b1100 = 0xc
Задачи
Задача_1: Fractions
Заданы два многочлена от х (А(х), В(х)) с рациональными коэффициентами, а также рациональные числа s и w. Проверить, является ли s решением уравнения A(x)/B(x)=w
Структура ввода: s, w, степень_А, коэффициенты_А, степень_В, коэффициенты_В. Числа задаются в виде m или m/n, где m, n - целые, n - положительное.
В программе-решении должна присутствовать функция, способная получать на вход как рациональные, так и вещественные числа, и возвращающая True или False.
- Тестовый пример 1:
уравнение: $$ (x^2 -(5/2)x + 1) / (x+3) = -1/8; s=1 $$; результат проверки: True
Input (1):
1, -1/8, 2, 1, -5/2, 1, 1, 1, 3
Output (1):
True
- Тестовый пример 2:
уравнение то же; s=11/12; результат проверки: False
Output (2):
False
- Тестовый пример_3:
уравнение то же; s=-3; результат проверки: False
Output (3):
False
Задача_2: График функции
Ввести через пробел ширину W и высоту H экрана, A и B, и произвольную всюду на [A, B] определённую python-формулу от x, которая может включать в себя функции из модуля math. Вывести с помощью "*" растровый график этой функции
A, B (A < B), а также минимальное и максимальное значение функции могут оказаться любыми.
График может получиться страшным из-за дискретности, если мы сильно не попали в экстремум. Например, график синуса от -61 до 61 страшный
(Неправда! Он красивый! Только на график синуса не похож… -- FrBrGeorge 2021-10-15 21:08:39)
- График должен быть непрерывным
TODO пояснение про точки vs. отрезки
- В идеале график должен занимать все строки и столбцы «экрана»
Input (1):
40 20 -6 6 sin(x)
Output (1):
** ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** **
Input (2):
20 24 5 50 (x-13)**2+x+1
Output (2):
* * * * * * * * * * * * * * * * * * * * * * * ** *****
К этой задаче тесты делать нужно, но результаты перекрёстного тестирования учитываться на будут, потому что способы округления и соблюдения непрерывности у всех могут оказаться разными
Задача_3: Форматирование
- Вводится ASCII-art, представляющий прямоугольный контейнер, заполненный жидкостью и/или газом ("#" — стенки, "." — газ, "~" — жидкость)
- Контейнер следует повернуть на 90° и вывести (жидкость и газ перераспределятся):
- На входе слои жидкости заполнены целиком, от края до края. Неполный слой жидкости на выходе дополняется до полного. Например, если в контейнер-ответ налить ещё три капли и повернуть обратно, он окажется полным)
- Также следует вывести горизонтальную диаграмму долей объёма, занимаемых газом и жидкостью:
- строка для газа состоит из символов '.', для жидкости — из символов '~'
- ширина диаграммы (т.е. длина её наибольшей строки) фиксирована и равна 20 символам
справа от каждой строки выводится в виде x/y исходная доля объёма соответствующей субстанции от объёма контейнера, сокращать дроби не нужно
- дроби должны быть выравнены так, чтобы
- самые правые их символы располагались в одной и той же позиции,
- расстояние между самой длинной строкой и дробью — один пробел
при расчёте числа символов в строке, для округления использовать функцию round()
Input:
######## #......# #~~~~~~# #~~~~~~# ########
Output:
##### #...# #...# #~~~# #~~~# #~~~# #~~~# ##### .......... 6/18 ~~~~~~~~~~~~~~~~~~~~ 12/18