13 / 13 / 2
Регистрация: 17.05.2012
Сообщений: 121
1

Программа, заменяющая английские сокращения слов

07.07.2013, 22:39. Показов 1741. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Программа должна заменять слова с сокращениями (don't, can't, won't, haven't, it's и т.д.) на их полные альтернативы (do not, cannot, will not и т.д.).
Также нужно обработать текстовый файл, из которого создать словарь со всеми словами в алфавитном порядке. То есть в него попадут не слова don't и пр. а слова do и not.

Проблемы у меня возникают с обработкой слов и преобразования их в несокращенные. Не могу придумать грамотного способа, чтобы осуществить задачу.
Функции, не особо относящиеся к проблеме, я не добавлял в пост.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void edit(string& line) //эта функция не проработана. она выделяет только сокращения с ..n't
{
    string word = "";
    int l = line.size();
 
    if (l >= 3 && (line[l-3] == 'n') && (line[l-2] == '\'') && (line[l-1] == 't'))
        l -= 3;
    
    for (int i = 0; i < l; i++)
        if (!(is_whitespace(line[i]) || isdigit(line[i]))) word = word + line[i];
 
    if (l != line.size()) 
        word = word + " not";
 
    line = word;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void execute(string& st)
{
    tolower(st); //привожу к нижнему регистру
    istringstream iss(st); 
    string word;
    ostringstream oss;
 
    while (iss >> word) 
    {
        edit(word); //слово отредактируется, если это потребуется (превратится в строку из двух слов)
        oss << word << " "; //заношу в строковый поток
    }
 
    st = oss.str(); //у нас новая строка. значит, я изменяю строку-аргумент
}
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
int main()
try
{
    setlocale(LC_ALL,"Russian");
    string input = "text.txt";
    string print = "new.txt";
    ifstream ifs(input.c_str());
    if (!ifs) error ("Unable to open input file ", input);
    ofstream ofs(print.c_str());
    if (!ofs) error ("Unable to open output file ", print);
 
    vector<string> vs;
    string st;
 
    while (getline(ifs,st)) //считываю строку из файла
    {
        execute(st); //обрабатываю строчку
        istringstream iss(st);
        string word;
        while (iss >> word) //считываю из обработанной строки слова и добавляю в вектор
            vs.push_back(word);
    }
 
    sort(vs.begin(), vs.end()); //сортировка
    
    for (int i = 0; i < vs.size(); i++)
        if (i == 0 || (vs[i] != vs[i-1])) ofs << vs[i] << endl; //вывожу неодинаковые слова в новый файл
 
    keep_window_open();
    return 0;
}
catch(exception& e)
{
    cerr << "Error:" << e.what() << "\n";
    keep_window_open();
    return 1;
}
catch(...)
{
    cerr << "Oops: uknown exception\n";
    keep_window_open();
    return 2;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2013, 22:39
Ответы с готовыми решениями:

Программа, заменяющая A на B по алгоритму
Здравствуйте! Необходимо создать не очень трудную программку, которая возможна принесет пользу не...

перевод руских слов на английские
Привет всем. У меня есть массив такого типа $id_categ_2= array(30 =&gt;&quot;сом&quot;,&quot;карп&quot;...); и в цикле я...

Программа на ruby, заменяющая текст в html
Программа вставляет текст перед &lt;/head&gt; и &lt;/body&gt;. Также заменяет текст заголовка &lt;title&gt;текст...

Программа, заменяющая буквы в строке на симметричные.
Дана строка s, состоящая из латинских букв и цифр. Написать программу, заменяющую все заглавные...

6
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
07.07.2013, 23:33 2
Цитата Сообщение от strange_man Посмотреть сообщение
can't, won't
Такие нужно заменить на cannot, wollnot ?
И сколько таких особенных слов? Думаю тут без словаря подобных слов не обойтись
0
13 / 13 / 2
Регистрация: 17.05.2012
Сообщений: 121
07.07.2013, 23:34  [ТС] 3
Цитата Сообщение от Olivеr Посмотреть сообщение
Такие нужно заменить на cannot, wollnot ?
И сколько таких особенных слов? Думаю тут без словаря подобных слов не обойтись
конечно, их нужно заменять по правилам английского языка.
вообще это задание из одного учебника, написанного Страуструпом. я в его заданиях часто не понимаю, что конкретно от меня требуется.
0
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
07.07.2013, 23:36 4
Цитата Сообщение от strange_man Посмотреть сообщение
конечно, их нужно заменять по правилам английского языка.
Одно дело заменить n't на " not" у слов как don't, haven't. А что делать со словами can't, won't?
0
13 / 13 / 2
Регистрация: 17.05.2012
Сообщений: 121
07.07.2013, 23:41  [ТС] 5
Цитата Сообщение от Olivеr Посмотреть сообщение
Одно дело заменить n't на " not" у слов как don't, haven't. А что делать со словами can't, won't?
зависит от того, каким алгоритмом убирать n't у обычных слов. поскольку я пока не знаком со стандартными функциями для работы со строками, приходится выкручиваться изощренными алгоритмами. просто выставить какое-то дополнительное условие. ну или, на худой конец, проверить эти слова в самом начале, если их и правда несколько штук.

для работы с 'll и 's потребуются дополнительные проверки. я пока не могу придумать такой код, который мне бы самому был приятен. может до завтра додумаюсь.
0
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
07.07.2013, 23:44 6
Разбирайтесь с этими функциями. Они вам пригодятся:
http://www.cplusplus.com/refer... ing/rfind/
http://www.cplusplus.com/refer... g/replace/

Пример использования вместе (программа заменяет любое вхождение old_phrase на new_phrase):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    const string old_phrase = "kitty";
    const string new_phrase = "dog";
    string text;
    getline(cin, text);
    size_t pos = string::npos;
    while ( (pos = text.rfind(old_phrase, --pos)) != string::npos )
        text.replace(pos, old_phrase.size(), new_phrase);
    cout << text;
    return 0;
}
0
13 / 13 / 2
Регистрация: 17.05.2012
Сообщений: 121
07.07.2013, 23:47  [ТС] 7
Цитата Сообщение от Olivеr Посмотреть сообщение
Разбирайтесь с этими функциями. Они вам пригодятся:
http://www.cplusplus.com/refer... ing/rfind/
http://www.cplusplus.com/refer... g/replace/

Пример использования вместе (программа заменяет любое вхождение old_phrase на new_phrase):
[CPP]#include <iostream>
#include <string>
C удовольствием, но я думаю, мне нельзя использовать их, поскольку книга не предполагает того, чтоб я знал их, выполняя задание.
0
07.07.2013, 23:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2013, 23:47
Помогаю со студенческими работами здесь

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

Программа заменяющая знаки ? на цифры для получения верного равенства
Помогите написать программу, а то башка совсем не варит.. Формат входных данных Входные данные...

Программа сокращения дроби
пРИ выполнении программы вылетыет с ошибкой.Где ошибка?:-| #include&lt;stdio.h&gt; void main() { int...

Программа сокращения дробей.
Помогите написать программу на сокращение дроби ПОЖАЛУЙСТА!

программа для сокращения дробей
необходимо написать программу в делфи сокращение дробей.Написал в паскале получилось, а в делфи не...

Программа на ассемблере, заменяющая все десятичные цифры в исходной строке на заданный символ
Ребят!!! Помогите пожалуйста!! Нужно написать программу, заменяющую все десятичные цифры в исходной...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru