Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Поиск повторений в таблице


Автор: Гость_Shorr Kan 7.7.2005, 12:21
Если у меня есть таблица, там много записей... И я хочу суммировать по продукции - как это сделать?

Продукция | Заказано | Изготовлено

Ворота | 5 | 1
Забор | 3 | 3
Ворота | 6 | 2



Так вот как мне выводить такое:

Ворота | 11 | 3
Забор | 3 | 3


Автор: vadims 7.7.2005, 12:35
Честно говоря я не знаток Visual C++/MFC/WTL и может там какие-то технологии более хитрые есть, но алгоритмически
1. упорядочить по индексу по полю "Продукция"
2. перебирать последовательно записи и считать

Автор: Step 7.7.2005, 22:13
на стл

это структура которая запихиваеться в мап
Код

class mystruct{
public:
int a1;
int a2;
mystruct();
mystruct(int a_1, int a_2){
a1=a_1;
a2=a_2
}
add(int a_1, int a_2){
a1+=a_1;
a2+=a_2;
};
~mystruct();
}


это объявление мап в хеадере того класа где будешь использовать
Код

map<CString, mystruct> my;
map<CString, mystruct>::iterator myiter


name - это позиция
f - первое число
s - второе число
а вот этот код произветед тебе групировку с суммирование
Код

myiter=my.find(name);
if  (myiter==my.end()){
   my[name]=mystruct(f,s);
} else {
   my[name].add(f,s);
}





извини, проверить пока не начем....


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

Автор: Earnest 11.7.2005, 20:21
Если уж на stl, то так:

Код

// допустим, это данные, к-е хранятся в записи и которые нужно суммировать
struct _data
{
    int val1;
    int val2;
    //...
    _data(int v1=0,int v2=0): val1(v1),val2(v2) {} 
    const _data& operator += (const _data& x)
    {
        val1 += x.val1;
        val2 += x.val2;
        return *this;
    }
};

// а это твои записи
struct _record 
{
    CString  name;
    _data    data;
};

// функция суммирования, предполагается, что ITER разыменовывается в const _record&
template <class ITER>
void _accumulate(ITER first,ITER last)
{
    typedef std::map<CString,_data> _results;
    _results res;
    for ( ; first != last; ++first)
        res[first->name] += first->data;

    // теперь, скажем, печатаем
    for (_results::iterator it = res.begin(); it != res.end(); ++it)
        cout << it->first << it->second.val1 << it->second.val2;
}

// использование
void foo()
{
     // записи могут храниться в любом последовательном контейнере, да хоть в обычном массиве

    const int rec_nmb = 1000;
    _record* pr = new _record [rec_nmb];

    // как-то заполняем
    ...

   _accumulate(pr, pr+rec_nmb);
}


В общем, все как говорил Step

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)