IPB

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  1 2 >  
Ответить в эту темуОткрыть новую тему
> Перевод прописных чисел в цифровые, Английский язык
denizk
сообщение 4.1.2011, 14:02
Сообщение #1


Пользователь


Группа: Активисты
Сообщений: 654
Регистрация: 31.10.2007
Пользователь №: 18 005



Собственно задание надо написать программу которая переводит строку с числами прописью в обычные числа!
Тобишь:
Входная строка: Twelve One Hundred Twenty One
Выходная строка: 12 100 21
Кол-во пробелов может быть любое! У кого какие идеи?
Я пока вот всё,что надумал:

Код

var
  Form1: TForm1;
  FirstSymb:array[0..100] of string[10];

procedure TForm1.Button1Click(Sender: TObject);
Var
  i, j, p: integer;
  InputSt, OutputSt, TempSt1, TempSt2, SearchSt: string;
begin
InputSt := Edit1.Text;
TempSt1 := 'one';
P := SearchString(TempSt1,InputSt,2);
Label1.Caption := IntToStr(P);
{for I := 0 to 9 do
begin
  SearchSt := FirstSymb[i];
  P := Pos(SearchSt,InputSt);
  if P <> 0 then
  if P <> 1 then Showmessage('Ошибка такого числа нету')
  else
  begin
   TempSt1 := IntToStr(I);
   TempSt2 := IntToStr(J);
   OutputSt := TempSt1[1]+TempSt2;
  end;
end;
Label1.Caption := OutputSt;}
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FirstSymb[0] := 'zero';
FirstSymb[1] := 'one';
FirstSymb[2] := 'two';
FirstSymb[3] := 'three';
FirstSymb[4] := 'four';
FirstSymb[5] := 'five';
FirstSymb[6] := 'six';
FirstSymb[7] := 'seven';
FirstSymb[8] := 'eight';
FirstSymb[9] := 'nine';
FirstSymb[10] := 'ten';
FirstSymb[11] := 'eleven';
FirstSymb[12] := 'twelve';
FirstSymb[13] := 'thirteen';
FirstSymb[14] := 'fourteen';
FirstSymb[15] := 'fifteen';
FirstSymb[16] := 'sixteen';
FirstSymb[17] := 'seventeen';
FirstSymb[18] := 'eighteen';
FirstSymb[19] := 'nineteen';
FirstSymb[20] := 'twenty';
FirstSymb[30] := 'thirty';
FirstSymb[40] := 'fourty';
FirstSymb[50] := 'fifty';
FirstSymb[60] := 'sixty';
FirstSymb[70] := 'seventy';
FirstSymb[80] := 'eighty';
FirstSymb[90] := 'ninety';
end;


Тобишь собственно ровным счётом ничего! Если одно число в строке то ещё как-то понятно!

Код

procedure TForm1.Button1Click(Sender: TObject);
Var
  i, j, p, z, sum: integer;
  InputSt, OutputSt, TempSt1, TempSt2, SearchSt: string;
  Error: boolean;
begin
Error := True;
InputSt := Edit1.Text;
for I := 0 to 90 do
for J := 0 to 90 do
begin
  if InputSt = FirstSymb[i]+' '+FirstSymb[j]  then
  begin
   TempSt1 := IntToStr(I);
   TempSt2 := IntToStr(J);
   OutputSt := TempSt1[1]+TempSt2;
   Error := False;
  end;
  if InputSt = FirstSymb[i] then
  begin
   OutputSt := IntToStr(i);
   Error := False;
  end;
end;
for I := 0 to 9 do
   if InputSt = FirstSymb[i]+' '+'hundred' then
    OutputSt := IntToStr(i)+'00';
for I := 0 to 9 do
   for J := 0 to 90 do
   if InputSt = FirstSymb[i]+' '+'hundred'+' '+FirstSymb[j] then
      begin
        if j <= 9 then
        begin
          OutputSt := IntToStr(I)+'0'+IntToStr(J);
          Error := False;
        end;
        if j>=10 then
        begin
          OutputSt := IntToStr(I)+IntToStr(J);
          Error := False;
        end;
      end;
for I := 0 to 9 do
   for J := 0 to 90 do
     for Z := 0 to 9 do
       if InputSt = FirstSymb[i]+' '+'hundred'+' '+FirstSymb[j]+' '+FirstSymb[z] then
       begin
         TempSt1 := IntToStr(J);
         OutputSt := IntToStr(I)+TempSt1[1]+IntToStr(Z);
         Error := False;
       end;


Label1.Caption := OutputSt;
if Error = True then ShowMessage('Ошибка такой цифры нет');

end;


Сообщение отредактировал denizk - 4.1.2011, 14:50
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tanker
сообщение 4.1.2011, 15:35
Сообщение #2


Пользователь


Группа: Активисты
Сообщений: 363
Регистрация: 26.11.2009
Пользователь №: 22 377



надо использовать алгоритмы выделения слов из строки входной. были здесь на форуме такие.

в этом же цикле выделения и переводить затем в цифры...


--------------------
Успехов!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
denizk
сообщение 4.1.2011, 15:50
Сообщение #3


Пользователь


Группа: Активисты
Сообщений: 654
Регистрация: 31.10.2007
Пользователь №: 18 005



Цитата(Tanker @ 4.1.2011, 15:35) *

надо использовать алгоритмы выделения слов из строки входной. были здесь на форуме такие.

в этом же цикле выделения и переводить затем в цифры...

Ну то что надо использовать алгоритмы выделения слов из строки это понятно))

Предложи какой-нибудь пожалуйста)) rolleyes.gif
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tanker
сообщение 4.1.2011, 16:39
Сообщение #4


Пользователь


Группа: Активисты
Сообщений: 363
Регистрация: 26.11.2009
Пользователь №: 22 377



http://opeople.ru/topic9428s0.html?p=193154&#entry193154


--------------------
Успехов!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
denizk
сообщение 4.1.2011, 20:59
Сообщение #5


Пользователь


Группа: Активисты
Сообщений: 654
Регистрация: 31.10.2007
Пользователь №: 18 005



Цитата(Tanker @ 4.1.2011, 16:39) *

Спасибо! Максимум чего теперь надумал как отсеивать только числа с 0 до 9,а как двухзначные и трёхзначные при таком подходе делать! unsure.gif

Код

procedure Poisk(InSlovo: String);
var
S: String;    {считанная строка <=255 символов}
len: integer; {длина считанной строки}
kol: byte; {номер слова}
p: byte; {номер рассматриваемого символа в строке}
Slovo: string; {выделяемое слово}
I, J, Z: integer; {переменные для прогона}
TempSt1, TempSt2, OutputSt: string;
begin
{считываем строку S}
S := InSlovo;
len:=Length(S); {длина строки S}
kol:=0;   {рассмотрено 0 слов}
p:=1;     {начнем с первого символа}
{пропустить пробелы в начале строки}
while (p<=len) and (S[p]=' ') do p:=p+1;
{выделяем слова пока не конц строки}
while (p<=len) do
begin
   {выделяем слово до пробела, запятой или конца строки}
   Slovo:='';
   while (p<=len) and (S[p]<>' ') do
   begin
     Slovo:=Slovo + S[p];  {складываем символы в слово}
     p:=p+1;               {к следующему символу}
   end;
   if Slovo<>'' then  {если слово найдено}
   begin
     Kol:=Kol+1;     {увеличиваем количество найденных слов}
     showmessage(IntToStr(kol)+' '+Slovo); {вывод слова и его номера}
     for I := 0 to 90 do
     begin
       if Slovo = FirstSymb[i] then
           OutSlovo := OutSlovo + ' ' + IntToStr(i);
     end;
    end;
   {пропускаем пробелы и запятые, не выходя за пределы строки}
   while (p<=len) and (S[p]=' ') do p:=p+1;
end;
end;
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tanker
сообщение 5.1.2011, 11:04
Сообщение #6


Пользователь


Группа: Активисты
Сообщений: 363
Регистрация: 26.11.2009
Пользователь №: 22 377



думаю, надо не сразу выводить, а собирать сначала число полностью
например,

две тысячи шесть сотен пятьдесят :

