Сижу уже пару часов и не знаю как это сделать. На c++.
Дан текст, он уже есть в переменной типа char (там есть пробелы, специальные символы), нужно вывести все двухбуквенный сочетания, имеющиеся в тексте (текст уже в переменной типа char) и их количество. Например:
Хороший день, не правда ли?
хо - 1
ор - 1
ро - 1
ош - 1
ши - 1
ий - 1
не - 1
пр - 1
ав - 1
вд - 1
да - 1
Я думаю суть ясна.
Проходить всю строку добавляя предыдущую+текущую букву в map как в примере выше (достаточно просто ++ потому что он добавит и инициализирует значение 0 когда такого ключа еще нет). Ну и видимо пропускать пробелы и т.п.
Зачем переделывать когда проще с нуля с map как в похожей задаче выше?)
С массивом тут сложно, это тогда надо два массива: один для всех встреченных сочетаний, второй для их количеств (ну или массив структур с этими двумя полями). И если не париться с динамическими массивами, то надо создавать массивы какого-то избыточного размера, например, strlen(s) - 1 вроде должно хватить (йцукенг, 7 — йц цу ук ке ен нг, 6) и для каждой пары букв проходить весь массив, чтобы найти это сочетание.
В этом и проблема, я не могу понять как делать. Вот я попробовал, у меня получилось сделать частоту повторения каждой буквы и её количество. Для двухбуквенных сочетаний всё равно не понимаю
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, и перебрать пары символов (подстроки), т.е. другой цикл, со счетчиком/итератором, или запоминать внутри этого пред. символ, складывая с ним текущий для получения строки.
Хорошо, посмотрите, пожалуйста, код. Можете помочь сделать для двухбуквенных сочетаний в моём случае?
#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;
}