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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подсчёт кол-во слов в тексте. И номера строк в которых встречаются сл. 
V
    Опции темы
MoxHaToe
Дата 20.5.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Может быть есть у кого нибудь готовый пример?

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

Это сообщение отредактировал(а) MoxHaToe - 20.5.2009, 14:55
PM MAIL   Вверх
bsa
Дата 20.5.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



MoxHaToe, что именно не получается или вызывает затруднения?
PM   Вверх
MoxHaToe
Дата 20.5.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Один из вариантов решения не получается, как перехватить ввод enter при вводе строки string. Чтобы посчитать кол-во строк?
PM MAIL   Вверх
bsa
Дата 20.5.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Э... а зачем его перехватывать? Ты при вводе можешь получать только строки (нужно изрядно повозиться, чтобы перехватывать каждый вводимый символ). Т.е. ты даешь команду fgets(buffer, buf_size, stdin); И  в buffer будет вся строка, которую ввел пользователь.
PM   Вверх
MoxHaToe
Дата 20.5.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В цикле можно сделать условие на нажатие enter? то есть действие на нажатие клавиши о переносе строки?
PM MAIL   Вверх
zim22
Дата 20.5.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(MoxHaToe @  20.5.2009,  15:34 Найти цитируемый пост)
В цикле можно сделать условие на нажатие enter?

getline из <string> по умолчанию реагирует на Enter и std::cin из <iostream>


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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



MoxHaToe, нужно сильно поизвращаться, чтобы получать символы из стандартного ввода до того, как пользователь нажал на ввод. Короче, строка в программу поступает только после нажатия на ввод.
PM   Вверх
MoxHaToe
Дата 24.5.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <windows.h> 
#include <algorithm>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{SetConsoleOutputCP(1251);
SetConsoleCP(1251);
cout<<"Вводите текст:"<<endl; 
string s;
int l=1;char* z;
cout<<l;
cout<<' ';
vector<string> vec; /*объявление переменной из контейнера вектор (типа список)*/
vector<char*> vec2;
do {
cin >> s; /*ввод текста через пробел*/
if((s!=".")&&(s!="exit")) {cout<<"";vec.push_back(s);/*добавление в конец*/
vec2.push_back(z);} else {l++;cout<<l;cout<<' ';}
z=(char*)l;
}while(s!="exit");
}

Как здесь правильно написать, чтобы в vec2 заносился номер строки?

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


depict1
****


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

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



Цитата(MoxHaToe @  24.5.2009,  19:09 Найти цитируемый пост)
Как здесь правильно написать, чтобы в vec2 заносился номер строки?

может быть так?
Код

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <windows.h> 
#include <algorithm>
using namespace std;int main(){SetConsoleOutputCP(1251);SetConsoleCP(1251);cout<<"Вводите текст:"
<<endl;string s;int l=1;char*z;cout<<l;cout<<' ';vector<string>vec;/*объявление переменной из 
контейнера вектор (типа список)*/vector<int>vec2;int line_number=0;do{line_number++;cin
>>s;/*ввод текста через пробел*/if((s!=".")&&(s!="exit")){cout<<""
;vec.push_back(s);/*добавление в конец*/vec2.push_back(line_number);}else 
{l++;cout<<l;cout<<' ';}z=(char*)l;}while(s!="exit");}

p.s. не обращайте внимание на форматирование кода - мне так удобней было.

Это сообщение отредактировал(а) zim22 - 24.5.2009, 19:29


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


Новичок



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

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



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

Добавлено через 1 минуту и 21 секунду
Думал на счёт того, чтобы создать вектор char и добавлять к нему соответствующие номера строк при поиске одинаковых слов.

Добавлено через 9 минут и 31 секунду
Код

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <windows.h> 
#include <algorithm>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{SetConsoleOutputCP(1251);
SetConsoleCP(1251);
cout<<"Вводите текст:"<<endl; 
string s;
int l=1,z;
cout<<l;
cout<<' ';
vector<string> vec; /*объявленпе переменной из контейнера вектор (типа список)*/
vector<int> vec2;
do {
cin >> s; /*ввод текста через пробел*/
if((s!=".")&&(s!="exit")) {cout<<"";vec.push_back(s);/*добавление в конец*/
vec2.push_back(z);} else {l++;}
z=l;
}while(s!="exit");
cout<<"Частота с какой встречаются слова"<<endl;
vector<int> v; /*еще одна переменная типа вектор*/
vector<char*> v2;
for(size_t i = 0;i<vec.size();++i) /*счетчик, а size-размер введенного текста */
{
int count = 0;
char* q;
vector<string>::iterator it = find(vec.begin(),vec.end(),vec[i]);
for(vector<string>::iterator iter = vec.begin(); iter != vec.end();++iter) /*циклик для сравнивания нового итератора со старым*/
{
    if(*iter == *it) /*и если они равны, то счетчик от слова плюсуется*/
    {++count;
    }
}
v.push_back(count); /*и это количество записывается в перменную v*/
v2.push_back(q);
}

map<string,int> m_map; /*ассоциативный массик. стринг - ключ, инт - значение*/

for(size_t i = 0;i<vec.size();++i) 
m_map[vec[i]] = v[i]; /*и вот мы собсно туда и записываем все предыдущее, слова и их встречаемость*/

for(map<string,int>::iterator iter = m_map.begin();iter != m_map.end();++iter) /*вывод на печать))*/
{
cout<<iter->first<<' '<<iter->second<<endl;
}
return 0;
}

На данный момент, работает только число потворений (взят пример). 
PM MAIL   Вверх
zim22
Дата 24.5.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(MoxHaToe @  24.5.2009,  19:46 Найти цитируемый пост)
Мне просто в дальнейшем как то надо запомнить, число повторений слов и номера строк, в которых они встречаются, как это сделать

сохраняйте слова в map.
ключом будет слово, значением - число его повторений в тексте.
первоначально значение = 0, в дальнейшем инкрементируется на 1.

задача состоит из подзадач. реализуя их вы реализуете задачу.
Цитата(MoxHaToe @  20.5.2009,  14:55 Найти цитируемый пост)
 программу, которая читает текст

Цитата(MoxHaToe @  20.5.2009,  14:55 Найти цитируемый пост)
 печатает его с добавлением последовательных номеров строк

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

Цитата(MoxHaToe @  20.5.2009,  14:55 Найти цитируемый пост)
построить таблицу



Это сообщение отредактировал(а) zim22 - 24.5.2009, 20:21


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


Новичок



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

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



*Реализация для вводимого текста также возможна.
PM MAIL   Вверх
zim22
Дата 25.5.2009, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата

число повторений слов и номера строк, в которых они встречаются

каждому слову будет соответствовать свой set, в котором будут номер строк указаны, в которых оно встречается. число повторений есть размер set'a
Код

std::map<std::string, std::set<int> > numbers_of_line;




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


Шустрый
*


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

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



Вот примерная идея.
Код
#include <iostream>
#include <sstream>
#include <map>
#include <list>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

struct WordCount{        // Для хранения слова и количества его вхождений в текст
    string word;
    size_t count;

    WordCount(string _word , size_t _count =0):word(_word),count(_count){};
};

struct WordGreat{        //Функтор для сортировки по количеству вхождений
    bool operator()(const WordCount& lhs, const WordCount& rhs){
        return lhs.count > rhs.count;
    }
};

int main(int argc, char *argv[]){
    
    map<string, list<int> > Words;    // Для хранения слов и номеров строк
    int line_num = 1;
    string str,word;

    while(!getline(cin,str).eof()){ // Считываем очередную строку в str
        stringstream sstr(str);        // Создаем stringstream на основе этой строки
        while(!sstr.eof()){            
            sstr >> word;            // Считываем по одному слову
            Words[word].push_back(line_num); // Добавляем слово и номер строки (с дублировнием)
        }
        cout << line_num++ << " " << str << endl;
    }

    cout << endl;

    
    vector<WordCount> v;        

    map<string, list<int> >::iterator mi;
    
    for(mi=Words.begin(); mi!= Words.end(); ++mi){    // Создаем vector на основе map
        v.push_back(WordCount(mi->first,mi->second.size()));
        mi->second.unique();                // Удаляем повторяюшиеся номера строк
    }

    sort(v.begin(),v.end(),WordGreat());   // Сортируем

    vector<WordCount>::iterator vi;
    list<int>::iterator li;

    for(vi = v.begin(); vi != v.end(); ++vi){
        cout << vi->word << " total count: " << vi->count << " lines: "; // Выводим слово и количество его вхождений
            list<int>& tmp_list = Words[vi->word];
            for(li = tmp_list.begin(); li !=tmp_list.end(); ++li){  // Выводим номера строк где оно встретилось
                cout << *li << " ";
            }
        cout << endl;
    }

    return 0;
}




Это сообщение отредактировал(а) sdukshis - 25.5.2009, 21:05
PM MAIL   Вверх
MoxHaToe
Дата 26.5.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



О спасибо, разобрался. Делал попытку через массив сделать, но понял, что всё гораздо сильно усложняется.

Это сообщение отредактировал(а) MoxHaToe - 26.5.2009, 14:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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