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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 61, средняя оценка - 4.66
dimon_91
10 / 10 / 1
Регистрация: 06.05.2009
Сообщений: 34
#1

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

06.05.2009, 20:02. Просмотров 7857. Ответов 35
Метки нет (Все метки)

Здравствуйте господа программисты! Мне нужна помощь. В курсовой работе есть задание "Создать проект «Русско-английский и англо-русский словарь», который обеспечивает перевод слов, хранящихся в файле данных." Мой файл данных имеет вид "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;
Что дальше делать не знаю.
Заранее благодарен!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2009, 20:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Русско-английский и англо-русский словарь (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
08.01.2011, 15:12 #16
Сравнение строк нужно делать функцией strcmp.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
08.01.2011, 15:33 #19
Цитата Сообщение от KoIIIeY Посмотреть сообщение
проблема может быть только если будут два слова одинаковой длинны и начинающиеся на одну и ту же букву
.....
Цитата Сообщение от kazak Посмотреть сообщение
Сравнение строк нужно делать функцией strcmp.
TBIKC
web dev
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
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
08.01.2011, 15:44 #21
Цитата Сообщение от TBIKC Посмотреть сообщение
Ошибка 1 error C2664: CharToOemW: невозможно преобразовать параметр 1 из "char *" в "LPCWSTR" C:\Users\Anton\documents\visual studio 2010\Projects\Project\Project\Project.cpp 14 Project
Попробуй юникод в настройках отключить.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
08.01.2011, 16:09 #22
Да либо мультибайт либо нот сет нужно поставить
KoIIIeY
163 / 163 / 4
Регистрация: 08.01.2011
Сообщений: 850
08.01.2011, 16:23 #23
Цитата Сообщение от kazak Посмотреть сообщение
.....
А почему ты сразу не использовал strcmp ?

Но я согласен, стало проще:
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 (strcmp(buf1, word) == 0)
      {
 
         cout << word << " = " << rus(buf2) << endl;
         find = true;
         break;
      }
      if (strcmp(buf2, word) == 0)
      {
         cout << word << " = " << buf1 << endl;
         find = true;
         break;
      }
   }
   if (!find)
      cout << rus("Нет совпадений") << endl;
 
   fileIn.close();
   system("pause");
   return 0;
}
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
08.01.2011, 16:36 #24
Цитата Сообщение от KoIIIeY Посмотреть сообщение
А почему ты сразу не использовал strcmp ?
На дату поста посмотри - молод был, неопытен
D1mex
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 16
05.05.2011, 11:47 #25
мне тоже не могли бы скинуть наброски курсовой вашей на мыло если не трудно d1mexe(@)gmail.com
KoIIIeY
163 / 163 / 4
Регистрация: 08.01.2011
Сообщений: 850
05.05.2011, 12:28 #26
Цитата Сообщение от D1mex Посмотреть сообщение
мне тоже не могли бы скинуть наброски курсовой вашей на мыло если не трудно d1mexe(@)gmail.com
Код полтора ответа выше и есть моя курсовая. Создавайте файл dict.txt, пишите туда слова в формате
C
1
2
mouse=мышь
коробка=box
все работает, компилил в Borland C++ Builder.
D1mex
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 16
06.05.2011, 09:25 #27
а что надо подправить что бы на Visual 2010 C++ Работал подскажите?
KoIIIeY
163 / 163 / 4
Регистрация: 08.01.2011
Сообщений: 850
06.05.2011, 09:41 #28
Хороший вопрос. Я его вчера пришел сдавать, а скомпиленую версию че-то не взял. На VS 2008 тоже не компилится.

Компиль в Borland C++ Builder, или в аналогичном от Майкрософт. А так - я хз.
D1mex
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 16
06.05.2011, 10:35 #29
можешь закинуть готую ее в арфивчики я попробую ее
KoIIIeY
163 / 163 / 4
Регистрация: 08.01.2011
Сообщений: 850
06.05.2011, 12:58 #30
Вот, взгляни. Закомпилен и собран в Borland C++ Builder, 2006 года выпуска.
Вложения
Тип файла: rar translator.rar (133.3 Кб, 77 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2011, 12:58
Привет! Вот еще темы с ответами:

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

Курсовая работа на тему англо-русский словарь - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;clocale&gt; #include &lt;stdlib.h&gt; #include &lt;locale&gt; int...

Англо-русский словарь построен как двоичное дерево. - C++
Всем привет! Помогите пожалуйста с написанием программы:cry: Очень прошу:gcray: Англо-русский словарь построен как двоичное дерево. ...

Разобраться в некоректности программы!(англо-русский словарь лин. списком) - C++
Здравствуйте,помогите пожалуйста с программой,требуется написать программу для русско-английского словаря,читать слова из текстового файла...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.05.2011, 12:58
Ответ Создать тему
Опции темы

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