Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Транслитерация Киррилица->Латинница - что делаю не так?   Найти похожие ветки 

 
Дмитрий. М   (2010-04-15 09:28) [0]

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


 
MBo ©   (2010-04-15 09:35) [1]

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


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

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

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


 
Palladin ©   (2010-04-15 09:39) [3]

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:49) [4]


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


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


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


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


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

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


 
Dennis I. Komarov ©   (2010-04-15 13:43) [6]


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

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


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


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

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


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

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

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:58) [9]


> 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;


 
Anatoly Podgoretsky ©   (2010-04-15 15:25) [10]

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

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


 
Anatoly Podgoretsky ©   (2010-04-15 15:27) [11]

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

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


 
Palladin ©   (2010-04-15 16:14) [12]


> Дмитрий. М   (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;

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


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

Palladin ©   (15.04.10 16:14) [12]

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


 
Leonid Troyanovsky ©   (2010-04-15 19:37) [14]


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

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

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

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

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.067 c
15-1271686611
БарЛог
2010-04-19 18:16
2010.08.27
А как будет по-английки...


15-1266341008
NewZ
2010-02-16 20:23
2010.08.27
Книга по БД.


2-1270804414
droidron
2010-04-09 13:13
2010.08.27
Mozzilla handle


3-1239901324
Мазут Береговой
2009-04-16 21:02
2010.08.27
Хранимые процедуры и параметры с UNICODE


2-1272489700
yagluboko
2010-04-29 01:21
2010.08.27
ошибка периода компиляции