Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Поиск в текстовом файле 
:(
    Опции темы
ksa
  Дата 25.3.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.1.2009

Репутация: нет
Всего: нет



Добрый вечер!
Помогите пожалуйста написать программу.

В текстовом файле найти те предложения, которые заканчиваются одинаковыми словами.
Ну и соответственно вывести их на экран.

Заранее Благодарен!
PM MAIL   Вверх
mrbrooks
Дата 26.3.2009, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 16
Всего: 306



ksa, что то в этом духе

Код

#include <iostream>
#include <fstream>
#include <string>

int main()
{    
    std::ifstream file("text.txt");
    std::string str = "", str1 = "";
    int count = 0;
    if (file.is_open())
    {
        while (!file.eof())
        {
                    file >> str;
                    if ((str[str.length()-1] == '.')&&(str1 == str.erase(str.length()-1)))
                    {
                        std::cout << "Repetititve word = "<< str << std::endl;
                        count++;
                    }
                    str1 = str;
        }
        std::cout << "All = "<< count << std::endl;        
        file.close();
    }
    else
    {
        std::cout << "file not open\n";
    }
    std::cin.get();
    return 0;
}

PM MAIL   Вверх
Anikmar
Дата 26.3.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(mrbrooks @  26.3.2009,  10:53 Найти цитируемый пост)
if ((str[str.length()-1] == '.')&&(str1 == str.erase(str.length()-1)))

mrbrooks, вы подразумеваете, что конец предложения (то биш точка) находится обязательно в конце строки?

Я подумал, что нужно распарсить текст и вывести что-то такое:
Предложение в строке 5, 7, 15, 25 заканчивается на слово1
Предложение в строке 8, 12 заканчивается на слово2


PM MAIL ICQ   Вверх
mrbrooks
Дата 26.3.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 16
Всего: 306



Цитата(Anikmar @  26.3.2009,  11:02 Найти цитируемый пост)
mrbrooks, вы подразумеваете, что конец предложения (то биш точка) находится обязательно в конце строки?

вообще то да. по крайней мере меня так учили в школе.   smile  

другое дело что предложение не обязательно должно заканчиваться точкой. К примеру может быть и многоточие, и восклицательный знак, и вопрос. Но как выйти из этой ситуации автор пусть додумает сам - ситуация аналогичная точке.

Цитата(Anikmar @  26.3.2009,  11:02 Найти цитируемый пост)
Я подумал, что нужно распарсить текст и вывести что-то такое:
Предложение в строке 5, 7, 15, 25 заканчивается на слово1
Предложение в строке 8, 12 заканчивается на слово2


Решений на самом деле думаю можно наделать воз и маленькую тележку. Не скажу что мой вариант оптимальный, писался то он за несколько минут.  smile 
PM MAIL   Вверх
zim22
Дата 26.3.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(mrbrooks @  26.3.2009,  11:45 Найти цитируемый пост)
Решений на самом деле думаю можно наделать воз и маленькую тележку

Дело не в решении,а в понимании условия задачи. 
Я тоже согласен с Anikmar, что необходимо было сравнивать предложения на наличие повторяющегося слова в конце, а не наличие повторяющихся слов в одном и том же предложении. Ваш вариант тоже подходит из-за того, что автор не чётко сформулировал требования.


--------------------
PM MAIL   Вверх
mrbrooks
Дата 26.3.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 16
Всего: 306



Цитата(zim22 @  26.3.2009,  12:55 Найти цитируемый пост)
что необходимо было сравнивать предложения на наличие повторяющегося слова в конце


а я что по твоему делаю?

Цитата(zim22 @  26.3.2009,  12:55 Найти цитируемый пост)
а не наличие повторяющихся слов в одном и том же предложении. 


это ты про меня говоришь? покажи где я так поступаю? 
сравнивается последнее слово в предложении, заканчивающееся точкой, с предыдущим. 


PM MAIL   Вверх
zim22
Дата 26.3.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(mrbrooks @  26.3.2009,  13:24 Найти цитируемый пост)
сравнивается последнее слово в предложении, заканчивающееся точкой, с предыдущим. 

Всё правильно. smile 
Но я условие задачи понимаю по другому. И реализовал соответственно тоже.

Код
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <sstream>

struct Build_index {    
    Build_index(std::multimap<std::string, size_t> &m) : map_s(&m) { }
    void operator()(std::string &s)
    {
        ++line_number;
        std::string res(s);
        res.erase(res.size() - 1);
        std::string::size_type pos = res.find_last_of(" ");
        res = res.substr(pos + 1);

        map_s->insert(std::make_pair(res, line_number));            
    }
private:
    std::multimap<std::string, size_t> *map_s;
    static size_t line_number;
};
size_t Build_index::line_number;
int main()
{    
    std::ifstream in("text.txt");
    std::vector<std::string> vs;

    std::string text_line;
    while (getline(in, text_line))
        vs.push_back(text_line);
    
    std::multimap<std::string, size_t> ms;    
    std::for_each(vs.begin(), vs.end(), Build_index(ms));

    for (std::multimap<std::string, size_t>::const_iterator cit = ms.begin(); cit != ms.end(); cit = ms.upper_bound(cit->first))
    {
        size_t occurs_time = ms.count(cit->first);
        if (occurs_time > 1)
        {
            std::cout << "Word \"" << cit->first << "\" occurs " << ms.count(cit->first) << " times in lines:" << std::endl;
            for (size_t i = 0; i != occurs_time; ++i)
            {
                std::cout << " ( " << cit->second << " ) " << vs[cit->second - 1] << std::endl;
                ++cit;
            }
            --cit;
            std::cout << std::endl;
        }
                
    }

    return 0;
}



Это сообщение отредактировал(а) zim22 - 26.3.2009, 13:51

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  text.txt 0,13 Kb


--------------------
PM MAIL   Вверх
mrbrooks
Дата 26.3.2009, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 16
Всего: 306



Цитата(zim22 @  26.3.2009,  13:50 Найти цитируемый пост)
И реализовал соответственно тоже.

я обратил на это внимание  smile 
Ничего пусть ksa разбирается  smile 
PM MAIL   Вверх
zim22
Дата 26.3.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



mrbrooks, код у меня страшный. он только запутается smile


--------------------
PM MAIL   Вверх
mrbrooks
Дата 26.3.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 16
Всего: 306



Цитата(zim22 @  26.3.2009,  14:02 Найти цитируемый пост)
mrbrooks, код у меня страшный. он только запутается smile 

возможно smile 
я то специально не перегружал свой код - дабы было понятно новичку - однако не факт - что это верный способ.
PM MAIL   Вверх
Anikmar
Дата 26.3.2009, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(mrbrooks @  26.3.2009,  11:45 Найти цитируемый пост)
вообще то да. по крайней мере меня так учили в школе.     

Да ну, а сами пишете так:
Цитата(mrbrooks @  26.3.2009,  11:45 Найти цитируемый пост)
другое дело что предложение не обязательно должно заканчиваться точкой. К примеру может быть и многоточие, и восклицательный знак, и вопрос. Но как выйти из этой ситуации автор пусть додумает сам - ситуация аналогичная точке.


Неужели у вас все точки в конце строки?   smile 

Я не сказал в конце предложения, а сказал в конце строки. В смысле строки, которую вы считываетет из файла. И ищете точку в конце этой строки. Т.е. предложение не может заканчиваться посередине строки?

Цитата(mrbrooks @  26.3.2009,  10:53 Найти цитируемый пост)
file >> str;
                    if ((str[str.length()-1] == '.')&&(str1 == str.erase(str.length()-1)))


Я именно об этом.

Это сообщение отредактировал(а) Anikmar - 26.3.2009, 20:54
PM MAIL ICQ   Вверх
mrbrooks
Дата 26.3.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 16
Всего: 306



Цитата(Anikmar @  26.3.2009,  20:54 Найти цитируемый пост)
Неужели у вас все точки в конце строки?   smile

упаси вас батенька.
Цитата(Anikmar @  26.3.2009,  11:02 Найти цитируемый пост)
mrbrooks, вы подразумеваете, что конец предложения (то биш точка) находится обязательно в конце строки?

Цитата(Anikmar @  26.3.2009,  20:54 Найти цитируемый пост)
Я не сказал в конце предложения, а сказал в конце строки. В смысле строки, которую вы считываетет из файла. И ищете точку в конце этой строки. Т.е. предложение не может заканчиваться посередине строки?

Теперь понял об чем речь - нет. Строка и предложения у меня не одно и то же. Точка может быть и в середине строки.
Anikmar, я честно говоря не понимаю в чем критика - откомпилите и посмотрите результат. Я не претендую на оптимальность. Это просто заготовка. Рабочая заготовка. 

А где же ваше предложение сеньер?  smile  smile 

зы. И хватит на Вы. Все таки почти чуть вместе проект не забомбили (но не срослось), да и тески мы   smile .
PM MAIL   Вверх
Anikmar
Дата 26.3.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(mrbrooks @  26.3.2009,  21:34 Найти цитируемый пост)
И хватит на Вы. Все таки почти чуть вместе проект не забомбили (но не срослось), да и тески мы    . 


Уболтал, черт языкастый!  smile 

Цитата(mrbrooks @  26.3.2009,  21:34 Найти цитируемый пост)
Anikmar, я честно говоря не понимаю в чем критика - откомпилите и посмотрите результат. Я не претендую на оптимальность. Это просто заготовка. Рабочая заготовка. 


Я не критикую. Своего варианта не представил - посколько не считаю задачу такой уж пятиминутной.

Я загнал пример файла, получил ответ 0. Думаю дело в русских словах, ща посмотрю внимательнее.

Файл выглядит так:
Код

Предложение заканчивается на Слово1. А это предложение заканчивается на Слово2.
Предложение заканчивается на Слово1. А это предложение заканчивается на Слово2. Предложение заканчивается на Слово1. А это предложение заканчивается на Слово2. Предложение заканчивается на Слово1. А это предложение заканчивается на Слово2.
Предложение заканчивается на Слово1. А это предложение заканчивается на Слово2.
Предложение заканчивается на Слово1. А это предложение заканчивается на Слово2.


Гы.
И вообще где ТС? Пусть разъяснит задачу  smile 

PM MAIL ICQ   Вверх
Anikmar
Дата 26.3.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



От предъявы по поводу точки в центре - отказываюсь, был неправ. Я стандартным выводом так редко пользуюсь, что забыл, что он же не строку читает, а слово до пробела.

Не работает код - там в любом случае присваивается текущее слово вне зависимости перед точкой оно или нет. И начинается всякая ерунда. (под отладчиком смотрел).

В общем все равно - условие задачи гораздо сложнее.
Попробую еще код zim22. Я тоже сразу о map подумал, но мне лень было смотреть как им пользоваться (не помню синтаксис) да и вообще я сначала думал о том, что делать с предложением на несколько строк. По идее надо сначала предложения в некий массив запихать, а потом уже слова последние сравнивать.

Ведь по условиям задачи надо вывести именно предложения с повторяющимися словами а не кол-во слов и не сами слова.

Добавлено через 9 минут и 9 секунд
Блин, хреновый из меня тестер.  smile 

Загнал вариант zim22.
Сначала изначальный файл прогнал - выдал крякозябры. Набрал латиницей и получил цинничный вылет.

Файл для теста прилагаю.



Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  text.txt 0,20 Kb
PM MAIL ICQ   Вверх
Anikmar
Дата 26.3.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(mrbrooks @  26.3.2009,  21:34 Найти цитируемый пост)
А где же ваше предложение сеньер?     

Вот и мое.

Представляю огромную гору критики, но это все фигня.

Во-первых. Использовал goto.  smile  smile. Потому, что мне так нравится  smile 
Во-вторых не использовал vector. Честно говоря засомневался как будет моя структура вести себя при побитовом копировании - поэтому сделал статическим массивом.
В-третьих не использовал алгоритмы STL. По двум причинам - во-первых побыстрее хотел наляпать, во-вторых утяжелит понимание - так как потребует дополнительной функции сравнения.
В-четвертых не использовал map, по соображениям третьего пункта

Ну и резюме - оно вроде как работает.
Код

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <sstream>


typedef struct
{
    std::string Source;
    std::string Word;
    bool Flag;
} TPhrase;

void SearchWordAnikmar(void)
{
    std::ifstream file("text.txt");
    TPhrase Phrases[200];
    std::string str,str1;
    int Count=0,CountF;

    if (!file.is_open())
    {
        std::cout << "file not open\n";
        goto ExitProc;
    }

    str1 = "";
    while (!file.eof())
    {
        file >> str;
        if (str[str.length()-1] != '.')
        {
            str1 += str + " ";
            continue;
        }

        Phrases[Count].Source = str1 + str;
        Phrases[Count].Word = str.erase(str.length()-1);
        Phrases[Count].Flag = false;
        str1 = "";
        Count++;
        if (Count >= 200)
        {
            std::cout << "Max phrases is 200\n";
            break;
        }
    }

    for(int i=0; i<Count;i++)
    {
        if (Phrases[i].Flag) continue;
        CountF = 0;
        for (int j=i+1;j<Count;j++)
        {
            if (Phrases[j].Flag) continue;
            if (Phrases[i].Word == Phrases[j].Word)
            {
                if (CountF == 0)
                {
                    std::cout << "Word: " << Phrases[i].Word << "\n";
                    std::cout << Phrases[i].Source << "\n";
                }
                std::cout << Phrases[j].Source << "\n";
                Phrases[j].Flag = true;
                CountF++;
            }
        }
        if (CountF > 0) std::cout << "Total " << (CountF + 1) <<"\n";
        Phrases[i].Flag = true;
    }

ExitProc:
    std::cout << "End of Work\n";
    return;
}



Файл для теста оставил  как выше - единственное добавил предложение на несколько строк.
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0739 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.