![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Транслитерация Киррилица->Латинница - что делаю не так? [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 ?