Уведомления

Группа в Telegram: @pythonsu

#1 Март 25, 2010 21:51:39

Alex_Kutsan
От:
Зарегистрирован: 2010-03-25
Сообщения: 150
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

Начал учить Питон недавно, но тут преподаватель по дискретной математике сказл что если хотите успешно сдать экзамен то вам нужно написать программу на любом языке програмирования, которая будет определять является ли то что вы ввели Формулой алгебры высказывания, или нет. Так как я знаю только питон то буду писать на нём.

Так вот основные требования:
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” он мне кажется не заметит.



Офлайн

#2 Март 25, 2010 22:16:00

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

офигеть, раньше писали “сделайте”, а терь “сначала прочитайте методичку”…
ссылка с трояном не открывается из-за запятой, но он мне не страшен у меня не винда. ;)

ЗЫ: открыть файл можно командой open()

Отредактировано (Март 25, 2010 22:16:57)

Офлайн

#3 Март 25, 2010 22:55:16

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

по большому счету в этой задача все куда проще, вам же не нужно выражение вычислять, поэтому проверка приоритетов тоже не нужна. Тупо проверьте количество скобок и не идут ли несколько операторов друг за другом в формуле(за исключением оператора НЕ, он может идти сколько угодно раз). Задайте строгий набор операторов и пляшите от него.
Так же нужно проверить нет ли операторов непосредственно перед закрывающей скобкой и сразу после открывающей.



Отредактировано (Март 25, 2010 22:59:10)

Офлайн

#4 Март 25, 2010 23:10:42

Alex_Kutsan
От:
Зарегистрирован: 2010-03-25
Сообщения: 150
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

У меня тоже не вида, поэтому я даже не знал что там троян. простите если что…
Я вот вроде как написал но она у меня зависает в бесконечной рекрусии, и я немогу понять где.
Я написал с подщётом скобок, но ведь усло вие может задаватся и без них, изза приоритета оператора например я не буду ставить скобки (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



Офлайн

#5 Март 25, 2010 23:13:17

Alex_Kutsan
От:
Зарегистрирован: 2010-03-25
Сообщения: 150
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

да и нащёт открытия файлов, я знаю команду open() но она создаёт фаил, и мне нужно открыть текстовый фаил на жестком диске



Отредактировано (Март 25, 2010 23:19:06)

Офлайн

#6 Март 25, 2010 23:25:52

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

f=open(FILENAME).read()



Офлайн

#7 Март 25, 2010 23:50:20

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

>> А вот мой код, подскажите где рекрусия?
О_о' Шо?

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

Вся задача решается в один проход в цикле…



Отредактировано (Март 25, 2010 23:51:23)

Офлайн

#8 Март 26, 2010 00:02:30

Alex_Kutsan
От:
Зарегистрирован: 2010-03-25
Сообщения: 150
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

Я изменил код немного, мне показалось тут ошибка но всёравно в рекрусии зависает

 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)

Офлайн

#9 Март 26, 2010 00:20:00

Alex_Kutsan
От:
Зарегистрирован: 2010-03-25
Сообщения: 150
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

прото, если 1 цикл, то разность скобок уже после 1 становится 1 , и цикл завершается



Офлайн

#10 Март 26, 2010 00:37:29

Alex_Kutsan
От:
Зарегистрирован: 2010-03-25
Сообщения: 150
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

как например вот

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
но он мне неправильно почемуть посчитал разность скобок, цикл прекратился на первойже закрывающейся скобке



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version