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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> подсчитать количество биграмм 
V
    Опции темы
Beg1nner
  Дата 7.10.2009, 18:20 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброе время суток прошу прощения за возможно глупый вопрос. Но все же… =)

Что нужно: в имеющемся тексте подсчитать количество биграмм, то есть если текст «123123» то должно получиться 12 –  2; 23-2; 31-1. Сиё хочу сделать через словарь.
Код


 std::map <char*, long, compare > DictSubStr;
 std::map <char*, long, compare >::iterator i;              // определяем итератор

 char szSubString[3]="\0\0\0";          // сюда сохраняем подстроки


 inFile->Read(szSubString+1,sizeof(char)); 

 while (inFile->Position!=inFile->Size)
 {
    szSubString[0]=szSubString[1];      // 2й символ становится  1м
    inFile->Read(szSubString+1,sizeof(char)); // читаем 2й символ

    i=DictSubStr.find(szSubString);      // ищем строку
    if (i == DictSubStr.end())
    {
        DictSubStr[szSubString]=1;       // добавляем запись  ВЫПОЛНЯЕТСЯ ТОЛЬКО 1 РАЗ =(
    }else
    {
        (*i).second++;                  // счетчик++
        //ShowMessage ((*i).second);
    }
 }
 ShowMessage(DictSubStr.size());




6 чувство подсказывает,что     здесь    DictSubStr[szSubString]=1; ключом пишу адрес а не строку по этому адресу.  Т.к Эта строка выполняется только 1 раз. Так вот, как записать все же строку (в стиле Си), если не использовать String.

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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Упакуй твои 2 символа ключа в int, и сохраняй его.
Код

 std::map <unsigned, int > DictSubStr;

 unsigned short key = 0;

 inFile->Read((char*)&key,sizeof(char)); 
 while (inFile->Position!=inFile->Size)
 {
    key<<=8;
    inFile->Read((char*)&key,sizeof(char)); // читаем 2й символ
    DictSubStr[key]++;
 }
 ShowMessage(DictSubStr.size());

И вот это
Код


    i=DictSubStr.find(szSubString);      // ищем строку
    if (i == DictSubStr.end())
    {
        DictSubStr[szSubString]=1;       // добавляем запись  ВЫПОЛНЯЕТСЯ ТОЛЬКО 1 РАЗ =(
    }else
    {
        (*i).second++;                  // счетчик++
        //ShowMessage ((*i).second);
    }

тоже лишнее - DictSubStr[key]++ вполне достаточно. При первой нидексации map автоматически добавит элемент с нулевым значением

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


Новичок



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

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



2xvr
спасиб 

так Я был прав по поводу адреса ?

просто смутил пример Л.Аммерааля

и не очень понятно чем он отличается от моего случая.....

Это сообщение отредактировал(а) Beg1nner - 8.10.2009, 17:01

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  __________.png 6,92 Kb
PM MAIL   Вверх
xvr
Дата 8.10.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Beg1nner @ 8.10.2009,  14:52)
так Я был прав по поводу адреса ?

Прав
Цитата

и не очень понятно чем он отличается от моего случая.....
А это зависит от типа переменной D. Если это что то типа map<string,...> то все правильно

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


Новичок



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

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



Цитата(xvr @  8.10.2009,  16:30 Найти цитируемый пост)
Если это что то типа map<string,...>

объявление сделано    std::map<char*, long, compare> D; 
просто не понятно почему приведённый в книге код работает, а написанный мной нет(не надо по руки =) )



Код

class compare {
    public:
    bool operator() (const char* s, const char* t) const
    { return strcmp(s,t)<0;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    for(;;){
    std::map<char*, long, compare> D;
    D["Johnson"]=12345;
    D["Smith"]=6789;
    D["Shaw"]=111111;
    D["Terry"]=423423423;
    char GivenName[30];
    std::cout<< "Enter a Name: ";
    std::cin >> GivenName;
    if (GivenName[0]=='0') return 0;
    if (D.find(GivenName) != D.end()) {
        std::cout << "The number is" << D[GivenName];
    }else{
        std::cout << "Not found";
    }
    std::cout << std::endl;
    }
    return 0;
}



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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Потому что у него в map подан функтор compare для сравнения char* строк. Без функтора будет использовано обычное сравнение (с помощью '<'), а оно для char* позволит упорядочить именно указатели, а не те строки, на которые они указывают

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


Новичок



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

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



спасибо, хотя думаю реализовывать на предложенном варианте с int, но все равно попробовал с char*, все работает.  smile 
 
2xvr спасибо за разъяснения.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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