Форумчанин
Регистрация: 25.04.2011
Сообщений: 107
|
замена цифр на слова
Код:
char *zamena( int m, char *s)
{
const char *text[4][10] = {
{"", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять "},
{"", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать "},
{"", "десять ", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто "},
{"", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот "}};
strcat( s, text[3][ m / 100]);
if( (m / 10)% 10 != 1) strcat( s, text[2][ (m / 10)% 10]);
strcat( s, text[ (m / 10)% 10 == 1 ? 1: 0][ m % 10]);
return s;
}
эта функция на си, используется в исходной процедуре.
Код:
Procedure change (var s:string; r,k:string);
var flag:boolean;
i,m,err,del:integer;
t:string;
begin
flag:=false;
i:=1; //начало пробега по циклу
if not (s='') then //если строка не пустая..
begin
Repeat
If ((s[i]=r[1]) and (s[i+1]=r[2]) and (s[i+2]=r[3]) and (s[i+3]=r[4])) or ((s[i]=k[1]) and (s[i+1]=k[2])) and ((s[i+2]=k[3]) and (s[i+3]=k[4])) then flag:=true; //начало вхождения
if flag then //если вхождение обнаружено..
begin
if i=3 then //если первый символ строки,
begin
t:=copy(s,1,1); //копируем его и удаляем
delete(s,1,3)
end
else if i=4 then
begin
t:=copy(s,1,2); //если первые два символа строки,
delete(s,1,4) //копируем их и удаляем
end
else t:=copy(s,i-4,3); //иначе копируем символа, с i-ый -4
val(t,m,err); //перевод в числовой вид
del:=3;
While err<>0 do //проверка на ошибку
begin
delete(t,1,1); //удаляем по одному символу
if t='' then break; //проверка на пустую строку
val(t,m,err); //перевод в числовой вид
del:=del-1; //длинна числа
end;
if t='' then break; //проверка на пустую строку
zamena(m,t);
If m<100 then delete(s,i-del-1,del) //удаление цифр
else delete(s,i-del-2,del+1);
If m<100 then insert(t,s,i-del) //вставка их словесных представлений
else insert(t,s,i-del-1);
i:=i+length(t); //прибавлений к параметру цикла, длинну вставленной строки
end;
flag:=false;
i:=i+1;
Until i>=(length(s)-3); //цикл идёт до конца строки
end
else exit; //выход из цикла, в случае, если строка пустая
end;
надо перевести вторую функцию с паскаля на си. первую перевёл, вторую можете помочь? ищет цифры, заменяет на слова, удаляет цифры, вставляет подстроку со словесными эквивалентами цифр в исходную строку.
|