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

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

06.05.2009, 20:02. Показов 15354. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.05.2009, 20:02
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 15 часов 28 минут
вскрыл с десяток мобильных словарей, но там в большинстве случаев мало того что база разбита на десятки файлов, так еще в такой сложной форме написано, что алгоритм сопоставления слов я так и не вкурил ((
0
10 / 10 / 4
Регистрация: 06.05.2009
Сообщений: 34
30.12.2010, 22:36  [ТС]
Словарной базы как таковой у меня нет. Для демонстрации работы программы был составлен лишь текстовый файл с десятком слов и их переводами, т.к. передо мной стояла задача разработки алгоритма, а не создания готового программного продукта (бОльшего на первом курсе не требовалось ).
0
163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
08.01.2011, 13:50
Народ, пытаюсь сделать перевод в обе стороны, но ответ всегда только один. Кто нибудь эту проблему решал?
0
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,304
08.01.2011, 14:39
Ну корявый вариант был дан выше.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.01.2011, 14:51
Ну по сути тут проще всего через map как я понимаю...
Хотя не факт. Мап же сортирует.
0
163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
08.01.2011, 15:07
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
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,304
08.01.2011, 15:12
Сравнение строк нужно делать функцией strcmp.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
08.01.2011, 15: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
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
Да, у тебя неплохой код вышел, но у нас в политехе есть несколько НО:
1) Препод не понимает как надо делать правильно. Если не поймет что написано - не зачтет.
2) Мой код тоже работает, проблема может быть только если будут два слова одинаковой длинны и начинающиеся на одну и ту же букву (в предыдущих реализациях эта бага была в любом случае, при любой длинне слов.)
3) Пока что хватит и этого, мне еще два курсача делать
0
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,304
08.01.2011, 15:33
Цитата Сообщение от KoIIIeY Посмотреть сообщение
проблема может быть только если будут два слова одинаковой длинны и начинающиеся на одну и ту же букву
.....
Цитата Сообщение от kazak Посмотреть сообщение
Сравнение строк нужно делать функцией strcmp.
0
web dev
 Аватар для TBIKC
107 / 93 / 9
Регистрация: 23.09.2010
Сообщений: 737
08.01.2011, 15:43
Цитата Сообщение от 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.cp p 14 Project
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2011, 15:43
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru