├── LICENSE ├── README.md ├── ariphmetic_design.ui ├── functions.py ├── main.py ├── main_widget_design.ui ├── requirements.txt └── Техническое задание.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 AlexOmelyanenko2007 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Цифровой помощник учителя 2 | Умный калькулятор, с помощью которого можно решать различные задачи по физике, математике и информатике: сложные алгебраические примеры, функции с построением их графиков, множества и т.д. А также все процессы разделены на вкладки. Данным приложение разработано для преподавателей и учащихся для удобной, комфортной работы с вычислениями и самопроверки. 3 | 4 | # Скачать: [Цифровой помощник учителя](https://github.com/AlexOmelyanenko2007/MathCalculator/releases/tag/v0.1) 5 | 6 | # Разработка 7 | ## Задачи 8 | ### 1. Создать репозиторий 9 | ### 2. Придумать интерфейс 10 | ### 3. Реализовать решение математических задач: 11 | - 1.1. Функции с построением графика 12 | - 1.2. Неравенства 13 | - 1.3. Арифметика 14 | - 1.4. Алгебра 15 | 16 | # Язык программирования: 17 | - ## Python и библиотеки: 18 | - ### 1.PyQt5 19 | - ### 2.Matplotlib 20 | - ### 3.Numpy 21 | 22 | # Интерфейс 23 | ## Главное окно 24 | ![2022-11-10_18-22-09](https://user-images.githubusercontent.com/94148371/201145636-0b2ca8b3-a562-4f7a-8353-9a7a599a9049.png) 25 | 26 | ## Арифметика 27 | ![image](https://github.com/AlexOmelyanenko2007/MathCalculator/assets/94148371/90ac8a60-fd98-41f3-82fd-4197e08e9a23) 28 | ![image](https://github.com/AlexOmelyanenko2007/MathCalculator/assets/94148371/64ca5abe-9230-42df-8401-61d73e240311) 29 | 30 | ## Функции с построением графика 31 | ![image](https://github.com/AlexOmelyanenko2007/MathCalculator/assets/94148371/bc661293-ed1b-41ab-a592-0d6f6988ec47) 32 | ![image](https://github.com/AlexOmelyanenko2007/MathCalculator/assets/94148371/fac5a624-4dfc-4451-abf6-df2f7c74be21) 33 | 34 | ## Алгебра 35 | ![2022-11-10_02-11-08](https://user-images.githubusercontent.com/94148371/201153982-ae3dbc7a-0f69-47e2-8fb6-59bbd000c336.png) 36 | ![image](https://github.com/AlexOmelyanenko2007/MathCalculator/assets/94148371/77001e3d-567a-46e9-9fcd-04a329fdc3aa) 37 | 38 | ## Неравенства 39 | ![2022-11-10_02-11-08](https://user-images.githubusercontent.com/94148371/201154003-0c39a0fb-de72-4f54-b854-b14bed166e16.png) 40 | ![image](https://github.com/AlexOmelyanenko2007/MathCalculator/assets/94148371/51e44709-8fe0-43d2-bdab-18f421570bd5) 41 | 42 | -------------------------------------------------------------------------------- /ariphmetic_design.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 400 10 | 500 11 | 12 | 13 | 14 | Калькулятор 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 0 24 | 0 25 | 400 26 | 40 27 | 28 | 29 | 30 | 31 | 15 32 | 75 33 | true 34 | 35 | 36 | 37 | background-color: rgb(161, 159, 162); 38 | color:rgb(255, 255, 255); 39 | 40 | 41 | 0 42 | 43 | 44 | 10 45 | 46 | 47 | 48 | 49 | 50 | 0 51 | 400 52 | 150 53 | 90 54 | 55 | 56 | 57 | 58 | 15 59 | 75 60 | true 61 | 62 | 63 | 64 | background-color:rgb(255, 173, 93) 65 | 66 | 67 | 0 68 | 69 | 70 | 71 | 72 | 73 | 250 74 | 400 75 | 150 76 | 90 77 | 78 | 79 | 80 | 81 | 15 82 | 75 83 | true 84 | 85 | 86 | 87 | background-color:rgb(255, 130, 118) 88 | 89 | 90 | = 91 | 92 | 93 | 94 | 95 | 96 | 0 97 | 310 98 | 100 99 | 90 100 | 101 | 102 | 103 | 104 | 15 105 | 75 106 | true 107 | 108 | 109 | 110 | background-color:rgb(255, 173, 93) 111 | 112 | 113 | 114 | 1 115 | 116 | 117 | 118 | 119 | 120 | 0 121 | 130 122 | 100 123 | 90 124 | 125 | 126 | 127 | 128 | 15 129 | 75 130 | true 131 | 132 | 133 | 134 | background-color:rgb(255, 173, 93) 135 | 136 | 137 | 138 | 7 139 | 140 | 141 | 142 | 143 | 144 | 100 145 | 40 146 | 100 147 | 90 148 | 149 | 150 | 151 | 152 | 15 153 | 75 154 | true 155 | 156 | 157 | 158 | background-color:rgb(255, 173, 93) 159 | 160 | 161 | 162 | +/- 163 | 164 | 165 | 166 | 167 | 168 | 0 169 | 220 170 | 100 171 | 90 172 | 173 | 174 | 175 | 176 | 15 177 | 75 178 | true 179 | 180 | 181 | 182 | background-color:rgb(255, 173, 93) 183 | 184 | 185 | 186 | 4 187 | 188 | 189 | 190 | 191 | 192 | 100 193 | 310 194 | 100 195 | 90 196 | 197 | 198 | 199 | 200 | 15 201 | 75 202 | true 203 | 204 | 205 | 206 | background-color:rgb(255, 173, 93) 207 | 208 | 209 | 210 | 2 211 | 212 | 213 | 214 | 215 | 216 | 100 217 | 130 218 | 100 219 | 90 220 | 221 | 222 | 223 | 224 | 15 225 | 75 226 | true 227 | 228 | 229 | 230 | background-color:rgb(255, 173, 93) 231 | 232 | 233 | 234 | 8 235 | 236 | 237 | 238 | 239 | 240 | 0 241 | 40 242 | 100 243 | 90 244 | 245 | 246 | 247 | 248 | 15 249 | 75 250 | true 251 | 252 | 253 | 254 | background-color:rgb(255, 173, 93) 255 | 256 | 257 | 258 | C 259 | 260 | 261 | 262 | 263 | 264 | 200 265 | 40 266 | 100 267 | 90 268 | 269 | 270 | 271 | 272 | 15 273 | 75 274 | true 275 | 276 | 277 | 278 | background-color:rgb(255, 173, 93) 279 | 280 | 281 | 282 | % 283 | 284 | 285 | 286 | 287 | 288 | 100 289 | 220 290 | 100 291 | 90 292 | 293 | 294 | 295 | 296 | 15 297 | 75 298 | true 299 | 300 | 301 | 302 | background-color:rgb(255, 173, 93) 303 | 304 | 305 | 306 | 5 307 | 308 | 309 | 310 | 311 | 312 | 200 313 | 220 314 | 100 315 | 90 316 | 317 | 318 | 319 | 320 | 15 321 | 75 322 | true 323 | 324 | 325 | 326 | background-color:rgb(255, 173, 93) 327 | 328 | 329 | 330 | 6 331 | 332 | 333 | 334 | 335 | 336 | 200 337 | 130 338 | 100 339 | 90 340 | 341 | 342 | 343 | 344 | 15 345 | 75 346 | true 347 | 348 | 349 | 350 | background-color:rgb(255, 173, 93) 351 | 352 | 353 | 354 | 9 355 | 356 | 357 | 358 | 359 | 360 | 300 361 | 310 362 | 100 363 | 90 364 | 365 | 366 | 367 | 368 | 15 369 | 75 370 | true 371 | 372 | 373 | 374 | background-color:rgb(255, 173, 93) 375 | 376 | 377 | 378 | - 379 | 380 | 381 | 382 | 383 | 384 | 300 385 | 220 386 | 100 387 | 90 388 | 389 | 390 | 391 | 392 | 15 393 | 75 394 | true 395 | 396 | 397 | 398 | background-color:rgb(255, 173, 93) 399 | 400 | 401 | 402 | + 403 | 404 | 405 | 406 | 407 | 408 | 300 409 | 130 410 | 100 411 | 90 412 | 413 | 414 | 415 | 416 | 15 417 | 75 418 | true 419 | 420 | 421 | 422 | background-color:rgb(255, 173, 93) 423 | 424 | 425 | 426 | * 427 | 428 | 429 | 430 | 431 | 432 | 300 433 | 40 434 | 100 435 | 90 436 | 437 | 438 | 439 | 440 | 15 441 | 75 442 | true 443 | 444 | 445 | 446 | background-color:rgb(255, 173, 93) 447 | 448 | 449 | 450 | / 451 | 452 | 453 | 454 | 455 | 456 | 200 457 | 310 458 | 100 459 | 90 460 | 461 | 462 | 463 | 464 | 15 465 | 75 466 | true 467 | 468 | 469 | 470 | background-color:rgb(255, 173, 93) 471 | 472 | 473 | 474 | 3 475 | 476 | 477 | 478 | 479 | 480 | 150 481 | 400 482 | 100 483 | 90 484 | 485 | 486 | 487 | 488 | 15 489 | 75 490 | true 491 | 492 | 493 | 494 | background-color:rgb(255, 173, 93) 495 | 496 | 497 | 498 | . 499 | 500 | 501 | 502 | 503 | 504 | 505 | 0 506 | 0 507 | 400 508 | 21 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | -------------------------------------------------------------------------------- /functions.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pyplot as plt 2 | import numpy as np 3 | 4 | 5 | fig, ax = plt.subplots() 6 | ax.set_title('График') 7 | ax.set_xlabel('x') 8 | ax.set_ylabel('y') 9 | ax.grid() 10 | 11 | x = np.linspace(-5, 5, 100) 12 | # x = np.linspace(1) 13 | y = x ** 2 + 4 14 | ax.plot(x, y) 15 | 16 | plt.show() -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import re 2 | import sys 3 | import math 4 | from PyQt5 import QtCore, QtGui, QtWidgets 5 | from PyQt5.QtWidgets import QMessageBox 6 | from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg 7 | from matplotlib.figure import Figure 8 | import numpy as np 9 | from sympy import Symbol, expand 10 | from sympy.solvers import solve 11 | from sympy.parsing.sympy_parser import (parse_expr, standard_transformations, implicit_multiplication_application) 12 | 13 | 14 | class Ui_MainWindow(object): 15 | def __init__(self): 16 | super().__init__() 17 | 18 | def setupUi(self, MainWindow): 19 | MainWindow.setObjectName("MainWindow") 20 | MainWindow.resize(460, 472) 21 | MainWindow.setStyleSheet("") 22 | self.centralwidget = QtWidgets.QWidget(MainWindow) 23 | self.centralwidget.setObjectName("centralwidget") 24 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget) 25 | self.horizontalLayout.setObjectName("horizontalLayout") 26 | self.widget = QtWidgets.QWidget(self.centralwidget) 27 | self.widget.setStyleSheet("background-color: rgb(161, 159, 162);\n" 28 | "color:rgb(255, 255, 255);") 29 | self.widget.setObjectName("widget") 30 | self.label = QtWidgets.QLabel(self.widget) 31 | self.label.setGeometry(QtCore.QRect(80, 20, 291, 20)) 32 | font = QtGui.QFont() 33 | font.setPointSize(7) 34 | font.setBold(True) 35 | font.setWeight(75) 36 | self.label.setFont(font) 37 | self.label.setObjectName("label") 38 | self.verticalLayoutWidget = QtWidgets.QWidget(self.widget) 39 | self.verticalLayoutWidget.setGeometry(QtCore.QRect(20, 70, 401, 291)) 40 | self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") 41 | self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) 42 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 43 | self.verticalLayout.setObjectName("verticalLayout") 44 | self.arithmetic_btn = QtWidgets.QPushButton(self.verticalLayoutWidget) 45 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred) 46 | sizePolicy.setHorizontalStretch(0) 47 | sizePolicy.setVerticalStretch(0) 48 | sizePolicy.setHeightForWidth(self.arithmetic_btn.sizePolicy().hasHeightForWidth()) 49 | self.arithmetic_btn.setSizePolicy(sizePolicy) 50 | font = QtGui.QFont() 51 | font.setPointSize(7) 52 | font.setBold(True) 53 | font.setWeight(75) 54 | self.arithmetic_btn.setFont(font) 55 | self.arithmetic_btn.setStyleSheet("background-color:rgb(255, 173, 93)") 56 | self.arithmetic_btn.setIconSize(QtCore.QSize(14, 14)) 57 | self.arithmetic_btn.setObjectName("arithmetic_btn") 58 | self.verticalLayout.addWidget(self.arithmetic_btn) 59 | self.algebra_btn = QtWidgets.QPushButton(self.verticalLayoutWidget, clicked=lambda: self.open_alglin(True)) 60 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) 61 | sizePolicy.setHorizontalStretch(0) 62 | sizePolicy.setVerticalStretch(0) 63 | sizePolicy.setHeightForWidth(self.algebra_btn.sizePolicy().hasHeightForWidth()) 64 | self.algebra_btn.setSizePolicy(sizePolicy) 65 | font = QtGui.QFont() 66 | font.setPointSize(7) 67 | font.setBold(True) 68 | font.setWeight(75) 69 | self.algebra_btn.setFont(font) 70 | self.algebra_btn.setStyleSheet("background-color:rgb(255, 173, 93)") 71 | self.algebra_btn.setIconSize(QtCore.QSize(67, 55)) 72 | self.algebra_btn.setObjectName("algebra_btn") 73 | self.verticalLayout.addWidget(self.algebra_btn) 74 | self.functions_btn = QtWidgets.QPushButton(self.verticalLayoutWidget) 75 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) 76 | sizePolicy.setHorizontalStretch(0) 77 | sizePolicy.setVerticalStretch(0) 78 | sizePolicy.setHeightForWidth(self.functions_btn.sizePolicy().hasHeightForWidth()) 79 | self.functions_btn.setSizePolicy(sizePolicy) 80 | self.functions_btn.setMaximumSize(QtCore.QSize(16777215, 16777215)) 81 | font = QtGui.QFont() 82 | font.setPointSize(7) 83 | font.setBold(True) 84 | font.setWeight(75) 85 | self.functions_btn.setFont(font) 86 | self.functions_btn.setStyleSheet("background-color:rgb(255, 173, 93)") 87 | self.functions_btn.setObjectName("functions_btn") 88 | self.verticalLayout.addWidget(self.functions_btn) 89 | self.inequalities_btn = QtWidgets.QPushButton(self.verticalLayoutWidget, clicked=lambda: self.open_alglin()) 90 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) 91 | sizePolicy.setHorizontalStretch(0) 92 | sizePolicy.setVerticalStretch(0) 93 | sizePolicy.setHeightForWidth(self.inequalities_btn.sizePolicy().hasHeightForWidth()) 94 | self.inequalities_btn.setSizePolicy(sizePolicy) 95 | font = QtGui.QFont() 96 | font.setPointSize(7) 97 | font.setBold(True) 98 | font.setWeight(75) 99 | self.inequalities_btn.setFont(font) 100 | self.inequalities_btn.setStyleSheet("background-color:rgb(255, 173, 93)") 101 | self.inequalities_btn.setObjectName("inequalities_btn") 102 | self.verticalLayout.addWidget(self.inequalities_btn) 103 | self.horizontalLayout.addWidget(self.widget) 104 | MainWindow.setCentralWidget(self.centralwidget) 105 | self.menubar = QtWidgets.QMenuBar(MainWindow) 106 | self.menubar.setGeometry(QtCore.QRect(0, 0, 460, 21)) 107 | self.menubar.setObjectName("menubar") 108 | self.menu = QtWidgets.QMenu(self.menubar) 109 | self.menu.setObjectName("menu") 110 | self.menu_2 = QtWidgets.QMenu(self.menubar) 111 | self.menu_2.setObjectName("menu_2") 112 | MainWindow.setMenuBar(self.menubar) 113 | self.statusbar = QtWidgets.QStatusBar(MainWindow) 114 | self.statusbar.setObjectName("statusbar") 115 | MainWindow.setStatusBar(self.statusbar) 116 | self.actionMathCalcurator = QtWidgets.QAction(MainWindow) 117 | self.actionMathCalcurator.setObjectName("actionMathCalcurator") 118 | self.menu.addAction(self.actionMathCalcurator) 119 | self.menubar.addAction(self.menu.menuAction()) 120 | self.menubar.addAction(self.menu_2.menuAction()) 121 | self.retranslateUi(MainWindow) 122 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 123 | 124 | def retranslateUi(self, MainWindow): 125 | _translate = QtCore.QCoreApplication.translate 126 | MainWindow.setWindowTitle(_translate("MainWindow", "MathCalcurator")) 127 | self.label.setText(_translate("MainWindow", "Выбирите задачу для решения")) 128 | self.arithmetic_btn.setText(_translate("MainWindow", "Арифметика")) 129 | self.algebra_btn.setText(_translate("MainWindow", "Алгебра")) 130 | self.functions_btn.setText(_translate("MainWindow", "Функции с построением графика")) 131 | self.inequalities_btn.setText(_translate("MainWindow", "Неравенства")) 132 | self.menu.setTitle(_translate("MainWindow", "О программе")) 133 | self.menu_2.setTitle(_translate("MainWindow", "Помощь")) 134 | self.actionMathCalcurator.setText( 135 | _translate("MainWindow", "MathCalcurator - программа, которая поможет нам решать математику")) 136 | 137 | self.arithmetic_btn.clicked.connect(self.open_ariphmetic) 138 | self.functions_btn.clicked.connect(self.open_functions) 139 | 140 | def open_ariphmetic(self): 141 | self.window = QtWidgets.QMainWindow() 142 | self.ui = Ariphmetic_MainWindow() 143 | self.ui.setupUi(self.window) 144 | self.window.show() 145 | 146 | def open_functions(self): 147 | self.window = QtWidgets.QMainWindow() 148 | self.ui = Function_liney() 149 | self.ui.setupUi(self.window) 150 | self.window.show() 151 | 152 | def open_alglin(self, al=False): 153 | self.window = QtWidgets.QMainWindow() 154 | self.ui = AlgLin() 155 | self.ui.setupUi(self.window, al) 156 | self.window.show() 157 | 158 | 159 | class Ariphmetic_MainWindow(object): 160 | def __init__(self, *args): 161 | super().__init__() 162 | 163 | def setupUi(self, MainWindow): 164 | MainWindow.setObjectName("MainWindow") 165 | MainWindow.resize(400, 500) 166 | MainWindow.setStyleSheet("") 167 | self.centralwidget = QtWidgets.QWidget(MainWindow) 168 | self.centralwidget.setObjectName("centralwidget") 169 | self.label = QtWidgets.QLabel(self.centralwidget) 170 | self.label.setGeometry(QtCore.QRect(0, 0, 400, 40)) 171 | font = QtGui.QFont() 172 | font.setPointSize(15) 173 | font.setBold(True) 174 | font.setWeight(75) 175 | self.label.setFont(font) 176 | self.label.setStyleSheet("background-color: rgb(161, 159, 162);\n" 177 | "color:rgb(255, 255, 255);") 178 | self.label.setObjectName("label") 179 | self.btn_0 = QtWidgets.QPushButton(self.centralwidget) 180 | self.btn_0.setGeometry(QtCore.QRect(0, 400, 150, 90)) 181 | font = QtGui.QFont() 182 | font.setPointSize(15) 183 | font.setBold(True) 184 | font.setWeight(75) 185 | self.btn_0.setFont(font) 186 | self.btn_0.setStyleSheet("background-color:rgb(255, 173, 93)") 187 | self.btn_0.setObjectName("btn_0") 188 | self.btn_equate = QtWidgets.QPushButton(self.centralwidget) 189 | self.btn_equate.setGeometry(QtCore.QRect(250, 400, 150, 90)) 190 | font = QtGui.QFont() 191 | font.setPointSize(15) 192 | font.setBold(True) 193 | font.setWeight(75) 194 | self.btn_equate.setFont(font) 195 | self.btn_equate.setStyleSheet("background-color:rgb(255, 130, 118)") 196 | self.btn_equate.setObjectName("btn_equate") 197 | self.btn_1 = QtWidgets.QPushButton(self.centralwidget) 198 | self.btn_1.setGeometry(QtCore.QRect(0, 310, 100, 90)) 199 | font = QtGui.QFont() 200 | font.setPointSize(15) 201 | font.setBold(True) 202 | font.setWeight(75) 203 | self.btn_1.setFont(font) 204 | self.btn_1.setStyleSheet("background-color:rgb(255, 173, 93)\n" 205 | "") 206 | self.btn_1.setObjectName("btn_1") 207 | self.btn_7 = QtWidgets.QPushButton(self.centralwidget) 208 | self.btn_7.setGeometry(QtCore.QRect(0, 130, 100, 90)) 209 | font = QtGui.QFont() 210 | font.setPointSize(15) 211 | font.setBold(True) 212 | font.setWeight(75) 213 | self.btn_7.setFont(font) 214 | self.btn_7.setStyleSheet("background-color:rgb(255, 173, 93)\n" 215 | "") 216 | self.btn_7.setObjectName("btn_7") 217 | self.btn_add_sub = QtWidgets.QPushButton(self.centralwidget) 218 | self.btn_add_sub.setGeometry(QtCore.QRect(100, 40, 100, 90)) 219 | font = QtGui.QFont() 220 | font.setPointSize(15) 221 | font.setBold(True) 222 | font.setWeight(75) 223 | self.btn_add_sub.setFont(font) 224 | self.btn_add_sub.setStyleSheet("background-color:rgb(255, 173, 93)\n" 225 | "") 226 | self.btn_add_sub.setObjectName("btn_add_sub") 227 | self.btn_4 = QtWidgets.QPushButton(self.centralwidget) 228 | self.btn_4.setGeometry(QtCore.QRect(0, 220, 100, 90)) 229 | font = QtGui.QFont() 230 | font.setPointSize(15) 231 | font.setBold(True) 232 | font.setWeight(75) 233 | self.btn_4.setFont(font) 234 | self.btn_4.setStyleSheet("background-color:rgb(255, 173, 93)\n" 235 | "") 236 | self.btn_4.setObjectName("btn_4") 237 | self.btn_2 = QtWidgets.QPushButton(self.centralwidget) 238 | self.btn_2.setGeometry(QtCore.QRect(100, 310, 100, 90)) 239 | font = QtGui.QFont() 240 | font.setPointSize(15) 241 | font.setBold(True) 242 | font.setWeight(75) 243 | self.btn_2.setFont(font) 244 | self.btn_2.setStyleSheet("background-color:rgb(255, 173, 93)\n" 245 | "") 246 | self.btn_2.setObjectName("btn_2") 247 | self.btn_8 = QtWidgets.QPushButton(self.centralwidget) 248 | self.btn_8.setGeometry(QtCore.QRect(100, 130, 100, 90)) 249 | font = QtGui.QFont() 250 | font.setPointSize(15) 251 | font.setBold(True) 252 | font.setWeight(75) 253 | self.btn_8.setFont(font) 254 | self.btn_8.setStyleSheet("background-color:rgb(255, 173, 93)\n" 255 | "") 256 | self.btn_8.setObjectName("btn_8") 257 | self.btn_c = QtWidgets.QPushButton(self.centralwidget) 258 | self.btn_c.setGeometry(QtCore.QRect(0, 40, 100, 90)) 259 | font = QtGui.QFont() 260 | font.setPointSize(15) 261 | font.setBold(True) 262 | font.setWeight(75) 263 | self.btn_c.setFont(font) 264 | self.btn_c.setStyleSheet("background-color:rgb(255, 173, 93)\n" 265 | "") 266 | self.btn_c.setObjectName("btn_c") 267 | self.btn_procent = QtWidgets.QPushButton(self.centralwidget) 268 | self.btn_procent.setGeometry(QtCore.QRect(200, 40, 100, 90)) 269 | font = QtGui.QFont() 270 | font.setPointSize(15) 271 | font.setBold(True) 272 | font.setWeight(75) 273 | self.btn_procent.setFont(font) 274 | self.btn_procent.setStyleSheet("background-color:rgb(255, 173, 93)\n" 275 | "") 276 | self.btn_procent.setObjectName("btn_procent") 277 | self.btn_5 = QtWidgets.QPushButton(self.centralwidget) 278 | self.btn_5.setGeometry(QtCore.QRect(100, 220, 100, 90)) 279 | font = QtGui.QFont() 280 | font.setPointSize(15) 281 | font.setBold(True) 282 | font.setWeight(75) 283 | self.btn_5.setFont(font) 284 | self.btn_5.setStyleSheet("background-color:rgb(255, 173, 93)\n" 285 | "") 286 | self.btn_5.setObjectName("btn_5") 287 | self.btn_6 = QtWidgets.QPushButton(self.centralwidget) 288 | self.btn_6.setGeometry(QtCore.QRect(200, 220, 100, 90)) 289 | font = QtGui.QFont() 290 | font.setPointSize(15) 291 | font.setBold(True) 292 | font.setWeight(75) 293 | self.btn_6.setFont(font) 294 | self.btn_6.setStyleSheet("background-color:rgb(255, 173, 93)\n" 295 | "") 296 | self.btn_6.setObjectName("btn_6") 297 | self.btn_9 = QtWidgets.QPushButton(self.centralwidget) 298 | self.btn_9.setGeometry(QtCore.QRect(200, 130, 100, 90)) 299 | font = QtGui.QFont() 300 | font.setPointSize(15) 301 | font.setBold(True) 302 | font.setWeight(75) 303 | self.btn_9.setFont(font) 304 | self.btn_9.setStyleSheet("background-color:rgb(255, 173, 93)\n" 305 | "") 306 | self.btn_9.setObjectName("btn_9") 307 | self.btn_sub = QtWidgets.QPushButton(self.centralwidget) 308 | self.btn_sub.setGeometry(QtCore.QRect(300, 310, 100, 90)) 309 | font = QtGui.QFont() 310 | font.setPointSize(15) 311 | font.setBold(True) 312 | font.setWeight(75) 313 | self.btn_sub.setFont(font) 314 | self.btn_sub.setStyleSheet("background-color:rgb(255, 173, 93)\n" 315 | "") 316 | self.btn_sub.setObjectName("btn_sub") 317 | self.btn_add = QtWidgets.QPushButton(self.centralwidget) 318 | self.btn_add.setGeometry(QtCore.QRect(300, 220, 100, 90)) 319 | font = QtGui.QFont() 320 | font.setPointSize(15) 321 | font.setBold(True) 322 | font.setWeight(75) 323 | self.btn_add.setFont(font) 324 | self.btn_add.setStyleSheet("background-color:rgb(255, 173, 93)\n" 325 | "") 326 | self.btn_add.setObjectName("btn_add") 327 | self.btn_mul = QtWidgets.QPushButton(self.centralwidget) 328 | self.btn_mul.setGeometry(QtCore.QRect(300, 130, 100, 90)) 329 | font = QtGui.QFont() 330 | font.setPointSize(15) 331 | font.setBold(True) 332 | font.setWeight(75) 333 | self.btn_mul.setFont(font) 334 | self.btn_mul.setStyleSheet("background-color:rgb(255, 173, 93)\n" 335 | "") 336 | self.btn_mul.setObjectName("btn_mul") 337 | self.btn_div = QtWidgets.QPushButton(self.centralwidget) 338 | self.btn_div.setGeometry(QtCore.QRect(300, 40, 100, 90)) 339 | font = QtGui.QFont() 340 | font.setPointSize(15) 341 | font.setBold(True) 342 | font.setWeight(75) 343 | self.btn_div.setFont(font) 344 | self.btn_div.setStyleSheet("background-color:rgb(255, 173, 93)\n" 345 | "") 346 | self.btn_div.setObjectName("btn_div") 347 | self.btn_3 = QtWidgets.QPushButton(self.centralwidget) 348 | self.btn_3.setGeometry(QtCore.QRect(200, 310, 100, 90)) 349 | font = QtGui.QFont() 350 | font.setPointSize(15) 351 | font.setBold(True) 352 | font.setWeight(75) 353 | self.btn_3.setFont(font) 354 | self.btn_3.setStyleSheet("background-color:rgb(255, 173, 93)\n" 355 | "") 356 | self.btn_3.setObjectName("btn_3") 357 | self.btn_point = QtWidgets.QPushButton(self.centralwidget) 358 | self.btn_point.setGeometry(QtCore.QRect(150, 400, 100, 90)) 359 | font = QtGui.QFont() 360 | font.setPointSize(15) 361 | font.setBold(True) 362 | font.setWeight(75) 363 | self.btn_point.setFont(font) 364 | self.btn_point.setStyleSheet("background-color:rgb(255, 173, 93)\n" 365 | "") 366 | self.btn_point.setObjectName("btn_point") 367 | MainWindow.setCentralWidget(self.centralwidget) 368 | self.menubar = QtWidgets.QMenuBar(MainWindow) 369 | self.menubar.setGeometry(QtCore.QRect(0, 0, 400, 21)) 370 | self.menubar.setObjectName("menubar") 371 | MainWindow.setMenuBar(self.menubar) 372 | self.statusbar = QtWidgets.QStatusBar(MainWindow) 373 | self.statusbar.setObjectName("statusbar") 374 | MainWindow.setStatusBar(self.statusbar) 375 | 376 | self.retranslateUi(MainWindow) 377 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 378 | 379 | self.add_function() 380 | 381 | self.btn_equate = False 382 | 383 | self.window = None 384 | 385 | def retranslateUi(self, MainWindow): 386 | _translate = QtCore.QCoreApplication.translate 387 | MainWindow.setWindowTitle(_translate("MainWindow", "Калькулятор")) 388 | self.label.setText(_translate("MainWindow", "0")) 389 | self.btn_0.setText(_translate("MainWindow", "0")) 390 | self.btn_equate.setText(_translate("MainWindow", "=")) 391 | self.btn_1.setText(_translate("MainWindow", "1")) 392 | self.btn_7.setText(_translate("MainWindow", "7")) 393 | self.btn_add_sub.setText(_translate("MainWindow", "±")) 394 | self.btn_4.setText(_translate("MainWindow", "4")) 395 | self.btn_2.setText(_translate("MainWindow", "2")) 396 | self.btn_8.setText(_translate("MainWindow", "8")) 397 | self.btn_c.setText(_translate("MainWindow", "C")) 398 | self.btn_procent.setText(_translate("MainWindow", "%")) 399 | self.btn_5.setText(_translate("MainWindow", "5")) 400 | self.btn_6.setText(_translate("MainWindow", "6")) 401 | self.btn_9.setText(_translate("MainWindow", "9")) 402 | self.btn_sub.setText(_translate("MainWindow", "-")) 403 | self.btn_add.setText(_translate("MainWindow", "+")) 404 | self.btn_mul.setText(_translate("MainWindow", "*")) 405 | self.btn_div.setText(_translate("MainWindow", "/")) 406 | self.btn_3.setText(_translate("MainWindow", "3")) 407 | self.btn_point.setText(_translate("MainWindow", ".")) 408 | 409 | def add_function(self): 410 | self.btn_0.clicked.connect(lambda: self.write_number(self.btn_0.text())) 411 | self.btn_1.clicked.connect(lambda: self.write_number(self.btn_1.text())) 412 | self.btn_2.clicked.connect(lambda: self.write_number(self.btn_2.text())) 413 | self.btn_3.clicked.connect(lambda: self.write_number(self.btn_3.text())) 414 | self.btn_4.clicked.connect(lambda: self.write_number(self.btn_4.text())) 415 | self.btn_5.clicked.connect(lambda: self.write_number(self.btn_5.text())) 416 | self.btn_6.clicked.connect(lambda: self.write_number(self.btn_6.text())) 417 | self.btn_7.clicked.connect(lambda: self.write_number(self.btn_7.text())) 418 | self.btn_8.clicked.connect(lambda: self.write_number(self.btn_8.text())) 419 | self.btn_9.clicked.connect(lambda: self.write_number(self.btn_9.text())) 420 | self.btn_add.clicked.connect(lambda: self.write_number(self.btn_add.text())) 421 | self.btn_procent.clicked.connect(lambda: self.write_number(self.btn_procent.text())) 422 | self.btn_mul.clicked.connect(lambda: self.write_number(self.btn_mul.text())) 423 | self.btn_sub.clicked.connect(lambda: self.write_number(self.btn_sub.text())) 424 | self.btn_add_sub.clicked.connect(lambda: self.write_number(self.btn_add_sub.text())) 425 | self.btn_point.clicked.connect(lambda: self.write_number(self.btn_point.text())) 426 | self.btn_div.clicked.connect(lambda: self.write_number(self.btn_div.text())) 427 | self.btn_equate.clicked.connect(self.results) 428 | self.btn_c.clicked.connect(self.clear) 429 | self.btn_add_sub.clicked.connect(self.negative) 430 | 431 | def write_number(self, number): 432 | if number == ".": 433 | # print('dot!') 434 | self.label.setText(self.label.text() + number) 435 | elif self.label.text() == "0" or self.btn_equate: 436 | self.label.setText(number) 437 | self.btn_equate = False 438 | else: 439 | self.label.setText(self.label.text() + number) 440 | 441 | def results(self): 442 | if not self.btn_equate: 443 | text = self.label.text() 444 | text = self.recalculate_percent(text) 445 | res = eval(text) 446 | self.label.setText("Результат:" + str(res)) 447 | self.btn_equate = True 448 | else: 449 | error = QMessageBox() 450 | error.setWindowTitle("Ошибка") 451 | error.setText("Сейчас это действие выполнить нельзя") 452 | error.setIcon(QMessageBox.Warning) 453 | 454 | error.setStandardButtons(QMessageBox.Reset | QMessageBox.Cancel | QMessageBox.Ok) 455 | 456 | error.setInformativeText("Два раза действие не выполнить") 457 | error.setDetailedText("Детали") 458 | 459 | error.buttonClicked.connect(self.popup_action) 460 | error.exec() 461 | 462 | def recalculate_percent(self, example): 463 | result = re.findall(r"(\d*[\+\-\*\/]?\d*\%[\+\-\*\/]?\d*)", example) 464 | 465 | for el in result: 466 | perc = re.findall(r"(\d*\%)", el) 467 | num_perc = el.find(perc[0]) 468 | if num_perc == 0: 469 | sub = re.split('\+|\-|\*|\/', el) 470 | to_replace = int(sub[1]) * int(sub[0][:-1]) / 100 471 | example = example.replace(sub[0], str(to_replace)) 472 | else: 473 | sub = re.split('\+|\-|\*|\/', el) 474 | to_replace = int(sub[0]) * int(sub[1][:-1]) / 100 475 | example = example.replace(sub[1], str(to_replace)) 476 | return example 477 | 478 | 479 | def popup_action(self, btn): 480 | if btn.text() == "Ok": 481 | print("Print ok") 482 | elif btn.text() == "Resert": 483 | self.label.setText("") 484 | self.btn_equate = False 485 | 486 | 487 | def clear(self): 488 | self.label.setText("0") 489 | 490 | 491 | def negative(self): 492 | try: 493 | res = eval(f'-{self.label.text()[:-1]}') 494 | self.label.setText(str(res)) 495 | except SyntaxError: 496 | self.label.append('0') 497 | 498 | 499 | def procent(self): 500 | if not self.btn_procent: 501 | res = eval(self.label.text()) 502 | self.label.setText(str(res / 100)) 503 | self.btn_equate = True 504 | else: 505 | error = QMessageBox() 506 | error.setWindowTitle("Ошибка") 507 | error.setText("Сейчас это действие выполнить нельзя") 508 | error.setIcon(QMessageBox.Warning) 509 | 510 | error.setStandardButtons(QMessageBox.Reset | QMessageBox.Cancel | QMessageBox.Ok) 511 | 512 | error.setInformativeText("Два раза действие не выполнить") 513 | error.setDetailedText("Детали") 514 | 515 | error.buttonClicked.connect(self.popup_action) 516 | error.exec() 517 | 518 | 519 | class MplCanvas(FigureCanvasQTAgg): 520 | def __init__(self, parent=None, width=5, height=4, dpi=100): 521 | fig = Figure(figsize=(width, height), dpi=dpi) 522 | self.axes = fig.add_subplot(111) 523 | super(MplCanvas, self).__init__(fig) 524 | 525 | 526 | class Function_liney(object): 527 | def setupUi(self, MainWindow): 528 | MainWindow.setObjectName("MainWindow") 529 | MainWindow.resize(460, 472) 530 | MainWindow.setStyleSheet("") 531 | self.centralwidget = QtWidgets.QWidget(MainWindow) 532 | self.centralwidget.setObjectName("centralwidget") 533 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget) 534 | self.horizontalLayout.setObjectName("horizontalLayout") 535 | self.widget = QtWidgets.QWidget(self.centralwidget) 536 | self.widget.setStyleSheet("background-color: rgb(161, 159, 162);\n" 537 | "color:rgb(255, 255, 255);") 538 | self.widget.setObjectName("widget") 539 | self.label = QtWidgets.QLabel(self.widget) 540 | self.label.setGeometry(QtCore.QRect(100, 10, 181, 20)) 541 | font = QtGui.QFont() 542 | font.setPointSize(7) 543 | font.setBold(True) 544 | font.setWeight(75) 545 | self.label.setFont(font) 546 | self.label.setObjectName("label") 547 | self.pushButton = QtWidgets.QPushButton(self.widget, clicked=lambda: self.draw_plot()) 548 | self.pushButton.setGeometry(QtCore.QRect(20, 310, 400, 70)) 549 | font = QtGui.QFont() 550 | font.setPointSize(16) 551 | font.setBold(True) 552 | font.setWeight(75) 553 | self.pushButton.setFont(font) 554 | self.pushButton.setStyleSheet("background-color:rgb(255, 173, 93)") 555 | self.pushButton.setObjectName("pushButton") 556 | self.label_y = QtWidgets.QLabel(self.widget) 557 | self.label_y.setGeometry(QtCore.QRect(20, 60, 31, 20)) 558 | font = QtGui.QFont() 559 | font.setPointSize(7) 560 | font.setBold(True) 561 | font.setWeight(75) 562 | self.label_y.setFont(font) 563 | self.label_y.setObjectName("label_y") 564 | self.label_vvod = QtWidgets.QLineEdit(self.widget) 565 | self.label_vvod.setGeometry(QtCore.QRect(50, 50, 341, 41)) 566 | self.label_vvod.setStyleSheet("background-color:rgb(20, 20, 20)") 567 | self.label_vvod.setText("") 568 | self.label_vvod.setObjectName("label_vvod") 569 | self.frame = QtWidgets.QFrame(self.widget) 570 | self.frame.setGeometry(QtCore.QRect(50, 110, 401, 191)) 571 | self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) 572 | self.frame.setFrameShadow(QtWidgets.QFrame.Raised) 573 | self.frame.setObjectName("frame") 574 | self.horizontalLayout.addWidget(self.widget) 575 | MainWindow.setCentralWidget(self.centralwidget) 576 | self.menubar = QtWidgets.QMenuBar(MainWindow) 577 | self.menubar.setGeometry(QtCore.QRect(0, 0, 460, 24)) 578 | self.menubar.setObjectName("menubar") 579 | self.menu = QtWidgets.QMenu(self.menubar) 580 | self.menu.setObjectName("menu") 581 | self.menu_2 = QtWidgets.QMenu(self.menubar) 582 | self.menu_2.setObjectName("menu_2") 583 | MainWindow.setMenuBar(self.menubar) 584 | self.statusbar = QtWidgets.QStatusBar(MainWindow) 585 | self.statusbar.setObjectName("statusbar") 586 | MainWindow.setStatusBar(self.statusbar) 587 | self.Functions = QtWidgets.QAction(MainWindow) 588 | self.Functions.setObjectName("Functions") 589 | self.menu.addAction(self.Functions) 590 | self.menubar.addAction(self.menu.menuAction()) 591 | self.menubar.addAction(self.menu_2.menuAction()) 592 | 593 | self.retranslateUi(MainWindow) 594 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 595 | 596 | def retranslateUi(self, MainWindow): 597 | _translate = QtCore.QCoreApplication.translate 598 | MainWindow.setWindowTitle(_translate("MainWindow", "Решение функций")) 599 | self.label.setText(_translate("MainWindow", "Функция на графике")) 600 | self.pushButton.setText(_translate("MainWindow", "Ввести")) 601 | self.label_y.setText(_translate("MainWindow", "y = ")) 602 | self.menu.setTitle(_translate("MainWindow", "О программе")) 603 | self.menu_2.setTitle(_translate("MainWindow", "Помощь")) 604 | self.Functions.setText( 605 | _translate("MainWindow", "MathCalcurator - программа, которая поможет нам решать математику")) 606 | self.sc = MplCanvas(self, width=5, height=2, dpi=70) 607 | self.sc.setParent(self.frame) 608 | 609 | def draw_plot(self): 610 | self.sc.axes.cla() 611 | x = np.linspace(-5, 5, 100) 612 | y = eval(self.label_vvod.text()) 613 | self.sc.axes.plot(x, y) 614 | self.sc.draw() 615 | 616 | 617 | class AlgLin(object): 618 | def setupUi(self, Form, alg): 619 | self.is_alg = alg 620 | Form.setObjectName("Form") 621 | Form.resize(237, 255) 622 | # Form.resize(237, 255) 623 | self.solve_example = QtWidgets.QPushButton(Form, clicked=lambda: self.solve_this()) 624 | 625 | self.solve_example.setStyleSheet("background-color:rgb(255, 173, 93)") 626 | self.solve_example.setGeometry(QtCore.QRect(130, 200, 91, 40)) 627 | self.solve_example.setObjectName("solve_example") 628 | self.label = QtWidgets.QLabel(Form) 629 | self.label.setGeometry(QtCore.QRect(20, 100, 91, 21)) 630 | self.label.setObjectName("label") 631 | self.example = QtWidgets.QTextEdit(Form) 632 | self.example.setGeometry(QtCore.QRect(20, 30, 201, 51)) 633 | self.example.setObjectName("example") 634 | self.solved = QtWidgets.QTextEdit(Form) 635 | self.solved.setGeometry(QtCore.QRect(20, 120, 201, 51)) 636 | self.solved.setObjectName("solved") 637 | self.label_2 = QtWidgets.QLabel(Form) 638 | self.label_2.setGeometry(QtCore.QRect(20, 10, 91, 21)) 639 | self.label_2.setObjectName("label_2") 640 | 641 | self.retranslateUi(Form) 642 | QtCore.QMetaObject.connectSlotsByName(Form) 643 | 644 | def retranslateUi(self, Form): 645 | _translate = QtCore.QCoreApplication.translate 646 | Form.setWindowTitle(_translate("Form", "Решение задач по математике")) 647 | self.solve_example.setText(_translate("Form", "Решить")) 648 | self.label.setText(_translate("Form", "Решение:")) 649 | self.label_2.setText(_translate("Form", "Задача:")) 650 | 651 | def solve_this(self): 652 | txt = self.example.toPlainText() 653 | if self.is_alg: 654 | input_str = txt 655 | transformations = standard_transformations + (implicit_multiplication_application,) 656 | slv = expand(parse_expr(input_str, transformations=transformations)) 657 | self.solved.setText(str(slv)) 658 | else: 659 | if len(txt.split('=')) == 1: 660 | strToSolve = txt 661 | else: 662 | strToSolve = txt.split('=') 663 | slv = solve(strToSolve) 664 | self.solved.setText(str(slv)) 665 | 666 | 667 | if __name__ == "__main__": 668 | import sys 669 | 670 | app = QtWidgets.QApplication(sys.argv) 671 | MainWindow = QtWidgets.QMainWindow() 672 | ui = Ui_MainWindow() 673 | ui.setupUi(MainWindow) 674 | MainWindow.show() 675 | sys.exit(app.exec()) 676 | 677 | 678 | 679 | 680 | 681 | -------------------------------------------------------------------------------- /main_widget_design.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 460 10 | 472 11 | 12 | 13 | 14 | MathCalcurator 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | background-color: rgb(161, 159, 162); 25 | color:rgb(255, 255, 255); 26 | 27 | 28 | 29 | 30 | 80 31 | 20 32 | 291 33 | 20 34 | 35 | 36 | 37 | 38 | 15 39 | 75 40 | true 41 | 42 | 43 | 44 | Выбирите задачу для решения 45 | 46 | 47 | 48 | 49 | 50 | 20 51 | 70 52 | 401 53 | 291 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 0 62 | 0 63 | 64 | 65 | 66 | 67 | 16 68 | 75 69 | true 70 | 71 | 72 | 73 | background-color:rgb(255, 173, 93) 74 | 75 | 76 | Арифметика 77 | 78 | 79 | 80 | 14 81 | 14 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 0 91 | 0 92 | 93 | 94 | 95 | 96 | 16 97 | 75 98 | true 99 | 100 | 101 | 102 | background-color:rgb(255, 173, 93) 103 | 104 | 105 | Алгебра 106 | 107 | 108 | 109 | 67 110 | 55 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 0 120 | 0 121 | 122 | 123 | 124 | 125 | 16777215 126 | 16777215 127 | 128 | 129 | 130 | 131 | 16 132 | 75 133 | true 134 | 135 | 136 | 137 | background-color:rgb(255, 173, 93) 138 | 139 | 140 | Функции с построением графика 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 0 149 | 0 150 | 151 | 152 | 153 | 154 | 16 155 | 75 156 | true 157 | 158 | 159 | 160 | background-color:rgb(255, 173, 93) 161 | 162 | 163 | Неравенства 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 0 177 | 0 178 | 460 179 | 21 180 | 181 | 182 | 183 | 184 | О программе 185 | 186 | 187 | 188 | 189 | 190 | Помощь 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | MathCalcurator - программа, которая поможет нам решать математику 200 | 201 | 202 | 203 | 204 | 205 | 206 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | contourpy==1.0.6 2 | cycler==0.11.0 3 | fonttools==4.38.0 4 | kiwisolver==1.4.4 5 | matplotlib==3.6.2 6 | mpmath==1.2.1 7 | numpy==1.23.4 8 | packaging==21.3 9 | Pillow==9.3.0 10 | pyparsing==3.0.9 11 | PyQt3D==5.15.5 12 | PyQt5==5.15.7 13 | PyQt5-sip==12.11.0 14 | PyQtChart==5.15.6 15 | PyQtDataVisualization==5.15.5 16 | PyQtNetworkAuth==5.15.5 17 | PyQtPurchasing==5.15.5 18 | PyQtWebEngine==5.15.6 19 | python-dateutil==2.8.2 20 | PyYAML==6.0 21 | six==1.16.0 22 | sympy==1.11.1 23 | -------------------------------------------------------------------------------- /Техническое задание.md: -------------------------------------------------------------------------------- 1 | # Техническое задание 2 | --- 3 | # Содержание 4 | 5 | # 1 Введение 6 | 7 | ## 1.1 Назначение 8 | 9 | В этом документе описаны функциональные и нефункциональные требования к приложению «Калькулятор» для Android. Этот документ предназначен для команды, которая будет реализовывать и проверять корректность работы приложения.(На данный момент это проект для Яндекс.Лицея) 10 | 11 | ## 1.2 Бизнес-требования 12 | 13 | 14 | ### 1.2.1 Исходные данные 15 | 16 | В современном мире много людей работает с различного рода вычислениями.Однако, не все калькуляторы имеют возможность выполнять сложные операции. Это приводит к тому, что пользователи ищут сторонние сервисы для получение желаемого результата. 17 | 18 | 19 | ### 1.2.2 Возможности бизнеса 20 | 21 | Многие студенты, преподователи, программисты желают иметь вычислитльное средство, которое позволит выполнять лоические операции. 22 | Подобное приложение позволит им тратить меньше времени на получение необходимого результата. Интерфейс, спроектированный с учётом 23 | того что он должен быть простым, чтобы была возможность работать людям с малой технической грамотностью. 24 | 25 | 26 | ## 1.3 Аналоги и интерфейс 27 | 28 | Основное отличие от стандартного, предустановленного калькулятор это наличее умение решать задач по алгебре, неравенства и функций с построением графика. 29 | 30 | ### 1.3.1 Программные интерфейсы 31 | 32 | - Должна быть возможность вычисления арифметических операций. 33 | - Должна быть возможность вычисления алгебраических задач. 34 | - Должна быть возможность вычисления неравенств. 35 | - Должна быть возможность вычисления функций с построением графиков. 36 | 37 | 38 | ## 1.4 Аудитория приложения 39 | 40 | ### 1.4.1 Целевая аудитория 41 | 42 | Люди со средним или выше среднего уровнем образования, например, преподаватели, программисты, студенты технических специальностей, люди обладающие минимальной технической грамотностью. 43 | 44 | ### 1.4.2 Побочная аудитория 45 | Все остальные люди, обладающие вышеперечисленными качествами. 46 | 47 | ## 1.5 Функциональные требования 48 | 49 | ### 1.5.1 Основные функции 50 | 1.Вычислния арифметических операций 51 | 2.Вычислния логических алгебраических задач 52 | 3.Вычислния неравенств 53 | 4.Вычислния функций с построением графиков 54 | 55 | --------------------------------------------------------------------------------