Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Транслит, С++ 
:(
    Опции темы
lonevagrant
Дата 18.1.2010, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.7.2009

Репутация: нет
Всего: нет



Здравствуйте. 
Прошу вашей помощи, нужно помочь написать функцию транслита на С++.
Вот пытался так и не смог.

Код

int main()
{

    char word[]="cлово слово";
    char rus[] = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя ";
    char end[] = "abcdefghijklmnopqrstuvwxyzytythnb-";
    char* encode=new char[lstrlen(word)+1];
    ZeroMemory(encode,sizeof(encode));

    int i=0;
    int b=0;
    for (i; i<= strlen(word); i++)
    {
        for(b; b<=strlen(rus); b++)
        {
            if(word[i]==rus[b])
            {
                encode[i]=end[b];
            }
        }
               
    }

    cout<<encode;
    cin.get();
    delete []encode;

    return 0;
}

Благодарен за любую помощь!
PM MAIL   Вверх
bsa
Дата 18.1.2010, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



lonevagrant, некоторые русские буквы кодируются несколькими английскими (я = ya, щ = shch), поэтому твой метод несколько некорректен. Тебе нужно использовать std::map<char, const char*> для хранилища таблицы перекодировки. Ключом служит русская буква, значением - набор латинских.
PM   Вверх
lonevagrant
Дата 19.1.2010, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.7.2009

Репутация: нет
Всего: нет



Да, с этим позже, где 1 русс. символ = 2 англ.
Мне алгоримт не ясен. наверное с циклами намудрул. Результат вообще не вижу.
PM MAIL   Вверх
Леопольд
Дата 19.1.2010, 02:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(lonevagrant @  19.1.2010,  00:34 Найти цитируемый пост)
Мне алгоримт не ясен. наверное с циклами намудрул. Результат вообще не вижу. 

Цитата(bsa @  18.1.2010,  23:57 Найти цитируемый пост)
Тебе нужно использовать std::map<char, const char*> для хранилища таблицы перекодировки.

Так, надеюсь, понятнее? Я бы написал функцию, которая "кодирует" только известные литёры, а остальные оставляет неизменными. Код ниже просто более развёрнутая подсказка которую уже дал bsa.
Код

#include <map>
#include <string>
#include <iostream>

int main(){
    std::map<char, std::string> codingTable;
    codingTable['А'] = std::string("a");
    codingTable['Б'] = std::string("b");
    codingTable['В'] = std::string("v");
    codingTable['Г'] = std::string("g");
    codingTable['Д'] = std::string("d");
    codingTable['Е'] = std::string("e");
    codingTable['Ё'] = std::string("yo");
    codingTable['Ё'] = std::string("jo");
    codingTable['Ж'] = std::string("zh");
    codingTable['З'] = std::string("z");
    codingTable['И'] = std::string("i");
    codingTable['Й'] = std::string("j");
    codingTable['К'] = std::string("k");
    codingTable['Л'] = std::string("l");
    codingTable['М'] = std::string("m");
    codingTable['Н'] = std::string("n");
    codingTable['О'] = std::string("o");
    codingTable['П'] = std::string("p");
    codingTable['Р'] = std::string("r");
    codingTable['С'] = std::string("s");
    codingTable['Т'] = std::string("t");
    codingTable['У'] = std::string("u");
    codingTable['Ф'] = std::string("f");
    codingTable['Х'] = std::string("h");
    codingTable['Ц'] = std::string("c");
    codingTable['Ч'] = std::string("ch");
    codingTable['Ш'] = std::string("sh");
    codingTable['Щ'] = std::string("sch");
    codingTable['Щ'] = std::string("shch");
    codingTable['Ь'] = std::string("'");
    codingTable['Ы'] = std::string("y");
    codingTable['Э'] = std::string("`e");
    codingTable['Ю'] = std::string("ju");
    codingTable['Я'] = std::string("ja");
    codingTable[' '] = std::string(" ");

    std::string word("СЛОВО ЩАС");
    std::string encodedWord;
    for(std::size_t i=0; i<word.length(); ++i)
        encodedWord.append(codingTable[word[i]]);
    std::cout<<encodedWord<<std::endl;

    return 0;
}



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
andrew_121
Дата 19.1.2010, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Си
Код

#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <locale.h>

#define NUM_LETTERS (33 * 2)

const char rl[] = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя";
const char* tr[] = {    "A", "B", "V", "G", "D", "E", "Yo", "J", "Z", "I", "Y", "K", "L", "M", "N", "O", "P",
"R", "S", "T", "U", "F", "H", "C", "4", "6", "6'", "'", "Y", "'", "E", "Yu", "Ya",
"a", "b", "v", "g", "d", "e", "yo", "j", "z", "i", "y", "k", "l", "m", "n", "o", "p",
"r", "s", "t", "u", "f", "h", "c", "4", "6", "6'", "'", "y", "'", "e", "yu", "ya"
};

int strreplace(char* str, int sz, char* find, char* with) {
    int findLen = strlen(find);
    int withLen = strlen(with);
    char* start = NULL;
    
    assert(strlen(str) + withLen - findLen  < sz);
    
    if ( (start = strstr(str, find)) ) {
        char* temp = malloc(sz);
        strcpy(temp, start + findLen);
        memcpy(start, with, withLen);
        start += withLen;
        memcpy(start, temp, strlen(temp) + 1);
        free(temp);
        return 1;
    }
    return 0;
}

char* translit(char* str, int sz) {
    char* rus = str;
    size_t pos;
    char rls[2]= "\0";
    while( (pos = strcspn(rl, str)) < NUM_LETTERS ) {
        rls[0] = rl[pos];
        while( strreplace(str, sz, rls, (char *)tr[pos]) );
    }
    return str;
}

int main() {
    setlocale(LC_ALL, "Rus");
    char buf[] = "мега сложное русское слово";
    char* res = translit(buf, sizeof(buf));
    printf("%s\n", res);
    return 0;
}



Это сообщение отредактировал(а) andrew_121 - 19.1.2010, 02:43


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
lonevagrant
Дата 19.1.2010, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.7.2009

Репутация: нет
Всего: нет



щас будем тестить.
Спасибо!

P.S - а что это за константа NUM_LETTERS (количество символов русского алфавита?)

Это сообщение отредактировал(а) lonevagrant - 19.1.2010, 02:40
PM MAIL   Вверх
andrew_121
Дата 19.1.2010, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(lonevagrant @  19.1.2010,  02:36 Найти цитируемый пост)
P.S - а что это за константа NUM_LETTERS 

поправил


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
lonevagrant
Дата 19.1.2010, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 2.7.2009

Репутация: нет
Всего: нет



вродь работает, только в консоли получаю крякозябры.

компилятор VS. 2008. пробовал из примера выше.
PM MAIL   Вверх
andrew_121
Дата 19.1.2010, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



исходник сохрани в кодировке ср1251
выводит латыницу?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 19.1.2010, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Леопольд @  19.1.2010,  01:20 Найти цитируемый пост)
    codingTable['А'] = std::string("a");
    codingTable['Б'] = std::string("b");
    codingTable['В'] = std::string("v");
    codingTable['Г'] = std::string("g");
    codingTable['Д'] = std::string("d");
    codingTable['Е'] = std::string("e");
