{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Материалы разработаны Т.Ф. Долгих к.ф.-м.н., доц. кафедры ВМ и МФ мехмата ЮФУ &#128105;&#8205;&#127979;.\n",
    "\n",
    "-----------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Пример &#49;&#65039;&#8419;\n",
    "\n",
    "Описать функцию для вычисления $\\mathrm{ctg}\\, x$.\n",
    "\n",
    "С помощью этой функции вычислить значение $\\mathrm{ctg}\\, \\alpha$, где $0^\\circ \\leqslant \\alpha \\leqslant 360^\\circ$ &mdash; угол, заданный в градусах."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "alpha >>> 45\n",
      "ctg(45.0) = 1.0000\n"
     ]
    }
   ],
   "source": [
    "from math import sin, cos, radians\n",
    "\n",
    "\n",
    "def ctg(x):\n",
    "    return sin(x) / cos(x)\n",
    "\n",
    "\n",
    "alpha = float(input('alpha >>> '))\n",
    "if alpha == 90 or alpha == 270:\n",
    "    print('ctg не определён.')\n",
    "else:\n",
    "    beta = radians(alpha)   # перевод градусов в радианы\n",
    "    y = ctg(beta)\n",
    "    print('ctg(%3.1f) = %6.4f' %(alpha, y))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Пример &#50;&#65039;&#8419;\n",
    "\n",
    "Даны целые числа $a$, $b$ и $c$. \n",
    "\n",
    "Описать функцию `min2` для поиска минимального числа из двух заданных, в которой не используется стандартная  функция `min()`.\n",
    "\n",
    "С помощью функции `min2` получить значение выражения\n",
    "$$\n",
    "\\min(a^2, b-4, c+5)\n",
    "$$\n",
    "\n",
    "*Указание.* Для проверки вычислений использовать стандартную функцию `min()`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Введите целое число >>> -3\n",
      "Введите целое число >>> 0\n",
      "Введите целое число >>> 6\n",
      "ответ: -4\n",
      "проверка: -4\n"
     ]
    }
   ],
   "source": [
    "def min2(x, y):\n",
    "    if x < y:\n",
    "        return x\n",
    "    return y\n",
    "\n",
    "\n",
    "a = int(input('Введите целое число >>> '))\n",
    "b = int(input('Введите целое число >>> '))\n",
    "c = int(input('Введите целое число >>> '))\n",
    "\n",
    "m2 = min2(a * a, b - 4)\n",
    "m3 = min2(m2, c + 5)\n",
    "print('ответ:', m3)\n",
    "\n",
    "# проверка\n",
    "pr = min(a * a, b - 4, c + 5)\n",
    "print('проверка:', pr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Другие способы реализации функции `min2`\n",
    "\n",
    "-----------------------\n",
    "\n",
    "```python\n",
    "def min2(x, y):\n",
    "    if x < y:\n",
    "        mn = x\n",
    "    else:\n",
    "        mn = y\n",
    "    return mn\n",
    "```\n",
    "\n",
    "-----------------------\n",
    "\n",
    "```python\n",
    "def min2(x, y):\n",
    "    mn = x\n",
    "    if y < mn:\n",
    "        mn = y\n",
    "    return mn\n",
    "```\n",
    "\n",
    "-----------------------\n",
    "\n",
    "```python\n",
    "def min2(x, y):\n",
    "    return x if x < y else y\n",
    "```\n",
    "\n",
    "-----------------------"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Пример &#51;&#65039;&#8419;\n",
    "\n",
    "Описать анонимную функцию для вычисления функции $f(x) = \\ln (x^2 + 1)$.\n",
    "\n",
    "Даны целые числа $m$, $n$ ($m < n$).\n",
    "\n",
    "Провести табуляцию функции при $x_k = 0{,}1k$, $k=\\overline{m, n}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ввести левую границу отрезка табуляции >>> -2\n",
      "Ввести правую границу отрезка табуляции >>> 3\n",
      " -0.200    0.03922\n",
      " -0.100    0.00995\n",
      "  0.000    0.00000\n",
      "  0.100    0.00995\n",
      "  0.200    0.03922\n",
      "  0.300    0.08618\n"
     ]
    }
   ],
   "source": [
    "from math import log\n",
    "\n",
    "\n",
    "f = lambda s: log(s * s + 1)\n",
    "\n",
    "\n",
    "m = int(input('Ввести левую границу отрезка табуляции >>> '))\n",
    "n = int(input('Ввести правую границу отрезка табуляции >>> '))\n",
    "\n",
    "for k in range(m, n+1):\n",
    "    xk = 0.1 * k\n",
    "    yk = f(xk)\n",
    "    print('%7.3f %10.5f' %(xk, yk))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Пример &#52;&#65039;&#8419;\n",
    "\n",
    "Дано вещественное число $b > 0$.\n",
    "Опишите функцию для вычисления номера и значения первого отрицательного элемента последовательности\n",
    "$$\n",
    "a_0 = b, \\quad\n",
    "a_i = a_{i-1} - \\dfrac{\\pi}{5}, \\quad\n",
    "i = 1, 2, 3,\\ldots\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "b > 0 >>> 5.2\n",
      "Первый отрицательный элемент: a[9] = -0.455\n"
     ]
    }
   ],
   "source": [
    "from math import pi\n",
    "\n",
    "\n",
    "def seq(start):\n",
    "    a = start\n",
    "    i = 0\n",
    "    while a >= 0:\n",
    "        i = i + 1\n",
    "        a = a - pi / 5\n",
    "    return i, a\n",
    "\n",
    "\n",
    "b = float(input('b > 0 >>> '))\n",
    "n, an = seq(b)\n",
    "print('Первый отрицательный элемент: a[%d] = %5.3f' %(n, an))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Первый отрицательный элемент: a[9] = -0.455\n"
     ]
    }
   ],
   "source": [
    "# второй способ вызова функции\n",
    "\n",
    "res = seq(b)\n",
    "print('Первый отрицательный элемент: a[%d] = %5.3f' %(res[0], res[1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Пример &#53;&#65039;&#8419;\n",
    "\n",
    "Дано действительное $x$. \n",
    "Опишите функцию для печати значений элементов последовательности\n",
    "$$\n",
    "y_0 = 1, \\quad\n",
    "y_i = y_{i-1} \\cdot \\dfrac{x^2}{(2i-1)2i}, \\quad\n",
    "i = 1, 2, 3,\\ldots\n",
    "$$\n",
    "больших $10^{-3}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x >>> 0.84\n",
      "    0    1.000\n",
      "    1    0.353\n",
      "    2    0.021\n"
     ]
    }
   ],
   "source": [
    "def prnt(x, eps=1e-3):\n",
    "    x2 = x * x\n",
    "    y = 1\n",
    "    i = 0\n",
    "    while abs(y) > eps:\n",
    "        print('%5d %8.3f' %(i, y))\n",
    "        i = i + 1\n",
    "        y = y * x2 / ((2 * i - 1) * 2 * i)\n",
    "        \n",
    "\n",
    "x = float(input('x >>> '))\n",
    "prnt(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Пример &#54;&#65039;&#8419;\n",
    "\n",
    "Описать функцию для проверки случайного целого числа из диапазона $[-2025; 2025]$: число трёхзначное и кратно $k$.\n",
    "По умолчанию $k=2$.\n",
    "\n",
    "*Указание.* Используйте разные вызовы функции: позиционный, по имени, с использованием значений по умолчанию."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Проверяем число -184\n",
      "кратность >>> 4\n",
      "True\n",
      "True\n",
      "True\n"
     ]
    }
   ],
   "source": [
    "from random import randint\n",
    "\n",
    "\n",
    "def ok(a, k=2):\n",
    "    return all([abs(a) >= 100, abs(a) <= 999, abs(a) % k == 0])\n",
    "\n",
    "\n",
    "n = randint(-2025, 2025)\n",
    "print('Проверяем число %d' %n)\n",
    "m = int(input('кратность >>> '))\n",
    "\n",
    "# позиционный вызов\n",
    "res1 = ok(n, m)\n",
    "print(res1)\n",
    "\n",
    "# по имени\n",
    "res2 = ok(a=n, k=m)\n",
    "print(res2)\n",
    "\n",
    "# со значением по умолчанию\n",
    "res3 = ok(n)\n",
    "print(res3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Пример &#55;&#65039;&#8419;\n",
    "\n",
    "Описать функцию, которая для чисел из набора значений, ищет сумму положительных элементов, количество нулевых значений и произведение отрицательных чисел. \n",
    "\n",
    "Набор чисел (обозн. `array`), которые необходимо проверить, может быть произвольной длины.\n",
    "\n",
    "Инициализируйте в программе набор значений для вызова функции."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Проверяем числа: -3 6 12 0 -5 20 -6 0 3 10\n",
      "Сумма положительных чисел = 51\n",
      "Количество нулей = 2\n",
      "Произведение отрицательных значений = -90\n"
     ]
    }
   ],
   "source": [
    "def scp(*array):\n",
    "    s, k, p = 0, 0, 1\n",
    "    for a in array:\n",
    "        if a > 0:\n",
    "            s = s + a\n",
    "        elif a == 0:\n",
    "            k = k + 1\n",
    "        else:\n",
    "            p = p * a\n",
    "    return s, k, p\n",
    "\n",
    "\n",
    "val = -3, 6, 12, 0, -5, 20, -6, 0, 3, 10\n",
    "print('Проверяем числа:', *val)\n",
    "s, k, p = scp(*val)\n",
    "print('Сумма положительных чисел =', s)\n",
    "print('Количество нулей =', k)\n",
    "print('Произведение отрицательных значений =', p)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
