Найти - Пользователи
Полная версия: Программа определения ФАВ в строке
Начало » Python для новичков » Программа определения ФАВ в строке
1 2 3 4 5
Alex_Kutsan
вот немного подкоректировал, теперь он мне говорит что разность скобок = 1 , на последнем символе.
def COUNT(n):
k=h=m=d=0
while h!=1:
if n[d]=="(":
k=k+1
d=d+1
elif n[d]==")":
m=m+1
d=d+1
else:
d=d+1
while n[d]!= ")":
if n[d]=="(":
k=k+1
d=d+1
elif n[d]==")":
m=m+1
d=d+1
else:
d=d+1
h=k-m
return d
кажется это изза ещё одного вложеного цикла, но как сделать без него я не могу придумать
Alex_Kutsan
О! кажется получилось
>>> n
'(((!x)>x)_((!y)=(!x)))'
>>> def COUNT(n):
k=h=m=d=0
j=1
while h!=1:
if n[d]=="(":
k=k+1
d=d+1
elif n[d]==")":
m=m+1
d=d+1
else:
d=d+1
while n[j]!= ")":
if n[j]=="(":
k=k+1
j=j+1
d=d+1
elif n[d]==")":
m=m+1
d=d+1
j=j+1
else:
d=d+1
j=j+1
h=k-m
return d

>>> COUNT(n)
9
>>> n[:9]
'(((!x)>x)'
Но теперь проблема,
ведь такой случай если n='(((!x) >=x)_((!y)=(!x)))' программа тоже обработает и даже не заикнётся,а в решении это будет ошибка. Как обработать такое исключение?
PooH
О! Программирование методом Монте-Карло!!! Я преклоняюсь пред Вами, Мастер…
Ed
В первом цикле напрочь отсутствует изменение условия выхода. Он бесконечен.
Попытайтесь переписать это на Python :)
Zubchick
скобочки считаются элементарно.
brackets = 0
# Считаем скобочки
for letter in string:
if letter == '(':
brackets += 1
elif letter == ')':
brackets -= 1

if brackets != 0:
print "Ошибка! Ошибка!"
Alex_Kutsan
Спасибо, я совеошенно забыл про циклы for, но к сожалению этот код мне не совсем подходит.
если его проанализировать на функции например n= "(((!x)>x)_((!y)=(!x))) и цикл выполнится. Но всё что он сделал то это сказал что количество открыывающихся скобок = количеству закрывающихся, а для этого подходит и такая функция ()()()()()()()x(), которая уже не является ФАВ т.к тут просто скобки без выражения и действий, Я возьму вашу функцию на заметку в начале программы, чтоб следуйщий оператор по напрасну не работал с функцией где разница скобок != 0

PooH
О! Программирование методом Монте-Карло!!! Я преклоняюсь пред Вами, Мастер…
это наверно сарказм,я если чесно не сильно понял вашего выражения, я знаю конечно у меня код слегка Индуский. Я сейчас выложу код с коментариями, чтобы было понятней что я хотео им сделать.

>>> n
'(((!x)>x)_((!y)=(!x)))' # Я задал высказывание
>>> def COUNT(n): # Чоб определить Фав оно или не фав мне надо разбить его ещё на 2 высказывания, в том месте где
#личество открывающихся скобок на 1 больше чем закрывающихся( кроме 1 скобки)
k=h=m=d=0 # задаю нужные мне перемен. k=откр скобки, m=закр, d=колво симв. которые прошол цикл. h=k-m
j=1 # j мне понадобится во вложеном цикле чтоб предотвратить такую разность скобок как 1-0 =1,
while h!=1: # В конце цикла я сделал h как кол-во откр - кол-во закр скобок, и циклмпродолж. пока эта разность !=1
if n[d]=="(":
k=k+1
d=d+1
elif n[d]==")": # я щитаю откр скобки и закр скобки, если же это не скобки то он просто переходит не след символ
m=m+1
d=d+1
else:
d=d+1
while n[j]!= ")": # а вот решение проблемы 1 откр скобки, ведь сразу после неё будет k=1,m=0,h=k-m=1-0=1 и цикл
if n[j]=="(": # прекратится, я создал вложеный цикл который перемещяется по симв. пока не встретит закр. скоб.
k # условия оператора подщёта скобок теже самые, но встретив 1 закр скобку, проблема
j=j+1 # вида k=1,m=0,h=k-m=1-0=1 решится, и вложеный цикл закончится.
d=d+1
elif n[d]==")":
m=m+1
d=d+1
j=j+1
else:
d=d+1
j=j+1
h=k-m # после подщёта циклом скобок от отнимает от откр - закр когда эта разность стнет 1 цикл прекратится
return d # и выдаст мне номер той скобки , на которой разность открытых и закрытых станет 1.
>>> COUNT(n)
9
>>> n[:9]
'(((!x)>x)' # как видно всё правильно, колво откр=3, закр=2, 3-2=1
#теперь нужно в месте d разбить функцию на 2, до d и после d, отвросить у этих функций крайние скобки и проделать с каждой из них тоже самое, пока не дойдём до отсуствия скобок. А там начнутся основные сложности.
sypper-pit
Alex_Kutsan
а модуль math и аналоги чем не устраивают ?
Ed
Что-нибудь типо такого подойдет?
def is_prop_formula(string):
def reduce(string):
result = re.sub("\(?&[A-Z]\)?|\(?[A-Z]>[A-Z]\)?|\(?[A-Z]<[A-Z]\)?|\(?[A-Z]=[A-Z]\)?|\(?[A-Z]_[A-Z]\)?|\([A-Z]\)", "X", string)
if result != string:
return reduce(result)
return result
return reduce(string) == "X"
По крайней мере у меня заработало вот это:
In [1]: is_prop_formula("(A=B)>(&C<D)=C=T>Z")
Out[1]: True
In [2]: is_prop_formula("+(A=B)>(&C<D)=C=T>Z")
Out[2]: False
rerednaW
Alex_Kutsan
это наверно сарказм,я если чесно не сильно понял вашего выражения, я знаю конечно у меня код слегка Индуский. Я сейчас выложу код с коментариями, чтобы было понятней что я хотео им сделать.
Я конечно не знаком с современными методами преподавания, но, по-моему, задача сводится к простейшему парсеру на базе yacc. Под Питон есть PLY, и соответственно, совсем простой пример http://www.dabeaz.com/ply/example.html

А программирование методом Монте-Карло - это сильно… :-)
Ed
Он же студент. Готовое решение на основе PLY или другой библиотеки его не устроит. По крайней мере если бы я был преподом, то не принял бы.
Судя по крикам ‘СРОЧНО!’ экзамен уже сегодня-завтра-в понедельник.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB