3 / 3 / 5
Регистрация: 31.03.2015
Сообщений: 23
1

Дополнение к разбивке на лексемы

14.12.2017, 16:30. Показов 570. Ответов 1
Метки нет (Все метки)

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

morse.h

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
#pragma once
 
#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <map>
 
std::map<std::string, std::string> MORSE_CODE = {   { ".-", "A" },
                                                    { "-...", "B" },
                                                    { ".--", "W" },
                                                    { "--.", "G" },
                                                    { "-..", "D" },
                                                    { ".", "E" },
                                                    { "...-", "V" },
                                                    { "--..", "Z" },
                                                    { "..", "I" },
                                                    { ".---", "J" },
                                                    { "-.-", "K" },
                                                    { ".-..", "L" },
                                                    { "--", "M" },
                                                    { "-.", "N" },
                                                    { "---", "O" },
                                                    { ".--.", "P" },
                                                    { ".-.", "R" },
                                                    { "...", "S" },
                                                    { "-", "T" },
                                                    { "..-", "U" },
                                                    { "..-.", "F" },
                                                    { "....", "H" },
                                                    { "-.-.", "C" },
                                                    { "--.-", "Q" },
                                                    { "-.--", "Y" },
                                                    { "-..-", "X" } };
 
std::vector<std::string> &split(const std::string &s, std::vector<std::string> &elems) {
    std::stringstream ss(s);
    std::string item;
 
    while (ss >> item) {
        elems.push_back(item);
    }
 
    return elems;
}
 
 
std::vector<std::string> split(const std::string &s) {
    std::vector<std::string> elems;
    return split(s, elems);
}
 
std::string decodeMorse(std::string morseCode) {
    std::stringstream ss;
 
    std::vector<std::string> buff = split(morseCode);
 
    for (auto p : buff)
        ss << MORSE_CODE[p];
 
    return ss.str();
}

morse.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "morse.h"
 
int main() {
    std::string morseCode = ".-.. --- .--   -.- . -.--   .... .. --. ....   -.- . -.--";
 
    std::cout << decodeMorse(morseCode) << std::endl;
 
    system("pause");
    return 0;
}


Добавлено через 19 часов 48 минут
В данном примере должно выводиться не "LOWKEYHIGHKEY", a "LOW KEY HIGH KEY"
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2017, 16:30
Ответы с готовыми решениями:

Разделение строки на лексемы с strtok, проверка длины каждой лексемы (выдает ошибку)
я именно вот разделяю строку на лексемы и хочу проверить длину каждой лексемы, потом выполнить...

Разбить строку на лексемы и вывести лексемы в обратном порядке.
Ребята, помогите. Получил такое задание: Напишите программу, которая вводит строку текста,...

По разбивке предложения
Приветствую. Суть мини плагина в том, чтобы подменивать предложения в редакторе вида:...

По разбивке текста на слова.
Дан текстовый файл, содержащий несколько строк текста. Определить количество слов в нем. Завтра...

1
1463 / 1005 / 455
Регистрация: 30.10.2017
Сообщений: 2,793
14.12.2017, 16:46 2
Я в свое время так писал.

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
#define _CRT_SECURE_NO_WARNINGS
 
#include <iostream>
#include <string.h>
#include <ctype.h>
#include <Windows.h>
 
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char input[256], inputTemp[256];
    const char *morzeLetter[26] = { ".-", "-...", "-.-.", "-..", ".", "..-.",
        "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---",
        ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-",
        "-.--", "--.." }, *morzeDigit[10] = { "-----", ".----", "..---",
        "...--", "....-", ".....", "-....", "--...", "---..", "----." };
    char *tokenPtr;
    int counter = 0;
 
    cout << "Введите фразу без знаков препинания: " << endl << endl;
    cin.getline(input, 256, '\n');
    cout << endl << "Фраза на азбуке Морзе:" << endl << endl;
 
    for (int i = 0; i < strlen(input); i++)
    {
        if (tolower(input[i]) >= (int) 'a' && tolower(input[i]) <= (int) 'z')
            cout << morzeLetter[tolower(input[i]) - (int) 'a'] << ' ';
 
        if (input[i] >= '0' && input[i] <= '9')
            cout << morzeDigit[(int)input[i] - (int) '0'] << ' ';
 
        if (input[i] == ' ')
            cout << "  ";
    }
 
    cout << endl << endl
        << "Введите фразу на азбуке Морзе без знаков препинания: " << endl
        << endl;
    cin.getline(input, 256, '\n');
    cout << endl << "Фраза на английском языке:" << endl << endl;
    strcpy(inputTemp, input);
    tokenPtr = strtok(inputTemp, " ");
 
    while (tokenPtr != NULL)
    {
        for (int i = 0; i < 26; i++)
        {
            if (strcmp(tokenPtr, morzeLetter[i]) == 0)
                cout << (char)(i + (int) 'a');
        }
 
        for (int i = 0; i <= 9; i++)
        {
            if (strcmp(tokenPtr, morzeDigit[i]) == 0)
                cout << (char)(i + (int) '0');
        }
 
        while (counter < strlen(input) && input[counter] != ' ')
            counter++;
 
        if (counter < strlen(input) &&
            strncmp(&input[counter], "   ", 3) == 0)
            cout << ' ';
 
        while (counter < strlen(input) && input[counter] == ' ')
            counter++;
 
        tokenPtr = strtok(NULL, " ");
    }
 
    cout << endl;
 
    system("pause");
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2017, 16:46
Помогаю со студенческими работами здесь

Макрос по разбивке больших файлов
добрый день всем. есть файлы .xlsx с количеством 500 000+ строк информации цель - разбить файл на...

Вопрос по разбивке нового HDD
Купил новый винч 320 Gb, 7200rpm, 16Mb, Seagate Barracuda 7200.12 И хотел бы вам задать следующий...

Вопрос по разбивке HDD и размеру кластера
Новый жесткий диск Seagate Barracuda 7200.14 1TB (ST1000DM003), на нем будет windows 7, программы и...

При разбивке жесткого диска С на два возникла проблема с форматированием
Доброй ночи, уважаемые програмеры и сисадмины! Помогите, пожалуйста! Возникла такая вот проблема,...

Какие разделы при GPT-разбивке необязательны? Потом ещё Акронисом бэкапить буду
При установке на MBR-разметку я делил HDD утилитой diskpart. Теперь, устанавливая Windows 10 на...

Написать программу по разбивке и анализу содержимого файла отчета работы ПО (log-файла)
Здравствуйте, задача такова: Написать программу по разбивке и анализу содержимого файла...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru