Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

cataninja

Corretor Ortográfico

Mensagens Recomendadas

cataninja

Olá pessoal :) Eu tenho de fazer um trabalho de programação que consiste em criar um corretor ortográfico e estou com um problema. Para ser mais fácil entender: "Deve começar por implementar as rotinas de leitura da lista de palavras (contidas no ficheiro wordlist.txt, uma palavra por linha) e o seu armazenamento na estrutura de dados adequada. Deve depois implementar as rotinas necessárias à leitura dos ficheiros de entrada e o seu processamento frase-a-frase (a cada linha do ficheiro corresponde um parágrafo, que pode conter uma ou mais frases). O processamento de cada frase implica verificar se cada palavra que a constitui está (ou não) com a ortografia correta (deve ter atenção às questões de maiúsculas/minúsculas na primeira palavra da frase, carateres de pontuação, aspas e parêntesis, valores numéricos, etc.). Caso encontre uma palavra que não tenha a ortografia correta deve utilizar uma rotina que permita sugerir alternativas ortograficamente corretas (relembre o tipo de erros que deve considerar)."

Para já, só tenho a 1ª parte é que está a funcionar. Queria guardar as frases do ficheiro de texto escolhido, num vetor, mas aparentemente não está a dar. Alguém consegue dar uma ajudinha?

#include <stdio.h>
#include <string.h>
#include <time.h>
#include "vetor.h"
#include "tabdispersao.h"
#include <ctype.h>
#define BUFFSIZE 255

//função que guarda as frases

void carregarFicheiro (char* filename, vetor *vec ){
FILE * input;
input = fopen (filename, "r");
int maxSize= BUFFSIZE;
char *frase;
frase = (char*)malloc(BUFFSIZE * sizeof(char) );
int i =0;
int pos = 0;
char c;
while((c=fgetc(input))!= EOF) {
if(i>=maxSize) {
frase = (char*)realloc(frase, BUFFSIZE * sizeof(char));
maxSize = maxSize + BUFFSIZE;
}
frase[i] = c;
if (c=='.' || c=='!' || c=='?')
{
vetor_insere(vec, frase, pos );
pos++;
i = 0;
}
i++;
}
for(i=0; i<vec->tamanho; i++){	 //ciclo for para testar se isto funciona
printf("%s \n", vec->elementos[i]);
}
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cataninja

eu estou a trabalhar no eclipse por isso usei a linha de comandos do windows para executar o programa e basicamente não aparece nada por isso presumo que haja aí algum erro.

Editado por cataninja

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram

Primeiro, "vec" é um vetor de que? strings ou chars?

se for de char o printf abaixo devia ter um %c

printf("%s \n", vec->elementos[i]);

Segundo, já verificaste se o ficheiro abre?

if(input) printf("Abre?");

Terceiro:

frase = (char*)realloc(frase, BUFFSIZE * sizeof(char));

maxSize = maxSize + BUFFSIZE;

"maxSize =..." têm de estar antes do realloc, e dentro do realloc, no lugar do BUFFSIZE devia estar o "MaxSize" pois é ele que vai aumentar.

Quarto, têns a certeza que tens um ponto final, de exclamação ou interrogação no ficheiro?

if (c=='.' || c=='!' || c=='?')

Traça um caminho com printfs e vê o que está a falhar.

Editado por seuqram
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cataninja

Obrigada pelas dicas! Eu testei a função e isto agora está a funcionar. Só há um pequeno problema que eu não faço ideia de como resolver. É que a primeira palavra do texto aparece assim: "ion.nkenstein" em vez de "Frankenstein". Sabem qual é a razão?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
seuqram

Esse erro parece um pouco estranho. Apenas com a informação que me dás eu não consigo ajudar muito.

Partindo do principio que o vetor que está representado no código é um vetor de strings, o output que o programa enviou ("ion.nkenstein") têm um ponto no meio da palavra, ou seja quando chega á condição:

if (c=='.' || c=='!' || c=='?')
{
vetor_insere(vec, frase, pos );
pos++;
i = 0;
//continue;
}
i++; //Por causa disto

ele vai ser inserido num novo vetor e aqui:

printf("%s \n", vec->elementos[i]);

faria com que o "nkenstein" aparece-se noutra linha(porcausa do \n) visto que faz parte de outro vetor.

Repara na variável i dentro do loop while.

Quando a condição if (c=='.' || c=='!' || c=='?') é ativada... ele muda o i para 0, mas depois aumenta-o logo, começando o novo ciclo while com o i sendo 1. A melhor forma de fazeres isso é meteres um "continue;" depois de definires "i = 0;" assim ele passa logo para o fim do loop.

Mas acho que isso não vai resolver o teu problema visto que o que está errado é a primeira palavra. Podes tentar meter o memset(frase, NULL, BUFFSIZE); para limpares o teu arraz, visto que tanto o malloc como o realloc dão-te arrays com carateres aleatórios.

Estou mais desconfiado que o teu problema esteja relacionado com a parte interna do teu vetor, mas como disse anteriormente é dificil saber, do meu ponto de vista, o que está realmente mal.

Editado por seuqram

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.