Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2009, 19:12   #1
pizhon1
Пользователь
 
Регистрация: 17.09.2009
Сообщений: 10
По умолчанию не хватает условия в программе

Извините если не в ту тему пишу
сейчас прохожу языки грамматику
Вообщем программа должна выдавать YES если текст например такого вида z=c*b если не такого вида(вместо z может быть x или y,и любая комбинация -+*с буквами a,b,c)то должен выдавать ошибку,но вот у меня если я введу =с*b или c*b или *b или b ошибку не выдаёт надо где то условие поставить не могу понять где?
type AutoState=(AH,AK,AP,AT,AR,AuS,AE);
var i:byte;InputSt:string;
function ErrorCode(InputSt:string):byte;
var i:byte;Istate:AutoState;
begin
i:=length(InputSt);
Istate:=AH;
repeat
case Istate of
AH:if InputSt[i] in ['a,b,c'] then begin IState:=AK;
dec(i) end else Istate:=AE;
AK:if InputSt[i] in ['+,-,*'] then begin IState:=AP;
dec(i) end else Istate:=AE;
AP:if InputSt[i] in [a,b,c] then begin IState:=AT;
dec(i) end else Istate:=AE;
AT:if InputSt[i] in ['='] then begin IState:=AR;
dec(i) end else Istate:=AE;
AR:if InputSt[i] in ['x,y,z'] then begin IState:=AuS;
dec(i) end else Istate:=AE;
end;
AuS:if i<>1 then IState:=AE else i:=0;
end;
until(i=0) or (IState=AE);
ErrorCode:=i;
end;
begin
readln(InputSt);
If ErrorCode(InputSt)<>0 then writeln('Error at pos',ErrorCode(InputSt)) else writeln('YES');
readln;
end.
end.

Последний раз редактировалось pizhon1; 21.10.2009 в 19:24.
pizhon1 вне форума Ответить с цитированием
Старый 21.10.2009, 22:33   #2
hoza_syl
Форумчанин
 
Аватар для hoza_syl
 
Регистрация: 23.05.2008
Сообщений: 219
По умолчанию

В этом коде чорт голову сломает(заключи его хоть в BB коды CODE), и объяснение тоже мягко говоря не очень.
The Revolution is Now!
hoza_syl вне форума Ответить с цитированием
Старый 21.10.2009, 22:48   #3
Vol666
Гуру Разврата
Форумчанин
 
Аватар для Vol666
 
Регистрация: 29.07.2009
Сообщений: 373
По умолчанию

Зачем же так заморачиваться, просто делаете проверку так:
if (edit1.text='z=c*b') then
begin
//что необходимо делать если тексты совпадают
end
else
begin
//что необходимо делать когда не совпадают
end;
Фредди вернулся))) И Готов Убивать!!!
Vol666 вне форума Ответить с цитированием
Старый 22.10.2009, 01:13   #4
.Phoenix
Форумчанин
 
Регистрация: 02.04.2009
Сообщений: 235
По умолчанию

Vol666 не думаю что
Код:
if (edit1.text='z=c*b') then
begin
//что необходимо делать если тексты совпадают
end
else
begin
//что необходимо делать когда не совпадают
end;
код будет работать. Если хорошо присмотреться, то можно увидеть, что программа пишется на Turbo Pascal'е.
Код:
type AutoState=(AH,AK,AP,AT,AR,AuS,AE);
var i:byte;InputSt:string;
function ErrorCode(InputSt:string):byte;
var i:byte;Istate:AutoState;
begin
i:=length(InputSt);
Istate:=AH;
repeat
case Istate of
AH:if InputSt[i] in ['a,b,c'] then begin IState:=AK;
dec(i) end else Istate:=AE;
AK:if InputSt[i] in ['+,-,*'] then begin IState:=AP;
dec(i) end else Istate:=AE;
AP:if InputSt[i] in [a,b,c] then begin IState:=AT;
dec(i) end else Istate:=AE;
AT:if InputSt[i] in ['='] then begin IState:=AR;
dec(i) end else Istate:=AE;
AR:if InputSt[i] in ['x,y,z'] then begin IState:=AuS;
dec(i) end else Istate:=AE;
end;
AuS:if i<>1 then IState:=AE else i:=0;
end;
until(i=0) or (IState=AE);
ErrorCode:=i;
end;
begin
readln(InputSt);
If ErrorCode(InputSt)<>0 then writeln('Error at pos',ErrorCode(InputSt)) else writeln('YES');
readln;
end.
end.
например, я по крайне мере выделенные операторы встречал только в TP, в Delphi ничего подобного не видел.
Всё гениальное - просто!
.Phoenix вне форума Ответить с цитированием
Старый 22.10.2009, 01:20   #5
.Phoenix
Форумчанин
 
Регистрация: 02.04.2009
Сообщений: 235
По умолчанию

2pizhon1. Тебе не кажется, что на вот этом этапе:
Код:
AH:if InputSt[i] in ['a,b,c'] then begin IState:=AK;
dec(i) end else Istate:=AE;
AK:if InputSt[i] in ['+,-,*'] then begin IState:=AP;
dec(i) end else Istate:=AE;
AP:if InputSt[i] in [a,b,c] then begin IState:=AT;
dec(i) end else Istate:=AE;
AT:if InputSt[i] in ['='] then begin IState:=AR;
dec(i) end else Istate:=AE;
AR:if InputSt[i] in ['x,y,z'] then begin IState:=AuS;
dec(i) end else Istate:=AE;
end;
AuS:if i<>1 then IState:=AE else i:=0;
стоит оформит в виде множеств, т.е.
Код:
AH:if InputSt[i] in ['a','b','c'] then begin IState:=AK;
dec(i) end else Istate:=AE;
AK:if InputSt[i] in ['+','-','*'] then begin IState:=AP;
dec(i) end else Istate:=AE;
AP:if InputSt[i] in [a,b,c] then begin IState:=AT; кстати, в множестве желательно оформлять символы, у меня на этом этапе выдает ошибку, но если тут поставить галочки тут всё путём
dec(i) end else Istate:=AE;
AT:if InputSt[i] in ['='] then begin IState:=AR;
dec(i) end else Istate:=AE;
AR:if InputSt[i] in ['x','y','z'] then begin IState:=AuS;
dec(i) end else Istate:=AE;
AuS:if i<>1 then IState:=AE else i:=0;
я тут слегка подкорректировал код. По крайней мере у меня теперь выдает сообщения, но я не до конца всё таки понял твои пояснения и чего ты хочешь добиться.
Поясню...
Код:
AH:if InputSt[i] in ['a','b','c']...
Вот мой фрагмент кода
Код:
AH:if InputSt[i] in ['a,b,c']...
Вот твой фрамент кода.
Тут я понимаю идёт проверка входит ли InputSt[i] в множество ['a,b,c'], если Да, то какое -то выполняется действие. Напомню, что элементы множества, стоит разделять...Как показано на моём образце.
Всё гениальное - просто!

Последний раз редактировалось .Phoenix; 22.10.2009 в 01:29.
.Phoenix вне форума Ответить с цитированием
Старый 22.10.2009, 01:22   #6
Вавел из ГМТУ
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 896
По умолчанию

Всётаки тема в разделе "Общие вопросы Delphi", если автор адекватен, то он это заметил и не стал бы сюда постить задачу по TP. А операторы типа Read(ln) и Write(ln) есть в консольном проекте. Такчто предположим что это консоль.

Теперь по теме.

По моему всё очень просто. Надо в цикле идти по строке. И смотреть чтоб происходило чередование "буква - спецсимвол".
А также выставить обязательные условия:
1. 1-ый знак всегда буква.
2. 2-ой знак всегда равно.
3. 3-ий буква.
4. Не буква, любой из + - * /.
5. Буква.

Если вид именно с = a * b и пр. то это покатит.

PS: я кстати не понял что там за код у автора )))
Мозг сломался, пойду чинить....

Последний раз редактировалось Вавел из ГМТУ; 22.10.2009 в 01:38.
Вавел из ГМТУ вне форума Ответить с цитированием
Старый 23.10.2009, 09:35   #7
pizhon1
Пользователь
 
Регистрация: 17.09.2009
Сообщений: 10
По умолчанию

спасибо ребята я разобрался...ещё раз приношу свои извинения что не туда написал
pizhon1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите дописать БД Лорд_Оледжан Паскаль, Turbo Pascal, PascalABC.NET 2 30.05.2009 22:14
Помогите дописать ShnapS Паскаль, Turbo Pascal, PascalABC.NET 4 28.05.2008 21:08
Помогите дописать программу. ShnapS Паскаль, Turbo Pascal, PascalABC.NET 5 17.05.2008 19:50
Помогите дописать Klyan Общие вопросы C/C++ 8 22.06.2007 01:55