1

Buen día, necesito hacer un traductor de inglés-español en C++, que tenga un menú que permita escoger traducir de un idioma al otro. Esto es lo que llevo por ahora (está de sobra decir que tiene errores y le faltan cosas). Por ahora quiero que funcione lo del menú y que se haga la "traducción".

#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<string.h>
#include<dos.h>
#include<stdlib.h>
#include<ctype.h>

struct lang{
        char english[20];
        char spanish[20];
        };
lang wordslist[50]={"CAT","GATO","DOG","PERRO","ENGLISH","INGLES","SPANISH","ESPANOL","FISH","PEZ","TURTLE","TORTUGA","BEAR","OSO","RABBIT","CONEJO","HELLO","HOLA","TREE","ARBOL","BLUE","AZUL","COLOR","COLOR","RED","ROJO","SMALL","PEQUENO","COMPUTER","COMPUTADORA","NUMBER","NUMERO","WORD","PALABRA","APPLE","MANZANA","GOODBYE","ADIOS","ORANGE","NARANJA","FRUIT","FRUTA","LEMON","LIMON","MOUSE","RATON","PLAY","JUGAR","WRITE","ESCRIBIR","HOUSE","CASA","PHONE","TELEFONO","SPEAK","HABLAR","SCHOOL","ESCUELA","BOOK","LIBRO"};
char word[50];
int i;

void main()
{
    clrscr();
    gotoxy(7,5);
    printf("ENGLISH-SPANISH TRANSLATOR");
    gotoxy(14,7);
    printf("Introduzca la palabra en espanol a traducir --> ");
    gets(word);
    clrscr();
    int x=strcmp(word,wordslist[i]);
    for (i=0;i<=50;i++)
    {
        if (x<0)
        {
            cout<<wordslist[i].spanish<<" ";
            cout<<wordslist[i].english<<" ";
        }
    }
    getch();
}

Creo que el error principal está en el strcmp, aparece un error y no puedo comparar las dos cadenas (creo que se llaman así, soy nuevo en la programación, el profesor no nos ha explicado muy bien muchas cosas, por ello estoy aquí). Por si preguntan, el compilador es Borland.

Le agredeceré mucho a quien me pudiera ayudar. Si faltaron datos diganmelo.

  • Programáticamente lo más sencillo que conseguirás es una traducción literal, que puedes hacer con un diccionario o un mecanismo similar como el que usas. Si quieres un traductor fiable sugiero que crees una IA. – Mateo Jun 03 '22 at 17:34

2 Answers2

2

Lo que sucede es que has puesto la comparación fuera del bucle, luego solo se va a ejecutar una vez ... además, en ese punto i no está inicializada, luego puede valer cualquier cosa.

No estaría de más que eliminases la declaración global de i. Las variables deben tener una vida lo más pequeña posible. Esto ayuda a evitar ciertos errores en el código.

Otro detalle: Si el array tiene 50 elementos, tienes que iterar de 0 a 49. Si lo haces de 0 a 50 entonces estarás intentando acceder a 51 elementos ...

El código, corregido, podría quedar así:

for (int i=0; i<50; i++)
{
    if (strcmp(word,wordslist[i].spanish) == 0)
    {
        cout<<wordslist[i].spanish<<" ";
        cout<<wordslist[i].english<<" ";
    }
}
eferion
  • 49,291
  • 5
  • 30
  • 72
2

Creo que el error principal está en el strcmp

No, los errores de código ya los ha señalado eferion, yo te voy a señalar los errores de diseño:

  • En , para trabajar con texto se usa el objeto std::string, disponible al incluir la cabecera <string>, este objeto tiene métodos internos para comparar, copiar y gestionar texto sin confiar en herramientas de como strcmp.
  • Si estás trabajando con C++, NO debes usar las cabeceras de C, lee este hilo para saber más del tema.
  • En C++ se usan flujos de datos para leer y escribir en consola, no uses herramientas de C como printf o gets.
  • No necesitas inicializar a mano los datos si tus datos son estáticos, úsalos directamente.
  • La función main debe devolver int.

Siguiendo los consejos anteriores, tu código podría parecerse a:

#include <iostream>
#include <string>
#include <algorithm>
#include <list>

struct en_to_es {
    std::string english;
    std::string spanish;
};

std::list<en_to_es> wordslist {
    {"CAT","GATO"},
    {"DOG","PERRO"},
    {"ENGLISH","INGLES"},
    {"SPANISH","ESPANOL"},
    {"FISH","PEZ"},
    {"TURTLE","TORTUGA"},
    {"BEAR","OSO"},
    {"RABBIT","CONEJO"},
    {"HELLO","HOLA"},
    {"TREE","ARBOL"},
    {"BLUE","AZUL"},
    {"COLOR","COLOR"},
    {"RED","ROJO"},
    {"SMALL","PEQUENO"},
    {"COMPUTER","COMPUTADORA"},
    {"NUMBER","NUMERO"},
    {"WORD","PALABRA"},
    {"APPLE","MANZANA"},
    {"GOODBYE","ADIOS"},
    {"ORANGE","NARANJA"},
    {"FRUIT","FRUTA"},
    {"LEMON","LIMON"},
    {"MOUSE","RATON"},
    {"PLAY","JUGAR"},
    {"WRITE","ESCRIBIR"},
    {"HOUSE","CASA"},
    {"PHONE","TELEFONO"},
    {"SPEAK","HABLAR"},
    {"SCHOOL","ESCUELA"},
    {"BOOK","LIBRO"}
};

int main()
{
    std::cout << "ENGLISH-SPANISH TRANSLATOR";
    std::string palabra;
    std::getline(std::cin, palabra);

    auto found = std::find_if(wordslist.begin(), wordslist.end(),
        [&palabra](const en_to_es &dupla)
        {
            return dupla.english == palabra;
        });

    if (found == wordslist.end())
        std::cout << "No se traducir " << palabra;
    else
        std::cout << palabra << " es " << found->spanish << " en espanol";

    return 0;
}

Puedes ver el código funcionando en Try it online!.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82