Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda Tradutor portugues->ingles [+ Manipiulação de arquivos]


babylon

Pergunta

Aew galera beleza, seguinte estou com um trabalho de faculdade e queria ajuda de vocês, tipo na verdade eu sei mais Flash e PHP e em C++ so sei o basico de progamação e não sei nada de arquivos TXT queria saber de vocês ate uma ajuda quanto a este trabalho de faculdade que me foi passado:

"Você deverá construir um tradutor que deverá fazer uso também dos TADs implementado para traduzir um texto. Para isso, o sistema deverá receber um arquivo texto e traduzir palavra a palavra o texto de português para inglês ou de inglês para português. A mesma saída deverá ser impressa na tela e em um arquivo de saída. Quando a palavra lida não existir no dicionário o tradutor deverá manter a palavra original.

Você pode assumir que as palavras no arquivo de entrada e no dicionário não estarão acentuadas.

Por exemplo, suponha o dicionário:

aniversario - birthday

bolo – cake

de – of

e – is

eu – I

festa – party

gosto – like

hoje – today

meu - my

presente – gift

Neste caso, se o usuário entrar um arquivo contendo:

Hoje e meu aniversario. Eu adoro bolo.

O sistema vai gerar a saída:

Today is my birthday. I adoro cake.

O usuário pode então interagir com o sistema para entrar uma nova palavra e acrescentar

adoro – love no dicionário. Fazendo a tradução do mesmo arquivo, então se obteria:

Today is my birthday. I love cake.

Formato Exemplo:

<palavra português 1> <palavra inglês 1>

<palavra português 2> <palavra inglês 2>

<palavra português 3> <palavra inglês 3>

...

<palavra português n> <palavra inglês n>

Observe que o arquivo contendo o dicionário deve ser carregado automaticamente a partir de um dicionário no mesmo diretório do programa principal de nome dicionario.txt. O dicionário deverá conter apenas palavras simples, sem acento e sem hífen. Palavras compostas ou expressões não precisam ser consideradas.

Para o desenvolvimento do trabalho, deverão ser implementadas 3 (três) TAD (Tipos Abstratos de Dados):

• Palavra: este TAD deve representar uma palavra em uma língua específica (inglês ou português). Uma palavra é definida como um conjunto de até M caracteres do alfabeto (a-z, A-Z).

• Verbete: este TAD representa um par de palavras, uma em português e a sua tradução em inglês.

• Dicionário: este TAD contém um conjunto de verbetes.

Algumas das funções que você deverá implementar no TAD Verbete são:

• void inicializaVerbete(Verbete *v, Palavra p1, Palavra p2) Inicializa o Verbete v com as palavras p1 e p2, garantindo que elas estejam em línguas

diferentes, uma em PORTUGUES, outra em INGLES.

• Palavra obtemTraducao(Verbete v, Palavra p)

Dada a palavra p contida no verbete v, retorne a sua tradução.

• Palavra retornaPort(Verbete v)

Dado um verbete v, retorna a tradução em português.

• Palavra retornaIng(Verbete v)

Dado um verbete v, retorna a tradução em inglês.

Algumas das funções que você deverá implementar no TAD Dicionário são:

• void InicializaDicionario(Dicionario *dic)

Inicializa o dicionário dic como vazio.

• int CarregaDic(char *NomeArq, Dicionario *dic);

Dado um string contendo o nome de um arquivo, abre o arquivo e carrega o dicionário em dic. Retorna 1, caso tenha conseguido carregar corretamente o dicionário e 0 se não conseguir.

• int InsereDic(Dicionario *dic, Verbete v);

Dado um dicionário dic e um Verbete v, acrescenta-a no dicionário. Retorna 1, caso tenha conseguido acrescentá-la (caiba no dicionário) e 0 se não conseguir.

• void RetiraDic(Dicionario *dic, Palavra *p);

Dado um dicionário dic e uma palavra p, retira o VERBETE que contenha p do dicionario dic. Retorna 1, caso tenha conseguido retirá-la e 0 se não conseguir (e.x. não a encontrar).

• int retornaTraducaoPort(Palavra p, Palavra *p2);

Dada uma palavra em inglês p, retorna 1, caso tenha conseguido traduzi-la para português, inserindo em p2 a sua tradução. Retorna 0 se não conseguir (e.x. não a encontrar).

• int retornaTraducaoIng(Palavra p, Palavra *p2);

Dada uma palavra em português p, retorna 1, caso tenha conseguido traduzi-la para inglês inserindo em p2 a sua tradução. Retorna 0 se não conseguir (e.x. não a encontrar)."

----------------------------