две --- число = 2 , последнее = 2
тысячи --- число = число - последнее + последнее*1000 =2000 , последнее = 0
шесть --- число = число + 6 = 2006, последнее = 6
сотен ---- число = число - последнее + последнее*100 = 2600, последнее= 0
пятьдесят -- число = число + 50, последнее= 50


если несколько чисел в строке, пожалуй, еще порядок отслеживать надо, чтобы понять это цифра из меньшего порядка или новое число...


--------------------
Успехов!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
denizk
сообщение 5.1.2011, 20:08
Сообщение #7


Пользователь


Группа: Активисты
Сообщений: 654
Регистрация: 31.10.2007
Пользователь №: 18 005



Цитата(Tanker @ 5.1.2011, 11:04) *

думаю, надо не сразу выводить, а собирать сначала число полностью
например,

две тысячи шесть сотен пятьдесят :

две --- число = 2 , последнее = 2
тысячи --- число = число - последнее + последнее*1000 =2000 , последнее = 0
шесть --- число = число + 6 = 2006, последнее = 6
сотен ---- число = число - последнее + последнее*100 = 2600, последнее= 0
пятьдесят -- число = число + 50, последнее= 50
если несколько чисел в строке, пожалуй, еще порядок отслеживать надо, чтобы понять это цифра из меньшего порядка или новое число...

Вот как это порядок тогда отслеживать)) Разделитель только пробел
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tanker
сообщение 6.1.2011, 11:08
Сообщение #8


Пользователь


Группа: Активисты
Сообщений: 363
Регистрация: 26.11.2009
Пользователь №: 22 377



Цитата(denizk @ 5.1.2011, 23:08) *

Вот как это порядок тогда отслеживать))
А для одного числа уже сделал? biggrin.gif


например, вот так:
---------------------------
(для 0..20000):

две тысяч шесть сотен пятьдесят пятнадцать три сотни пять сотен
---------------------------

число = -1, порядок = 0, предпорядок = 100

разбор в цикле:

если 0, то
--- вывод числа (кроме -1), вывод 0
и число = -1, последнее=0, порядок = 1, предпорядок = 100


если 1..9, то
--- если порядок<=1, то вывод числа (кроме -1), число=-1
иначе (порядок>1) число = число + 9 , последнее = 9, предпорядок=порядок, порядок = 1
и
если число = -1, то число = 9, последнее=9, порядок = 1, предпорядок = 100

если 10..19, то
--- если порядок<=2, то вывод числа, число=-1,
иначе (порядок>2) число = число + 19 , последнее = 19, предпорядок=порядок, порядок = 1
и
если число = -1, то число = 19, последнее= 19, порядок = 1, предпорядок = 100

если 20,30,...90, то
--- если порядок<=2, то вывод числа, число=-1
иначе (порядок>2) число = число + 90 , последнее = 90, предпорядок=порядок, порядок = 2
и
если число = -1, то число = 90, последнее= 90, порядок = 2, предпорядок = 100

если сотен
---- если предпорядок>3, то число = число - последнее + последнее*100 , последнее = 0, порядок = 3
иначе (предпорядок<=3), то число = число- последнее и вывод числа (кроме 0), число = последнее*100, последнее = 0, порядок = 3

если тысячи
--- если предпорядок>4, то число = число - последнее + последнее*1000 =2000 , последнее = 0, порядок = 4
иначе (предпорядок<=4), то число = число- последнее и вывод числа (кроме 0), число = последнее*1000, последнее = 0, порядок = 4

конец цикла
в конце - вывод числа, если оно >0 (последнее остается невыведенным...)

-----------------------

надо еще протестить rolleyes.gif , но что-то похожее

Сообщение отредактировал Tanker - 6.1.2011, 12:34


--------------------
Успехов!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
denizk
сообщение 6.1.2011, 14:16
Сообщение #9


Пользователь


Группа: Активисты
Сообщений: 654
Регистрация: 31.10.2007
Пользователь №: 18 005



Честно ничего не понял! Тупняк в голове творится,сессия,работа!
Если не сложно накидай код в дельфи твоим образом хотя бы от 0 до 99 !
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tanker
сообщение 6.1.2011, 15:03
Сообщение #10


