Форум программистов, компьютерный форум CyberForum.ru

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

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

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

Добавлено через 15 часов 28 минут
вскрыл с десяток мобильных словарей, но там в большинстве случаев мало того что база разбита на десятки файлов, так еще в такой сложной форме написано, что алгоритм сопоставления слов я так и не вкурил ((
dimon_91
10 / 10 / 1
Регистрация: 06.05.2009
Сообщений: 34
30.12.2010, 22:36  [ТС]     Русско-английский и англо-русский словарь #11
Словарной базы как таковой у меня нет. Для демонстрации работы программы был составлен лишь текстовый файл с десятком слов и их переводами, т.к. передо мной стояла задача разработки алгоритма, а не создания готового программного продукта (бОльшего на первом курсе не требовалось ).
KoIIIeY
163 / 163 / 4
Регистрация: 08.01.2011
Сообщений: 850
08.01.2011, 13:50     Русско-английский и англо-русский словарь #12
Народ, пытаюсь сделать перевод в обе стороны, но ответ всегда только один. Кто нибудь эту проблему решал?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
08.01.2011, 14:39     Русско-английский и англо-русский словарь #13
Ну корявый вариант был дан выше.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.01.2011, 14:51     Русско-английский и англо-русский словарь #14
Ну по сути тут проще всего через map как я понимаю...
Хотя не факт. Мап же сортирует.
KoIIIeY
163 / 163 / 4
Регистрация: 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;
}
вот, работает русский, переводит в обе стороны.
Всем спасибо


Вообще-то я веб-программер, по этому не судите строго если что не так.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
08.01.2011, 15:12     Русско-английский и англо-русский словарь #16
Сравнение строк нужно делать функцией strcmp.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
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;
}
KoIIIeY
163 / 163 / 4
Регистрация: 08.01.2011
Сообщений: 850
08.01.2011, 15:27     Русско-английский и англо-русский словарь #18
Да, у тебя неплохой код вышел, но у нас в политехе есть несколько НО:
1) Препод не понимает как надо делать правильно. Если не поймет что написано - не зачтет.
2) Мой код тоже работает, проблема может быть только если будут два слова одинаковой длинны и начинающиеся на одну и ту же букву (в предыдущих реализациях эта бага была в любом случае, при любой длинне слов.)
3) Пока что хватит и этого, мне еще два курсача делать
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
08.01.2011, 15:33     Русско-английский и англо-русский словарь #19
Цитата Сообщение от KoIIIeY Посмотреть сообщение
проблема может быть только если будут два слова одинаковой длинны и начинающиеся на одну и ту же букву
.....
Цитата Сообщение от kazak Посмотреть сообщение
Сравнение строк нужно делать функцией strcmp.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2011, 15:43     Русско-английский и англо-русский словарь
Еще ссылки по теме:

Курсовая работа на тему англо-русский словарь C++
C++ Англо-русский словарь построен в виде двоичного дерева в программе с++
Реализовать русско-английский и англо-русский словарь C++

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

Или воспользуйтесь поиском по форуму:
TBIKC
web dev
 Аватар для TBIKC
104 / 91 / 1
Регистрация: 23.09.2010
Сообщений: 738
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
Yandex
Объявления
08.01.2011, 15:43     Русско-английский и англо-русский словарь
Ответ Создать тему
Опции темы

Текущее время: 13:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru