Сапунов Павел : другие произведения.

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

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


 Ваша оценка:


   АЛГОРИТМ, ЗАМЕНЯЮЩИЙ КОНЕЧНЫЙ АВТОМАТ
  
  
  
   Конечные автоматы - хороший инструмент. Иногда даже слишком хороший. Например,
   для тестирования чисел можно использовать что-нибудь попроще.
  
   Если на входе - число, например -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т список
Сайт - "Художники" .. || .. Доска об'явлений "Книги"