The purpose of the project is to develop a program that reads a text document (a dictionary in% with% more concretely) and removes the words, ignoring their definitions, special characters.
The words to be taken are all in txt
, hyphenated words must be separated and stored distinctly, ignoring words that contain apostrophes. When writing the code itself, we found no problem, since by testing the program on CAPSLOCK
smaller files created by us it can extract everything correctly.
The problem arises when we test the program in the text file made available by the teacher, because we get a message of txt
(send print attached).
Also send a link to the available txt file (29765-8.txt - link
a>)It might be a bit tedious to evaluate the code, but it would help with any kind of help.
#include <iostream>
#include <string>
#include <fstream>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <cctype>
using namespace std;
//const bool Debug = true;
int tamanho(string palavra) {
int tamanho = 0;
for (int i = 0; i < 1000; i++) {
if (palavra[i] == '#include <iostream>
#include <string>
#include <fstream>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <cctype>
using namespace std;
//const bool Debug = true;
int tamanho(string palavra) {
int tamanho = 0;
for (int i = 0; i < 1000; i++) {
if (palavra[i] == '%pre%') {
break;
}
else {
tamanho++;
}
}
return tamanho;
}
bool TemHiphen(string palavra) {
int tam = tamanho(palavra);
bool flag = false;
for (int j = 0; j < tam; j++) {
if (((palavra[j] >= 'A') && (palavra[j] <= 'Z')) || palavra[j] == '-') {
flag = true;
}
else {
flag = false;
break;
}
}
return flag;
}
bool sinonimo(string palavra) {
int tam = tamanho(palavra);
bool flag = false;
for (int j = 0; j < tam; j++) {
palavra[j] = (unsigned char)palavra[j];
if (palavra[j] == ';' || ((palavra[j] >= 'A') && (palavra[j] <= 'Z'))) {
flag = true;
}
else {
flag = false;
break;
}
}
return flag;
}
bool pertence(string palavra) {
bool flag = true;
int tam = tamanho(palavra);
for (int j = 0; j < tam; j++) {
palavra[j] = (unsigned char)palavra[j];
if (isupper(palavra[j])) {
flag = true;
}
else {
flag = false;
break;
}
}
return flag;
}
bool TemPalavra(string s1) {
//variaveis
bool flag = false;
int tam = tamanho(s1);
//ciclo para ver se e composta ou nao
for (int i = 0; i < tam; i++) {
if (!((s1[i] >= 'A' && s1[i] <= 'Z'))) {
flag = true;
break;
}
else {
flag = false;
}
}
return flag;
}
bool DaPraEscrever(string s1) {
bool flag = false;
int tam = tamanho(s1);
for (int i = 0; i < tam; i++) {
if (isgraph(s1[i])) {
flag = true;
}
else {
flag = false;
break;
}
}
return flag;
}
int main() {
//variaveis
char nomeFicheiro[300];
ifstream dicionario; //este objeto lê o ficheiro
cin >> nomeFicheiro; //o utilizador escolhe o nome do ficheiro que vamos ler
dicionario.open(nomeFicheiro); //o conteudo do ficheiro fica guardado na variavel nomeFicheiro
if (!dicionario.is_open()) { //ve se e possivel abrir o ficheiro
cout << "ERRO NA LEITURA" << endl;
exit(EXIT_FAILURE);
}
vector<string> palavrasDic; //criação do vetor para guardar palavras
vector<string> composta; //criacao do vetor para as palavras compostas
vector<string> simples; //criacao do vetor para as palaras simples
vector<string> decomposta; //criacao de vetor que separa as palavras compostas em simples
vector<string> juncao; //criacao de um vetor que junta os vetores simples e decomposta
// O FICHEIRO ESTÁ ABERTO MESMO QUE NAO APAREÇA NA CONSOLA
string palavra; //enquanto o ficheiro tiver conteudo
while (dicionario.good()) {
dicionario >> palavra;
if (DaPraEscrever(palavra)) {
if (pertence(palavra)) { //se a palavra estiver pronta para ser adicionada ela e adicionada
palavrasDic.push_back(palavra);
}
else if (sinonimo(palavra)) { //se a palavra tiver a flag da funcao sinonimos ligada
palavra = palavra.substr(0, palavra.length() - 1); //retira lhe o ; e poe a palavra na B.D
palavrasDic.push_back(palavra);
}
else if (TemHiphen(palavra)) { //se a flag do tem hiphen estiver ativada
for (int i = 0; i < palavra.length(); i++) { //este excerto vai separar as duas palavras com hiphen e adiciona las
if (!((palavra[i] >= 'A' && palavra[i] <= 'Z') || (palavra[i] >= 'a' && palavra[i] <= 'z'))) {
palavra[i] = ' ';
}
}
palavrasDic.push_back(palavra);
}
}
}
//neste ciclo separamos do vetor que contem todas as palavras as palavras simples das compostas (que tinham hiphen)
//e guardamo-las em 2 vetores diferentes (simpes ; composta)
for (int i = 0; i < palavrasDic.size(); i++) {
if (TemPalavra(palavrasDic[i])) {
composta.push_back(palavrasDic[i]);
}
else {
simples.push_back(palavrasDic[i]);
}
}
//este excerto separa o string que tem as palavras compostas em strings separadas
for (int i = 0; i < composta.size(); i++) {
string cmd = composta[i];
string arg;
string::size_type pos = cmd.find(' ');
if (cmd.npos != pos) {
arg = cmd.substr(pos + 1);
cmd = cmd.substr(0, pos);
}
decomposta.push_back(cmd);
decomposta.push_back(arg);
}
//juncao dos dois vetores (simples e decomposta)
juncao.reserve(simples.size() + decomposta.size()); //guardar espaco na memoria
juncao.insert(juncao.end(), simples.begin(), simples.end());
juncao.insert(juncao.end(), decomposta.begin(), decomposta.end());
/*
for (int v = 0; v < palavrasDic.size(); v++) { //ESTE EXCERTO E TEMPORARIO PARA OS TESTES
cout << palavrasDic[v] << endl;
}
cout << endl;
cout << endl;
for (int v = 0; v < composta.size(); v++) { //ESTE EXCERTO E TEMPORARIO PARA OS TESTES
cout << composta[v] << endl;
}
cout << endl;
cout << endl;
for (int v = 0; v < simples.size(); v++) { //ESTE EXCERTO E TEMPORARIO PARA OS TESTES
cout << simples[v] << endl;
}
cout << endl;
cout << endl;
for (int v = 0; v < decomposta.size(); v++) { //ESTE EXCERTO E TEMPORARIO PARA OS TESTES
cout << decomposta[v] << endl;
}
*/
int size = juncao.size();
int i = 0;
int p1 = 0;
int p2 = 1;
while (i < (size-1)) {
if (juncao[p1] > juncao[p2]) {
swap(juncao[p1], juncao[p2]);
p1 = 0;
p2 = 1;
i = 0;
}
p1++;
p2++;
i++;
}
for (int v = 0; v < juncao.size(); v++) { //ESTE EXCERTO E TEMPORARIO PARA OS TESTES
cout << juncao[v] << endl;
}
return 0;
}
') {
break;
}
else {
tamanho++;
}
}
return tamanho;
}
bool TemHiphen(string palavra) {
int tam = tamanho(palavra);
bool flag = false;
for (int j = 0; j < tam; j++) {
if (((palavra[j] >= 'A') && (palavra[j] <= 'Z')) || palavra[j] == '-') {
flag = true;
}
else {
flag = false;
break;
}
}
return flag;
}
bool sinonimo(string palavra) {
int tam = tamanho(palavra);
bool flag = false;
for (int j = 0; j < tam; j++) {
palavra[j] = (unsigned char)palavra[j];
if (palavra[j] == ';' || ((palavra[j] >= 'A') && (palavra[j] <= 'Z'))) {
flag = true;
}
else {
flag = false;
break;
}
}
return flag;
}
bool pertence(string palavra) {
bool flag = true;
int tam = tamanho(palavra);
for (int j = 0; j < tam; j++) {
palavra[j] = (unsigned char)palavra[j];
if (isupper(palavra[j])) {
flag = true;
}
else {
flag = false;
break;
}
}
return flag;
}
bool TemPalavra(string s1) {
//variaveis
bool flag = false;
int tam = tamanho(s1);
//ciclo para ver se e composta ou nao
for (int i = 0; i < tam; i++) {
if (!((s1[i] >= 'A' && s1[i] <= 'Z'))) {
flag = true;
break;
}
else {
flag = false;
}
}
return flag;
}
bool DaPraEscrever(string s1) {
bool flag = false;
int tam = tamanho(s1);
for (int i = 0; i < tam; i++) {
if (isgraph(s1[i])) {
flag = true;
}
else {
flag = false;
break;
}
}
return flag;
}
int main() {
//variaveis
char nomeFicheiro[300];
ifstream dicionario; //este objeto lê o ficheiro
cin >> nomeFicheiro; //o utilizador escolhe o nome do ficheiro que vamos ler
dicionario.open(nomeFicheiro); //o conteudo do ficheiro fica guardado na variavel nomeFicheiro
if (!dicionario.is_open()) { //ve se e possivel abrir o ficheiro
cout << "ERRO NA LEITURA" << endl;
exit(EXIT_FAILURE);
}
vector<string> palavrasDic; //criação do vetor para guardar palavras
vector<string> composta; //criacao do vetor para as palavras compostas
vector<string> simples; //criacao do vetor para as palaras simples
vector<string> decomposta; //criacao de vetor que separa as palavras compostas em simples
vector<string> juncao; //criacao de um vetor que junta os vetores simples e decomposta
// O FICHEIRO ESTÁ ABERTO MESMO QUE NAO APAREÇA NA CONSOLA
string palavra; //enquanto o ficheiro tiver conteudo
while (dicionario.good()) {
dicionario >> palavra;
if (DaPraEscrever(palavra)) {
if (pertence(palavra)) { //se a palavra estiver pronta para ser adicionada ela e adicionada
palavrasDic.push_back(palavra);
}
else if (sinonimo(palavra)) { //se a palavra tiver a flag da funcao sinonimos ligada
palavra = palavra.substr(0, palavra.length() - 1); //retira lhe o ; e poe a palavra na B.D
palavrasDic.push_back(palavra);
}
else if (TemHiphen(palavra)) { //se a flag do tem hiphen estiver ativada
for (int i = 0; i < palavra.length(); i++) { //este excerto vai separar as duas palavras com hiphen e adiciona las
if (!((palavra[i] >= 'A' && palavra[i] <= 'Z') || (palavra[i] >= 'a' && palavra[i] <= 'z'))) {
palavra[i] = ' ';
}
}
palavrasDic.push_back(palavra);
}
}
}
//neste ciclo separamos do vetor que contem todas as palavras as palavras simples das compostas (que tinham hiphen)
//e guardamo-las em 2 vetores diferentes (simpes ; composta)
for (int i = 0; i < palavrasDic.size(); i++) {
if (TemPalavra(palavrasDic[i])) {
composta.push_back(palavrasDic[i]);
}
else {
simples.push_back(palavrasDic[i]);
}
}
//este excerto separa o string que tem as palavras compostas em strings separadas
for (int i = 0; i < composta.size(); i++) {
string cmd = composta[i];
string arg;
string::size_type pos = cmd.find(' ');
if (cmd.npos != pos) {
arg = cmd.substr(pos + 1);
cmd = cmd.substr(0, pos);
}
decomposta.push_back(cmd);
decomposta.push_back(arg);
}
//juncao dos dois vetores (simples e decomposta)
juncao.reserve(simples.size() + decomposta.size()); //guardar espaco na memoria
juncao.insert(juncao.end(), simples.begin(), simples.end());
juncao.insert(juncao.end(), decomposta.begin(), decomposta.end());
/*
for (int v = 0; v < palavrasDic.size(); v++) { //ESTE EXCERTO E TEMPORARIO PARA OS TESTES
cout << palavrasDic[v] << endl;
}
cout << endl;
cout << endl;
for (int v = 0; v < composta.size(); v++) { //ESTE EXCERTO E TEMPORARIO PARA OS TESTES
cout << composta[v] << endl;
}
cout << endl;
cout << endl;
for (int v = 0; v < simples.size(); v++) { //ESTE EXCERTO E TEMPORARIO PARA OS TESTES
cout << simples[v] << endl;
}
cout << endl;
cout << endl;
for (int v = 0; v < decomposta.size(); v++) { //ESTE EXCERTO E TEMPORARIO PARA OS TESTES
cout << decomposta[v] << endl;
}
*/
int size = juncao.size();
int i = 0;
int p1 = 0;
int p2 = 1;
while (i < (size-1)) {
if (juncao[p1] > juncao[p2]) {
swap(juncao[p1], juncao[p2]);
p1 = 0;
p2 = 1;
i = 0;
}
p1++;
p2++;
i++;
}
for (int v = 0; v < juncao.size(); v++) { //ESTE EXCERTO E TEMPORARIO PARA OS TESTES
cout << juncao[v] << endl;
}
return 0;
}