Сапунов Павел
Алгоритм, Заменяющий Конечный Автомат

Самиздат: [Регистрация] [Найти] [Рейтинги] [Обсуждения] [Новинки] [Обзоры] [Помощь|Техвопросы]
Links
Кожевенное мастерство: сумки, ремни своими руками
 Ваша оценка:



  АЛГОРИТМ, ЗАМЕНЯЮЩИЙ КОНЕЧНЫЙ АВТОМАТ
 
 
 
  Конечные автоматы - хороший инструмент. Иногда даже слишком хороший. Например,
  для тестирования чисел можно использовать что-нибудь попроще.
 
  Если на входе - число, например -3.045012Е-007, можно сделать так.
  У нас три "цепочки" чисел - "3", "045012", "007". Наш псевдоавтомат не должен иметь чувствительность как к длине цепочки, так и к разнообразию чисел внутри цепочки. Поэтому, первое, что мы сделаем - заменим все цифры в цепочках на одну, например на "1". Получим: "1", "111111", "111". А затем заменим все пары "11" на единичный символ "1". После этого тестируемое число станет таким: "-1.1Е-1"
 
  Далее, на первой позиции может быть знак числа. Если он есть, то его можно заменить на пустое место или на знак "1". Если есть "Е-1", то минус (или плюс) можно заменить на "1" - "Е11". Если по ошибке набрано два минуса ( "Е--1" ), то второй минус останется -
  "Е1-1". После этого все пары "11" надо заменить на "1".
 
  Если число было набрано верно, у нас должно получиться "1.1Е1" . После этого надо опять сделать замену "Е1" на "1" (один раз). После этого надо опять все пары "11" надо заменить на "1". Если в начале число было набрано верно, то у нас получится строка "1.1"
  А если получилось что-то другое - значит, число было набрано не верно.
 
  Данный псевдоавтомат (но несколько иначе) реализован в программе:
 
  Procedure change(var ss:string; s1,s2:string);
  Var ii:byte;
  Begin ii:=pos(s1,ss);
  If ii >0 then begin
  Delete(ss,ii,length(s1));insert(s2,ss,ii);end;
  End;
 
  Function goodN(Num:string):boolean;
  Const N=#3;
  Var ii:word;
  Begin
  Change(Num,'+','-');
  If Num[1]='-' then change(Num,'-','');
  Change(Num,'.','');
  For ii:=1 to length(Num) do if Num[ii] in ['0'..'9'] then Num[ii]:=N;
  While pos(N+N,Num)>0 do change(Num,N+N,N);
  If Num=N then goodN:=true else goodN:=not true;
  End;
 
 
  Как видите, в программировании так же, как и в математике, у каждой задачи есть несколько решений. И это хорошо, иначе было бы скучно жить!
  А жизнь - это творчество. Причём, это верно для всех людей.
  Поэтому, желаю Вам всем - УДАЧИ !
 
 
  Павел Сапунов
 Ваша оценка:

Связаться с программистом сайта.

Новые книги авторов СИ, вышедшие из печати:
О.Болдырева "Крадуш. Чужие души" М.Николаев "Вторжение на Землю"

Как попасть в этoт список

Кожевенное мастерство | Сайт "Художники" | Доска об'явлений "Книги"