// и много много таких же строчек

 smile 
Леопольд, вот это терпенье и трудолюбие !  smile  smile 


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 19.1.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Леопольд @  19.1.2010,  02:20 Найти цитируемый пост)
codingTable[' '] = std::string(" ");

прощу прощения за придирчивость, но чем отличается русский пробел от английского? smile 
PM   Вверх
Леопольд
Дата 19.1.2010, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(azesmcar @  19.1.2010,  10:04 Найти цитируемый пост)
прощу прощения за придирчивость, но чем отличается русский пробел от английского?

Просто что-бы выводился... smile

Цитата(mes @  19.1.2010,  10:02 Найти цитируемый пост)
Леопольд, вот это терпенье и трудолюбие ! 

Это подказка, а не полноценный код, скопировал где-то таблицу, и автозаменой... smile

Это сообщение отредактировал(а) Леопольд - 19.1.2010, 10:59


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
bsa
Дата 19.1.2010, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Леопольд, а два раза задаешь "Щ" зачем?

Это сообщение отредактировал(а) bsa - 19.1.2010, 11:35
PM   Вверх
Леопольд
Дата 19.1.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(bsa @  19.1.2010,  11:35 Найти цитируемый пост)
Леопольд, а два раза задаешь "Щ" зачем?

Цитата(Леопольд @  19.1.2010,  10:51 Найти цитируемый пост)
скопировал где-то таблицу, и автозаменой...

Просто не заметил smile
Было намерение "донести" до ТС что такое ассоциативный массив и почему он тут наиболее подходящий/удобный вариант.

Это сообщение отредактировал(а) Леопольд - 19.1.2010, 12:17


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
zim22
Дата 19.1.2010, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Леопольд @  19.1.2010,  01:20 Найти цитируемый пост)
for(std::size_t i=0; i<word.length(); ++i)

просто информация к сведению:
если уж выбирать между size_t и std::string::size_type то пусть будет второе.


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1101 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.