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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C]Перефодчик с русского на азбуку Морзе и обратно 
V
    Опции темы
d3m0n1c
  Дата 7.5.2008, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В общем, проблема такова. Нужно написать переводчик с русского на азбуку Морзе и обратно и всё это надо сделать на чистом Си. Подскажите как это лучше реализовать. Если можно пример.  smile 
PM MAIL   Вверх
Rififi
Дата 7.5.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



инициализируешь таблицу указателей:

Код
const char* abc_translate[256] = {
"",
"",

/* ascii-код для буквы 'A' */ ".-",
...
};

далее в цикле для каждого символа в строке ищешь соответствие по таблице
abc_translate[ch]

обратно - поиск по массиву структур:

Код
struct morse_code
{
    const char* morse;
    char symbol;
};

struct morse_code morse_translate[] = { { ".-", 'А' },  ... };


для такой задачи хорошо бы подошел boost::bimap в качестве контейнера данных... но раз на чистом Си, придётся тебе погемороиться... :gigi:
PM MAIL   Вверх
d3m0n1c
Дата 13.5.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#define length 8

struct morse_code
{
    const char* morse;
    char symbol;
};

struct morse_code morse_translate[] = 
{
    {".-", 'a'},    {"-...", 'б'},
    {".--", 'в'},    {"--.", 'г'},
    {"-..", 'д'},    {"...-", 'ж'},
    {"--..", 'з'},    {"..", 'и'},
};

main()
{
    char str[256];
    scanf("%s", &str);
    int i = 0;
    int j;
    do
    {
        for(j=0;j<length;j++)
        {
            if(str[i]==morse_translate[i].symbol)
            {
                printf("%s", morse_translate[i].morse);
                break;
            }

        }
        i++;
    }while(str[i]!='\0');

    printf("\n");

}


Ну вообще вот это перевод с русского на азбуку Морзе (пока правда 8 букв). Теперь пару вопросов:
1.    Как сделать именно русские буквы. Как я понял из выше написанного топа по ascii-кодам, но у меня не получается.
2.    Не совсем понятно какой алгоритм перевода из Морзе на русский, потому что к примеру на сколько я понял в Морзе 1 пробел это 7 точек, как отличить где ещё буква, а где уже начался пробел?

PM MAIL   Вверх
Rififi
Дата 13.5.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



За единицу времени принимается длительность одной точки. Длительность тире равна трём точкам. Пауза между элементами одного знака — одна точка, между знаками в слове — 3 точки, между словами — 7 точек.
© Wiki
следовательно во входном потоке должны быть аналогичные разделители.
PM MAIL   Вверх
d3m0n1c
Дата 13.5.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ещё такой вопросик, как мне считать строку с пробелами с помощью scanf? Как я понял, он определяет пробел как конец строки.

P.S. Извините что задаю нубские вопросы, просто СИ для меня тёмный лес.

P.P.S. Прочитав более внимательно задание, я понял что мне нужно переводить отдельные символы поэтому получатся что пробелы должны остаться пробелами даже на азбуке Морзе 

Это сообщение отредактировал(а) d3m0n1c - 13.5.2008, 15:13
PM MAIL   Вверх
Rififi
Дата 13.5.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(d3m0n1c @  13.5.2008,  15:10 Найти цитируемый пост)
Ещё такой вопросик, как мне считать строку с пробелами с помощью scanf? Как я понял, он определяет пробел как конец строки.

можно поиграться с форматными спецификаторами, например %[^\n]s, но лучше использовать более безопасную функцию fgets:

Код
char buf[100] = {0};
fgets(buf, sizeof(buf)-1, stdin); // передаем размер на 1 меньше чтобы поместился нуль-терминатор


Цитата(d3m0n1c @  13.5.2008,  15:10 Найти цитируемый пост)
пробелы должны остаться пробелами даже на азбуке Морзе 

значит надо придумать другие разделители, илисмиритьсястекстомвыглядящимвоттак(:


Это сообщение отредактировал(а) Rififi - 13.5.2008, 17:08
PM MAIL   Вверх
d3m0n1c
Дата 13.5.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я наверное уже достал своими нубскими вопросами, но всё таки спрошу. Я так и не понял как мне считывать русские буквы, получается если я печатаю к примеру русскую букву то она передаётся в строку в виде пробела. 
    
    
P.S. Спасибо за подсказку с функцией которая позволяет считывать строку с пробелами. Да и вообще спасибо за помощь.  smile 

PM MAIL   Вверх
Rififi
Дата 14.5.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



если я печатаю к примеру русскую букву то она передаётся в строку в виде пробела
не понял фразы.
при вводе строки с консоли она сохраняется в массиве символов. у каждого символа есть свой код.
кстати формально такая запись неправильная:
scanf("%s", &str); // кастинг к типу int (*)[256]

надо передавать или адрес первого символа массива, или имя массива
scanf("%s", &str[0]); или scanf("%s", str); // кастинг к типу int*
PM MAIL   Вверх
d3m0n1c
Дата 24.5.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В принципе всё получилось, спасибо. Остался последний вопрос. Я бы хотел сделать что бы пользователь выбирал с чего на что переводить. И столкнулся с такой проблемой, я перед функцией fgets поставил функцию fscan (ну типо меню, для перевода с русского на Морзе нажмите 1, для перевода с Морзе на русский нажмите 2) и получается так что после ввода выбора программа думает что введённое число и есть строка которую надо перевести. В общем как бороться с этим? 

Это сообщение отредактировал(а) d3m0n1c - 24.5.2008, 19:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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