Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.88
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
#1

Морзянка... - C++

20.08.2009, 04:40. Просмотров 4309. Ответов 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;
}
Прокомментируйте, пожалуйста, кому не сложно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
23.05.2010, 23:05  [ТС]     Морзянка... #21
Ничего себе, покойника откопали...
Dr_Tier, а зачем так вычурно? Русские буквы тоже последовательными блоками располагаются, хоть и с разрывом (cp866)...
Dr_Tier
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 3
24.05.2010, 00:25     Морзянка... #22
кто-то вроде просил попроще написать.
а как переписать то программу чтобы и на руский переводила? что-то никак не пойму?
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
24.05.2010, 08:57  [ТС]     Морзянка... #23
Цитата Сообщение от Dr_Tier Посмотреть сообщение
кто-то вроде просил попроще написать.
Не знаю, как на счёт проще, но если сделать гибрид из моей програмки и предложенной accept, получится функция, которая получает на вход строку и словарь (массив структур) и выдаёт соответствующую строку морзянки. Только структура с морзяночным представлением буквы должна похитрее быть - помимо строки точек с тире и количества символов, она ещё код соответствующего печатного символа должна содержать.
Mr.X
Эксперт С++
3039 / 1684 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
24.05.2010, 20:03     Морзянка... #24
Не, с применением 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 при установлении русской локали русский текст на консоль выводится нормально, а вот вводиться с консоли не хочет?
Dr_Tier
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 3
29.05.2010, 12:50     Морзянка... #25
Что-то никак не разберусь как на русский перевод поменять, easybudda помоги, пожайлуста
Эрис
0 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 6
27.04.2011, 08:13     Морзянка... #26
А как сделать чтобы текст не вводился а брался из фаила, а потом записывался в новый????
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.04.2011, 08:19     Морзянка... #27
А зачем текстом? Пусть морзит динамиком. Кстати, я такую прогу делал, только на другом языке и уже не помню не только исходник, но даже язык. И там вывод был именно на динмик.
Эрис
0 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 6
27.04.2011, 08:20     Морзянка... #28
А как это сделать??
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
27.04.2011, 09:49  [ТС]     Морзянка... #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
#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 не нажмёшь...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2012, 09:48     Морзянка...
Еще ссылки по теме:

Морзянка (Азбука морзе) и ее перевод Pascal ABC

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

Или воспользуйтесь поиском по форуму:
Fatym
1 / 1 / 0
Регистрация: 01.12.2012
Сообщений: 9
15.12.2012, 09:48     Морзянка... #30
easybudda, подскажите пожалуйста, почему
Цитата Сообщение от easybudda Посмотреть сообщение
int c;
переменная с имеет тип int, ведь в ней хранится очередной символ, или я что-то не так понял?
Yandex
Объявления
15.12.2012, 09:48     Морзянка...
Ответ Создать тему
Опции темы

Текущее время: 11:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru