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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Словарь, Слова и строки 
:(
    Опции темы
aToM1
Дата 24.1.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужно создать прогу... :
Цели:Открыть файл, считать файл, вывести на экран,
сколько раз использовалось !каждое слово! из этого файла (формат doc , txt и др...).
Пример:
"Война и Мир"
Война - 24567раз.
Мир - 4523 раз.
и т д
Все, что накумекал:
Код

#include<stdio.h>
int main()
{
    FILE* fileIn;
    char  word[80];
    int   count = 0;
        fileIn = fopen("input.txt", "r");
while(fscanf(fileIn, "%s", word) != EOF);

Дальше не идет...
Че-то типа:
Код

for (std::map<std::string,int>::iterator p = count.begin(); p != count.end(); p++)
        std::cout<<p->first<<'\t'<<p->second<<'\n';
}

 Использовать STL очень желательно(map в частности...)

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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



много ж ты накумекал...

теперь кумекай чтение строки. потом поиск в этой строке слова. потом
count[_слово_]++; (не забудь про регистр)
все...



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
aToM1
Дата 24.1.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(_hunter @ 24.1.2007,  12:44)
много ж ты накумекал...

теперь кумекай чтение строки. потом поиск в этой строке слова. потом
count[_слово_]++; (не забудь про регистр)
все...

Это я и сам знаю...Теоритически...
А на практике... Не выходит че-то...
PM MAIL   Вверх
_hunter
Дата 24.1.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



Цитата(aToM1 @  24.1.2007,  15:49 Найти цитируемый пост)
А на практике... Не выходит че-то...

ну так показывай код -- будем ошибки искать.

если же тебе исходник нужен -- ты разделом ошибся -- это в работа/центр помощи...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
KpoHyc
Дата 24.1.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нафиг темы плодить?

Делается это в два прохода - сначала составляется массив всех встреченных слов в файле. потом создается такой же массив с количеством встретившихся данных
--------------------
AScript + Pascal + C -> C++ ->C#Adobe Photoshop 7.0/CS 2.0 + GIMP+ Visual Studio .NET(sp1)/2005 pro(sp1)
PM MAIL ICQ Skype GTalk Jabber   Вверх
GIK
Дата 24.1.2007, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


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

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



Я писал недавно алгиритм подсчета, помойму ты же и создавал тему?....
Пороюсь в своих архивах, но там все просто:
Создаешь массив из string объектов, пропускаешь его через цикл, при этом в цикле создается еще один массив из тех же "стрингов" (извините за выражение), но только урезая копиии, т.е. в итоге получится каждое слово в одном экземпляре. После этого создаешь массив из целых чисел, кол-во чисел = кол-ву слов по одному экземпляру. Далее ты просто инкрементируешь еллементы массива в цикле где проверяешь слова. 
Наверно мало что понятно, если код найду скину, там его и доработаешь....


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
zkv
Дата 24.1.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



вообщем то задача только как слова почистить, это уже на ваше усмотрение, надо знать что может прийти, и что в этом случае должно выйти. Вообщем дорабатывайте ClearString(). Удачи.
Код

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

bool ClearString( std::string &str );

int main()
{
    std::map<std::string,int> count;
    std::string word;

    std::ifstream fileIn( "ReadMe.txt" );
    int i = 0;
    while ( !fileIn.eof() )
    {
        fileIn>>word;
        if( ClearString( word ) )
            count[word]++;
    }
    fileIn.close();
    std::cout<<"\nResults:";
    for (std::map<std::string,int>::iterator p = count.begin(); p != count.end(); p++)
        std::cout<<"Word: "<<p->first<<"\tquantity: "<<p->second<<'\n';
}
//вся задача сводится к написанию этой функции, думаю её нужно 
//существенно доработать, пока что она просто удаляет знаки 
//препинания с конца слова 
bool ClearString( std::string &str )
{
    while( !str.empty() && ispunct( str[ str.length() - 1] ) )
    {
        str.erase( str.length() - 1 );
    }
    return !str.empty();
}

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


Добрый человек
**


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

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



Я ненашел у себя исходник, но сделал кое-что.
Подсчет слов выглядит примерно так, только нужно нужно динамически определять кол-во эллеменов в массивах.
Код

#include <string>
#include <iostream>
#include <fstream>
#include <map>
#include <vector>
#include <conio>


using namespace std;

int main()
{
  vector<string> my_str(12);
  vector<string> my_str2(12); 
  vector<string> :: iterator iter;
  iter=my_str.begin(); 
   for(int i=0; i<12; i++){
   cin>>*iter;
   iter++; 
   }

   bool bb=false;
   iter=my_str2.begin();

   for(int i=0; i<12; i++){          //уже созданные эллементы сравниваются с начальным массивом,
    for(int j=0; j<12; j++){        //чтобы создать группу из оригинальных слов
     if(my_str[i]==my_str2[j]){bb=true; break;} //если есть такое слово, то не заносим его в        
                                                                           //массив "оригинальных" слов
    }
    if(!bb){*iter=my_str[i];}
    iter++;
   }
   int uuu[]={0,0,0,0,0,0,0,0,0,0,0,0}; //каждый эллемент поочередности соответствует эллементу
                                                // из массива с оригинальных слов, его тоже надо динамически 
                                               // определять
   for(int i=0; i<my_str2.size(); i++){  //подсчитываем слова, поочередно сранивая каждый эллемент
                                                          //из оригинальных слов с массивом данных 
    for(int j=0; j<my_str.size(); j++){
     if(my_str2[i]==my_str[j]){uuu[i]++;}
    }
   }
  for(int i=0; i<12; i++){
  cout<<my_str2[i]<<"="<<uuu[i]<<endl;
  }

 getch();
 return 0;
}

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



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
GIK
Дата 25.1.2007, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


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

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



Народ, HELP.
Надо как то решить одну логическую задачу. Не знаю как корректно проинициализировать массив uuu[] (строка 42)

Код

#include <string>
#include <iostream>
#include <fstream>
#include <map>
#include <vector>
#include <conio>
#include <fstream>
 using namespace std;

bool ClearString( std::string &str );

int main()
{

 string word;
 ifstream fileIn("C:\\test\\test.txt");

  vector<string> my_str;
  vector<string> my_str2;
  vector<string> :: iterator iter;
  iter=my_str.begin();
   while ( !fileIn.eof() )
    {
        fileIn>>word;
      if(ClearString( word ) )
       {  my_str.push_back(word);
       }
        cout<<word<<endl;
    }
 fileIn.close();
  my_str2.push_back(my_str[1]); //чтобы было с чем сравнивать

   bool bb=false;
   for(int i=0; i<my_str.size(); i++){
    for(int j=0; j<my_str.size(); j++)  
     if(my_str[i]==my_str2[j]){bb=true; break;}

    if(!bb){my_str2.push_back(my_str[i]);}
    bb=false;
   }
   int uuu[]={0,0,0,0,0,0,0,0,0,0,0,0};
   for(int i=0; i<my_str2.size(); i++){  
    for(int j=0; j<my_str.size(); j++){
     if(my_str2[i]==my_str[j]){uuu[i]++;}
    }
   }
  for(int i=0; i<12; i++){
  cout<<my_str2[i]<<"="<<uuu[i]<<endl;
  }

 getch();
 return 0;
};

bool ClearString(string &str)
{
    while( !str.empty() && ispunct( str[ str.length() - 1] ) )
    {
        str.erase( str.length() - 1 );
    }
    return !str.empty();
}


Добавлено @ 11:14 
Не знаю как определить начальный размер, и при этом проинициализировать нулями.


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
zkv
Дата 25.1.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Цитата(GIK @  25.1.2007,  11:12 Найти цитируемый пост)
Не знаю как определить начальный размер, и при этом проинициализировать нулями. 

велосипед изобретаете? smile
Код

//length - длина массива, определяется где то раньше 
//например в vector есть метод size() - возвращает количество элементов
int *uuu = new int[ length ];
memset( uuu, 0, sizeof( int ) * length );


Это сообщение отредактировал(а) zkv - 25.1.2007, 11:51
PM MAIL   Вверх
Vyacheslav
Дата 25.1.2007, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Кину я свои пять копеек( т.е. 5 строчек) smile
Не скажу, что эффективно, зато лаконично
Код

#include<iostream>
#include<iterator>
#include<set>
#include <algorithm>
#include <fstream>



//---------------------------------------------------------------------------
using namespace std;
#pragma argsused
int main(int argc, char* argv[])
{
     ifstream in( "ReadMe.txt" );
     multiset<string> mset;
     copy(istream_iterator<string,char>(in),  istream_iterator<string,char>(),  inserter(mset,mset.begin()));
     for(   multiset<string>::iterator i=mset.begin(); i != mset.end(); advance(i,mset.count(*i))){
        cout << *i << " " << mset.count(*i) << endl;
     }
}




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
ip127001
Дата 25.1.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

#include<iostream>
#include<string>
#include<vector>
#include<conio>
#include<fstream>
#pragma hdrstop
using namespace std;
//------------------------------------------------------------------------------
typedef vector<string> Ttext_;
typedef vector<short> Tnumber;
typedef pair<Ttext_*,Tnumber*> Tvault;

Tvault* retrieve() //берет строки из файла
{
  Ttext_ *offer=new Ttext_;
  Tnumber *number_=new Tnumber;
  string name_f,textline;
  short n_line=0;
   cout<<"Input file name: "<<endl;
   cin>>name_f;
  ifstream infile(name_f.c_str(),ios::in);
        if (!infile)
        {
           cout<<"File not found!"<<endl<<__LINE__<<endl;
           cout<<__DATE__<<" "<<__TIME__;
        }
        while (getline(infile,textline,'\n'))
        {
           offer->push_back(textline);
           number_->push_back(n_line);
           n_line++;
        }

   return new Tvault(offer,number_);
}
//------------------------------------------------------------------------------
typedef pair<short,short> Tlocation;
typedef vector<Tlocation> Tloc;
typedef pair<Ttext_*,Tloc*> Tmain_words;
Tmain_words* separate(Tvault* w_main) // разбивает строки на слова
{
  Ttext_ *words=new Ttext_;
  Tloc *info_w=new Tloc;
  string::size_type pos=0,tmp_pos=0,lineStep=0;
        while (lineStep<w_main->first->size())
        {
                while ((pos=(*w_main->first)[lineStep].find_first_of(' ',tmp_pos))!=string::npos)
                {
                    if (tmp_pos==0)
                    {
                       words->push_back((*w_main->first)[lineStep].substr(tmp_pos,pos));
                    }else{
                       words->push_back((*w_main->first)[lineStep].substr(tmp_pos,pos-tmp_pos));
                    }
                   tmp_pos=pos+1;
                }
           words->push_back((*w_main->first)[lineStep].substr(tmp_pos,words->size()-tmp_pos-1));
           lineStep++;
           pos=0;
           tmp_pos=0;
        }
   vector<string>::iterator b_iter=words->begin();
   vector<string>::iterator end_iter=words->end();
        for (;b_iter!=end_iter;b_iter++)
        {
           cout<<*b_iter<<' '<<endl;
        }
   return new Tmain_words(words,info_w);
}
//------------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
  Tvault *main_str=retrieve();
  Tmain_words *m_words=separate(main_str);
  Ttext_::iterator b_iter=main_str->first->begin();
  Ttext_::iterator end_iter=main_str->first->end();

        for (int i=0;b_iter!=end_iter;b_iter++,i++)
        {
           cout<<(*main_str->second)[i]<<": "<<(*main_str->first)[i]<<endl;
        }

   getch();
   return 0;
}


