Главная страница
    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.692 c
15-1268204901
DOOM
2010-03-10 10:08
2010.08.27
что можно узнать по ip-адресу?


2-1273989815
fallen_from_skies
2010-05-16 10:03
2010.08.27
создание программы для тестирования учащихся


15-1264673292
Vigi
2010-01-28 13:08
2010.08.27
Часы с разными часовыми поясами


2-1269347442
12
2010-03-23 15:30
2010.08.27
Выделяю память. Освобождать Пушкин или сам?


2-1270546653
spectre d
2010-04-06 13:37
2010.08.27
Calc





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский