{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d44f1f4d",
   "metadata": {},
   "source": [
    "# 23-01 · Калькулятор\n",
    "\n",
    "Практика к разделу [«Проект 23-1: Калькулятор с Tkinter»](../../site/chapters/glava-23/23-01-kalkulyator.html). Полный файл — `projects/tkinter/calculator/calculator.py`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3cc72374",
   "metadata": {},
   "source": [
    "## Цель\n",
    "\n",
    "Проверить вычисление выражений и последовательность нажатий кнопок, как это делал бы настоящий пользователь."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06eb0b8e",
   "metadata": {},
   "source": [
    "## Рабочий пример"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "4edc4bba",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:59:46.582188Z",
     "iopub.status.busy": "2026-08-14T20:59:46.582088Z",
     "iopub.status.idle": "2026-08-14T20:59:46.706098Z",
     "shell.execute_reply": "2026-08-14T20:59:46.705588Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4\n",
      "4\n",
      "9\n",
      "3.5\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "\n",
    "sys.path.insert(0, \"../../projects/tkinter/calculator\")\n",
    "import calculator as c\n",
    "\n",
    "print(c.vychislit_vyrazhenie(\"2+2\"))\n",
    "print(c.vychislit_vyrazhenie(\"10-3*2\"))\n",
    "print(c.vychislit_vyrazhenie(\"(1+2)*3\"))\n",
    "print(c.vychislit_vyrazhenie(\"7/2\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37519bc5",
   "metadata": {},
   "source": [
    "## Проверка результата"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "97c0ef9a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:59:46.707164Z",
     "iopub.status.busy": "2026-08-14T20:59:46.707044Z",
     "iopub.status.idle": "2026-08-14T20:59:46.709511Z",
     "shell.execute_reply": "2026-08-14T20:59:46.709088Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Верно: базовые вычисления совпадают с ожидаемыми.\n"
     ]
    }
   ],
   "source": [
    "assert c.vychislit_vyrazhenie(\"2+2\") == \"4\"\n",
    "assert c.vychislit_vyrazhenie(\"10-3*2\") == \"4\"\n",
    "assert c.vychislit_vyrazhenie(\"(1+2)*3\") == \"9\"\n",
    "print(\"Верно: базовые вычисления совпадают с ожидаемыми.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "674610ad",
   "metadata": {},
   "source": [
    "## Эксперимент — некорректный и опасный ввод не приводит к падению"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2a1c9c59",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:59:46.710489Z",
     "iopub.status.busy": "2026-08-14T20:59:46.710377Z",
     "iopub.status.idle": "2026-08-14T20:59:46.712951Z",
     "shell.execute_reply": "2026-08-14T20:59:46.712567Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ошибка\n",
      "Ошибка\n",
      "Ошибка\n",
      "Верно: деление на ноль, синтаксическая ошибка и посторонний код — везде «Ошибка».\n"
     ]
    }
   ],
   "source": [
    "print(c.vychislit_vyrazhenie(\"5/0\"))\n",
    "print(c.vychislit_vyrazhenie(\"2+*3\"))\n",
    "print(c.vychislit_vyrazhenie(\"import os\"))\n",
    "\n",
    "assert c.vychislit_vyrazhenie(\"5/0\") == \"Ошибка\"\n",
    "assert c.vychislit_vyrazhenie(\"2+*3\") == \"Ошибка\"\n",
    "assert c.vychislit_vyrazhenie(\"import os\") == \"Ошибка\"\n",
    "print(\"Верно: деление на ноль, синтаксическая ошибка и посторонний код — везде «Ошибка».\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32d1dc7e",
   "metadata": {},
   "source": [
    "## Задание ★ Базовая практика\n",
    "\n",
    "Симулируйте нажатия кнопок «1», «2», «+», «8», «=» и проверьте результат на экране."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "3ecb1582",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-08-14T20:59:46.714019Z",
     "iopub.status.busy": "2026-08-14T20:59:46.713810Z",
     "iopub.status.idle": "2026-08-14T20:59:46.716347Z",
     "shell.execute_reply": "2026-08-14T20:59:46.716025Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Верно: 12 + 8 = 20 на экране калькулятора.\n"
     ]
    }
   ],
   "source": [
    "c.na_ochistit_nazhali()\n",
    "for simvol in \"12+8\":\n",
    "    c.na_cifru_ili_znak_nazhali(simvol)\n",
    "\n",
    "assert c.ekran_text.get() == \"12+8\"\n",
    "c.na_ravno_nazhali()\n",
    "\n",
    "assert c.ekran_text.get() == \"20\"\n",
    "print(\"Верно: 12 + 8 = 20 на экране калькулятора.\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Cartesian Python 3.14",
   "language": "python",
   "name": "cartesian-python314"
  },
  "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.14.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
