Форум сайта python.su
Начал учить Питон недавно, но тут преподаватель по дискретной математике сказл что если хотите успешно сдать экзамен то вам нужно написать программу на любом языке програмирования, которая будет определять является ли то что вы ввели Формулой алгебры высказывания, или нет. Так как я знаю только питон то буду писать на нём.
Так вот основные требования:
1. ввод данных должен быть из текстового файла, а вывод данных на ээкран ответом ДА,или НЕТ.
вот и мой 1 вопрос, какая команда открывает текстовый фаил? я просто ещё не дошол до этого
2. В текстоввый фаил он занесёт некое выражение и программа должна определить ФАВ(формула алгебры высказывания это или нет)
что такое фав можно прочитать слъдесь на 7-8 страице http://fmponmu.narod.ru/metodichki/odm.exe, там немного, и несложно.
Ит так вот как я решил это решать.
1. нужно задать питону такие команды и их приоритеты( от большего к меньшему) как коньюнкция, дизюнкция, эквиваленция , импликация, и ещё один вне приоритета( или с самым большим приоритетом) отрицание. Как это сделать? как обозначить коньюнкцию( не важно что это такое, главное что у неё самый большой приоритет) значком >. и дизюнкцию <, и чтоб интерпритатор понимал не как строки, а как операции.
2. После задания приоритета, нужно чтобы питон разбил входную( достаточно большую) функцию на несколько функций по меньше, по значку самого малеького приоритета, и конечно с учётом скобок( тоесть если маленький приоритет в скобках, то его разбивать нельзя) это как 2*(2+2)*2, или 2*2+2*2, в первом случае разбивать нельзя, во втором можно.
3. Каждую маленькую функцию он снова разобьёт на несколько ещё меньших , и будет разбивать до того как не дойдёт до каждой переменной в отдельности.
4.Если же он дойдёт да каждой переменой, то это будет ФАВ, если же не дойдёт( например будет нарушение логики типа цифра там какаято или ошибка типа “2*+3”,( только с моими операторами) то это уже не будет ФАВ.
Я приблизительно знаю ка кэто реализовать, но мне например кажется что я всёже построил не правильное решение, ведь если он просто будет разбивать по менее приоритетным операторам, то ошибку типа “2*+3” он мне кажется не заметит.
Офлайн
офигеть, раньше писали “сделайте”, а терь “сначала прочитайте методичку”…
ссылка с трояном не открывается из-за запятой, но он мне не страшен у меня не винда. ;)
ЗЫ: открыть файл можно командой open()
Отредактировано (Март 25, 2010 22:16:57)
Офлайн
по большому счету в этой задача все куда проще, вам же не нужно выражение вычислять, поэтому проверка приоритетов тоже не нужна. Тупо проверьте количество скобок и не идут ли несколько операторов друг за другом в формуле(за исключением оператора НЕ, он может идти сколько угодно раз). Задайте строгий набор операторов и пляшите от него.
Так же нужно проверить нет ли операторов непосредственно перед закрывающей скобкой и сразу после открывающей.
Отредактировано (Март 25, 2010 22:59:10)
Офлайн
У меня тоже не вида, поэтому я даже не знал что там троян. простите если что…
Я вот вроде как написал но она у меня зависает в бесконечной рекрусии, и я немогу понять где.
Я написал с подщётом скобок, но ведь усло вие может задаватся и без них, изза приоритета оператора например я не буду ставить скобки (2*2)+(3*3)
А вот мой код, подскажите где рекрусия?
>>> n= "(((!x)>x)_((!y)=(!x)))"
>>> def COUNT(n):
k=h=0
while h!=1:
if n[k]=="(":
k=k+1
h=k
m=0
while m!= 1:
if n[k]=="(":
k=k+1
m=k
elif n[k]==")":
k=k-1
m=k
else:
k=k+1
return m
Офлайн
да и нащёт открытия файлов, я знаю команду open() но она создаёт фаил, и мне нужно открыть текстовый фаил на жестком диске
Отредактировано (Март 25, 2010 23:19:06)
Офлайн
f=open(FILENAME).read()
Офлайн
>> А вот мой код, подскажите где рекрусия?
О_о' Шо?
И заодно объясните зачем вам 2 вложенных цикла +)
Вся задача решается в один проход в цикле…
Отредактировано (Март 25, 2010 23:51:23)
Офлайн
Я изменил код немного, мне показалось тут ошибка но всёравно в рекрусии зависает
def COUNT(n):
k=h=0
while h!=1:
if n[k]=="(":
k=k+1
h=k
m=0
while m!= 1:
if n[k]=="(":
k=k+1
m=k
elif n[k]==")":
k=k-1
m=k
else:
k=k+1
Отредактировано (Март 26, 2010 00:06:00)
Офлайн
прото, если 1 цикл, то разность скобок уже после 1 становится 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
h=k-m
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
Офлайн