Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Alik-Soldier
9 / 9 / 2
Регистрация: 01.05.2009
Сообщений: 127
#1

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

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

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

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

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

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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2009, 14:29
Ответы с готовыми решениями:

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

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

Удалить из последовательности все повторные вхождения слов
При запуске программы появляется ошибка Debug Assertion Failed. Помогите...

Удалить из последовательности все повторные вхождения слов
с++ строки

Подсчитать частоту вхождения слов в текстовом файле
У меня есть код (задание ниже). Код не работает, выдает какую-то ощибку....

5
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,528
06.09.2009, 15:12 #2
Что за ошибка? В какой строке?
0
Gravity
569 / 563 / 64
Регистрация: 29.01.2009
Сообщений: 1,274
06.09.2009, 15:21 #3
Код
word=strtok(predl," ");
Код
word1=strtok(predl," ");
Как насчет проверять возвращаемое значение? Может выдать NULL.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,528
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 раза подряд.
Короче, дальше не разбирался.
1
valeriikozlov
Эксперт С++
4684 / 2510 / 751
Регистрация: 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() для написания того что задумано здесь не обойтись.
0
ITALIANO
1 / 1 / 4
Регистрация: 24.10.2014
Сообщений: 186
11.06.2018, 03:20 #6
И что же тут тогда нужно изменить?

Unhandled exception at 0x003BA1DA in контрольная.exe: 0xC0000005: Access violation reading location 0x00000000.

Выводит данную ошибку при компиляции.
0
11.06.2018, 03:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2018, 03:20

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

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

Исключить из файла повторные вхождения чисел
Заполнить файл последовательного доступа f целыми числами, полученными с...


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

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

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