Пользователь


Группа: Активисты
Сообщений: 363
Регистрация: 26.11.2009
Пользователь №: 22 377



держи cool.gif
только не полностью слова у меня в примере, и не по английски, но ля алгоритма это не суть важно

для строки '8 0 20 т 19 т 9 с 90 9', те
восемь ноль двадцать тысяч девятнадцать тысяч девять сотен девяносто девять

Код
program Prj_chis;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
   S: ShortString = '8 0 20 т 19 т 9 с 90 9';        // от 0 до 20000
var
   chislo: integer;
   poslednee, poryadok, predporyadok: byte;

len: integer; {длина считанной строки}
p: byte; {номер рассматриваемого символа в строке}
Slovo: string; {выделяемое слово}

begin
{считываем строку S}
//write('S=?'); readln(S);

len:=Length(S); {длина строки S}
p:=1;     {начнем с первого символа}
chislo:=-1; poryadok:=0; predporyadok:=100; poslednee:= 0;

{пропустить пробелы в начале строки}
while (p<=len) and (S[p]=' ') do p:=p+1;
{выделяем слова пока не конц строки}
while (p<=len) do
begin
   {выделяем слово до пробела, запятой или конца строки}
   Slovo:='';
   while (p<=len) and (S[p]<>' ') do
   begin
     Slovo:=Slovo + S[p];  {складываем символы в слово}
     p:=p+1;               {к следующему символу}
   end;
   if Slovo<>'' then  {если слово найдено}
   begin
//   --------------

     if Slovo='0' then  // 0
     begin
       if chislo<>-1 then writeln(chislo);
       writeln(0);
       chislo:=-1; poslednee:=0;
       poryadok:=1; predporyadok:=100;
     end;

     if (length(Slovo)=1) and (Slovo[1] in ['1'..'9']) then //1..9
       begin
         if poryadok <=1 then
         begin
           if chislo<>-1 then writeln(chislo);
           chislo:= -1;
         end
         else
         begin
           chislo:=chislo+Ord(Slovo[1])-48; poslednee:= Ord(Slovo[1])-48;
           predporyadok:=poryadok; poryadok:=1;
         end;
         if chislo=-1 then
         begin
           chislo:=Ord(Slovo[1])-48; poslednee:=Ord(Slovo[1])-48;
           poryadok:=1; predporyadok:=100;
         end;
       end;

     if (length(Slovo)=2) and (Slovo[2]='0') then //10 20 30 ... 90
     begin
       if poryadok<=2 then
         begin
           if chislo<>-1 then writeln(chislo);
           chislo:= -1;
         end
         else
         begin
           chislo:=chislo+(Ord(Slovo[1])-48)*10; poslednee := (Ord(Slovo[1])-48)*10;
           predporyadok:=poryadok; poryadok:=2;
           if Slovo='10' then poryadok:=1;
         end;
         if chislo=-1 then
         begin
           chislo:=(Ord(Slovo[1])-48)*10; poslednee:=(Ord(Slovo[1])-48)*10;
           poryadok:=2; predporyadok:=100;
           if Slovo='10' then poryadok:=1;
         end;
     end;

     if (length(Slovo)=2) and (Slovo[2]<>'0') then  //11..19
     begin
       if poryadok<=2 then
         begin
           if chislo<>-1 then writeln(chislo);
           chislo := -1;
         end
         else
         begin
           chislo:=chislo+Ord(Slovo[2])-48+10; poslednee:= Ord(Slovo[2])-48+10;
           predporyadok:=poryadok; poryadok:=1;
         end;
         if chislo=-1 then
         begin
           chislo:=Ord(Slovo[2])-48+10; poslednee:=Ord(Slovo[2])-48+10;
           poryadok:=1; predporyadok:=100;
         end;
     end;

     if Slovo = 'т' then  //tysyach
     begin
       if predporyadok<=4 then
         begin
           chislo:= chislo-poslednee;
           if chislo<>0 then writeln(chislo);
           chislo:= poslednee*1000;
           poslednee:=0; poryadok:=4;
         end
         else
         begin
           chislo:=chislo-poslednee+ poslednee*1000;
           poslednee:=0; poryadok:=4;
         end;
     end;

     if Slovo = 'с' then //soten
     begin
       if predporyadok<=3 then
         begin
           chislo:= chislo-poslednee;
           if chislo<>0 then writeln(chislo);
           chislo:= poslednee*100;
           poslednee:=0; poryadok:=3;
         end
         else
         begin
           chislo:=chislo-poslednee+ poslednee*100;
           poslednee:=0; poryadok:=3;
         end;
     end;

//   --------------
   end;
   {пропускаем пробелы и запятые, не выходя за пределы строки}
   while (p<=len) and (S[p]=' ') do p:=p+1;
end;
   if chislo>0 then writeln(chislo);


   readln;

end.


Сообщение отредактировал Tanker - 6.1.2011, 17:59


--------------------
Успехов!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
denizk
сообщение 6.1.2011, 16:06
Сообщение #11


Пользователь


Группа: Активисты
Сообщений: 654
Регистрация: 31.10.2007
Пользователь №: 18 005



Хитёр бобёр! Для чисел то легко,а ты для букв сделай! а то 8 0 и букву ввиде ты то понятно!))
Предложи мне его же пожалуйста,чтоб из строки eleven twenty one получал 11 21
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tanker
сообщение 6.1.2011, 16:13
Сообщение #12


Пользователь


Группа: Активисты
Сообщений: 363
Регистрация: 26.11.2009
Пользователь №: 22 377



просто преобразуй свою строку
eleven twenty one
в мою:
11 20 1
и получишь ответ
11
21


или
Twelve One Hundred Twenty One
в
12 1 c 20 1
и получишь
12
121


--------------------
Успехов!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
denizk
сообщение 6.1.2011, 16:35
Сообщение #13


Пользователь


Группа: Активисты
Сообщений: 654
Регистрация: 31.10.2007
Пользователь №: 18 005



Цитата(Tanker @ 6.1.2011, 16:13) *

просто преобразуй свою строку
eleven twenty one
в мою:
11 20 1
и получишь ответ
11
21
или
Twelve One Hundred Twenty One
в
12 1 c 20 1
и получишь
12
121

Такой ты простой))
Суть задачи и есть в преобразовании строки!
Нафига мне тогда уже твой алгоритм?)))
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tanker
сообщение 6.1.2011, 16:41
Сообщение #14


Пользователь


Группа: Активисты
Сообщений: 363
Регистрация: 26.11.2009
Пользователь №: 22 377



как хотИшь wink.gif


как хотИшь wink.gif


--------------------
Успехов!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
denizk
сообщение 6.1.2011, 16:51
Сообщение #15


Пользователь


Группа: Активисты
Сообщений: 654
Регистрация: 31.10.2007
Пользователь №: 18 005



Цитата(Tanker @ 6.1.2011, 16:41) *

как хотИшь wink.gif
как хотИшь wink.gif

А чего хотишь?
Алгоритм твой неработает!
поставь вместе первого числа двухзначное число! 10 или 20! rolleyes.gif
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tanker
сообщение 6.1.2011, 17:09
Сообщение #16


Пользователь


Группа: Активисты
Сообщений: 363
Регистрация: 26.11.2009
Пользователь №: 22 377



Цитата(denizk @ 6.1.2011, 19:51) *

А чего хотишь?
Алгоритм твой неработает!
поставь вместе первого числа двухзначное число! 10 или 20! rolleyes.gif

какой косяк в 20????

двадцать ноль - 20 0 --> 20 и 0
двадцать пять - 20 5 --> 25
двадцать пятнадцать - 20 15 --> 20 и 15

вот с 10 действительно промах, надо его также как 11 обрабатываить, а не как 20, сейчас подправлю,
добавив if Slovo='10' then poryadok:=1;

Сообщение отредактировал Tanker - 6.1.2011, 17:17


--------------------
Успехов!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
denizk
сообщение 6.1.2011, 17:36
Сообщение #17


Пользователь


Группа: Активисты
Сообщений: 654
Регистрация: 31.10.2007
Пользователь №: 18 005



Цитата(Tanker @ 6.1.2011, 17:09) *

какой косяк в 20????

двадцать ноль - 20 0 --> 20 и 0
двадцать пять - 20 5 --> 25
двадцать пятнадцать - 20 15 --> 20 и 15

вот с 10 действительно промах, надо его также как 11 обрабатываить, а не как 20, сейчас подправлю,
добавив if Slovo='10' then poryadok:=1;

Мне смысла подставлять нету))
У меня задача другая)) rolleyes.gif
Вот я пробовал тут твой алгоритм для себя подделать,но фигня получается!

Код

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
   S: ShortString = 'nine zero two hundred twenty one';        // от 0 до 999
var
   chislo, i, j, z: integer;
   poslednee, poryadok, predporyadok: byte;
   Symb: array[0..100] of string[10];
   Temp, Temp2, Temp3: string;

len: integer; {длина считанной строки}
p: byte; {номер рассматриваемого символа в строке}
Slovo: string; {выделяемое слово}

begin
Symb[10] := 'ten';
Symb[20] := 'twenty';
Symb[30] := 'thirty';
Symb[40] := 'fourty';
Symb[50] := 'fifty';
Symb[60] := 'sixty';
Symb[70] := 'seventy';
Symb[80] := 'eighty';
Symb[90] := 'ninety';

Symb[1] := 'one';
Symb[2] := 'two';
Symb[3] := 'three';
Symb[4] := 'four';
Symb[5] := 'five';
Symb[6] := 'six';
Symb[7] := 'seven';
Symb[8] := 'eight';
Symb[9] := 'nine';

Symb[11] := 'eleven';
Symb[12] := 'twelve';
Symb[13] := 'thirteen';
Symb[14] := 'fourteen';
Symb[15] := 'fifteen';
Symb[16] := 'sixteen';
Symb[17] := 'seventeen';
Symb[18] := 'eighteen';
Symb[19] := 'nineteen';

{считываем строку S}
//write('S=?'); readln(S);

len:=Length(S); {длина строки S}
p:=1;     {начнем с первого символа}
chislo:=-1; poryadok:=0; predporyadok:=100; poslednee:= 0;

{пропустить пробелы в начале строки}
while (p<=len) and (S[p]=' ') do p:=p+1;
{выделяем слова пока не конц строки}
while (p<=len) do
begin
   {выделяем слово до пробела, запятой или конца строки}
   Slovo:='';
   while (p<=len) and (S[p]<>' ') do
   begin
     Slovo:=Slovo + S[p];  {складываем символы в слово}
     p:=p+1;               {к следующему символу}
   end;
   if Slovo<>'' then  {если слово найдено}
   begin
//   --------------

     if Slovo='zero' then  // 0
     begin
       if chislo<>-1 then writeln(chislo);
       writeln(0);
       chislo:=-1; poslednee:=0;
       poryadok:=1; predporyadok:=100;
     end;

     for J := 0 to 9 do
     if (Slovo=Symb[j]) then //1..9
       begin
         if poryadok <=1 then
         begin
           if chislo<>-1 then writeln(chislo);
           chislo:= -1;
         end
         else
         begin
           Temp2:=IntToStr(J);
           chislo:=chislo+Ord(Temp2[1])-48; poslednee:= Ord(Temp2[1])-48;
           predporyadok:=poryadok; poryadok:=1;
         end;
         if chislo=-1 then
         begin
           Temp2:=IntToStr(J);
           chislo:=Ord(Temp2[1])-48; poslednee:=Ord(Temp2[1])-48;
           poryadok:=1; predporyadok:=100;
         end;
       end;

     for I := 0 to 90 do
     if (Slovo=Symb[i]) then //20 30 ... 90
     begin
       if poryadok<=2 then
         begin
           if chislo<>-1 then writeln(chislo);
           chislo:= -1;
         end
         else
         begin
           Temp := IntToStr(i);
           chislo:=chislo+(Ord(Temp[1])-48)*10; poslednee := (Ord(Temp[1])-48)*10;
           predporyadok:=poryadok; poryadok:=2;
         end;
         if chislo=-1 then
         begin
           chislo:=(Ord(Temp[1])-48)*10; poslednee:=(Ord(Temp[1])-48)*10;
           poryadok:=2; predporyadok:=100;
         end;
     end;

     for Z := 11 to 19 do
     if (Slovo=Symb[z]) then  //11..19
     begin
       if poryadok<=2 then
         begin
           if chislo<>-1 then writeln(chislo);
           chislo := -1;
         end
         else
         begin
           Temp3:=IntToStr(z);
           chislo:=chislo+Ord(Temp3[2])-48+10; poslednee:= Ord(Temp3[2])-48+10;
           predporyadok:=poryadok; poryadok:=1;
         end;
         if chislo=-1 then
         begin
           Temp3:=IntToStr(z);
           chislo:=Ord(Temp3[2])-48+10; poslednee:=Ord(Temp3[2])-48+10;
           poryadok:=1; predporyadok:=100;
         end;
     end;

     if Slovo = 'hundred' then //soten
     begin
       if predporyadok<=3 then
         begin
           chislo:= chislo-poslednee;
           if chislo<>0 then writeln(chislo);
           chislo:= poslednee*100;
           poslednee:=0; poryadok:=3;
         end
         else
         begin
           chislo:=chislo-poslednee+ poslednee*100;
           poslednee:=0; poryadok:=3;
         end;
     end;

//   --------------
   end;
   {пропускаем пробелы и запятые, не выходя за пределы строки}
   while (p<=len) and (S[p]=' ') do p:=p+1;
end;
   if chislo>0 then writeln(chislo);


   readln;
   writeln;

end.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tanker
сообщение 6.1.2011, 17:58
Сообщение #18


Пользователь


Группа: Активисты
Сообщений: 363
Регистрация: 26.11.2009
Пользователь №: 22 377



Цитата(denizk @ 6.1.2011, 20:36) *

Мне смысла подставлять нету))
У меня задача другая)) rolleyes.gif
Вот я пробовал тут твой алгоритм для себя подделать,но фигня получается!

Код

...     for J := 0 to 9 do
     if (Slovo=Symb[j]) then //1..9
...
     for I := 0 to 90 do
     if (Slovo=Symb[i]) then //20 30 ... 90

задача именно такая wink.gif
как подделал, так и работает, нечего на зеркало пенять biggrin.gif

от 0 до 9
и 1..9

а также

от 0 до 90
и 10 20 30 40 50 60 70 80 90

разные циклы


а также вместо, например
Код
           Temp2:=IntToStr(J);
           chislo:=chislo+Ord(Temp2[1])-48; poslednee:= Ord(Temp2[1])-48;
надо
Код
           chislo:=chislo+J; poslednee:= J;





--------------------
Успехов!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
denizk
сообщение 6.1.2011, 18:07
Сообщение #19


Пользователь


Группа: Активисты
Сообщений: 654
Регистрация: 31.10.2007
Пользователь №: 18 005



Цитата(Tanker @ 6.1.2011, 17:58) *

задача именно такая wink.gif
как подделал, так и работает, нечего на зеркало пенять biggrin.gif

от 0 до 9
и 1..9

а также

от 0 до 90
и 10 20 30 40 50 60 70 80 90

разные циклы
а также вместо, например
Код
           Temp2:=IntToStr(J);
           chislo:=chislo+Ord(Temp2[1])-48; poslednee:= Ord(Temp2[1])-48;
надо
Код
           chislo:=chislo+J; poslednee:= J;



Подравил как ты говоришь! от 1 до 9 сделал и второй от 10 до 90 и тот код поменял и всё равно!!))
Получается на такую строку nine zero two hundred twenty one выдаёт 8 0 220 rolleyes.gif
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Tanker
сообщение 6.1.2011, 18:09
Сообщение #20


Пользователь


Группа: Активисты
Сообщений: 363
Регистрация: 26.11.2009
Пользователь №: 22 377



так это не все ошибки smile.gif
хотя очень странно, что вместо 9 выдает 8


--------------------
Успехов!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

2 страниц V  1 2 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 20.5.2012, 23:54