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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.88
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.08.2009, 04:40     Морзянка... #1
В одном из учебников наткнулся на задачу - написать переводчик англ. букв и цифр в азбуку Морзе. Сделал так:
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;
}
Прокомментируйте, пожалуйста, кому не сложно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
20.08.2009, 05:09     Морзянка... #2
А оно работает? Если работает, то и ладно, чего спрашивать.

Но можно было написать менее эффективную программу, но гораздо проще.
Можно сформировать две строки
-первая строка представляет исходный алфавит, разделённый пробелами
-вторая строка тоже но на морзе
В первой строке, за счет разделения пробелами, выровнять символы алфавита, так что бы они были на техже позициях, что и начала соответствующих кодов Морзе.

После этого можно использовать стандартные функции (методы) поиска и копирования подстрок C(C++).
Т.е. в одной строке ищем нужный символ или код, из другой копируем (выделяем) подстроку начиная с определённого номера позиции, до ближайшего пробела.
Только итераторы использовать не получится, т.е. только индексация как в массиве по номерам символов [n]
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.08.2009, 05:20  [ТС]     Морзянка... #3
Цитата Сообщение от skvor Посмотреть сообщение
А оно работает? Если работает, то и ладно, чего спрашивать.
Ага, работает... А спрашивал - так учусь. Меня вот в самой функции вызов strlen чуть ли не через строку смущает. А с другой стороны - так вроде проще, чем счётчик количества символов в выходной строке приделывать...
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
20.08.2009, 05:32     Морзянка... #4
C++
1
2
3
4
5
6
7
8
9
10
std::string E="a   b   c  ";
std::string M="... ___ ._."; //конечно от балды
std::string In,Out;
std::cout<<"Введите строку\n";
std::cin>>In;
for (std::string::size_type i=0; i<In.length(); ++i)
{ std::string::size_type Pos=E.find(In[i]);
  Out+=M.substr(Pos,M.find(" ",Pos+1)-Pos+1);
}
std::cout<<Out<<std::endl;
Естественно, нет и защиты от левых символов.
snake32
 Аватар для snake32
1306 / 949 / 120
Регистрация: 26.02.2009
Сообщений: 3,494
Записей в блоге: 5
20.08.2009, 12:29     Морзянка... #5
Цитата Сообщение от easybudda Посмотреть сообщение
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 <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 ) {
                        /*добавить пробел если он влезет, те меньше максимальной длины выходного буфера mstr (п)*/
* * * * * * * * * * * * if ( strlen(mstr) + strlen(space) < max )
* * * * * * * * * * * * * * * * strcat(mstr, space);
* * * * * * * * * * * * else /*иначе выход из цикла*/
* * * * * * * * * * * * * * * * break;
* * * * * * * * } * * * 
* * * * * * * * 
* * * * * * * * c = toupper(*str);/* сохраняем символ как заглавную букву в с*/
* * * * * * * * /* Если с - буква */
* * * * * * * * if ( c >= 'A' && c <= 'Z' ){
                        /*тк индексация letters начинается с нуля, необходимо вычесть самый первый символ заглавных букв из с*/
* * * * * * * * * * * * 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;
}
Собственно почти по шагам описание функции. Только вот подтверждение слов
между "словами" три пробела
я не нашёл. Ставится только один пробел.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.08.2009, 12:43  [ТС]     Морзянка... #6
Цитата Сообщение от snake32 Посмотреть сообщение
Собственно почти по шагам описание функции. Только вот подтверждение слов я не нашёл. Ставится только один пробел.
Один пробел вставляется перед каждым новым символом, если он не первый в строке mstr. Второй - если символ в str и есть пробел и третий перед следующим символом.
-=ЮрА=-
Заблокирован
Автор FAQ
20.08.2009, 12:47     Морзянка... #7
easybudda я думаю ошибка здесь
C++
1
2
3
char text[BUFSIZ];
char morse[BUFSIZ];//Строка из морзянок длиннее строки букв и цифр
//на букву у тебя как минимум два символа нуна
Для простоты вбей morse[15*BUFSIZ]; Множитель потом подберёшь
Прога вылетает от переполнения блока памяти отведенной под строчку морзянки...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.08.2009, 13:22  [ТС]     Морзянка... #8
Цитата Сообщение от skvor Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
std::string E="a   b   c  ";
std::string M="... ___ ._."; //конечно от балды
std::string In,Out;
std::cout<<"Введите строку\n";
std::cin>>In;
for (std::string::size_type i=0; i<In.length(); ++i)
{ std::string::size_type Pos=E.find(In[i]);
  Out+=M.substr(Pos,M.find(" ",Pos+1)-Pos+1);
}
std::cout<<Out<<std::endl;
Естественно, нет и защиты от левых символов.
Не знаю, как на счёт "проще", но как вариант решения - интересно, спасибо!

