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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.88
easybudda
Модератор
Эксперт CЭксперт С++
9622 / 5570 / 946
Регистрация: 25.07.2009
Сообщений: 10,695
#1

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

20.08.2009, 04:40. Просмотров 4406. Ответов 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;
}
Прокомментируйте, пожалуйста, кому не сложно.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2009, 04:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Морзянка... (C++):

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

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

Морзянка - C++
Всем привет !! Написал программу которая переводит слова в морзянка. Теперь мне надо написать программу которая будет все делать наоборот...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.08.2009, 05:08 #16
я тут накидал без диалога
вообще, она выносится из функции в отдельный файл (потому не static там)
на русские выпадает
0
Вложения
Тип файла: zip morze.zip (862 байт, 47 просмотров)
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
21.08.2009, 08:59 #17
easybudda, а если использовать ООП, можно переписать проще
0
easybudda
Модератор
Эксперт CЭксперт С++
9622 / 5570 / 946
Регистрация: 25.07.2009
Сообщений: 10,695
21.08.2009, 17:57  [ТС] #18
accept Спасибо, очень интересный код! Если позволите, несколько вопросов:
1. Если ничего не путаю, что-то, объявленное как static во внешнем файле, только в нём и видно. Но свойства создаваться при запуске и сохраняться между вызовами вроде не теряет. К тому же у Вас MorzeCodePage mcp объявленная внутри ConvertToMorzeLine, только там и используется. Почему не нужно (не желательно) её, как static объявлять?

C++
1
2
3
4
5
6
7
8
9
10
11
void ConvertToMorzeLine(char *dest, const char *l){
...
    for (p = (char *) l; *p != '\0'; p++) {
        c = tolower(*p);
        if (!(q = strchr(mcp.characters, tolower(c))))
            strncat(dest, p, 1);
        else {   
            strcat(dest, mcp.morze[q-mcp.characters]);
            strcat(dest, " ");
        }
    }
2.
C++
1
for (p = (char *) l ...
А зачем l к char* приводится? Она же вроде и есть указатель на char, правда, константный...

3.
C++
1
2
c = tolower(*p);
        if (!(q = strchr(mcp.characters, tolower(c))))
с и так *p в нижнем регистре. Это случайо, наверное?

PS:
C++
1
strcat(dest, mcp.morze[q-mcp.characters]);
Очень понравилось, обязательно применю где-нибудь.

Lolcht0 Да можно, наверное. Мне архаичный Си больше нравится.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.08.2009, 06:25 #19
Цитата Сообщение от easybudda
К тому же у Вас MorzeCodePage mcp объявленная внутри ConvertToMorzeLine, только там и используется. Почему не нужно (не желательно) её, как static объявлять?
потому что она не должна быть там, потому и не надо её там поселять со static, эта штука должна передаваться в функцию, тогда можно сделать много таких штук, поместить их в динамической памяти и передавать любую (например, легко разделить буквы и цифры, увеличить кодировочную таблицу и они все не будут скапливаться в одном месте (буквы+цифры+знаки+символы+...), потому что в функцию можно будет передать любую таблицу, хоть одни цифры, тогда цифры будут кодироваться, а буквы будут оставляться нетронутыми, а можно наоборот - короче гибкость)
то есть, я её оставил, чисто, чтобы стиль сразу не менять на другой

Цитата Сообщение от easybudda
А зачем l к char* приводится? Она же вроде и есть указатель на char, правда, константный...
можно и без этого, тогда ворнинг будет, типа "а вы, наверное, не знаете, что у вас консты отбросились"

Цитата Сообщение от easybudda
с и так *p в нижнем регистре. Это случайо, наверное?
да, оно там глючило при прямом возврате, поэтому добавил c = tolower(*p);
C
1
    if (!(q = strchr(mcp.characters, c)))
1
Dr_Tier
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 3
23.05.2010, 20:01 #20
а перевод на русский???
вот мой вариант, не эфектен и прост))) на уровне детского сада, переводит только русский

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
#include<stdio.h>
#include <conio.h>
main()
{
   int ch;
   printf("Input world, Enter for exit.\n");
   do
   {
    ch = getch();
    //putch( ch );   // для вывола на экран вводимого символа
            
 
    if(ch==0x20)printf("#");    // пробел
    if(ch==0xe4)printf("..-."); // ф
    if(ch==0xa9)printf(".---"); // й
    if(ch==0xef)printf(".-.-"); // я
    if(ch==0xeb)printf("-.--"); // ы
    if(ch==0xe6)printf("-.-."); // ц
    if(ch==0xe7)printf("---."); // ч
    if(ch==0xe3)printf("..-");  // у
    if(ch==0xa2)printf(".--");  // в
    if(ch==0xe1)printf("...");  // с
    if(ch==0xaa)printf("-.-");  // к
    if(ch==0xa0)printf(".-");   // а
    if(ch==0xac)printf("--");   // м
    if(ch==0xa5)printf(".");    // ё 
    if(ch==0xaf)printf(".--."); // п
    if(ch==0xa8)printf("..");   // и
    if(ch==0xad)printf("-.");   // н
    if(ch==0xe0)printf(".-.");  // р
    if(ch==0xe2)printf("-");    // т
    if(ch==0xa3)printf("--.");  // г
    if(ch==0xae)printf("---");  // о
    if(ch==0xec)printf("-..-"); // ь
    if(ch==0xe8)printf("----"); // ш
    if(ch==0xab)printf(".-.."); // л
    if(ch==0xe9)printf("--.-"); // щ
    if(ch==0xa4)printf("-..");  // д
    if(ch==0xa7)printf("--.."); // з
    if(ch==0x60)printf(".");    // е
    if(ch==0x5b)printf("...."); // х
    if(ch==0x3b)printf("...-"); // ж
    if(ch==0x27)printf("..-..");    // э
    if(ch==0x2c)printf("-..."); // б
    if(ch==0x2e)printf("..--"); // ю
 
 
 
 
 
 
 
 
 
 
 
 
    //printf("\n");    // переход на следующую строку
   }while( ch != 0x13 );
}
0
easybudda
Модератор
Эксперт CЭксперт С++
9622 / 5570 / 946
Регистрация: 25.07.2009
Сообщений: 10,695
23.05.2010, 23:05  [ТС] #21
Ничего себе, покойника откопали...
Dr_Tier, а зачем так вычурно? Русские буквы тоже последовательными блоками располагаются, хоть и с разрывом (cp866)...
0
Dr_Tier
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 3
24.05.2010, 00:25 #22
кто-то вроде просил попроще написать.
а как переписать то программу чтобы и на руский переводила? что-то никак не пойму?
0
easybudda
Модератор
Эксперт CЭксперт С++
9622 / 5570 / 946
Регистрация: 25.07.2009
Сообщений: 10,695
24.05.2010, 08:57  [ТС] #23
Цитата Сообщение от Dr_Tier Посмотреть сообщение
кто-то вроде просил попроще написать.
Не знаю, как на счёт проще, но если сделать гибрид из моей програмки и предложенной accept, получится функция, которая получает на вход строку и словарь (массив структур) и выдаёт соответствующую строку морзянки. Только структура с морзяночным представлением буквы должна похитрее быть - помимо строки точек с тире и количества символов, она ещё код соответствующего печатного символа должна содержать.
0
Mr.X
Эксперт С++
3049 / 1694 / 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 при установлении русской локали русский текст на консоль выводится нормально, а вот вводиться с консоли не хочет?
0
Dr_Tier
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 3
29.05.2010, 12:50 #25
Что-то никак не разберусь как на русский перевод поменять, easybudda помоги, пожайлуста
0
Эрис
0 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 6
27.04.2011, 08:13 #26
А как сделать чтобы текст не вводился а брался из фаила, а потом записывался в новый????
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.04.2011, 08:19 #27
А зачем текстом? Пусть морзит динамиком. Кстати, я такую прогу делал, только на другом языке и уже не помню не только исходник, но даже язык. И там вывод был именно на динмик.
0
Эрис
0 / 0 / 0
Регистрация: 24.04.2011
Сообщений: 6
27.04.2011, 08:20 #28
А как это сделать??
0
easybudda
Модератор
Эксперт CЭксперт С++
9622 / 5570 / 946
Регистрация: 25.07.2009
Сообщений: 10,695
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 не нажмёшь...
0
Fatym
1 / 1 / 0
Регистрация: 01.12.2012
Сообщений: 9
15.12.2012, 09:48 #30
easybudda, подскажите пожалуйста, почему
Цитата Сообщение от easybudda Посмотреть сообщение
int c;
переменная с имеет тип int, ведь в ней хранится очередной символ, или я что-то не так понял?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2012, 09:48
Привет! Вот еще темы с ответами:

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.12.2012, 09:48
Ответ Создать тему
Опции темы

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