Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.20 KB | None | 0 0
  1. #!/usr/bin/env python
  2. #encoding: utf-8
  3.  
  4. ''' импортировать библиотеку sys'''
  5.  
  6. import sys
  7.  
  8. # sysenc=sys.stdout.encoding
  9.  
  10. ''' проверка версии Python '''
  11. if sys.version_info[0] < 3:
  12.     '''
  13.        если версия Питона меньше 3, то определить функицю c параметрами:
  14.            str строка, которую преобразовывают
  15.            newline - определяет нужно ли добавлять символ '\n' к строке
  16.            fflush  - определяет нужно ли очистить буфер
  17.    '''
  18.     def eprint(str, newline=True, flush=False):
  19.         if newline: # если newline равна True
  20.             str += "\n" # выводить на новую строку
  21.         sys.stdout.write(str.decode('utf-8')) # вывести строку
  22.         if flush: ''' если flush равна False'''
  23.             sys.stdout.flush() # очистить буффер
  24. else:
  25. '''
  26.        если версия Питона больше или равна 3, то определить функицю c параметрами:
  27.            str строка, которую преобразовывают
  28.            newline - определяет нужно ли добавлять символ '\n' к строке
  29.            fflush  - определяет нужно ли очистить буфер
  30.    '''
  31.     def eprint(str, newline=True, flush=False):
  32.         if newline:
  33.             str += "\n"
  34.         sys.stdout.write(str)
  35.         if flush:
  36.             sys.stdout.flush()
  37.  
  38. ''' блок для импортирования библиотеки sympy и обработки исключений (если не импортировали) '''
  39.  
  40. try:
  41.     from sympy import * # импорт библиотеки
  42. except Exception as ex:
  43.     ''' вывод сообщений, если произошла исключительная ситуация '''
  44.  
  45.     eprint("Не удалось импортировать библиотеку sympy(" + str(ex) + ")")
  46.     eprint("возможно она не установлена.")
  47.     eprint("Установить её можно командой: pip install sympy")
  48.     sys.exit(1) # выйти из программы
  49. ''' блок для импортирования библиотеки sympy и обработки исключений (если не импортировали) '''
  50. try:
  51.     ''' импорт библиотек'''
  52.     import threading
  53.     import itertools
  54.     from contextlib import contextmanager
  55. except:
  56.     ''' обработка исключения, объявляем класс с методами __enter__ и __exit__'''
  57.     class Spinner(object):
  58.         def __enter__(self):
  59.             return self
  60.         def __exit__(self, type, value, traceback):
  61.             pass
  62. else:
  63.     ''' объявляем контекстный менеджер '''
  64.     @contextmanager
  65.     def printremove(ch):
  66.         eprint(ch, False, True) # вызов функции eprint
  67.         try:
  68.             yield ch # возвращаем элемент ch
  69.         finally: # finally выполняет блок инструкций в любом случае, было ли исключение, или нет
  70.             eprint('\b \b', False, True)
  71.  
  72.     ''' Объявляем класс, реализующий код потока, наследник класса Thread'''
  73.     class Spinner(threading.Thread):
  74.         # метод конструктор, вызывается при создании объекта класс
  75.         def __init__(self):
  76.             ''' определение свойств класса'''
  77.             self.chars = itertools.cycle(['-', '/', '|', '\\']) # создниеие итератора для цикла
  78.             threading.Thread.__init__(self) # конструктор класса предка (суперкласса)
  79.             self.setDaemon(True)
  80.             self.rlock = threading.RLock() #  примитив синхронизации, который может быть получен несколько раз одним и тем же потоком
  81.             self.cv = threading.Condition() # переменная состояния позволяет одному или нескольким потокам ждать, пока они не будут уведомлены другим потоком.
  82.             self.stop()
  83.             self._start()
  84.  
  85.         # когда поток создается, его нужно запустить, для этого используется метод start
  86.         def _start(self):
  87.             threading.Thread.start(self)
  88.         def start(self):
  89.             self.stoped = False
  90.             self.rlock.release()
  91.         # для остановки работы потока
  92.         def stop(self):
  93.             self.stoped = True
  94.             with self.cv:
  95.                 self.cv.notify() # вызов метода notify() в контекстном менеджере
  96.             self.rlock.acquire()
  97.  
  98.         ''' Метод, определяющий логику работы потока'''
  99.         def run(self):
  100.             # секция  для отлова и обработки исключений
  101.             try:
  102.                 while 1: # бесконечный цикл
  103.                     # используем rlock и cv (смотри определение этих параметров класса)
  104.                     with self.rlock:
  105.                         with self.cv:
  106.                             for ch in self.chars: # цикл по символам из chars
  107.                                 if self.stoped:
  108.                                     break # выход из цикла
  109.                                 with printremove(ch):
  110.                                     self.cv.wait(0.5) # ожидание половину секунды
  111.             finally: # finally выполняет блок инструкций в любом случае, было ли исключение, или нет
  112.                 self.stop() # остановка работы
  113.         # метод вызывается при входе в контектный менеджер
  114.         def __enter__(self):
  115.             self.start()
  116.             return self
  117.         # метод вызывается при выходе из контекстного менеджера
  118.         def __exit__(self, type, value, traceback):
  119.             self.stop()
  120.  
  121. # испорт библиотеки
  122. import fileinput
  123.  
  124.  
  125. try:
  126.     '''функция для красивого(термин pretty print) вывода информации'''
  127.     init_printing(use_unicode=False, wrap_line=False, no_global=False)
  128.  
  129.     x = symbols('x') # определение константы x
  130.     spinner = Spinner() # создали объект класса
  131.  
  132.     # вывод текста
  133.     print("")
  134.     eprint("Программа решения интегралов с бесконечными пределами.")
  135.     eprint("В подинтегральном выражении можно использовать переменную 'x'")
  136.     eprint("например: sin(x^2)")
  137.     print("")
  138.  
  139.     eprint("Введите подинтегральное выражение(или 'выйти'(или 'exit') для завершения):")
  140.     print("")
  141.  
  142.     eprint("> ", False, True)
  143.     # чтение из файла
  144.     for integrand in fileinput.input():
  145.         try:
  146.             integrand = integrand.strip().lower() # обработка строки
  147.             if "" != integrand: # если строка не равна пустому символу
  148.                 print("")
  149.                 # если строка равна одному из вариантов, то выход из цикла
  150.                 if ("exit" == integrand or "exit()" == integrand or "quit"  == integrand or
  151.                     "q"    == integrand or "выйти"  == integrand or "выход" == integrand):
  152.                     break
  153.  
  154.                 eprint("Результат: ", False, True)
  155.                 # заходим в контекстный менеджер
  156.                 with spinner:
  157.                     integrand = integrand.replace("^", "**") # заменяем символ ^ на **
  158.                     result = eval("integrate(" + integrand + ", (x, -oo, oo))") # вычисляем интеграл вызовом eval
  159.                 print("")
  160.                 pprint(result)
  161.  
  162.                 eprint("Численный результат: ", False, True)
  163.                 # выводим численный результат
  164.                 try:
  165.                     with spinner:
  166.                         result = result.evalf()
  167.                 except:
  168.                     result = nan
  169.                 eprint(str(result))
  170.                 print("")
  171.  
  172.         except Exception as ex: # обработка исключений
  173.             eprint("Было введено недопустимое выражение: " + str(ex))
  174.             print("")
  175.  
  176.         eprint("> ", False, True)
  177. except:
  178.     sys.exit() # завершение программы
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement