├── 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 | 
25 |
26 | ## Арифметика
27 | 
28 | 
29 |
30 | ## Функции с построением графика
31 | 
32 | 
33 |
34 | ## Алгебра
35 | 
36 | 
37 |
38 | ## Неравенства
39 | 
40 | 
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 |
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 |
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 |
--------------------------------------------------------------------------------