Добавлено @ 13:27 
Цитата(aToM1 @  24.1.2007,  11:58 Найти цитируемый пост)
Че-то типа:

код C++    
1:    
2:    
3:    
for (std::map<std::string,int>::iterator p = count.begin(); p != count.end(); p++)    
        std::cout<<p->first<<'\t'<<p->second<<'\n';    
}    

 Использовать STL очень желательно(map в частности...)

используй typedef!

Это сообщение отредактировал(а) ip127001 - 25.1.2007, 13:25
--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
Vyacheslav
Дата 25.1.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(ip127001 @  25.1.2007,  13:20 Найти цитируемый пост)
вот посмотри когда-то делал...

Правильно. Так и надо. Куча new и ни одного delete. А зачем ? Windows все спишет smile



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
ip127001
Дата 25.1.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Vyacheslav @  25.1.2007,  13:57 Найти цитируемый пост)
Цитата(ip127001 @  25.1.2007,  13:20 )    
вот посмотри когда-то делал...    

Правильно. Так и надо. Куча new и ни одного delete. А зачем ? Windows все спишет 

 smile  smile --мда конфуз)
делал давно...скопировал и вставил..гг не посмотрел

--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
ip127001
Дата 25.1.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



  Tvault *main_str=retrieve();    
  Tmain_words *m_words=separate(main_str);
кстати только на низ можно delete напустить....объекты созданные внутри функции не как...они же 
в return передаются адресами...=> их удаление поведет за собой потерю инфы...
так что только 2 deleta пропустил....до остальных не достать...если ток их глобальными сделать... smile 
--------------------
aqua currit et debere currere ut currere solebat
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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