Agora o que eu já fiz com ajuda de um colega e de pessoas um codigo que traduz as palavras por String, mais eu precisava mesmo como pede no trabalho é para fazer por manipulação de arquivos .TXT sendo que o TXT seria o banco de dados:

#include<stdio.h>
#include<string.h>
#include <conio.h>

int main()
{
    char Ln[256], *p, atomo[256], trad[256];
    int i = 0, x = 1, j, c;
    
    for(c=0;c<256;c++)
    {
        Ln[c] =0;
        atomo[c] =0;
        trad[c] =0;
    }

        printf("\nDigite uma palavra ou expressao a ser traduzida: \n");
        fgets(Ln,255,stdin);
        if(!feof(stdin))
        {
          p=Ln;
          while(*p)
          {
        if(*p!=' ')
        {
            j=0;
            while(*p && *p!=' ')
            {
                    atomo[j]=*p;
                    j++;
                    p++;
                
                    atomo[j]= '';
                if(strcmp(atomo,"i")==0)
                    strcat(trad,"eu ");
                else if(strcmp(atomo,"am")==0)
                    strcat(trad,"estou ");
                else if(strcmp(atomo,"gift")==0)
                    strcat(trad,"presente ");
                else if(strcmp(atomo,"party")==0)
                    strcat(trad,"festa ");                            
                else if(strcmp(atomo,"crazy")==0)
                    strcat(trad,"maluco ");                
            }
            p++;
        }
    }
}

    printf("\n\nTraducao: %s",trad);
    getch();
}
Problema é que traduz a frase por palavras mais sem manipulação de arquivos pelo que um colega meu ajudou, ai terei que refazer o codigo para manipular arquivos .TXT tambêm e esta é minha duvida. Mais tipo eu teria que entender adicionar arquivos .TXT em C, a ideia minha seria trabalhar então com um banco de dados adicionados a um arquivo .TXT onde la abrindo o .TXT sem precisar ir ao progama (no progama no caso você so conferia so escolhia um idioma e digitava a palavra e la viria o significado) você teria as palavras em ingles e portugues alem de poder adicionar varias outras palavras, seria algo assim no .TXT: txt.jpg "No caso as palavras ingês e portugues seriam traduzidas pela sequencia, tipo a 1a palavra em ingles seria traduzida na 1a em portugues." Eu achei um codigo para escrever no TXT:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
  FILE *fp;
  double ld;
  int d;
  char str[80];

  if(argc!=2) {
    printf("Specify file name.\n");
    exit(1);
  }

  /* open file for output */
  if((fp = fopen(argv[1], "w"))==NULL) {
    printf("Cannot open file.\n");
    exit(1);
  }

  fprintf(fp, "%f %d %s", 345.342, 908, "hiiiiiiii");
  fclose(fp);

  /* open file for input */
  if((fp = fopen(argv[1], "r"))==NULL) {
    printf("Cannot open file.\n");
    exit(1);
  }

  fscanf(fp, "%lf%d%s", &ld, &d, str);
  printf("%f %d %s", ld, d, str);
  fclose(fp);

  return 0;
}

Mais eu queria no caso implementar o codigo já feito mais acima por string e como não sei muito de manipulação de arquivos .TXT queria ajuda de vocês, bom se alguém puder me ajudar a refazer o codigo para chamar um .TXT por manipulação de arquivos.

Desde já vlw e falou!!!

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Sobre o seu problema verificar este link: http://www.cplusplus.com/reference/iostream/fstream/ e ver as funções:

--- funcoes que você utilizará na leitura

open()

operator>>

getline()

good()

close()

---- funcoes q você utilizara na escrita

open()

write()

close()

operator<<

Não vou lhe dar o código porque senão perde exatamente o intuito do exercício que é tentar fazer, procurar informações de como, e por fim fazer o exercicio

Como você sabe flash e php, presumo q você tenha certa noção para criar algoritmos e tentar resolver os problemas q você encontra

Uma dica que fica é em vez de utilizar o arquivo TXT da maneira que você propos:

- primeiros os nomes em portugues e depois de tudo os em ingles

Adote a seguinte maneira:

[palavra em portugues] [palavra em ingles]

oi hi

ola hello

Ou seja, você encontraria na mesma linha a tradução da palavra desejada, evitando assim continuar procurando no arquivo pelo que você quer

Espero que tenha ajudado.

Link para o comentário
Compartilhar em outros sites

  • 0
Sobre o seu problema verificar este link: http://www.cplusplus.com/reference/iostream/fstream/ e ver as funções:

--- funcoes que você utilizará na leitura

open()

operator>>

getline()

good()

close()

---- funcoes q você utilizara na escrita

open()

write()

close()

operator<<

Não vou lhe dar o código porque senão perde exatamente o intuito do exercício que é tentar fazer, procurar informações de como, e por fim fazer o exercicio

Como você sabe flash e php, presumo q você tenha certa noção para criar algoritmos e tentar resolver os problemas q você encontra

Uma dica que fica é em vez de utilizar o arquivo TXT da maneira que você propos:

- primeiros os nomes em portugues e depois de tudo os em ingles

Adote a seguinte maneira:

[palavra em portugues] [palavra em ingles]

oi hi

ola hello

Ou seja, você encontraria na mesma linha a tradução da palavra desejada, evitando assim continuar procurando no arquivo pelo que você quer

Espero que tenha ajudado.

Opa blinkbl beleza?

Seguinte ai é que esta, eu mexo mais com Flash na area de animações e pouco em progamação, em PHP eu faço mais o basico da progamaçaõ que é criar registros de cadastros, sql e etc, apesar de ter um pouco de noção de progamação, ai por isto procurei o forum aqui depois de ter feito com um colega meu o codigo que depois não aceito pelo professor pelo fato de não usar arquivos (bom na verdade eu ainda nem sei como manipular aquivos .TXT no C ) .TXT, apesar de você ter me dado uma ideia interessante para fazer a tradução das palavras eu pensei em uma outra, onde eu ao invez de usar um unico .TXT usa-se varios .TXT, a minha ideia era aproveitar este codigo já feito e comparar estes varios .TXT (ao invez de usar ponteiro para dizer emqu e linha esta cada palavra) que teriam uma unica palavra, seria mais ou menos assim (deve estar um pouco errado já que não sei a sintaxe ao certo):

#include<stdio.h>
#include<string.h>
#include <conio.h>

