Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/41: Рейтинг темы: голосов - 41, средняя оценка - 4.85
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973

Морзянка...

20.08.2009, 04:40. Показов 8075. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В одном из учебников наткнулся на задачу - написать переводчик англ. букв и цифр в азбуку Морзе. Сделал так:
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
#include <stdio.h>
#include <ctype.h>
#include <string.h>
 
/* Транслятор азбуки морзе. Версия 0.03b */
 
/* str2morse - перевод строки в морзянку. str - исходная строка, mstr - конвертированная, max - макс. длинна конвертированной строки 
для наглядности между "буквами" вставляется пробел, между "словами" три пробела */
char *str2morse(char *str, char *mstr, int max){
    static char *letters[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};
    static char *digits[] = {"-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."};
    static char space[] = " ";
    int c;
    int index;
    
    *mstr = '\0';
    while ( *str ){
        /* Вставить пробел, если не первый символ */
        if ( strlen(mstr) > 0 ) {
            if ( strlen(mstr) + strlen(space) < max )
                strcat(mstr, space);
            else 
                break;
        }   
        
        c = toupper(*str);
        /* Если с - буква */
        if ( c >= 'A' && c <= 'Z' ){
            index = c - 'A';
            if ( strlen(mstr) + strlen(letters[index]) < max ) 
                strcat(mstr, letters[index]);
            else 
                break;
        }
        /* Если с - цифра */
        else if ( c >= '0' && c <= '9' ){
            index = c - '0';
            if ( strlen(mstr) + strlen(digits[index]) < max ) 
                strcat(mstr, digits[index]);
            else 
                break;
        }
        /* Если с - пробел */
        else if ( c == ' ' ) {
            if ( strlen(mstr) + strlen(space) < max )
                strcat(mstr, space);
            else 
                break;
        }
        
        str++;
    }
 
    return mstr;
}
 
int main(){
    char text[BUFSIZ];
    char morse[BUFSIZ];
    
    while ( fgets(text, BUFSIZ, stdin) ) {
        if ( str2morse(text, morse, BUFSIZ) == NULL ) {
            fprintf(stderr, "Can't convert string!\n");
            return 1;
        }
        else {
            printf("%s\n", morse);
        }
    }
    
    printf("Good bye!\n");
    return 0;
}
Прокомментируйте, пожалуйста, кому не сложно.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.08.2009, 04:40
Ответы с готовыми решениями:

Морзянка
Ребят, помогите пожалуйста! нужно в borland c++ написать программу чтобы вводимый текст переводился в последовательность точек и тире с...

Морзянка
Короч дела такие..... Все вроде работает.... но мне нужно что бы руссие буковки переводи, и как наоборот сделать, не пойму... и еще...

Морзянка. Вводимый с клавиатуры текст перевести в последовательность точек и тире с помощью азбуки Морзе.
Народ, помогите плз решить 2 задачки на С оч надо... 1)Морзянка. Вводимый с клавиатуры текст перевести в последовательность...

29
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
23.05.2010, 23:05  [ТС]
Студворк — интернет-сервис помощи студентам
Ничего себе, покойника откопали...
Dr_Tier, а зачем так вычурно? Русские буквы тоже последовательными блоками располагаются, хоть и с разрывом (cp866)...
1
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 3
24.05.2010, 00:25
кто-то вроде просил попроще написать.
а как переписать то программу чтобы и на руский переводила? что-то никак не пойму?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
24.05.2010, 08:57  [ТС]
Цитата Сообщение от Dr_Tier Посмотреть сообщение
кто-то вроде просил попроще написать.
Не знаю, как на счёт проще, но если сделать гибрид из моей програмки и предложенной accept, получится функция, которая получает на вход строку и словарь (массив структур) и выдаёт соответствующую строку морзянки. Только структура с морзяночным представлением буквы должна похитрее быть - помимо строки точек с тире и количества символов, она ещё код соответствующего печатного символа должна содержать.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.05.2010, 20:03
Не, с применением STL это дело попроще смотрится.
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <string>
#include <locale>
#include <map>
#include <algorithm>
#include <vector>
#include <sstream>
 
typedef std::string  T_text;
 
typedef std::map<char, T_text>  T_symb_to_morse;
T_symb_to_morse                 symb_to_morse;
 
T_text  get_morse_word(const T_text&  word)
{    
    class T_make_morse_word
    {        
        T_text  res_morse_word;
    public:
        void operator()(char symb)
        {           
            res_morse_word.append(symb_to_morse[tolower(symb)]).append(" ");
        }
        operator T_text()
        {
            return res_morse_word;
        }    
    };
    return std::for_each(word.begin(), word.end(), T_make_morse_word());
}
 
T_text  get_morse_text(const T_text&  txt)
{   
    std::istringstream             in_potok(txt);
    std::istream_iterator<T_text>  p_beg(in_potok),  p_end;
    
    std::ostringstream  out_potok;
    
    std::transform(p_beg, p_end, 
                   std::ostream_iterator<T_text>(out_potok, "  "), 
                   get_morse_word);
 
    return out_potok.str();
}
 
int main()
{
    std::locale::global(std::locale("rus"));    
 
    symb_to_morse['a'] = ".-";
    symb_to_morse['b'] = "-...";
    symb_to_morse['c'] = "-.-.";
    symb_to_morse['d'] = "-..";
    symb_to_morse['e'] = ".";
    symb_to_morse['f'] = "..-.";
    symb_to_morse['g'] = "--.";
    symb_to_morse['h'] = "....";
    symb_to_morse['i'] = "..";
    symb_to_morse['j'] = ".---";
    symb_to_morse['k'] = "-.-";
    symb_to_morse['l'] = ".-..";
    symb_to_morse['m'] = "--";
    symb_to_morse['n'] = "-.";
    symb_to_morse['o'] = "---";
    symb_to_morse['p'] = ".--.";
    symb_to_morse['q'] = "--.-";
    symb_to_morse['r'] = ".-.";
    symb_to_morse['s'] = "...";
    symb_to_morse['t'] = "-";
    symb_to_morse['u'] = "..-";
    symb_to_morse['v'] = "...-";
    symb_to_morse['w'] = ".--";
    symb_to_morse['x'] = "-..-";
    symb_to_morse['y'] = "-.--";
    symb_to_morse['z'] = "--..";
 
    symb_to_morse['0'] = "-----";
    symb_to_morse['1'] = ".----";
    symb_to_morse['2'] = "..---";
    symb_to_morse['3'] = "...--";
    symb_to_morse['4'] = "....-";
    symb_to_morse['5'] = ".....";
    symb_to_morse['6'] = "-....";
    symb_to_morse['7'] = "--...";
    symb_to_morse['8'] = "---..";
    symb_to_morse['9'] = "----.";
 
    T_text  text;
    for(;;)
    {
        std::cout << "Введите текст на латинице: " << std::endl;
        getline(std::cin, text);
        if(text.empty()) break;        
        std::cout << std::endl
                  << "Этот же текст на азбуке Морзе:" << std::endl
                  << get_morse_text(text)
                  << std::endl
                  << std::endl
                  << std::endl
                  << std::endl;
    }
    return 0;
}
А можете подсказать, почему у меня в MS VS 2008 при установлении русской локали русский текст на консоль выводится нормально, а вот вводиться с консоли не хочет?
0
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 3
29.05.2010, 12:50
Что-то никак не разберусь как на русский перевод поменять, easybudda помоги, пожайлуста
0
0 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 6
27.04.2011, 08:13
А как сделать чтобы текст не вводился а брался из фаила, а потом записывался в новый????
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
27.04.2011, 08:19
А зачем текстом? Пусть морзит динамиком. Кстати, я такую прогу делал, только на другом языке и уже не помню не только исходник, но даже язык. И там вывод был именно на динмик.
0
0 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 6
27.04.2011, 08:20
А как это сделать??
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
27.04.2011, 09:49  [ТС]
Цитата Сообщение от Эрис Посмотреть сообщение
А как это сделать?
вот так
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
#include <stdio.h>
#include <windows.h>
 
#define BEEP fprintf(stderr, "\a")
#define MARGIN 500
#define GAP 1000
 
int main(void){
    int i;
    while ( 1 ){
        for ( i = 0; i < 3; ++i ){
            BEEP;
            Sleep(MARGIN);
        }
        for ( i = 0; i < 3; ++i ){
            BEEP;
            Sleep(MARGIN/2);
            BEEP;
            Sleep(MARGIN);
        }
        for ( i = 0; i < 3; ++i ){
            BEEP;
            Sleep(MARGIN);
        }
        Sleep(GAP);
    }
}
будет передавать сигнал SOS, пока комп не выключишь. Ну или Ctrl+C не нажмёшь...
1
1 / 1 / 0
Регистрация: 01.12.2012
Сообщений: 9
15.12.2012, 09:48
easybudda, подскажите пожалуйста, почему
Цитата Сообщение от easybudda Посмотреть сообщение
int c;
переменная с имеет тип int, ведь в ней хранится очередной символ, или я что-то не так понял?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.12.2012, 09:48
Помогаю со студенческими работами здесь

Морзянка
Заданный текст(вводимый с клавиатуры) представить последовательностью точек и тире с помощью азбуки морзе. Если возможно , сопроводить...

Морзянка
Задание: &quot;Реализовать возможность кодирования открытого текста и декодирования шифрограммы по правилам азбуки Морзе. Предусмотреть...

Морзянка (Азбука морзе) и ее перевод
Может кто помочь? Есть программа uses crt; const mrz:array of string= ...

Курсовая "Морзянка"
Задание: Разработать программу, которая считывает текст из файла (*.txt), выводит его в этом виде на экран, переводит его согласно азбуке...

"Морзянка"
Доброго времени суток. Думаю, многие знакомы с этой задачей. Так вот, мне нужно ввести доп/элементы в азбуку, которая распознает(пока) лишь...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
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