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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

Проверка орфографии - C++

05.08.2011, 15:26. Просмотров 2968. Ответов 11
Метки нет (Все метки)

Нужно написать маленькое приложение по проверке орфографии, которое сверяет введённое слово с словарём (файл dictionary.txt) и если слово написано правильно выводит уведомление об этом. Иначе пишет что слово было написано неправильно и пытается найти другие похожие слова (методом обмена местами двух букв в слове из словаря и дальнейшей сверкой со словом для поиска). Но что-то работает мой алгоритм через пень-колоду, что-то я упустил видать так как похожие слова он ищет не все. Так если внести в словарь слово simple и потом ввести ismple то алгоритм его "узнает", а если ввести simpel то уже не узнает.

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
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <string>
 
using namespace std;
 
void find(string);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string test;
    cout<<"Введите слово: ";
    cin>>test;
    find(test);
}
 
void find(string tofind)
{
    ifstream dict("dictionary.txt"); //открыть словарь
    if(!dict)
     exit(100500); //вернурть если файл не удалось открыть
    string temp; //временная переменная
 
    //пока в словаре есть слова
    while(dict>>temp)
    // сравнивать их с строкой для поиска
    // и если найдено совпадение то вывести уведомление и прекратить поиск
     if (temp==tofind)
     {
         cout<<"\nСлово написано правильно.\n";
         return;
     }
 
    //если точного совпадения слов не найдено
    //убрать метку конца файла и установить курсор на начало файла
    dict.clear();
    dict.seekg(0);
 
    //вывести уведомление пользователю
    cout<<"\nСлово написано неправильно.\n";
 
    //пока есть слова в словаре
    while(dict>>temp)
    {
        //если длина слова для поиска и текущего слова в словаре одинаковая
        if(temp.length()==tofind.length())
        {
            for (int i=0;i<temp.length();i++)
            {
                for (int j=0;j<temp.length();j++)
                {
                    //сделать копию слова чтобы в ней можно было
                    //проводить замены
                    string dtemp=temp;
                    char c=dtemp[i];
                    dtemp[i]=dtemp[j];
                    dtemp[j]=c;
 
                    //если после обмена двух букв модиф. слово из словаря
                    //и слово для поиска одинаковые то вывести слово на печать
                    if (dtemp==tofind)
                     cout<<"\nВозможно Вы имели в виду \""<<temp<<"\""<<endl;
                    break;
                }
            }
        }
    }
 
    dict.close(); //закрыть словарь
}
Собственно файл словаря обычный txt файл с словами разделёнными пробелами/символами новой строки.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2011, 15:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка орфографии (C++):

использование hunspell для проверки орфографии - C++
Привет, Хочу довавить проверку орфографии к моей проге. Пробовал использовать hunspell. Но почему-то при создании DLL следуя этим ...

Для программы проверки орфографии нужен словарь со словами - C++
для программы проверки орфографии нужен словарь со словами. откуда его вытащить?? .txt файл с набором слов через пробел либо через...

Visual C++ проверка ввода на число, проверка на кирилицу - C++
Суть ввести с клавиатуры нечто, и повторять ввод до тех пор пока введенное число не будет числом. Этот код проверяет на буквы и знаки,...

Проверка орфографии - MS Powerpoint
Добрый день! В презентации почему-то на отдельных слайдах все слова подчеркнуты красной линией как неправильные. Как можно все эти линии на...

Проверка орфографии (чк, чн) - Pascal ABC
составить программу проверяющую и исправляющую орфограмму чк-чн.

Проверка орфографии - Visual Basic .NET
Здравствуйте, уважаемые форумчане! Подскажите пожалуйста, как делать проверку орфографии вводимой в текстбоксы информации?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.08.2011, 16:32 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
            for (int i=0;i<temp.length();i++)
            {
                for (int j=0;j<temp.length();j++)
                {
                    //сделать копию слова чтобы в ней можно было
                    //проводить замены
                    string dtemp=temp;
                    char c=dtemp[i];
                    dtemp[i]=dtemp[j];
                    dtemp[j]=c;
 
                    //если после обмена двух букв модиф. слово из словаря
                    //и слово для поиска одинаковые то вывести слово на печать
                    if (dtemp==tofind)
                     cout<<"\nВозможно Вы имели в виду \""<<temp<<"\""<<endl;
                    break;
                }
            }
Да у вас же break всегда выполняется.
1
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
05.08.2011, 16:34 #3
Gepar, а просто map использовать нельзя?
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
05.08.2011, 19:28  [ТС] #4
ForEveR, тьфу, точно, скобки не доставил при редактировании.
ValeryLaptev, чего использовать?
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
05.08.2011, 20:29 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Gepar, map - стандартный ассоциативный контейнер. Вот посмотрите:

Для реализации словаря нужно использовать ассоциативный контейнер map. Элементами контейнера являются пары слов: английское слово является ключом, русское слово — значением. Для этого удобно использовать стандартную структуру pair с полями-строками: поле first является ключом, а поле second — значением. Посмотрите простой пример, который проясняет, как это делается (листинг 11.22).
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
Листинг 11.22. Использование ассоциативного контейнера map
#include <iostream>
#include <locale>
#include <string>
#include <algorithm>
#include <map>
#include <conio.h>
using namespace std;
typedef pair <wstring, wstring> word;               // карточка слова
void print(const word &t)                           // вывод карточки
{   wcout << t.first <<-<< t.second << endl; }
int main()
{   map <wstring, wstring> Dictionary;              // словарь
    wcout.imbue(locale("rus_rus.866"));             // для вывода русских 
// вставка в словарь
    Dictionary.insert(word(L"word",L"слово"));
    Dictionary.insert(word(L"path",L"путь, маршрут"));
    Dictionary.insert(word(L"computer",L"компьютер"));
// вывод словаря на экран
    for_each(Dictionary.begin(), Dictionary.end(), ptr_fun(print));
    cout << endl << endl;
// замена значения – русского слова
    Dictionary[L"computer"] = L"вычислительная машина";
    for_each(Dictionary.begin(), Dictionary.end(), ptr_fun(print));
    cout << endl << endl;
// получение русского слова 
    wstring s = Dictionary[L"word"];
    wcout << Dictionary[L"path"] << ';' << s << endl;
// вставка в словарь 
    word w = make_pair(L"accumulate", L"накапливать");
    Dictionary.insert(w);
    Dictionary[L"access"] = L"доступ";              
    for_each(Dictionary.begin(), Dictionary.end(), ptr_fun(print));
    cout << endl << endl;
    map <wstring, wstring> D;                       // новый словарь
// вставка в словарь
    D[L"account"] = L"учетная запись";
    D[L"accumulate"] = L"накапливать";
    D[L"path"] = L"маршрут";
    Dictionary.insert(D.begin(), D.end()); // объединение словарей
    for_each(Dictionary.begin(), Dictionary.end(), ptr_fun(print));
    cout << endl << endl;
    getch();
    return 0;
}
В этой программе использованы широкие строки и широкие потоки только для того, чтобы не иметь проблем с выводом русских слов-констант в консольное окно. Вывод словаря выполняет алгоритм for_each(), которому для этого передается функция print(). Вставка в словарь Dictionary выполняется методом insert():
C++
1
Dictionary.insert(word(L"computer",L"компьютер"));
Естественно, вместо явного задания констант можно добавлять в контейнер переменную типа word
C++
1
2
word w = make_pair(L"accumulate", L"накапливать");
Dictionary.insert(w);
Мы сконструировали пару из констант, но ничто не мешает нам ввести значения полей пары из файла.
Контейнер является ассоциативным массивом (см. раздел «Доступ к элементам контейнера» в гл. 3), поэтому оператор
C++
1
Dictionary[L"computer"] = L"вычислительная машина";
осуществляет замену значения, связанного с ключом «computer». Если ключ в словаре отсутствует, то такой оператор осуществляет запись в словарь нового значения, связанного с данным ключом. Именно так добавлялись слова во второй словарь D. Затем весь словарь D был добавлен в словарь Dictionary:
C++
1
Dictionary.insert(D.begin(), D.end());
Если слово уже присутствует в словаре Dictionary, то такое же слово из словаря D в словарь Dictionary не попадает (например, «accumulate», «path»). Если требуется, чтобы слова с одинаковыми ключами попадали в словарь, нужно просто заменить map на multimap.
Использование очереди, стека и приоритетной очереди не представляет сложностей. Однако нужно помнить, что адаптеры контейнеров не обеспечивают последовательный доступ с помощью итераторов. Это не позволяет просмотреть контейнер непосредственно, что иногда создает сложности.
3
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
06.08.2011, 14:33  [ТС] #6
ValeryLaptev, я stl только сегодня начал читать, до этого не знал о существовании того что Вы написали.
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.08.2011, 14:54 #7
Gepar, ну, вот и узнал... STL - рулит во многих случаях!
0
easybudda
Модератор
Эксперт CЭксперт С++
9624 / 5572 / 946
Регистрация: 25.07.2009
Сообщений: 10,702
06.08.2011, 16:55 #8
ValeryLaptev, и всё бы ничего, только ТС проверку орфографии, а не словарь делает...

Gepar, я бы бинарное дерево из слов строил. Если слово не найдётся - выводить одно, которое больше, и одно, которое меньше. Не факт, что в них по две буквы перевёрнуто будет, за то работать должно быстрее...
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
06.08.2011, 17:01 #9
Цитата Сообщение от easybudda Посмотреть сообщение
я бы бинарное дерево из слов строил.
Так в основе map тоже какое-нибудь черно-красное или AVL дерево стоит. Что еще лучше, чем бинарное.
Цитата Сообщение от easybudda Посмотреть сообщение
Если слово не найдётся - выводить одно, которое больше, и одно, которое меньше.
Вот этого не понял, зачем?
0
easybudda
Модератор
Эксперт CЭксперт С++
9624 / 5572 / 946
Регистрация: 25.07.2009
Сообщений: 10,702
06.08.2011, 17:05 #10
Цитата Сообщение от fasked Посмотреть сообщение
Вот этого не понял, зачем?
Ну надо же что-то на замену предлагать, если слово не нашлось...

Цитата Сообщение от fasked Посмотреть сообщение
Так в основе map тоже какое-нибудь черно-красное или AVL дерево стоит. Что еще лучше, чем бинарное.
Очень может быть, но как для этой задачи (проверка орфографии) контейнер map использовать - что-то не могу придумать. С деревом как-то понятнее...
0
fasked
06.08.2011, 17:06
  #11

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
Ну надо же что-то на замену предлагать, если слово не нашлось...
Учебник русского языка

0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.08.2011, 20:02 #12
easybudda, map - это и есть дерево... А уж как его использовать - дело разработчика. Может в данном случае больше подойдет set. Если слово правильное, то оно в set найдется. Если нужно близкие слова выводить, то не все так просто. Возможно, подойдет multymap с ключами-буквами.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2011, 20:02
Привет! Вот еще темы с ответами:

Проверка орфографии+ - PHP
Извиняюсь если топик не ту степь.. Есть ли скрипты для проверки орфографии как на сайте http://www.perevodspell.ru/speller.htm Можно ли...

Проверка орфографии в VB - Visual Basic
У меня возникла проблемма: как связать своё приложение с системой проверки орфографии Word''а?

Проверка орфографии - Haskell
Помогите написать программу Задание: &quot;Разработать программу, которая проверяла бы правильность написания слов в некоторой стоке,...

Проверка орфографии в Word - MS Word
Подскажите, пожалуйста, программку для проверки орфографии и правописания в Word. Желательно проверенную и действующую...


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

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

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