Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
1 / 1 / 4
Регистрация: 24.10.2014
Сообщений: 200

Смена раскладки символов с английской на русскую и наоборот

16.06.2016, 10:50. Показов 7888. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, делаю что-то вроде метода шифровки при котором различные символы при нажатии на кнопку, сменяются на символы противоположной раскладки. Типа "Ghbdtn"->"Привет". Использую в качестве строк Memo. Есть что-то вроде начального кода, образца что-ли...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
String tb = Memo1- >Text.Length();
for(int i=1; i<Memo1->Text.Length();i++)
{
if (tb[i] == L'А') tb[i]=L'F' ;
else if (tb[i] == L'Б') tb[i]=L',' ;
else if (tb[i] == L'В') tb[i]=L'D' ;
else if (tb[i] == L'Г') tb[i]=L'U' ;
else if (tb[i] == L'Д') tb[i]=L'L' ;
else if (tb[i] == L'Е') tb[i]=L'T' ;
else if (tb[i] == L'Ё') tb[i]=L'`' ;
else if (tb[i] == L'Ж') tb[i]=L';' ;
else if (tb[i] == L'З') tb[i]=L'P' ;
else if (tb[i] == L'И') tb[i]=L'B' ;
else if (tb[i] == L'Й') tb[i]=L'Q' ;
else if (tb[i] == L'К') tb[i]=L'R' ;
else if (tb[i] == L'Л') tb[i]=L'K' ;
else if (tb[i] == L'М') tb[i]=L'V' ;
else if (tb[i] == L'Н') tb[i]=L'Y' ;
else if (tb[i] == L'О') tb[i]=L'J' ;
else if (tb[i] == L'П') tb[i]=L'G' ;
else if (tb[i] == L'Р') tb[i]=L'H' ;
else if (tb[i] == L'С') tb[i]=L'C' ;
else if (tb[i] == L'Т') tb[i]=L'N' ;
else if (tb[i] == L'У') tb[i]=L'E' ;
else if (tb[i] == L'Ф') tb[i]=L'A' ;
else if (tb[i] == L'Х') tb[i]=L'[' ;
else if (tb[i] == L'Ц') tb[i]=L'W' ;
else if (tb[i] == L'Ч') tb[i]=L'X' ;
else if (tb[i] == L'Ш') tb[i]=L'I' ;
else if (tb[i] == L'Щ') tb[i]=L'O' ;
else if (tb[i] == L'Ъ') tb[i]=L']' ;
else if (tb[i] == L'Ы') tb[i]=L'S' ;
else if (tb[i] == L'Ь') tb[i]=L'M' ; 
else if (tb[i] == L'Э') tb[i]=L'"' ;
else if (tb[i] == L'Ю') tb[i]=L'.' ;
else if (tb[i] == L'Я') tb[i]=L'Z' ;
 
 
 
 
if (tb[i] == L'а') tb[i]=L'f' ;
else if (tb[i] == L'б') tb[i]=L',' ;
else if (tb[i] == L'в') tb[i]=L'd' ;
else if (tb[i] == L'г') tb[i]=L'u' ;
else if (tb[i] == L'д') tb[i]=L'l' ;
else if (tb[i] == L'е') tb[i]=L't' ;
else if (tb[i] == L'ё') tb[i]=L'`' ;
else if (tb[i] == L'ж') tb[i]=L';' ;
else if (tb[i] == L'з') tb[i]=L'p' ;
else if (tb[i] == L'и') tb[i]=L'b' ;
else if (tb[i] == L'й') tb[i]=L'q' ;
else if (tb[i] == L'к') tb[i]=L'r' ;
else if (tb[i] == L'л') tb[i]=L'k' ;
else if (tb[i] == L'м') tb[i]=L'v' ;
else if (tb[i] == L'н') tb[i]=L'y' ;
else if (tb[i] == L'о') tb[i]=L'j' ;
else if (tb[i] == L'п') tb[i]=L'g' ;
else if (tb[i] == L'р') tb[i]=L'h' ;
else if (tb[i] == L'с') tb[i]=L'c' ;
else if (tb[i] == L'т') tb[i]=L'n' ;
else if (tb[i] == L'у') tb[i]=L'e' ;
else if (tb[i] == L'ф') tb[i]=L'a' ;
else if (tb[i] == L'х') tb[i]=L'[' ;
else if (tb[i] == L'ц') tb[i]=L'w' ;
else if (tb[i] == L'ч') tb[i]=L'x' ;
else if (tb[i] == L'ш') tb[i]=L'i' ;
else if (tb[i] == L'щ') tb[i]=L'o' ;
else if (tb[i] == L'ъ') tb[i]=L']' ;
else if (tb[i] == L'ы') tb[i]=L's' ;
else if (tb[i] == L'ь') tb[i]=L'm' ; 
else if (tb[i] == L'э') tb[i]=L'"' ;
else if (tb[i] == L'ю') tb[i]=L'.' ;
else if (tb[i] == L'я') tb[i]=L'z' ;
}
Окно программы, так выглядит:
Миниатюры
Смена раскладки символов с английской на русскую и наоборот  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.06.2016, 10:50
Ответы с готовыми решениями:

