Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.55/64: Рейтинг темы: голосов - 64, средняя оценка - 4.55
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
1

Русско-английский и англо-русский словарь

06.05.2009, 20:02. Показов 12148. Ответов 37
Метки нет (Все метки)

Здравствуйте господа программисты! Мне нужна помощь. В курсовой работе есть задание "Создать проект «Русско-английский и англо-русский словарь», который обеспечивает перевод слов, хранящихся в файле данных." Мой файл данных имеет вид "en_word=ru_word", т.е. в каждой строке содержится английское слово и его перевод. У меня не получается осуществить поиск введенного слова в файле и соответственно вывести перевод.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "CyrIOS.h"
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
 
FILE *finp;
 
int main()
{
    char *FileName="d:\\dictionary_base.txt";
    finp=fopen(FileName,"r");
    if((fopen(FileName,"r"))==NULL)
        cout<<"Невозможно открыть словарную базу"<<endl;
    else
        cout<<"Словарная база успешно открыта"<<endl;
    cout<<"Введите слово для перевода"<<endl;
    char word[50]={0};
    cin>>word;
    cout<<"Ваше слово "<<word<<endl;
    int n=0;
    int i;
    for(i=0;i<50;i++)
    {
            if(word[i]!=0)
            n++;
    }
    cout<<"Длина слова (в символах) "<<n<<endl;
Что дальше делать не знаю.
Заранее благодарен!
3

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2009, 20:02
Ответы с готовыми решениями:

Реализовать русско-английский и англо-русский словарь
Надо было реализовать словарь с русского на англ и наоборот. #include &quot;iostream&quot; #include...

Англо-русский и русско-английский переводчик в одном приложении
Имеется программа-переводчик. Реализован перевод с англ. на русский. Есть ли возможность запихать...

Англо-Латинский и Латинско-Английский словарь
В общем, нам дано число n - количество англ слов. Затем в каждой строчке дается само англ. слово и...

Русско-английский словарь. Ввод данных с двух файлов. Вывод результата в файл
Здравствуйте, сама задача: Даны два текстовых файла - в первом расположены русские слова, во...

37
3081 / 2402 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
07.05.2009, 07:56 2
Что-то в этом духе
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream.h>
#include <fstream.h>
#inclede <string.h>
 
int main(int argc, char* argv[])
{
   char word[50] = {'\0'}, str[100] = {'\0'};
   char *buf1 = NULL, *buf2 = NULL;
   bool find = false;
   ifstream fileIn;
 
   fileIn.open("dict.txt");
   if (!fileIn.is_open())
   {
      cout << "Íåâîçìîæíî îòêðûòü ñëîâàðíóþ áàçó" << endl;
      exit(1);
   }
   cout << "Ñëîâàðíàÿ áàçà óñïåøíî îòêðûòà" << endl;
   cout << "Ââåäèòå ñëîâî äëÿ ïåðåâîäà" << endl;
   cin.getline(word, 50);
   while (!fileIn.eof())
   {
      fileIn.getline(str, 100);
      buf1 = strtok(str, "=");
      buf2 = strtok(NULL, " ");
      if (buf1 == word)
      {
         cout << word << " = " << buf2 << endl;
         find = true;
         break;
      }
      if (buf2 == word)
      {
         cout << word << " = " << buf1 << endl;
         find = true;
         break;
      }
 
   }
   if (!find)
      cout << "Ñîâïàäåíèé íå íàéäåíî" << endl;
 
   fileIn.close();
   system("pause");
   return 0;
}
Алгоритм работает, слова разделяет правильно(если слова разделены знаком = без пробелов), но с русским шрифтом проблема.
P.S. Что это за хидер у тебя "CyrIOS.h"?

Добавлено через 38 минут 14 секунд
Да, я так и не понял зачем в словаре длину слова узнавать, но если тебе надо, то воспользуйся функцией strlen(<указатель на строку>).
1
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
07.05.2009, 10:07  [ТС] 3
Спасибо большое!
"CyrIOS.h" для работы с кириллицей, но для корректной работы нужно в настройках проекта установить значение Character Set на Not Set. А длину слова определил на всякий случай (думал понадобится)
0
3081 / 2402 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
07.05.2009, 10:25 4
А выложить можешь этот хидер - интересно стало.
0
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
07.05.2009, 13:35  [ТС] 5
Закинь файлы в папку проекта Debug и не забудь указать их в самом проекте.
2
Вложения
Тип файла: rar CyrIOS.rar (2.2 Кб, 245 просмотров)
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
07.05.2009, 14:24  [ТС] 6
kazak, не могли бы вы объяснить, что нужно делать. Ваш код вроде бы рабочий, но какое слово я бы не ввёл, программа выдаёт сообщение "Совпадений не найдено". Например, первой же строкой в файле dict.txt у меня идёт "dog=пёс". Набираю слово "dog" выводит "Совпадений не найдено". В чём причина?
0
3081 / 2402 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
07.05.2009, 14:31 7
Блин, не доглядел при сравнении указатели надо разименовывать
C++
1
2
3
if (*buf1 == *word)
и
if (*buf2 == *word)
1
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
07.05.2009, 14:38  [ТС] 8
Огромное спасибо! Вы мне очень помогли!
0
1 / 1 / 0
Регистрация: 22.03.2010
Сообщений: 18
22.03.2010, 18:06 9
Dimon 91 Можешь скинуть свою курсовую, а то у меня такая же проблема, задали курсовую по этой же теме, а сделать надо за неделю, никак не успею. Если не трудно конечно.
0
4 / 4 / 0
Регистрация: 04.02.2009
Сообщений: 79
30.12.2010, 20:23 10
dimon_91, есть просьба, можешь скинуть базу словаря, если она в текстовом файле? (konstantyn[собачка]bk.ru)

Добавлено через 5 минут
Может есть у кого-нибудь вышеупомянутая база слов для англо-русского словаря в текстовом формате?
Буду очень признателен.

Добавлено через 15 часов 28 минут
вскрыл с десяток мобильных словарей, но там в большинстве случаев мало того что база разбита на десятки файлов, так еще в такой сложной форме написано, что алгоритм сопоставления слов я так и не вкурил ((
0
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
30.12.2010, 22:36  [ТС] 11
Словарной базы как таковой у меня нет. Для демонстрации работы программы был составлен лишь текстовый файл с десятком слов и их переводами, т.к. передо мной стояла задача разработки алгоритма, а не создания готового программного продукта (бОльшего на первом курсе не требовалось ).
0
163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
08.01.2011, 13:50 12
Народ, пытаюсь сделать перевод в обе стороны, но ответ всегда только один. Кто нибудь эту проблему решал?
0
3081 / 2402 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
08.01.2011, 14:39 13
Ну корявый вариант был дан выше.
0
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.01.2011, 14:51 14
Ну по сути тут проще всего через map как я понимаю...
Хотя не факт. Мап же сортирует.
0
163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
08.01.2011, 15:07 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <windows.h>
 
char bufRus[256];
 
char* rus(const char* text) {
      CharToOem(text, bufRus);
      return bufRus;
      }
 
int main(int argc, char* argv[])
{
   char word[50] = {'\0'}, str[100] = {'\0'};
   char *buf1 = NULL, *buf2 = NULL;
   bool find = false;
   ifstream fileIn;
 
   fileIn.open("dict.txt");
   if (!fileIn.is_open())
   {
      cout << rus("Áàçû íåò") << endl;
      exit(1);
   }
   cout << rus("Áàçà îòêðûòà") << endl;
   cout << rus("Ââåäèòå ñëîâî") << endl;
   cin.getline(word, 50);
   
   while (!fileIn.eof())
   {
      fileIn.getline(str, 100);
      buf1 = strtok(str, "=");
      buf2 = strtok(NULL, " ");
      buf1 = rus(buf1);
      if (*buf1 == *word && strlen(buf1) == strlen(word))
      {
 
         cout << word << " = " << rus(buf2) << endl;
         find = true;
         break;
      }
      if (*buf2 == *word && strlen(buf2) == strlen(word))
      {
         cout << word << " = " << buf1 << endl;
         find = true;
         break;
      }
   }
   if (!find)
      cout << rus("Ñîâïàäåíèé íå íàéäåíî") << endl;
 
   fileIn.close();
   system("pause");
   return 0;
}
вот, работает русский, переводит в обе стороны.
Всем спасибо


Вообще-то я веб-программер, по этому не судите строго если что не так.
1
3081 / 2402 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
08.01.2011, 15:12 16
Сравнение строк нужно делать функцией strcmp.
0
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.01.2011, 15:15 17
Вполне рабочий

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <string>
#include <windows.h>
#include <fstream>
#include <sstream>
#include <vector>
#include <map>
 
std::string Rus(const std::string& one)
{
    std::string res;
    res.resize(one.size());
    CharToOem(const_cast<char*>(one.c_str()), const_cast<char*>(res.c_str()));
    return res;
}
 
std::string RusToChar(const std::string& one)
{
    std::string res;
    res.resize(one.size());
    OemToChar(const_cast<char*>(one.c_str()), const_cast<char*>(res.c_str()));
    return res;
}
 
std::map<std::string, std::string> fill(std::ifstream& ifs)
{
    std::map<std::string, std::string> what;
    while(!ifs.eof())
    {
        if(!ifs.eof())
        {
            std::string tmp;
            std::string tmp2;
            std::vector<std::string> vec;
            const char delim='=';
            std::getline(ifs, tmp);
            for(std::string::iterator it=tmp.begin(); it != tmp.end(); ++it)
                if(*it == delim)
                    *it=' ';
            std::istringstream ist(tmp);
            while(ist >> tmp)
                vec.push_back(tmp);
            *vec.begin()=RusToChar(*vec.begin());
            what.insert(std::make_pair<std::string, std::string>(*vec.begin(), *(vec.begin()+1)));
        }
    }
    return what;
}
 
int main()
{
    typedef std::map<std::string, std::string> VOC;
    typedef std::map<std::string, std::string>::iterator VOCIT;
 
    std::string file_name;
    std::cout<<"Enter name of file: ";
    std::cin>>file_name;
    std::ifstream ifs(file_name.c_str());
    VOC voc;
    if(!ifs)
    {
        std::cerr<<"Error with opening file "<< file_name <<'\n';
        return 1;
    }
    voc=fill(ifs);
    std::string some;
    std::cout<<Rus(std::string("Введите слово на английском"))<<'\n';
    std::cin>>some;
    VOCIT it=voc.find(some);
    if(it != voc.end())
        std::cout<<Rus(std::string("Перевод найден."))<<'\n'<<Rus(std::string("Слово "))<< it->first 
        <<Rus(std::string(" на русском есть слово "))<< Rus(it->second)<<'\n';
    else
        std::cout<<Rus(std::string("Слово не найдено"))<<'\n';
    return 0;
}
0
163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
08.01.2011, 15:27 18
Да, у тебя неплохой код вышел, но у нас в политехе есть несколько НО:
1) Препод не понимает как надо делать правильно. Если не поймет что написано - не зачтет.
2) Мой код тоже работает, проблема может быть только если будут два слова одинаковой длинны и начинающиеся на одну и ту же букву (в предыдущих реализациях эта бага была в любом случае, при любой длинне слов.)
3) Пока что хватит и этого, мне еще два курсача делать
0
3081 / 2402 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
08.01.2011, 15:33 19
Цитата Сообщение от KoIIIeY Посмотреть сообщение
проблема может быть только если будут два слова одинаковой длинны и начинающиеся на одну и ту же букву
.....
Цитата Сообщение от kazak Посмотреть сообщение
Сравнение строк нужно делать функцией strcmp.
0
web dev
106 / 92 / 9
Регистрация: 23.09.2010
Сообщений: 737
08.01.2011, 15:43 20
Цитата Сообщение от ForEveR Посмотреть сообщение
Вполне рабочий

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <string>
#include <windows.h>
#include <fstream>
#include <sstream>
#include <vector>
#include <map>
 
std::string Rus(const std::string& one)
{
    std::string res;
    res.resize(one.size());
    CharToOem(const_cast<char*>(one.c_str()), const_cast<char*>(res.c_str()));
    return res;
}
 
std::string RusToChar(const std::string& one)
{
    std::string res;
    res.resize(one.size());
    OemToChar(const_cast<char*>(one.c_str()), const_cast<char*>(res.c_str()));
    return res;
}
 
std::map<std::string, std::string> fill(std::ifstream& ifs)
{
    std::map<std::string, std::string> what;
    while(!ifs.eof())
    {
        if(!ifs.eof())
        {
            std::string tmp;
            std::string tmp2;
            std::vector<std::string> vec;
            const char delim='=';
            std::getline(ifs, tmp);
            for(std::string::iterator it=tmp.begin(); it != tmp.end(); ++it)
                if(*it == delim)
                    *it=' ';
            std::istringstream ist(tmp);
            while(ist >> tmp)
                vec.push_back(tmp);
            *vec.begin()=RusToChar(*vec.begin());
            what.insert(std::make_pair<std::string, std::string>(*vec.begin(), *(vec.begin()+1)));
        }
    }
    return what;
}
 
int main()
{
    typedef std::map<std::string, std::string> VOC;
    typedef std::map<std::string, std::string>::iterator VOCIT;
 
    std::string file_name;
    std::cout<<"Enter name of file: ";
    std::cin>>file_name;
    std::ifstream ifs(file_name.c_str());
    VOC voc;
    if(!ifs)
    {
        std::cerr<<"Error with opening file "<< file_name <<'\n';
        return 1;
    }
    voc=fill(ifs);
    std::string some;
    std::cout<<Rus(std::string("Введите слово на английском"))<<'\n';
    std::cin>>some;
    VOCIT it=voc.find(some);
    if(it != voc.end())
        std::cout<<Rus(std::string("Перевод найден."))<<'\n'<<Rus(std::string("Слово "))<< it->first 
        <<Rus(std::string(" на русском есть слово "))<< Rus(it->second)<<'\n';
    else
        std::cout<<Rus(std::string("Слово не найдено"))<<'\n';
    return 0;
}
Ошибка 1 error C2664: CharToOemW: невозможно преобразовать параметр 1 из "char *" в "LPCWSTR" C:\Users\Anton\documents\visual studio 2010\Projects\Project\Project\Project.cpp 14 Project
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2011, 15:43

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Англо-русский словарь на С++
Помогите пожалста. Втупляю, немогу придумать ничего дельного. Разработать класс «Граф» для...

Англо-русский словарь
нужно написать программу &quot;англо-русский и русско-английский словарь&quot; база данных словаря должна...

Англо-русский словарь
Прошу вас помочь написать мне программу на Borland C, программа (англо-русский словарь) Вот...

Класс «англо – русский словарь»
Определите класс «англо – русский словарь». Словарь состоит из различных слов английского языка,...

Двоичное дерево. Англо-русский словарь
Как сделать, чтобы count прибавлялся для одного слова, которое искали, а не для всех сразу. ...

Англо-русский словарь в виде двоичного дерева
Строки 105 и 60, ошибки С4703 и С4700 соответственно. Задача:Каждая компонента содержит английское...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.