Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
Дмитрий. М   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.088 c
4-1237964752
Alex1234
2009-03-25 10:05
2010.08.27
Выполнить настройку COM-порта


2-1267590008
cwl
2010-03-03 07:20
2010.08.27
адрес - property с индексом


15-1270833793
turbouser
2010-04-09 21:23
2010.08.27
Из не отправленного :)


15-1270648471
Mozart
2010-04-07 17:54
2010.08.27
Seagate...того?


11-1221028023
GradeMax
2008-09-10 10:27
2010.08.27
Как при помощи KOL работать с почтовым ящиком?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский