Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Транслитерация Киррилица->Латинница - что делаю не так? [D2005]


Дмитрий. М ©   (2010-04-15 09:28:00) 

const
 cyr: array[1..33] of Char = ('а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и',
   'й', 'к',
   'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ',
   'ь', 'ы', 'ъ', 'э', 'ю', 'я');
 lat: array[1..33] of string = ('a', 'b', 'v', 'g', 'd', 'e', 'jo', 'zh', 'z',
   'i', 'jj', 'k',
   'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'kh', 'c', 'ch', 'sh',
   'shh', #34, 'y', #39, 'eh', 'yu', 'ya');

function TransliteKyrToLat(const Str: Ansistring): Ansistring;
var
 i, j: Integer;
begin
result := '';
 for i := Length(Str) downto 1 do
   for j := 1 to 33 do
   begin
     if Str[i] = cyr[j] then
       Str := copy(Str, 1, i - 1) + lat[j] + copy(Str, i + 1,
         Length(Str) - i)  // 1) ошибка
     else if Str[i] = AnsiUpperCase(cyr[j]) then
       Str := copy(Str, 1, i - 1) + AnsiUpperCase(lat[j]) + copy(Str, i +
         1, Length(Str) - i);  // 2) ошибка
   end;
 result := Str;
end;


Решил перевести процедуру в функцию, и столкнулся с проблемой:
1) E2064 Left side cannot be assigned to
2) E2064 Left side cannot be assigned to


Leonid Troyanovsky   (2010-04-15 19:37:00) [1]


> Игорь Шевченко ©   (15.04.10 19:27) [13]

> И ну и как будет выглядеть слово ЩУЧИЙ ?

А чего, нормально смотрится :)

У нас и не такие слова бывают, помню, как-то, обсуждали
русские слова с 6 согласными подряд.

--
Regards, LVT.


Игорь Шевченко   (2010-04-15 19:27:00) [2]

Palladin ©   (15.04.10 16:14) [12]

И ну и как будет выглядеть слово ЩУЧИЙ ?


Palladin   (2010-04-15 16:14:00) [3]


> Дмитрий. М   (15.04.10 13:58) [9]

а объеденить маленькие и большие буквы в один массив тебе религия не позволила?

function TransliteKyrToLat(const S: string): string;
const
RArray = 'абвгдеёжзийклмнопрстуфхцчшщьыъэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ';
colChar = 33;
arr: array[1..66] of string =
  ('a', 'b', 'v', 'g', 'd', 'e', 'yo', 'zh', 'z', 'i', 'y',
  'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f',
  'kh', 'ts', 'ch', 'sh', 'shch', '''', 'y', '''', 'e', 'yu', 'ya',
  'A', 'B', 'V', 'G', 'D', 'E', 'Yo', 'Zh', 'Z', 'I', 'Y',
  'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F',
  'Kh', 'Ts', 'Ch', 'Sh', 'Shch', '''', 'Y', '''', 'E', 'Yu', 'Ya');
var
i, n: Integer;
begin
result := '';
for i := 1 to Length(s) do
begin
  n := Pos(s[i], cyr);
  if n = 0 then
    Result := Result + s[i]
  else
    Result := Result + lat[n];
end;
end;

говорю тебе, будь проще


Anatoly Podgoretsky   (2010-04-15 15:27:00) [4]

> Дмитрий. М  (15.04.2010 13:55:08)  [8]

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


Anatoly Podgoretsky   (2010-04-15 15:25:00) [5]

> Дмитрий. М  (15.04.2010 13:27:05)  [5]

Нигде, надо просто расширить таблицу преобразования до 66 символов.


Дмитрий. М   (2010-04-15 13:58:00) [6]


> 1. Не называй переменные str, есть одноименная compiler
> magic функция


И выполнил соответственно Совета 1):