int main()
{
    char Ln[256], *p, atomo[256], trad[256];
    int i = 0, x = 1, j, c;
        FILE* f;
    
    for(c=0;c<256;c++)
    {
        Ln[c] =0;
        atomo[c] =0;
        trad[c] =0;
    }

        printf("\nDigite uma palavra ou expressao a ser traduzida: \n");
        fgets(Ln,255,stdin);
        if(!feof(stdin))
        {
          p=Ln;
          while(*p)
          {
        if(*p!=' ')
        {
            j=0;
            while(*p && *p!=' ')
            {
                    atomo[j]=*p;
                    j++;
                    p++;
                
                    atomo[j]= '';
                if(strcmp(atomo,"i")==0)
                    (trad,"f = fopen("eu.txt","r");
                else if(strcmp(atomo,"am")==0)
                    (trad,"f = fopen("estou.txt","r");
                else if(strcmp(atomo,"gift")==0)
                    (trad,"f = fopen("presente.txt","r");
                else if(strcmp(atomo,"party")==0)
                    (trad,"f = fopen("festa.txt","r");                            
                else if(strcmp(atomo,"crazy")==0)
                    (trad,"f = fopen("maluco.txt","r");                
            }
            p++;
        }
    }
}

    printf("\n\nTraducao: %s",trad);
    getch();
}

Bom estou a implementar esta ideia de ter varios .TXT cada um contendo uma palavra apenas que seria comparada a uma palavra que você digita-se por string, oque vocês ahcma, tipo qual o erro da sintaxe do progama postado acima já que estou a tentar fazer ele?

Bom é isto vlw a todos e falou!!!

Link para o comentário
Compartilhar em outros sites

  • 0

bom a ideia de varios arquivos funciona mas do ponto de vista mais teorico é ruim, porque você precisaria manipular diversos arquivos (em média) para cada tradução. (muitos seeks, e bla bla bla, q você houve na faculdade na materia de estrutura de arquivos)

Acho que seu professor não vai gosta dessa ideia, mas vms lá....

bom corrigir seus erros:

(trad,"f = fopen("eu.txt","r");
bom pelo q eu entendo você quer fazer algo do tipo: strcat(trad,texto_lido_do_arquvio); certo? se for isso então temos um problema porque a funcao fopen retorna um ponteiro de arquivo (o sei lá como se xama isso). Segundo, está faltando a função strcat() ali.
f = fopen("eu.txt","r");

strcat(trad,texto_lido);
Eu vi que você já utilizou a função fgets() acima, mas foi para ler uma linha de stdin (ou seja do input de dados que o usuário esta digitando). Faça a mesma coisa, mas em vez de ler de stdin, leia do seu arquivo.
fgets(char *buffer, int num, FILE *stream);

Editado por blinkbl
Link para o comentário
Compartilhar em outros sites

  • 0

Opa blinkbl vlw pela dica, seguinte passei o codigo para as dicass que você me falou, ve se esta certo e mesmo eu não entendi porque ta dando erro na linha do fgets, mais tai o codigo realterado:

#include<stdio.h>
#include<string.h>
#include<conio.h>

int main()
{
    char Ln[256], *p, atomo[256], trad[256];
    int i = 0, x = 1, j, c;
    FILE* f;
    
    for(c=0;c<256;c++)
    {
        Ln[c] =0;
        atomo[c] =0;
        trad[c] =0;
    }

        printf("\nDigite uma palavra ou a frase a ser traduzida: \n");
        fgets(char *buffer, int num, FILE *stream);
        if(!feof(stdin))
        {
          p=Ln;
          while(*p)
          {
        if(*p!=' ')
        {
            j=0;
            while(*p && *p!=' ')
            {
                    atomo[j]=*p;
                    j++;
                    p++;
                
                    atomo[j]= '';
                if(strcmp(atomo,"i")==0)
                    f = fopen("eu.txt","r");
                    strcat(trad,texto_lido);
                else if(strcmp(atomo,"am")==0)
                    f = fopen("estou.txt","r");
                    strcat(trad,texto_lido);
                else if(strcmp(atomo,"gift")==0)
                    f = fopen("presente.txt","r");
                    strcat(trad,texto_lido);
                else if(strcmp(atomo,"party")==0)
                    f = fopen("festa.txt","r");
                    strcat(trad,texto_lido);
                else if(strcmp(atomo,"crazy")==0)
                    f = fopen("maluco.txt","r");
                    strcat(trad,texto_lido);
            }
            p++;
        }
    }
}

    printf("\n\nTraducao: %s",trad);
    getch();
}

Bom se tiver jeito de você o que esta erro e mesmo se eu estou indo certo. Desde já vlw e falou!!!

Link para o comentário
Compartilhar em outros sites

  • 0

lol eu passei o protótipo da funcao

fgets(char *buffer, int num, FILE *stream);
akela parte do fgets q tava feita, estava certa o que eu quis dizer é utilizar um outro fgets quando você desse um fopen tipo ficaria assim:
if(strcmp(atomo,"i")==0) {
                    f = fopen("eu.txt","r");
                    
                    char texto_lido[50];

                    fgets(texto_lido,50,f);

                    strcat(trad,texto_lido);
}

Link para o comentário
Compartilhar em outros sites

  • 0
lol eu passei o protótipo da funcao

fgets(char *buffer, int num, FILE *stream);
akela parte do fgets q tava feita, estava certa o que eu quis dizer é utilizar um outro fgets quando você desse um fopen tipo ficaria assim:
if(strcmp(atomo,"i")==0) {
                    f = fopen("eu.txt","r");
                    
                    char texto_lido[50];

                    fgets(texto_lido,50,f);

                    strcat(trad,texto_lido);
}
Opa blinkbl beleza? Vlw pelas dicas, seguinte lembra que falou da minha ideia de manipular varios .txt, pois vem o professor vetou a minha ideia, justo quando eu tava progredindo, ele achou gambiarra, resultado estou voltando a estaca zero... tenso, mais tamos ai... seguinte, recomecei o codigo ate com ajuda de um colega meu e de um dos membros de um outro forum tb aproveitei tb para comentar sobre o que estou fazendo, so que eu estou com uma outra duvida, abaixo o novo codigo:
]#include <stdio.h>
#include <conio.h>

//cria estrutura com dois campos um em ingles e um em portugues

typedef struct                        
{
   char ingles   [50];
   char portugues[50];
}Tipoitem;

typedef struct
{
        Tipoitem item[9999];
        int inicio,fim;
}Tipofila;

void Cria(Tipofila *Fila)
{
Fila->inicio=0;
Fila->fim=0;
}

//insere elemento no fim da estrutura

void insere(Tipofila *Fila,Tipoitem item)
{
     Fila->item[Fila->fim]=item;
     Fila->fim++;
        
}

//função para carregar as palavras do arquivo para o dicionario

int CarregaDic(Tipoitem *item)
{
int i;
int a;
a=0;
FILE *infile;
if ((infile=fopen("infile","r"))==NULL)
   {
    return 0;//aborta
   }
else
  {
  for (i=1;i<=15;i++)
   {
   fscanf(infile,"%15s",item[ i ].portugues);
   fscanf(infile,"%15s",item[ i ].ingles);
   }
  }//else
}

//função principal
int main()
{
char frase[100];

FILE *Arq;

Tipoitem item;    
Tipofila DIC;
Cria   (&DIC);
CarregaDic(&item);

printf("Digite uma palavra ou a frase a ser traduzida:\n\n");
gets(frase);

return 0;
}

Seguinte, queria saber agora depois de feito e compilado este codigo, como eu faria para adicionar uma estrutura dentro do texto que é digitado?

Bom se puderem novamente me ajudar... desde já vlw e falou!!!

Editado por babylon
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...