{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Классная работа"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Func25.** Описать функцию `triangle_ps(a)`, вычисляющую по стороне a равностороннего треугольника его периметр $P = 3a$ и площадь $S = a^2\\frac{\\sqrt{3}}{4}$ и возвращающую их в виде двух вещественных чисел (`a` — вещественный параметр). С помощью этой функции найти периметры и площади трех равносторонних треугольников с данными сторонами. \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#описание функции\n",
    "def triangle_ps(a):\n",
    "    return 1,2  #чтобы на этот раз никто не сомневался - это просто заглушка. Сделайте правильную реализацию по формулам."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#основная программа\n",
    "for i in range(1): # сколько раз требуется?\n",
    "    a = float(input(\" a = \"))\n",
    "    print(f'Периметр P и площадь S равностороннего треугольника со стороной {a} равны {triangle_ps(a)}, соответственно.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Замечание.* Обратите внимание, что эта функция возвращает два значения. Каждое из них можно вывести и отдельно, например, так: `print(TrianglePS(a)[0])` (индекс 0 в квадратных скобках соответствует первому возвращаемому значению, 1 — второму). Попробуйте сделать более красивый вывод!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# блок тестирования функции\n",
    "assert triangle_ps(2)==(6.0, 1.7320508075688772), \"Test 1\"\n",
    "assert triangle_ps(1)==(3.0, 0.4330127018922193), \"Test 2\"\n",
    "assert triangle_ps(2.34)==(7.02, 2.3710043504810354), \"Test 3\"\n",
    "assert triangle_ps(3)[0]==9, \"Test 4\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Func27.**  Описать функцию `DigitCS(K)`, находящую и возвращающую количество $C$ цифр целого положительного числа $K$, а также их сумму $S$ (`K` — параметр целого типа). С помощью этой функции найти количество и сумму цифр для каждого из пяти данных целых чисел.  \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#описание функции\n",
    "def digit_cs(K):\n",
    "    return 1  #заглушка"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#основная программа\n",
    "\n",
    "#внимательно читаем задание и пишем здесь основную программу с вызовом написанной функции..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Совет.* При реализации функции используйте цикл (подумайте, какого типа) для определения количества цифр (разрядности числа) и подсчета их суммы."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# блок тестирования функции\n",
    "assert digit_cs(50)==(2,5), \"Test 1\"\n",
    "assert digit_cs(123)==(3,6), \"Test 2\"\n",
    "assert digit_cs(300201)==(6,6), \"Test 2\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Func30.**  Описать функцию `add_left_digit(D, K)`, добавляющую к целому положительному числу $K$ слева цифру $D$ и возвращающую полученное число ($D$ и $K$ — параметры целого типа, причем $D$ лежит в диапазоне $1–9$. С помощью этой функции последовательно добавить к данному числу $K$ слева данные цифры $D_1$ и $D_2$, выводя результат каждого добавления.  \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#описание функции\n",
    "def add_left_digit(D, K):\n",
    "    return 1  #заглушка"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#основная программа\n",
    "\n",
    "#внимательно читаем задание и пишем здесь основную программу с вызовом написанной функции..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Совет.* При реализации функции попробуйте использовать уже написанную выше функцию `digit_cs(K)`. Для этого ячейка с соответствующей функцией должна быть предварительно запущена."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Замечание.* Помните тему *модулей с функциями* из лекции? Здесь, в Jupyter Notebook, можно работать по тому же принципу благодаря цельной структуре файла, не создавая отдельные файлы с собранными функциями в текущей рабочей папке."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# блок тестирования функции\n",
    "assert add_left_digit(1,234)==1234, \"Test 1\"\n",
    "assert add_left_digit(3,14)/100==3.14, \"Test 2\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Func50.**  Описать функцию `time_to_hms(T)`, определяющую по времени $T$ (в секундах) содержащееся в нем количество часов $H$, минут $M$ и секунд $S$ и возвращающую значения $H$, $M$, $S$ (все параметры $T$, $H$, $M$ и $S$ — целые). Используя эту функцию, найти количество часов, минут и секунд для пяти данных отрезков времени $T_1$, $T_2$, …, $T_5$.  \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#описание функции\n",
    "def time_to_hms(T):\n",
    "    return 1,1,1  #заглушка\n",
    "# значения идут по порядку: часы, минуты, секунды"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#основная программа\n",
    "for i in range(5):\n",
    "    t=int(input(\"input t \"))\n",
    "    print(time_to_hms(t))\n",
    "#внимательно читаем задание и пишем здесь основную программу с вызовом написанной функции..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Совет.* Используем только арифметические операции, включая целочисленное деление и взятие остатка. Никаких циклов! Для удобства опишите в теле функции вспомогательные локальные переменные."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# блок тестирования функции\n",
    "assert time_to_hms(3600)==(1,0,0), \"Test 1\"\n",
    "assert time_to_hms(5689)==(1,34,49), \"Test 1\"\n",
    "\n",
    "# Напишите еще несколько тестов самостоятельно!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Домашняя работа"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Func29.**  Описать функцию `add_right_digit(D,K)`, добавляющую к целому положительному числу $K$ справа цифру $D$ и возвращающую полученное число ($D$ и $K$ — параметры целого типа, причем $D$ лежит в диапазоне $0–9$). С помощью этой функции последовательно добавить к данному числу $K$ справа данные цифры $D_1$ и $D_2$, выводя результат каждого добавления. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#описание функции\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#основная программа\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# блок тестирования функции\n",
    "assert add_right_digit(1,234)==2341, \"Test 1\"\n",
    "assert add_right_digit(6,5232)==52326, \"Test 2\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Совет.* Не переусложните реализацию!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Func37.** Описать функцию `power_1(A, B)` вещественного типа, находящую величину $A^B$ по формуле $A^B = \\exp(B·\\ln(A))$ (параметры $A$ и $B$ — вещественные). В случае нулевого или отрицательного параметра $A$ функция возвращает $0$. С помощью этой функции найти степени $A^P$, $B^P$, $C^P$, если даны числа $P$, $A$, $B$, $C$. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#описание функции\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#основная программа\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Совет.* Подключите математическую библиотеку `import math` и используйте функции `exp` и `log`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# тестирование функции\n",
    "assert power_1(-1, 2)==0, \"Test 1\"\n",
    "assert power_1(2, 1)==2, \"Test 2\"\n",
    "assert power_1(4, 5)==1024, \"Test 3\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Func38.** Описать функцию `power_2(A, N)` вещественного типа, находящую величину $A^N$ ($A$ — вещественный, $N$ — целый параметр) по следующим формулам:\n",
    "\n",
    "$A^0 = 1$;\n",
    "\n",
    "$A^N = A·A·…·A$  $\\quad$  ($N$ сомножителей),  $\\quad$   если $N > 0$;\n",
    "\n",
    "$A^N = 1/(A·A·…·A)$  $\\quad$   ($|N|$ сомножителей),  $\\quad$    если $N < 0$.\n",
    "\n",
    "С помощью этой функции найти $A^K$, $A^L$, $A^M$, если даны числа $A$, $K$, $L$, $M$.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#описание функции\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#основная программа\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Совет.* Используйте условный оператор и циклы for."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# тестирование функции\n",
    "assert power_2(2, -2)==0.25, \"Test 1\"\n",
    "assert power_2(2, 0)==1, \"Test 2\"\n",
    "assert power_2(4, 5)==1024, \"Test 3\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Func39.** Используя функции `power_1` и `power_2` из **Func37** и **Func38**, описать функцию `power_3(A, B)` вещественного типа с вещественными параметрами, находящую $A^B$ следующим образом: если $B$ имеет нулевую дробную часть, то вызывается `power_2(A, N)`, где $N$ — переменная целого типа, равная числу $B$; иначе вызывается `power_1(A, B)`. С помощью `power_3` найти $A^P$, $B^P$, $C^P$, если даны числа $P$, $A$, $B$, $C$.   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#описание функции\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#основная программа\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# тестирование функции\n",
    "assert power_3(2, 0)==1, \"Test 1\"\n",
    "assert power_3(2, 2)==4, \"Test 2\"\n",
    "assert power_3(2, 2.1)==4.2870938501451725, \"Test 3\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Func52.** Описать функцию `is_leap_year(Y)` логического типа, которая возвращает `True`, если год `Y` (целое положительное число) является високосным, и `False` в противном случае. Вывести значение функции `is_leap_year` для пяти данных значений параметра `Y`. Високосным считается год, делящийся на 4, за исключением тех годов, которые делятся на 100 и не делятся на 400. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#описание функции\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Совет.* Решение записывается в одну строчку. Используйте логическое выражение. Если трудно самостоятельно вывести решение, в интернете можно найти алгоритм вычисления високосного года."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#основная программа\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# тестирование функции\n",
    "assert is_leap_year(2001)==False, \"Test 1\"\n",
    "assert is_leap_year(2020)==True, \"Test 2\"\n",
    "assert is_leap_year(1852)==True, \"Test 3\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Func53.** Используя функцию `is_leap_year` из задания **Func52**, описать функцию `month_days(M, Y)` целого типа, которая возвращает количество дней для $M$-го месяца года $Y$ ($1 ≤ M ≤ 12$, $Y > 0$ — целые числа). Вывести значение функции `month_days` для данного года $Y$ и месяцев $M_1$, $M_2$, $M_3$. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#описание функции\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Подсказка.* Удобно использовать перечислимый тип данных. Вместо проверки с использованием условного оператора можно использовать проверку вхождения во множество перечисленных значений. Например, чтобы проверить, что значение переменной `m` равно одному из заданных, вместо\n",
    "\n",
    "`m==1 or m==2 or m==12 or m==24`\n",
    "\n",
    "удобнее написать\n",
    "\n",
    "`m in [1,2,12,24]`\n",
    "\n",
    "Результат будет булевского типа: `True` или `False`.\n",
    "\n",
    "Без условного оператора, тем не менее, при решении этой задачи не обойтись."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#основная программа\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# тестирование функции\n",
    "assert month_days(2,2004)==29, \"Test 1\"\n",
    "assert month_days(6,2004)==30, \"Test 2\"\n",
    "assert month_days(8,2004)==31, \"Test 3\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Func54.** Используя функцию `month_days` из задания **Func53**, описать функцию `prev_date(D, M, Y)`, которая по информации о правильной дате, включающей день $D$, номер месяца $M$ и год $Y$, определяет предыдущую дату и возвращает новые значения дня, месяца и года (все данные — целые). Применить функцию `prev_date` к трем исходным датам и вывести полученные значения предыдущих дат. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#описание функции\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Подсказка.* Работаем через условный оператор, используя функцию из прошлого задания для учета всевозможных вариантов."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#основная программа\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# тестирование функции\n",
    "assert prev_date(9,5,1995)==(8,5,1995), \"Test 1\"\n",
    "assert prev_date(1,8,1750)==(31,7,1750), \"Test 2\"\n",
    "assert prev_date(1,1,2020)==(31,12,2019), \"Test 3\"\n",
    "\n",
    "# напишите еще сами два интересных теста!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Func55.** Используя функцию `month_days` из задания **Func53**, описать функцию `next_date(D, M, Y)`, которая по информации о правильной дате, включающей день $D$, номер месяца $M$ и год $Y$, определяет следующую дату и возвращает новые значения дня, месяца и года (все данные — целые). Применить функцию `next_date` к трем исходным датам и вывести полученные значения следующих дат. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#описание функции\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#основная программа\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# тестирование функции\n",
    "\n",
    "# напишите тесты сами, аналогично предыдущему заданию!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
