Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
| 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, 16:39
Сообщение
#4
|
|
Пользователь Группа: Активисты Сообщений: 363 Регистрация: 26.11.2009 Пользователь №: 22 377 |
-------------------- Успехов!
|
| denizk |
4.1.2011, 20:59
Сообщение
#5
|
![]() Пользователь Группа: Активисты Сообщений: 654 Регистрация: 31.10.2007 Пользователь №: 18 005 |
Спасибо! Максимум чего теперь надумал как отсеивать только числа с 0 до 9,а как двухзначные и трёхзначные при таком подходе делать! Код 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 |
думаю, надо не сразу выводить, а собирать сначала число полностью например, две тысячи шесть сотен пятьдесят : две --- число = 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 |
Вот как это порядок тогда отслеживать)) например, вот так: --------------------------- (для 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 (последнее остается невыведенным...) ----------------------- надо еще протестить Сообщение отредактировал 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 |
держи
только не полностью слова у меня в примере, и не по английски, но ля алгоритма это не суть важно для строки '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:41
Сообщение
#14
|
|
Пользователь Группа: Активисты Сообщений: 363 Регистрация: 26.11.2009 Пользователь №: 22 377 |
как хотИшь
как хотИшь -------------------- Успехов!
|
| denizk |
6.1.2011, 16:51
Сообщение
#15
|
![]() Пользователь Группа: Активисты Сообщений: 654 Регистрация: 31.10.2007 Пользователь №: 18 005 |
|
| Tanker |
6.1.2011, 17:09
Сообщение
#16
|
|
Пользователь Группа: Активисты Сообщений: 363 Регистрация: 26.11.2009 Пользователь №: 22 377 |
А чего хотишь? Алгоритм твой неработает! поставь вместе первого числа двухзначное число! 10 или 20! какой косяк в 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 |
какой косяк в 20???? двадцать ноль - 20 0 --> 20 и 0 двадцать пять - 20 5 --> 25 двадцать пятнадцать - 20 15 --> 20 и 15 вот с 10 действительно промах, надо его также как 11 обрабатываить, а не как 20, сейчас подправлю, добавив if Slovo='10' then poryadok:=1; Мне смысла подставлять нету)) У меня задача другая)) Вот я пробовал тут твой алгоритм для себя подделать,но фигня получается! Код 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 |
Мне смысла подставлять нету)) У меня задача другая)) Вот я пробовал тут твой алгоритм для себя подделать,но фигня получается! Код ... 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 как подделал, так и работает, нечего на зеркало пенять от 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 |
задача именно такая как подделал, так и работает, нечего на зеркало пенять от 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 |
| Tanker |
6.1.2011, 18:09
Сообщение
#20
|
|
Пользователь Группа: Активисты Сообщений: 363 Регистрация: 26.11.2009 Пользователь №: 22 377 |
так это не все ошибки
хотя очень странно, что вместо 9 выдает 8 -------------------- Успехов!
|
![]() ![]() |
|
Текстовая версия | Сейчас: 20.5.2012, 23:54 |