Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
3 / 3 / 0
Регистрация: 02.04.2018
Сообщений: 47

Вычисление выражения с eval

27.09.2019, 12:45. Показов 4712. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нам дается строка - функция от переменной х. А затем даются 2 числа - концы отрезка, на котором обязательно есть ровно 1 корень. Нужно найти этот корень с точностью 0.00001 и вывести его.
Вот код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import math
def user_func(y,x):
    while y.find('x')!=-1:
        i = y.find('x')
        y = y[:i] + str(x) + y[i + 1:]
    return eval(y)
 
expr = input()
a,b = eval(input())
c = (a+b)/2
while abs(user_func(expr,c)) >= 0.000001:
    if user_func(expr,c)*user_func(expr,a) < 0:
        b = c
        c = (a+b)/2
    else:
        a = c
        c = (a+b)/2
 
print(c)
Но eval в конце когда считает, не понимает, что такое sin,cos и тп. Но пользовательский ввод это просто sin,а не math.sin. Я заранее не знаю что может попасться в функции, это может быть и логарифм, и экспонента. Если заранее знать функцию, то все норм, подключаешь через from и как будто работает. Вопрос: как считать тогда?
И да, использование eval в учебных целях, про опасность наслышана
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.09.2019, 12:45
Ответы с готовыми решениями:

Вычисление выражения без использования функции eval
Организовать ввод арифметического выражения. При подсчете учитывать наличие нескольких арифметических знаков, наличие скобок, приоритет...

Вычисление Eval()
Здравствуйте:yes: Прошу подсказать, будет ли Access функцией Eval() вычислять логическую функцию IIf, Switch или Choose, например: ...

Как через eval вывести значение выражения
Добрый день. Скрипт должен вывести значение выражения (14), но не выводит. $z1=&quot;2&quot;; $z2=&quot;*&quot;; $z2=&quot;(&quot;;...

5
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
27.09.2019, 14:54
Цитата Сообщение от hardequation Посмотреть сообщение
И да, использование eval в учебных целях, про опасность наслышана
Слухи про опасность eval преувеличены. Если кто то захочет нанести вред, он не будет использовать особенности инструкции eval, а просто запустит вирус. Случайно же навредить данным в компьютере неграмотным пользователем, который введет некоторую строку, не возможно, если в коде не импортируются системные модули sys или os. Повреждение же самого кода не страшно, его всегда можно восстановить (только совсем не разумные программисты хранят код в одном экземпляре).

Добавлено через 5 минут
Цитата Сообщение от hardequation Посмотреть сообщение
Если заранее знать функцию, то все норм, подключаешь через from и как будто работает. Вопрос: как считать тогда?
Вопрос не совсем понятен. Если Вы используете from math import * , то все функции из math доступны без указания модуля.
0
3 / 3 / 0
Регистрация: 02.04.2018
Сообщений: 47
27.09.2019, 21:01  [ТС]
Спасибо, я не знала что можно просто * поставить. В общем функции он ищет, но на тесте exp(x+2)-5 на отрезке [-5,0] в представлении числа появляется 'p', и выдается синтаксическая ошибка
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
28.09.2019, 01:47
hardequation, Я кажется нашел Вашу ошибку.
В строках
Python
1
2
    while y.find('x')!=-1:
        i = y.find('x')
питон находит не неизвестную "х", а букву "х" в названии функции exp и подставляет сюда число.
В результате мы получаем вместо выражения ерунду
Python
1
'e-2.5p(x-2)-5'
Питон не может вычислить это выражение, поэтому и выдает ошибку.
Нужно думать, как отличить в вводимом выражении букву х обозначающую неизвестную, в которую подставляется число, от буквы х в названии функции exp.

Добавлено через 24 минуты
Я посмотрел, какие функции в модуле math имеют в названии букву "х". Все они содержат в названии сочетание "exp". Если у меня таблица функций в модуле math полная, то можно в лоб проверять какой символ стоит за буквой "х". Если он является буквой "p", то нужно искать следующую букву "х".
Может кто то предложит более элегантное решение.

Добавлено через 19 минут
Кстати, а у Вас функция может содержать несколько "х" в описании функции?
Например выражение ahttps://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{2}+bx+c при определенных коэффициентах может иметь один корень, но использует в выражении переменную х два раза.
Кстати возник еще один вопрос. А как быть когда вводится например выражение 2х+3? Питон ведь не понимает 2х, у него должно быть 2*х. Как решается эта проблема?

Добавлено через 15 минут
Получается мы с клавиатуры должны вводить такое выражение, которое понимает питон, то есть 2*х+3 .
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
28.09.2019, 12:06
hardequation, Я не сразу сообразил, цикл while ищет в выражении все вхождения буквы "х" и заменяет ее на число.
Python
1
'e-2.5p(-2.5-2)-5'
поэтому свой первый вопрос я снимаю.
Постарайтесь решить проблему с "х" в названии функции "exp" .
0
3 / 3 / 0
Регистрация: 02.04.2018
Сообщений: 47
28.09.2019, 14:31  [ТС]
Да, я ваше предложение с поиском следующего символа не видела, но сделала также,подумала что вроде бы нигде 'x' больше не встречается.Проверку в while пришлось изменить,ибо из-за экспоненты она никогда -1 не будет равна, в общем вот результат:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from math import *
def user_func(y,x):
    i = 0
    while i!=len(y):
        if y[i] != 'x':
            i += 1
            continue
        if (i == 0 or i == len(y)-1) or y[i+1] != 'p':
            y = y[:i] + '('+ str(x) + ')' + y[i + 1:]
        else:
            i+=1
    return eval(y)
 
expr = input()
a,b = eval(input())
c = (a+b)/2
while (abs(user_func(expr,c))) >= 0.000001:
    if user_func(expr,c)*user_func(expr,a) < 0:
        b = c
        c = (a+b)/2
    else:
        a = c
        c = (a+b)/2
print(c)

Спасибо за помощь)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2019, 14:31
Помогаю со студенческими работами здесь

Запись чисел в строку и вычисление рез-та через eval()
Здравствуйте, решил написать калькулятор, но появилась проблема: числа не пишутся в строку(одно заменятется другим при попытки конкатенации...

Вычисление выражения
Составить программу, вычисляющую заданное условное целочисленное выражение для данных со знаком и размерностью до 4-х байт, используя...

Вычисление выражения
Даны действительные числа а_0,…, a_6. Получить для x= 1,3,4 значение p(x+1)-p(x), где p(y)= a_6 y^6+a_5 y^5+…+a_0

Вычисление выражения
1.На заданном отрезке изменения X {a, b} с шагом h подсчитать значения: Помогите ,пожалуйста! если n=15 то (2*n-1)! это 29!,то выходит...

Вычисление выражения
доброй ночи!Есть программа для вычисление выражения:(\frac{x+y}{8}) and {z^2}_{} assume DS:data ;================== code segment ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru