Как я могу создать серию триграмм в C++, где каждая следующая триграмма начинается со второй буквы первой?
Я работал над этим некоторое время, и я не смог решить проблему. По сути, если бы пользователю был предоставлен файл ".txt", в котором было написано следующее, "tHe@doG#wENt&uP$tHE!hiLL!"
конечный результат должен выглядеть следующим образом:
the
hed
edo
dog
ogw
gwe
wen
ent
ntu
...
Я мог бы продолжать, но я уверен, что это говорит само за себя. Код, который я использовал для достижения этой цели, показан ниже.
#include "functions.h"
#include "bigint/bigint.h"
#include <ctype.h>
#include <string>
#include <cstdio>
#include <stdio.h>
int main(int argc, char *argv[]) {
std::vector<std::string> v(17575);
std::string tri1;
std::string tri2;
std::string tri3;
for (int i = 1; i < argc; i++) {
char* filename = argv[i];
std::ifstream infile;
infile.open(filename);
// executes for discoverable files
if(! infile.fail()) {
char ch;
while (infile.get(ch)) {
if (isspace(ch) || ispunct(ch) || isdigit(ch)) {
continue;
}
else if (isupper(ch)) {
ch = tolower(ch);
}
tri1 += ch;
char ch2 = infile.peek();
if (isspace(ch2) || ispunct(ch2) || isdigit(ch2)) {
ch2 = infile.peek() + 1;
}
else if (isupper(ch2)) {
ch2 = islower(ch2);
}
tri2 += ch2;
char ch3 = infile.peek() + 1;
if (isspace(ch3) || ispunct(ch3) || isdigit(ch3)) {
ch3 = infile.peek() + 2;
}
else if (isupper(ch3)) {
ch3 = islower(ch3);
}
tri3 += ch3;
if (tri1.length() == 3) {
std::cout << tri1 << std::endl;
v.push_back(tri1);
tri1 = "";
}
if (tri2.length() == 3) {
std::cout << tri2 << std::endl;
v.push_back(tri2);
tri2 = "";
}
if (tri3.length() == 3) {
std::cout << tri3 << std::endl;
v.push_back(tri3);
tri3 = "";
}
} //while
infile.close();
}
// executes for non-discoverable files
else {
std::cerr << "Unable to open file: " << filename << '\n';
}
}
return 0;
}
Это связано с частотным анализом триграмм (векторами, которые я собираюсь использовать позже), и я чувствую, что есть способ сократить количество условных выражений, которые у меня есть, я просто не знаю как. Любая помощь будет оценена!