Добавлено через 12 минут 34 секунды
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
easybudda я думаю ошибка здесь
C++
1
2
3
char text[BUFSIZ];
char morse[BUFSIZ];//Строка из морзянок длиннее строки букв и цифр
//на букву у тебя как минимум два символа нуна
Для простоты вбей morse[15*BUFSIZ]; Множитель потом подберёшь
Прога вылетает от переполнения блока памяти отведенной под строчку морзянки...
Это какую же ей строку подсунуть надо, чтоб вылетала от переполнения морзяночной строки? У меня BUFSIZ аж в 8192 символа определён (gcc 4.3.2). К тому же проверка на превышение max символов везде присутствует и strcat 0 в конце строки добавляет. Короче странно - у меня работает, 0 сучков 0 задоринок...
snake32
 Аватар для snake32
1306 / 949 / 120
Регистрация: 26.02.2009
Сообщений: 3,494
Записей в блоге: 5
20.08.2009, 13:35     Морзянка... #9
Цитата Сообщение от easybudda Посмотреть сообщение
Один пробел вставляется перед каждым новым символом, если он не первый в строке mstr. Второй - если символ в str и есть пробел и третий перед следующим символом.
Ой! Облажался...
Цитата Сообщение от easybudda Посмотреть сообщение
Короче странно - у меня работает, 0 сучков 0 задоринок...
Так что тебя конкретно интересует? Если знаешь как алгоритм работает? Что ещё то надо? Оптимизация что ли?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.08.2009, 13:49  [ТС]     Морзянка... #10
Цитата Сообщение от snake32 Посмотреть сообщение
Ой! Облажался...

Так что тебя конкретно интересует? Если знаешь как алгоритм работает? Что ещё то надо? Оптимизация что ли?
Да, вот в плане производительности есть сомнения. Ну с морзянкой-то просто, но примерно тот же алгоритм думаю применить при замене строк по шаблону в больших файлах "на лету" (для чего, собственно, морзянкой и заморочился - можно сказать частный случай)...
snake32
 Аватар для snake32
1306 / 949 / 120
Регистрация: 26.02.2009
Сообщений: 3,494
Записей в блоге: 5
20.08.2009, 14:16     Морзянка... #11
easybudda, я читал книгу (Автор: Джоэл Спольски "Джоэл о программировании") где автор, один из разработчиков MS Excel, призывает не пользоватся строками типа ASCIIZ. Ведь каждая ф-ия работающая с таким типом, будь то strlen или strcat должна пробежаться по всему массиву символов в поисках нуля, что очень накладно выходит. В этом плане Паскалевсий тип string выглядит более привлекательнее, тк там уже "за ранее" известно сколько символов в строке, но как и везде есть свои минусы длина строки не может быть длинее 255 символов.

Я не знаю, может есть нечто среднее среди С-ишным char* и Паскалевским string-ом. Наверняка придумано куча классов.
-=ЮрА=-
Заблокирован
Автор FAQ
20.08.2009, 15:09     Морзянка... #12
Цитата Сообщение от easybudda Посмотреть сообщение
Не знаю, как на счёт "проще", но как вариант решения - интересно, спасибо!

Добавлено через 12 минут 34 секунды

Это какую же ей строку подсунуть надо, чтоб вылетала от переполнения морзяночной строки? У меня BUFSIZ аж в 8192 символа определён (gcc 4.3.2). К тому же проверка на превышение max символов везде присутствует и strcat 0 в конце строки добавляет. Короче странно - у меня работает, 0 сучков 0 задоринок...
Попробуй strcat вот так юзнуть

C++
1
2
3
char string[126] = "сюда вбей символов 123 штучки";
и сделай
strcat(string,"Строка из числа символов больше 2-х");
А лучше два или три раза стркат забей и погляди что с прогой станет, у меня к примеру прога вылетела
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.08.2009, 16:09  [ТС]     Морзянка... #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Попробуй strcat вот так юзнуть

C++
1
2
3
char string[126] = "сюда вбей символов 123 штучки";
и сделай
strcat(string,"Строка из числа символов больше 2-х");
А лучше два или три раза стркат забей и погляди что с прогой станет, у меня к примеру прога вылетела
Ну так-то конечно за предел string[126] перепрыгнешь. У меня же как-раз с этой целью
C++
1
2
3
4
if ( strlen(mstr) + strlen(add_str) < max )
strcat(mstr, add_str);
else
break;
То есть возвращается строка не длиннее max символов
-=ЮрА=-
Заблокирован
Автор FAQ
20.08.2009, 16:18     Морзянка... #14
Я думал прога вылеиает а так нормальный алгоритм...Шо коментить скомпилилтвой код вроде не вылетала програмулина, больше ничего сказать не могу
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.08.2009, 03:34  [ТС]     Морзянка... #15
Цитата Сообщение от snake32 Посмотреть сообщение
easybudda, я читал книгу (Автор: Джоэл Спольски "Джоэл о программировании") где автор, один из разработчиков MS Excel, призывает не пользоватся строками типа ASCIIZ. Ведь каждая ф-ия работающая с таким типом, будь то strlen или strcat должна пробежаться по всему массиву символов в поисках нуля, что очень накладно выходит. В этом плане Паскалевсий тип string выглядит более привлекательнее, тк там уже "за ранее" известно сколько символов в строке, но как и везде есть свои минусы длина строки не может быть длинее 255 символов.

Я не знаю, может есть нечто среднее среди С-ишным char* и Паскалевским string-ом. Наверняка придумано куча классов.
Да вот и я о том же. Работать-то оно работает, но как-то накладных расходов много... А на счёт паскалевских строк - так строка может и меньше 255 символов быть. Так или иначе, а длинну как-то получать прийдётся. У меня ещё вариант был ввести переменную, которая длинну mstr считает, но проблема решается только частично, да и корявенько оно как-то...
Вспомнил - в паскале как-раз первый байт длинну строки и определяет... Да, надо будет и тут что-то похожее придумывать...

Добавлено через 11 часов 12 минут 0 секунд
...И лучше выдумать не смог! (с)

Так, наверное, быстрее будет:
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
104
105
106
107
108
109
#include <stdio.h>
#include <ctype.h>
#include <string.h>
 
/* Транслятор азбуки морзе. Версия 0.04b */
 
typedef struct {
    int len;
    char *str;
} Str_t;
 
/* Str_t Str(char *) Возвращает структуру Str_t. str - указатель на существующую строку, тупо копируется */
Str_t Str(char *str){
    Str_t s;
    s.len = strlen(str);
    s.str = str;
    
    return s;
}
 
/* Str_t *catStr(Str_t *target, const Str_t *source) Дописывает source.str в конец target.str. target.str должна быть достаточно большой,
чтобы вместить source.str. Ноль в конце строки неявно копируется. 
target.len увеличивается на source.len */
Str_t *catStr(Str_t *target, const Str_t *source){
    char *tt; /* target tail */
    char *ss; /* source start */
    
    tt = target->str + target->len;
    ss = source->str;
    while ( *tt++ = *ss++ )
        ;
    target->len += source->len;
    
    return target;
}
    
 
/* str2morse - перевод строки в морзянку. str - исходная строка, mstr - конвертированная, max - макс. длинна конвертированной строки 
для наглядности между "буквами" вставляется пробел, между "словами" три пробела */
char *str2morse(char *str, char *mstr, int max){
    static Str_t letters[] = { {2, ".-"}, {4, "-..."}, {4, "-.-."}, {3, "-.."}, {1, "."}, {4, "..-."}, {3, "--."}, {4, "...."}, {2, ".."},
        {4, ".---"}, {3, "-.-"}, {4, ".-.."}, {2, "--"}, {2, "-."}, {3, "---"}, {4, ".--."}, {4, "--.-"}, {3, ".-."}, {3, "..."}, {1, "-"}, 
        {3, "..-"}, {4, "...-"}, {3, ".--"}, {4, "-..-"}, {4, "-.--"}, {4, "--.."} };
    static Str_t digits[] = { {5, "-----"}, {5, ".----"}, {5, "..---"}, {5, "...--"}, {5, "....-"}, {5, "....."}, {5, "-...."}, {5, "--..."}, 
        {5, "---.."}, {5, "----."} };
    static Str_t space = {1, " "};
    int c;
    int index;
    Str_t s;
    
    *mstr = '\0';
    s = Str(mstr);
    while ( *str ){
        /* Вставить пробел, если не первый символ */
        if ( s.len > 0 ) {
            if ( s.len + space.len < max )
                catStr(&s, &space);
            else 
                break;
        }   
        
        c = toupper(*str);
        /* Если с - буква */
        if ( c >= 'A' && c <= 'Z' ){
            index = c - 'A';
            if ( s.len + letters[index].len < max ) 
                catStr(&s, &letters[index]);
            else 
                break;
        }
        /* Если с - цифра */
        else if ( c >= '0' && c <= '9' ){
            index = c - '0';
            if ( s.len + digits[index].len < max ) 
                catStr(&s, &digits[index]);
            else 
                break;
        }
        /* Если с - пробел */
        else if ( c == ' ' ) {
            if ( s.len + space.len < max )
                catStr(&s, &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;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.08.2009, 05:08     Морзянка... #16
я тут накидал без диалога
вообще, она выносится из функции в отдельный файл (потому не static там)
на русские выпадает
Вложения
Тип файла: zip morze.zip (862 байт, 45 просмотров)
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
21.08.2009, 08:59     Морзянка... #17
easybudda, а если использовать ООП, можно переписать проще
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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 Да можно, наверное. Мне архаичный Си больше нравится.
accept
4838 / 3237 / 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)))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2010, 20:01     Морзянка...
Еще ссылки по теме:

Морзянка C++
"Морзянка" Free Pascal

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

Или воспользуйтесь поиском по форуму:
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 );
}
Yandex
Объявления
23.05.2010, 20:01     Морзянка...
Ответ Создать тему
Опции темы

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