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

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

Войти
Регистрация
Восстановить пароль
 
Alik-Soldier
9 / 9 / 0
Регистрация: 01.05.2009
Сообщений: 127
#1

Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложение - C++

06.09.2009, 14:29. Просмотров 517. Ответов 4
Метки нет (Все метки)

Здравствуйте.Помогите пожалуйста в решении вот такой задачи:

Дан файл, содержащий текст на русском языке. В предложениях некоторые из слов записаны подряд.
Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложение.

У миня получился вот такой код.Считывается из файла информация правильно,но при обработке слов вылезает ошибка...

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
#include "stdafx.h"
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <iostream>
using namespace std;
int main()
{
    setlocale(NULL,"rus");
    ifstream fin;
    fin.open("text.txt");
    if(!fin.is_open())
    {
        cout<<"Текстовый файл не найден"<<endl;
        exit(1);
    }
    cout<<"Текстовый файл успешно открыт"<<endl;
    ofstream fout;
    fout.open("text1.txt",ios::out);
    char predl[200];
    char *word=NULL;
    char *word1=NULL;
    int count=0;
    int count1=0;
    int n_word=0;
    while(!fin.eof())
    {
        fin.getline(predl,200,'.');//читаем предложение
        
            for(int j=0;j<sizeof(predl);j++)//считаем количество слов
            {
                if(predl[j]==' ')
                    n_word++;
            }
            n_word++;
            cout<<n_word<<'\n';
            for(int k=0;k<n_word;k++)//выделяем слово в буфер
            {
                word=strtok(predl," ");
                for(int k1=0;k1<n_word;k1++)//перебираем все слова и сравниваем с выделенным
                {
                    word1=strtok(predl," ");
                    if(*word==*word1)//если найдено более 1 совпадения
                        count1++;
                    if(count1>1)
                        for(int log=0;log<sizeof(word1);log++)// удаляем повторяющееся слово
                            word1[log]=0;
                }
                count1=0;
            }
            n_word=0;
        
    fout<<predl<<endl;
    }
    fin.close();
    fout.close();
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2009, 14:29     Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложение
Посмотрите здесь:

Нужно отформатировать текст находящийся в файле: каждое предложение должно иметь порядковый номер и начинаться с красной строки C++
C++ Вводится последовательность слов до встречи слова "stop". Образовать предложение, в котором разместить слова, состоящие более чем из 5 букв.
C++ Записать в файл g компоненты файла f, исключив повторные вхождения чисел
Удалить из последовательности все повторные вхождения слов C++
Подсчитать частоту вхождения слов в текстовом файле C++
C++ Создать программу, которая убирает повторные вхождения букв в тексте
Исключить из файла повторные вхождения чисел C++
C++ Удалить повторные вхождения слов в предложение
C++ Исключить из списка все повторные вхождения элементов
C++ Удалить повторные вхождения каждого слова из строки
C++ Получить новый файл, в котором все вхождения первого слова заменены на второе слово
C++ Замена слов: получить новый файл, в котором все вхождения первого слова заменены на второе слово

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
1696 / 875 / 44
Регистрация: 04.06.2008
Сообщений: 5,345
06.09.2009, 15:12     Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложение #2
Что за ошибка? В какой строке?
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
06.09.2009, 15:21     Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложение #3
Код
word=strtok(predl," ");
Код
word1=strtok(predl," ");
Как насчет проверять возвращаемое значение? Может выдать NULL.
kravam
быдлокодер
1696 / 875 / 44
Регистрация: 04.06.2008
Сообщений: 5,345
06.09.2009, 17:12     Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложение #4
Не стал полностью исправлять код. Тут ещё работать да работать.
Одна из основных ошибок.
Смотри автор. Значит, во внешнем цикле ты перебираешь слова, одно за другим.
И во внутреннем тоже.
Так вот. Когда ты пойдёшь не первый проход внутреннего цикла, (то есть на самый первый, при котором k==0 и k1==0) у тебя сработает условие
C++
1
(*word==*word1)
и count1 увеличится на 1. По другому не может быть, ведь мы сравниваем слово с самим с собой.


Беда в том, что при втором проходе внутреннего цикла (k==0 и k1==1) слово, с которым сравнивают, каким было, таким и осталось. Действительно, на него указывает word1. А он был при первом проходе ( когда k==0 и k1==0) был так инициализирован
C++
1
word1=strtok(predl," ");
Так он это же значение при (k==0 и k1==1) и принимает. Ты сравнивашь слово с самим собой. 2 раза подряд.
Короче, дальше не разбирался.
valeriikozlov
Эксперт C++
4663 / 2489 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
07.09.2009, 07:08     Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложение #5
В строке 30, цикл подсчета слов:
for(int j=0;j<sizeof(predl);j++)//считаем количество слов
при такой записи не зависимо от того какой длины предложение считано из файла, цикл всегда будет повторяться 200 раз (ведь Вы сами задали размер - char predl[200]. Что бы этого избежать лучше строку 30 переписать так:
for(int j=0;predl[j]!='\0';j++)//считаем количество слов
И еще один мой совет: использованием только функций strtok() для написания того что задумано здесь не обойтись.
Yandex
Объявления
07.09.2009, 07:08     Получить в новом файле отредактированный текст, в котором удалены повторные вхождения слов в предложение
Ответ Создать тему
Опции темы

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