function TransliteKyrToLat(const S: string): string;
const
 RArrayL = 'абвгдеёжзийклмнопрстуфхцчшщьыъэюя';
 RArrayU = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ';
 colChar = 33;
 arr: array[1..2, 1..ColChar] of string =
   (('a', 'b', 'v', 'g', 'd', 'e', 'yo', 'zh', 'z', 'i', 'y',
   'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f',
   'kh', 'ts', 'ch', 'sh', 'shch', '''', 'y', '''', 'e', 'yu', 'ya'),
   ('A', 'B', 'V', 'G', 'D', 'E', 'Yo', 'Zh', 'Z', 'I', 'Y',
   'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F',
   'Kh', 'Ts', 'Ch', 'Sh', 'Shch', '''', 'Y', '''', 'E', 'Yu', 'Ya'));
var
 i: Integer;
 LenS: Integer;
 p: integer;
 d: byte;
begin
 result := '';
 LenS := length(s);
 for i := 1 to lenS do
 begin
   d := 1;
   p := pos(s[i], RArrayL);
   if p = 0 then
   begin
     p := pos(s[i], RArrayU);
     d := 2
   end;
   if p <> 0 then
     result := result + arr[d, p]
   else
     result := result + s[i];
 end;
end;


Дмитрий. М   (2010-04-15 13:55:00) [7]

Сделал по ГОСТу

function TransliteKyrToLat(const Str: string): string;
const
 RArrayL = 'абвгдеёжзийклмнопрстуфхцчшщьыъэюя';
 RArrayU = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ';
 colChar = 33;
 arr: array[1..2, 1..ColChar] of string =
   (('a', 'b', 'v', 'g', 'd', 'e', 'yo', 'zh', 'z', 'i', 'y',
   'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f',
   'kh', 'ts', 'ch', 'sh', 'shch', '''', 'y', '''', 'e', 'yu', 'ya'),
   ('A', 'B', 'V', 'G', 'D', 'E', 'Yo', 'Zh', 'Z', 'I', 'Y',
   'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F',
   'Kh', 'Ts', 'Ch', 'Sh', 'Shch', '''', 'Y', '''', 'E', 'Yu', 'Ya'));
var
 i: Integer;
 LenS: Integer;
 p: integer;
 d: byte;
begin
 result := '';
 LenS := length(str);
 for i := 1 to lenS do
 begin
   d := 1;
   p := pos(str[i], RArrayL);
   if p = 0 then
   begin
     p := pos(str[i], RArrayU);
     d := 2
   end;
   if p <> 0 then
     result := result + arr[d, p]
   else
     result := result + str[i];
 end;
end;


Всем спасибо!


Дмитрий. М   (2010-04-15 13:53:00) [8]


> А ты программист или где?

Сама ветвь говорит о многом!


Dennis I. Komarov   (2010-04-15 13:43:00) [9]


> Где AnsiUpperCase забубенить?

А ты программист или где?


Дмитрий. М   (2010-04-15 13:27:00) [10]


>      Result := Result + s[i]
>    else
>      Result := Result + lat[n];


Не обрабатывает Верхний регистр:
Входная стока: Проверка
Выходная: Пroverka

Где AnsiUpperCase забубенить?


Дмитрий. М   (2010-04-15 09:49:00) [11]


> 0. Ты модификатор const сознательно поставил в параметрах?
> 1. Не называй переменные str, есть одноименная compiler
> magic функция
> 2. Ну к чему столько плохо понимаемого бреда? Будь проще


Приму к сведению, спасибо за помощь!


Palladin   (2010-04-15 09:39:00) [12]

0. Ты модификатор const сознательно поставил в параметрах?
1. Не называй переменные str, есть одноименная compiler magic функция
2. Ну к чему столько плохо понимаемого бреда? Будь проще
const
 cyr: String[33] = 'абвгдеёжзийклмнопрстуфхцчшщьыъэюя';
 lat: array[1..33] of string = ('a', 'b', 'v', 'g', 'd', 'e', 'jo', 'zh', 'z',
  'i', 'jj', 'k',
  'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'kh', 'c', 'ch', 'sh',
  'shh', #34, 'y', #39, 'eh', 'yu', 'ya');

function TransliteKyrToLat(const S: Ansistring): Ansistring;
var
 i, n: Integer;
begin
 result := '';
 for i := 1 to Length(s) do
 begin
   n := Pos(s[i], cyr);
   if n = 0 then
     Result := Result + s[i]
   else
     Result := Result + lat[n];
 end;
end;


И. Павел   (2010-04-15 09:37:00) [13]

constStr: Ansistring
Str := copy(Str, 1, i - 1)

Так константа же.


MBo   (2010-04-15 09:35:00) [14]

хочешь модифицировать аргумент constStr ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо