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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Количество повторяющихся записей в файле 
V
    Опции темы
gnokki200
Дата 23.4.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

    ...
    $array = array();
    ...
    $str = "строка из файла"
    $array[$str]++;
    ...

Но вот как грамотно и оптимально реализовать это на С, ума не приложу.  smile 
Теоретически предполагаю, что надо создать два динамических массива, один для строковых данных, другой для количества записей и при получении новой записи искать значение в массиве строковых данных, если найдено, то инкремент в массиве с количеством, если нет, то увеличивать массивы.
Хотя очень хочется верить, что такую задачу можно реализовать проще, например как в пхп.  smile 
Помогите пожалуйста кто чем сможет.
Заранее благодарен!  smile 
PM MAIL   Вверх
Rififi
Дата 23.4.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



gnokki200
в C++ было бы примерно то же самое.
для Си - сложнее, тебе потребуется динамический массив таких структур:

struct string_info
{
    unsigned int hash; // хэш-сумма строки
    unsigned int count; // счетчик повторов
    const char* str;      // сама строка
};

1. создаешь массив стуктур размера N (malloc)
2. в цикле считываешь строку во временный буфер
2.1 если номер считанной строки превышает размер массива структур, делаешь переаллокацию с N = N*2
3. вычисляешь хэш для считанной строки (функцию хэширования ищешь в сети или пишешь сам)
4. ищешь совпадения хэша в массиве структур string_info
4.1 если совпадение найдено, увеличить счетчик
4.2 если не найдено, инициализация структуры (счетчик=1, копия строки через strdup)
5. вывод результатов
6. освобождение памяти

Добавлено через 38 секунд
PS. уникальные записи не могут повторяться
PM MAIL   Вверх
gnokki200
Дата 23.4.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Rififi, благодарствую!
А подскажи пожалуйста, 
Цитата(Rififi @  23.4.2008,  12:09 Найти цитируемый пост)
в C++ было бы примерно то же самое.

если в С++ это реализовать проще, то имеет смысл выполнить ее на С++?
Прошу прощения, что не уточнил C/C++  smile 

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


Эксперт
***


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

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



gnokki200
в C++ будет проще, потому что как и в php есть обьектные аналоги для строки и ассоциативного массива

Код
// в этом заголовочном файле содержится определение класса map
#include <map>

#include <string> // для класса string
#include <iostream> // для cout, endl ...

// Определяем тип для ассоциативного массива
//   std:string - ключ (оно же поле first)
//   unsigned - значение ключа (оно же поле second)
typedef std::map<std::string, unsigned> StringMap;

// Создаем инстанс
StringMap stringMap;

// далее где-то в программе
while(пока не конец файла)
{
    std::string s = ... // читаем следующую строку
    stringMap[s]++; // увеличиваем счётчик использования
}

// выводим результаты
// Для этого используем итерацию по массиву
for(StringMap::const_iterator it=stringMap.begin(); it != stringMap.end(); ++it)
{
    // выводим сколько и чего. std::endl - перевод каретки
    std::cout << "Строка " << it->first << " встретилась " << it->second << " раз." << std::endl;
}

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


Новичок



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

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



Rififi, миллионы спасибо!!!  Все получилось! smile 
Для успокоения совести на досуге помучаю конечно еще и на С.  smile 
PS. если кто забредет сюда с подобным вопросом, вот еще похожий топик напечатать слова, которые встречаются в массиве только один раз
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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