Замена символов с английской раскладки на русскую
Как заменить набранные пользователем текст с английской раскладки на русский? Например, заменить 'vfvf' на 'мама'. Символ '[' на 'х'. ...

Перевод текста с английской раскладки на русскую
Помогите пожалуста Как перевод текста с английской раскладки на русскую

Смена раскладки на русскую при установке фокуса на textbox
Добрый день! Подскажите, как принудительно менять раскладку на русскую каждый раз, когда устанавливается фокус на textbox1?

10
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,342
Записей в блоге: 3
16.06.2016, 12:15
А вопрос в чем?
0
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,991
16.06.2016, 12:41
Лучший ответ Сообщение было отмечено nick42 как решение

Решение

Наверно, в этом
C++
1
2
3
4
5
6
7
8
  String from = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя",
         to   = "F,DULT`;PBQRKVYJGHCNEA[WXIO]SM\".Zf,dult`;pbqrkvyjghcnea[wxio]sm\".z",
         temp = Memo1->Text;
  for (int i = 1; i <= temp.Length(); i++)
    for (int j = 1; j <= from.Length(); j++)
      if (temp[i] == from[j])
        temp[i] = to[j];
  Memo2->Text = temp;
Миниатюры
Смена раскладки символов с английской на русскую и наоборот  
1
1 / 1 / 4
Регистрация: 24.10.2014
Сообщений: 200
16.06.2016, 17:45  [ТС]
gunslinger, c английского на русский тоже работает?

Добавлено через 1 час 24 минуты
gunslinger, или лучше сделать через RadioButton?
0
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,991
17.06.2016, 02:38
Если задашь соответствующий перевод (строки символов), то почему нет? Попробуй.
Как делать - твой выбор, хоть через ComboBox.
0
1 / 1 / 4
Регистрация: 24.10.2014
Сообщений: 200
17.06.2016, 08:30  [ТС]
Лучший ответ Сообщение было отмечено nick42 как решение

Решение

gunslinger, спасибо, большое за помощь)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void __fastcall TForm8::sButton1Click(TObject *Sender)
{
if(sRadioButton1->Checked)
{String from = "F,DULT`;PBQRKVYJGHCNEA[WXIO]SM".Zf,dult`;pbqrkvyjghcnea[wxio]sm".z#$^&",
         to   = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя№;:?",
         temp = Memo1->Text;
  for (int i = 1; i <= temp.Length(); i++)
    for (int j = 1; j <= from.Length(); j++)
      if (temp[i] == from[j])
        temp[i] = to[j];
  Memo2->Text = temp;}
 
if(sRadioButton2->Checked)
{
String from = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя№;:?",
         to   = "F,DULT`;PBQRKVYJGHCNEA[WXIO]SM".Zf,dult`;pbqrkvyjghcnea[wxio]sm".z#$^&",
         temp = Memo1->Text;
  for (int i = 1; i <= temp.Length(); i++)
    for (int j = 1; j <= from.Length(); j++)
      if (temp[i] == from[j])
        temp[i] = to[j];
  Memo2->Text = temp;
  }
  }
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
17.06.2016, 09:34
ITALIANO, вы только со служебными символами разберитесь, их экранировать нужно
0
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,342
Записей в блоге: 3
17.06.2016, 11:33
Не, я бы сделал отдельной функцией, в которую параметрами бы передавал с какого на какой переводить... На кой ляд 2 одинаковых обработчика плодить?
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
17.06.2016, 11:41
Цитата Сообщение от D1973 Посмотреть сообщение
Не, я бы сделал отдельной функцией, в которую параметрами бы передавал с какого на какой переводить...
Ну это приходит с опытом программирования
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33187 / 21484 / 8232
Регистрация: 22.10.2011
Сообщений: 36,863
Записей в блоге: 12
17.06.2016, 12:15
Лучший ответ Сообщение было отмечено gunslinger как решение

Решение

Это приходит при первом взгляде на код, который является копипастой: заменить строки from и to на массив строк, и передавать в функцию индекс строки с которой, и индекс строки, на которую нужно изменить раскладку. Причем передавать их очень просто, безо всяких if-ов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
String layouts[2] = {
    L"F,DULT`;PBQRKVYJGHCNEA[WXIO]SM\".Zf,dult`;pbqrkvyjghcnea[wxio]sm\".z#$^&",
    L"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя№;:?"
};
 
String __fastcall ChangeLayout(String s, int indexFrom, int indexTo)
{
    String temp = s;
    for (int i = 1; i <= temp.Length(); i++)
    {
        int p = layouts[indexFrom].Pos(temp[i]);
        if (p) temp[i] = layouts[indexTo][p];
    }
    return temp;
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // sRadioButton1 = RU->EN
    // sRadioButton2 = EN->RU
    Memo2->Text = ChangeLayout(Memo1->Text, sRadioButton1->Checked, sRadioButton2->Checked);
}
Вот тебе и преимущество: добавится еще одна раскладка - изменение кода сведется к тому, что нужно будет в layouts добавить еще одну строку, в одном-единственном месте, и передать в функцию правильные индексы преобразования, без переписывания самой функции.
3
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
17.06.2016, 13:11
.. силюсь понять, - в чём преимущества доп. функции в данном конкретном случае, и не выходит... . Обработчик ButtonClick всё равно остается; строки раскладки клавиатуры ни короче, ни длинее не сделаешь, хоть в функции она будет, хоть в обработчике. Чем такой обработчик хуже?___
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   String GG=Memo1->Text, layouts[2] = {
    "F,DULT`;PBQRKVYJGHCNEA[WXIO]SM".Zf,dult`;pbqrkvyjghcnea[wxio]sm".z#$^&",
    "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя№;:?"
    } ;
   for(int p,idx=RadioGroup1->ItemIndex,i=1; i<=GG.Length(); i++)
     if((p=layouts[idx].Pos(GG[i]))>0) GG[i] = layouts[1^idx][p];
   Memo2->Text = GG; 
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2016, 13:11
Помогаю со студенческими работами здесь

Смена раскладки текста с английского на русский и наоборот
Здравствуйте. Мне нужна такая функция, которая из текста, похожий на &quot;qwerty йцукен&quot; будет делать &quot;йцукен qwerty&quot;. Я уже...

Шифрование английской раскладки
Привет это я опять! Помогите решить вопрос с шифрованием слова, в шифровании я не разбираюсь, но мне надо например, q1w2e3r4t5 зашифровать,...

Создать массив со всеми буквами английской раскладки с последующей их перестановкой
Привет! Помогите создать массив со всеми буквами английской раскладки с последующей их перемешкой (random) и выводом. Заранее спасибо!

Автоматический сброс раскладки на русскую в Mozilla Firefox
Операционная система Ubuntu 18.04.4 LTS, браузер Mozilla Firefox for Ubuntu canonical-1.0 74.0 (64-битный). Проблема достаточно тонкая,...

Изменение раскладки строки с русской на английскую и наоборот
Программа такого типа ВХОД ДАННЫХ: Привет ВЫХОД ДАННЫХ: Ghbdtn или ВХОД ДАННЫХ: Hello ВЫХОД ДАННЫХ Руддщ Как вы уже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru