Найти - Пользователи
Полная версия: Программа определения ФАВ в строке
Начало » Python для новичков » Программа определения ФАВ в строке
1 2 3 4 5
Alex_Kutsan
Начал учить Питон недавно, но тут преподаватель по дискретной математике сказл что если хотите успешно сдать экзамен то вам нужно написать программу на любом языке програмирования, которая будет определять является ли то что вы ввели Формулой алгебры высказывания, или нет. Так как я знаю только питон то буду писать на нём.

Так вот основные требования:
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” он мне кажется не заметит.
o7412369815963
офигеть, раньше писали “сделайте”, а терь “сначала прочитайте методичку”…
ссылка с трояном не открывается из-за запятой, но он мне не страшен у меня не винда. ;)

ЗЫ: открыть файл можно командой open()
Zubchick
по большому счету в этой задача все куда проще, вам же не нужно выражение вычислять, поэтому проверка приоритетов тоже не нужна. Тупо проверьте количество скобок и не идут ли несколько операторов друг за другом в формуле(за исключением оператора НЕ, он может идти сколько угодно раз). Задайте строгий набор операторов и пляшите от него.
Так же нужно проверить нет ли операторов непосредственно перед закрывающей скобкой и сразу после открывающей.
Alex_Kutsan
У меня тоже не вида, поэтому я даже не знал что там троян. простите если что…
Я вот вроде как написал но она у меня зависает в бесконечной рекрусии, и я немогу понять где.
Я написал с подщётом скобок, но ведь усло вие может задаватся и без них, изза приоритета оператора например я не буду ставить скобки (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
Alex_Kutsan
да и нащёт открытия файлов, я знаю команду open() но она создаёт фаил, и мне нужно открыть текстовый фаил на жестком диске
igor.kaist
f=open(FILENAME).read()
Zubchick
>> А вот мой код, подскажите где рекрусия?
О_о' Шо?

И заодно объясните зачем вам 2 вложенных цикла +)

Вся задача решается в один проход в цикле…
Alex_Kutsan
Я изменил код немного, мне показалось тут ошибка но всёравно в рекрусии зависает
 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
Alex_Kutsan
прото, если 1 цикл, то разность скобок уже после 1 становится 1 , и цикл завершается
Alex_Kutsan
как например вот
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
цикл завершится после первого же прохождения, вот надо бы сделать чтобы он не работал с переменной m пока не найдёт хотябы 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
но он мне неправильно почемуть посчитал разность скобок, цикл прекратился на первойже закрывающейся скобке
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