Форум сайта python.su
Здравствуйте. Нужна помощь, в институте уволили преподшу, преподающую нам программирование, вместо нее поставили другого который не знает питона, он сказал сдаете все лабы будет вам зачет. никакие лекции и семинары у нас не проводятся. 2 лабы я уже вроде как сделал, но как делать вот эту не представляю как:
Цель — научиться использовать принцип конечных автоматов для простейшего лексического анализа.
Задание. Составить программу на языке Python, выполняющую анализ и обработку вводимого текста в соответствии с вариантом задания. В программе не должно быть ограничений на количество и длину строк исходного текста. Предполагается, что текст дан в кодировке ASCII и содержит буквы только латинского алфавита.
Замечания. Программа должна читать данные со стандартного ввода и выводить на стандартный вывод. Знак табуляции обозначается как «\t», а перевод строки «\n» при работе над программой.
Выделить все нечетные числа в тексте, если сумма их цифр четна.
< if i was you, i'd do 77 labs in 3 weeks
> 77
Пример Реализовать конечный автомат для подсчета слов в тексте, состоящего только из букв латинского алфавита и разделителей:**
from sys import stdin
k = 0
state = “out”
for char in stdin.read():
if state == “out”:
if “a” <= char <= “z” or “A” <= c <= “Z”:
state = “in”
k = k + 1
elif state == “in”:
if char == “ ” or char == “\t” or char == “\n” or char == “,”:
state = “out”
print k
с машиной тьюринга знаком, но не могу понять как заставить питон перебирать символы строк, что за метод(?) stdin.read, sys, char, from import stdin. Объясните хотя пример который приведен выше, за что каждое слово в ном отвечает, сам я нигде про это не могу найти информации(
спасибо
Офлайн
ой извините за дубблирование у меня браузер завис, удалите 2 темы
Офлайн
while True: stroka = raw_input('<') if stroka == 'q': break for slovo in stroka.split(): if slovo.isdigit(): if not int(slovo)%2: if sum(map(int,slovo)) %2: print '>',slovo
Офлайн
спасибо! только поясните как дать программе понять что я закончил вводить текст, и начался его анализ?
Офлайн
OxyD
Выделить все нечетные числа в тексте, если сумма их цифр четна.
< if i was you, i'd do 77 labs in 3 weeks
> 77
#!/usr/bin/env python3 def func(s): """Search even sums of digit words.""" delims = ' ' digits = '0123456789' lst = [] state = 0 word, wsum = '', 0 i, slen = 0, len(s) while i < slen: c = s[i] if state == 0: if c not in delims: i -= 1 state = 1 elif state == 1: if c in digits: word += c wsum += int(c) elif c not in delims: word, wsum = '', 0 state = 0 if c in delims or i + 1 == slen: i -= 1 state = 2 elif state == 2: if wsum % 2 == 0: lst.append(word) word, wsum = '', 0 state = 0 i += 1 return lst if __name__ == '__main__': strings = ("4 abc 12 def 345 ghi 5 jkl 57", " 4 abc 12 def 345 ghi 5 jkl 57 ", "1 2 3 4 5 6 7 8 9 10 11") for s in strings: print('str: <{0}>\n' 'lst: {1}'.format(s, func(s)))
[guest@localhost py]$ ./evensums.py
str: <4 abc 12 def 345 ghi 5 jkl 57>
lst: ['4', '345', '57']
str: < 4 abc 12 def 345 ghi 5 jkl 57 >
lst: ['4', '345', '57']
str: <1 2 3 4 5 6 7 8 9 10 11>
lst: ['2', '4', '6', '8', '11']
[guest@localhost py]$
#!/usr/bin/env python3 def func(s): """Search even sums of digit words.""" delims = ' \t' digits = '0123456789' lst = [] state = 'space' word, wsum = '', 0 i, slen = 0, len(s) while i < slen: c = s[i] if state == 'space': if c not in delims: i -= 1 state = 'word' elif state == 'word': if c in digits: i -= 1 state = 'digits' else: state = 'skip' elif state == 'digits': if c in digits: word += c wsum += int(c) if c in delims or \ (c in digits and i + 1 == slen): i -= 1 state = 'count' elif c not in digits: word, wsum = '', 0 state = 'skip' elif state == 'skip': if c in delims: state = 'space' elif state == 'count': if wsum % 2 == 0: lst.append(word) word, wsum = '', 0 state = 'space' i += 1 return lst if __name__ == '__main__': strings = (" 4 abc 12 def 345 ghi 5 jkl 57 ", "4 abc 12 def 345a345 ghi 5 jkl 57", "4 abc 12 def 345 ghi 5 jkl 57a", "1 2 3 4 5 6 7 8 9 10") for s in strings: print('str: <{0}>\n' 'lst: {1}'.format(s, func(s)))
[guest@localhost py]$ ./evsums.py
str: < 4 abc 12 def 345 ghi 5 jkl 57 >
lst: ['4', '345', '57']
str: <4 abc 12 def 345a345 ghi 5 jkl 57>
lst: ['4', '57']
str: <4 abc 12 def 345 ghi 5 jkl 57a>
lst: ['4', '345']
str: <1 2 3 4 5 6 7 8 9 10>
lst: ['2', '4', '6', '8']
[guest@localhost py]$
Отредактировано py.user.next (Апрель 21, 2012 02:20:27)
Офлайн
Вроде стал чуток разбираться, можете подробней написать про stdin, я так понимаю это ввод данных с клавиатуры, как обозначить конец ввода?
Отредактировано OxyD (Апрель 20, 2012 11:15:17)
Офлайн
исправил две логические ошибки у себя
старую версию оставил для сравнения
Офлайн