Двухбуквенные сочетания

Сижу уже пару часов и не знаю как это сделать. На c++.

Дан текст, он уже есть в переменной типа char (там есть пробелы, специальные символы), нужно вывести все двухбуквенный сочетания, имеющиеся в тексте (текст уже в переменной типа char) и их количество. Например:
Хороший день, не правда ли?
хо - 1
ор - 1
ро - 1
ош - 1
ши - 1
ий - 1
не - 1
пр - 1
ав - 1
вд - 1
да - 1
Я думаю суть ясна.

Хотите каждому слогу присвоить булевый тип значения?
Как-то громоздко получится…

Почему булевый? Это видимо количество слогов, пример вывода.

map<string, int> удобен для такого, примерно как тут

в С++ обычно удобнее string.

У меня до этого программа просто уже есть и там тип char, хотелось бы понять как можно сделать эти двухбуквенные сочетания…

Проходить всю строку добавляя предыдущую+текущую букву в map как в примере выше (достаточно просто ++ потому что он добавит и инициализирует значение 0 когда такого ключа еще нет). Ну и видимо пропускать пробелы и т.п.

Они легко конвертируются друг в друга.

const char *s = "Hello, World!";
std::string str(s); 

Смотрите, а вот можно этот код как-то переделать к моему заданию? Просто у меня текст типа char, а тут char*s.

char *s = "экскаватор";
int i, j, L = strlen(s)-1;
int *Cn = new int[L];
for(i=0; i<L; i++) Cn[i] = 0;
for(i=0; i<L; i++) {
  for(j=0; j<i; j++) {
    if(s[i]==s[j] && s[i+1]==s[j+1]) {
       Cn[j]++;
       break;
    } 
  } 
  if (j==i) 
        Cn[i] = 1;
}
for(i=0; i<L; i++)
   if (Cn[i])
        cout << s[i] << s[i+1] << " - " << Cn[i];

Зачем переделывать когда проще с нуля с map как в похожей задаче выше?)

С массивом тут сложно, это тогда надо два массива: один для всех встреченных сочетаний, второй для их количеств (ну или массив структур с этими двумя полями). И если не париться с динамическими массивами, то надо создавать массивы какого-то избыточного размера, например, strlen(s) - 1 вроде должно хватить (йцукенг, 7 — йц цу ук ке ен нг, 6) и для каждой пары букв проходить весь массив, чтобы найти это сочетание.

Я не работал с map и даже представления не имею(( А работу надо как-то сделать

Дык выше пример. Просто создать map<string, int> и добавлять туда все сочетания увеличия значения на 1.


Так а что мешает получить представление?)

В этом и проблема, я не могу понять как делать. Вот я попробовал, у меня получилось сделать частоту повторения каждой буквы и её количество. Для двухбуквенных сочетаний всё равно не понимаю

    map <char, int> string_map;
    for (auto it : filter) ++string_map[it]; //в filer уже есть текст типа string
    for (auto it : string_map) cout << it.first << " - " << it.second << endl;
    cout << endl;

Так вам нужно не char, а string, и перебрать пары символов (подстроки), т.е. другой цикл, со счетчиком/итератором, или запоминать внутри этого пред. символ, складывая с ним текущий для получения строки.

Есть Telegram? Сможешь помочь? Я вам скину код, посмотрите что можно там сделать?

А как телеграм поможет, чем скидывание туда лучше скидывания на форум?)

В личное сообщение можно я вам напишу?

Почему б не писать просто в тему, зачем ограничиваться одним человеком?)

Хорошо, посмотрите, пожалуйста, код. Можете помочь сделать для двухбуквенных сочетаний в моём случае?

#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;


int main() {
    setlocale(LC_ALL, "ru");

    char text;

    ifstream fin("text.txt");
    if (fin.is_open()) {
        ifstream fin;
        cout << "Текст из файла:\n\n";
        fin.open("text.txt");
        while (fin.get(text))
            cout << text;
        cout << endl;
    }
    else {
        cout << "Такого файла нет, проверьте его наличие.\n";
        system("pause");
    }

    // текст стал без пробелов и всех специальных символов (только буквы), но загавные остаются
    string vs, filter;
    bool f = true;

    while (getline(fin, vs)) {
        for (int i = 0; i < vs.length(); ++i) {
            if ((vs[i] >= 'a' && vs[i] <= 'z') or (vs[i] >= 'а' && vs[i] <= 'я') || (vs[i] >= 'A' && vs[i] <= 'Z') or (vs[i] >= 'А' && vs[i] <= 'Я')) {
                filter = filter + vs[i];
                f = true;
            }
        }
    }
    cout << endl << endl;

    // теперь текст состоит только из строчных букв
    for (int i = 0; i < filter.length(); ++i)
        filter[i] = tolower(filter[i]);

    cout << "Частота повторения каждой буквы в тексте:\n\n";
    map <char, int> string_map; 
    for (auto vse : filter) ++string_map[vse];
    for (auto vse : string_map) cout << vse.first << " - " << vse.second << endl;
    cout << endl;

    cout << "Частота повторения двухбуквенных сочетаний в тексте:\n\n";

    fin.close();
    return 0;
}

map <string, int> m;
string s= "";
    while (getline(fin, vs)) {
        for (int i = 0; i < vs.length(); ++i) {
            if ((vs[i] >= 'a' && vs[i] <= 'z') or (vs[i] >= 'а' && vs[i] <= 'я') || (vs[i] >= 'A' && vs[i] <= 'Z') or (vs[i] >= 'А' && vs[i] <= 'Я')) {
                if(s.length()==0) s= vs[i];
                else{
                  if(s.length()==1) s= s+vs[i];
                  else s[1]= vs[i];
                  m[s]++;
                  s[0]= s[1];
                  }
                f = true;
            } else s= "";
        }
    }

Это нахождение двухбуквенных сочетаний???

После этого видимо надо программу завершить.

return -1;

не используется ни для чего полезного.


or в С/С++ это ||.

Не уверен, кстати, что с русскими буквами тут будет всё работать, в С++ и консоли винды всё сложно с этим :kolobokcrossing:

Ну, мне просто не мешало, я примерно вставил код, ибо лень вчитываться, дальше компилятор и тестирование решают проблемы :laughing: