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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка массива структур 
V
    Опции темы
SergXP
Дата 17.11.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Добрый день!

Никак не могу отсортировать массив структур, поэтому прошу помощи.

Имеется структура:
Код

struct base
{
    int  key;
    char family;
    char model;
    int  num_dvig;
    char color;
    char city;
};


Задаю переменную:
Код

const int n = 100;
base bd[n];


Есть функции, которые считывают из файла и записывают в массив структуры 
bd[i].key
bd[i].family
и тд.

Данные считыватся правильно и также правильно заносятся в этот массив структур

Пролема в том, что мне не удается отсортировать этот массив по определенному полю.
Допустим по полю family.

Уже стока методов перепробывал, результатов 0.
Прошу, напишите хотябы примерно по моему примеру, как необходимо отсортировать данные.

http://forum.vingrad.ru/topic-93423.html - читал эту тему, мало чего понял

Спасибо!
--------------------
База IMEI-номеров украденных и утерянных мобильных телефоновhttp://imeis.net.ru/
PM MAIL WWW ICQ   Вверх
Lazin
Дата 17.11.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



используй std::sort

Код

struct pred
{
    bool operator () (const base& lhs, const base& rhs)
   {
        return lhs.family < rhs.family;
   }
}

std::sort(bd, bd + n, pred());

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


Шустрый
*


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

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



А что именно там Вам не понятно - можно поконкретнее? 
Вопрос тот же самый и ответ дан.

Код

template <typename T, typename M>
void sort(T *a, size_t length, M (T::*member))
{
    for(int i = 0; i < (int)length; i++)
    {
        for( int j = 0; j <(int)length; j++)
        {
            if (a[i].*member < a[j].*member)
            {
                 T temp = a[i];
                 a[i] = a[j];
                 a[j] = temp;
            }
        }
    }
}

struct base
{
    int  key;
    char family;
    char model;
    int  num_dvig;
    char color;
    char city;
};

const int n = 100;
base bd[n];

//сортируем по key
sort(bd, n, &base::key);


Это сообщение отредактировал(а) DareDevil225 - 17.11.2008, 13:02
PM MAIL   Вверх
SergXP
Дата 17.11.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



DareDevil225,  вышла ошибка
Код

Could not find a match for 'sort (base *,int,int base::*)'


Что это? чего он не нашел 

template <typename T, typename M>
я указал
template <class T, class M>

что не правильно?

Думаю вы уже видети, что я не профи, но пытаюсь хорошо разобраться.
Спасибо.
--------------------
База IMEI-номеров украденных и утерянных мобильных телефоновhttp://imeis.net.ru/
PM MAIL WWW ICQ   Вверх
DareDevil225
Дата 17.11.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



SergXP, а можно на весь код глянуть?
PM MAIL   Вверх
Cтpaнник
Дата 17.11.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include <algorithm>
using namespace std;


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


Бывалый
*


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

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



DareDevil225,  только в этом коде целая программа)) Несколько методов сортировок))
Код

#include <stdio.h>
#include <alloc.h>
#include <iostream.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#include <PROCESS.H>
#include <bios.H>
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>


const int n = 100;
int count;
char data[21][6][255];

template <class T, class M>
void sort(T *a, size_t length, M (T::*member))
{
    for(int i = 0; i < (int)length; i++)
    {
        for( int j = 0; j <(int)length; j++)
        {
            if (a[i].*member < a[j].*member)
            {
                 T temp = a[i];
                 a[i] = a[j];
                 a[j] = temp;
            }
        }
    }
}

struct base
{
    int  key;
    char family;
    char model;
    int  num_dvig;
    char color;
    char city;
};

struct index
{
    int key;
    int num;

};


index ind[n],z,ind2;
base bd[n];
////////////////////////////////////////
//  Sorting method 'Puzirek'
////////////////////////////////////////
sort_puzirek (int tp)
{
    char trash[255];

    for (int i=1; i<=count ; i++)
    {
       for (int j=1; j<=count-i; j++)
       {
        if (strcmpi(data[j][tp],data[j+1][tp])>0)
        {
            for(int row=1;row<=5;row++)
            {
                strcpy(trash,data[j][row]);
                strcpy(data[j][row],data[j+1][row]);
                strcpy(data[j+1][row],trash);
            }
        }
       }
    }

}
//------------------------------------------------------------------------//

//////////////////////////////////////
//Sorting Binary method
//////////////////////////////////////
sort_binary(int tp)
{
    int r,i,l,j;
    int m;
    char x[6][255];

    for (i=2;i<=count;i++)
    {
        for(int row=1;row<=5;row++)
        strcpy(x[row],data[i][row]);

        l=1;
        r=i-1;

           while(l<=r)
           {
          m=(l+r)/2;
          if (strcmpi(x[tp],data[m][tp])<0) r=m-1;
          else l=m+1;
           }
           for(j=i-1;j>=l;j--) for(row=1;row<=5;row++)
           strcpy(data[j+1][row],data[j][row]);

           for(row=1;row<=5;row++)
           strcpy(data[l][row],x[row]);
    }
}


//------------------------------------------------------------------------//

//////////////////////////////////
//  Sorting Fast
//////////////////////////////////
sort_fast(int l, int r,int tp)
{

    int i, j, row;
        int d=(l+r)/2;
     char x[6][255], y[6][255];

     i=l; j=r;

     for(row=1;row<=5;row++)strcpy(x[row],data[d][row]);
     while(i<j){

       while(strcmpi(data[i][tp],x[tp])<0)
       {
        i++;
           //    cout<<"I++ "<<i;
       }
       while(strcmpi(x[tp],data[j][tp])<0)
       {
        j--;
           //    cout<<"J-- "<<j;
       }
      // cout<<"i="<<i<<" j="<<j;
      // getche();
       if(i<=j){
           for(row=1;row<=5;row++){
        strcpy(y[row],data[i][row]);
        strcpy(data[i][row],data[j][row]);
        strcpy(data[j][row],y[row]);
           }
        i++; j--;
       }
     }
       //    cout<<"ceil l="<<l<<"r="<<r;
    //    getche();
     if(l<j) sort_fast(l, j, tp);
     if(i<r) sort_fast(i, r, tp);
       }


//--------------------------------------------------------------------//

/////////////////////////////////////
// Load from file Register Auto
/////////////////////////////////////
LoadFromFile()
{
    int col,row=1;
    count=0;
    clrscr();
    FILE *f;

    f=fopen("base.txt","r");

    if (!f)
    {
        cout<<"Cannot open file!";

    }

    while(!feof(f))
    {
        for(col=1;col<=6;col++)
        fscanf(f,"%s",data[row][col]);
        ind[row].key = row;
        ind[row].num = row;
        count++;
        row++;
    }
    fclose(f);

}

//--------------------------------------------------------//

//////////////////////////////////
// Print Base on Display
//////////////////////////////////
print_base()
{
    int i=1;
    clrscr();
    textcolor(2);
    gotoxy(1,1);  cprintf("N");
    gotoxy(4,1);  cprintf("Family");
    gotoxy(19,1); cprintf("Model");
    gotoxy(34,1); cprintf("Motor");
    gotoxy(49,1); cprintf("Color");
    gotoxy(64,1); cprintf("Adres");
    gotoxy(1,2);  cprintf("--------------------------------------------------------------------------");

    textcolor(7);

    for(i=1;i<=count;i++)
    {
           //    gotoxy(1,i+2);  cprintf(data[i][1]);
        gotoxy(1,i+2);  cprintf(data[i][1]);
        gotoxy(4,i+2);  cprintf(data[i][2]);
        gotoxy(19,i+2); cprintf(data[i][3]);
        gotoxy(34,i+2); cprintf(data[i][4]);
        gotoxy(49,i+2); cprintf(data[i][5]);
        gotoxy(64,i+2); cprintf(data[i][6]);

        bd[i].key    = (int)data[i][1];
        bd[i].family = (char)data[i][2];
        bd[i].model  = (char)data[i][3];
        bd[i].num_dvig = (int)data[i][4];
        bd[i].color = (char)data[i][5];
        bd[i].city = (char)data[i][6];


    }
       //    cout<<count<<endl;
    cout<<endl<<"Press any key..."<<endl;

    getche();

}


//--------------------------------------------------------//

///////////////////////
// Save in File
///////////////////////
SaveInFile()
{
    char text[255];
    int i;
    clrscr();

    FILE *f;

    f=fopen("base.txt","a");

    if (!f)
    {
        cout<<"Cannot open file!";

    }

    fprintf(f,"\n");
    fprintf(f,"%i\n",count+1);

    cout<<"Enter Family:            "; cin>>text; fprintf(f,"%s\n",text);
    cout<<"Enter Model Auto:        "; cin>>text; fprintf(f,"%s\n",text);
    cout<<"Enter Number Motor:      "; cin>>i;    fprintf(f,"%d\n",i);
    cout<<"Enter Color Auto:        "; cin>>text; fprintf(f,"%s\n",text);
    cout<<"Enter Adress Owner Auto: "; cin>>text; fprintf(f,"%s\n",text);
    cout<<"Information success save"<<endl;
    fclose(f);
    cout<<"Press any key..."<<endl;
    getche();
}
//--------------------------------------------------------//

//////////////////////////////////
// SubMenu for Sorting
//////////////////////////////////
select(int tp)
{

    int cursor;
    char key;

    while(cursor!=255)
    {
        clrscr();
        textcolor(6);
        gotoxy(8,2);
        if(tp==1) cprintf("Sorting Puzirek");
        if(tp==2) cprintf("Sorting Binary");
        if(tp==3) cprintf("Sorting Fast");
        gotoxy(2,4); cprintf("Key Sorting:");

        textcolor(10);
        gotoxy(2,cursor+4);cprintf("*");

        textcolor(7);
        gotoxy(5,5);cprintf("Family");
        gotoxy(5,6);cprintf("Model");
        gotoxy(5,7);cprintf("Motor");
        gotoxy(5,8);cprintf("Color");
        gotoxy(5,9);cprintf("Adres");

        textcolor(4);
        gotoxy(5,10);cprintf("Back");

        gotoxy(1,1);

        key = getche();

        if(key=='H')cursor--;
        if(key=='P')cursor++;

        if(key==13)
        {
            if((cursor>=1)&&(cursor<=5))
            {
                if(tp==1)sort_puzirek(cursor);
                if(tp==2)sort_binary(cursor);
                if(tp==3)sort_fast(1,count,cursor);
                print_base();
            }

            if(cursor==6)return 0;
        }
        if(key==27)return 0;

        if(cursor<1)cursor=6;
        if(cursor>6)cursor=1;

    }


}
//-----------------------------------------------------------------------//

///////////////////////////////
// Function Indexer Laboratory 2
///////////////////////////////
int compare (const void * a, const void * b)
{
    return (*(int*)a - *(int*)b);
}


indexing()
{
    int i;
    char *w;
    i=0;

    clrscr();



    for(i=1;i<=count;i++)
    {

        bd[i].key      = (int)data[i][1];
        bd[i].family   = (char)data[i][2];
        bd[i].model    = (char)data[i][3];
        bd[i].num_dvig = (int)data[i][4];
        bd[i].color    = (char)data[i][5];
        bd[i].city     = (char)data[i][6];


    }
    sort(bd, count, &base::key);

 

getche();
}
//-----------------------------------------------------------------------//

///////////////////////////////
//  Function Main
///////////////////////////////
main()
{
    FILE *f;

    if(fopen("base.txt","r")==0)
    {
        fopen("base.txt","w");
        fclose(f);
    }

    int cursor=1;
    char key;

    while(cursor!=255)
    {
        clrscr();

        LoadFromFile();

        textcolor(10);
        gotoxy(5,3); cprintf("Navigation:");
        gotoxy(1,2); cprintf("===========================================================");
        textcolor(3);
        gotoxy(20,1); cprintf("System Manage Register Auto");

        textcolor(10);
        gotoxy(2,cursor+4);
        cprintf(">>");

        textcolor(6);
        gotoxy(5,5);
        if (cursor == 1) textbackground(WHITE);
        else textbackground(BLACK);
        cprintf("Sorting 'Puzirek'");

        gotoxy(5,6);
        if (cursor == 2) textbackground(WHITE);
        else textbackground(BLACK);
        cprintf("Sorting binary method");

        gotoxy(5,7);
        if (cursor == 3) textbackground(WHITE);
        else textbackground(BLACK);
        cprintf("Sorting Fast");

        textcolor(5);
        gotoxy(5,8);
        if (cursor == 4) textbackground(WHITE);
        else textbackground(BLACK);
        cprintf("Add Auto");

        textcolor(5);
        gotoxy(5,9);
        if (cursor == 5) textbackground(WHITE);
        else textbackground(BLACK);
        cprintf("Print full base");

        gotoxy(5,10);
        if (cursor == 6) textbackground(WHITE);
        else textbackground(BLACK);
        cprintf("Indexer");

        textcolor(4);
        gotoxy(5,11);
        if (cursor == 7) textbackground(WHITE);
        else textbackground(BLACK);
        cprintf("Exit");
        textbackground(BLACK);

        textcolor(8);
        cout<<endl<<endl<<"Press key Esc for Exit...";
        gotoxy(1,1);

        key = getche();

        if(key=='H') cursor--;
        if(key=='P') cursor++;

        if (key==13)
        {
            if((cursor>=1)&&(cursor<=3)) select(cursor);

            if (cursor==4) SaveInFile();
            if (cursor==5) print_base();
            if (cursor==6) indexing();
            if (cursor==7) return 0;
        }

        if (key==27) return 0;;

        if (cursor<1) cursor=7;
        if (cursor>7) cursor=1;
    }
}
//------------------------------------------------------------------------//

--------------------
База IMEI-номеров украденных и утерянных мобильных телефоновhttp://imeis.net.ru/
PM MAIL WWW ICQ   Вверх
DareDevil225
Дата 17.11.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



М-да, совсем все не нужно было выкладывать  smile 

Нужно было только те места, где используется данная функция, т.е. объявления функции sort и функции indexing

СТранно, вроде должно работать - а в какой строке ошибку выдает и весь этот код в одном файле или в нескольких? (т.е. объявление шаблона фунции sort и indexing находятся в одном файле?)
PM MAIL   Вверх
SergXP
Дата 17.11.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



DareDevil225, все в одном файле.
using namespace std; - нехочет работать!  smile 
--------------------
База IMEI-номеров украденных и утерянных мобильных телефоновhttp://imeis.net.ru/
PM MAIL WWW ICQ   Вверх
DareDevil225
Дата 17.11.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Бывалый
*


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

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



DareDevil225,  на строку using namespace std; 
говорит
Declaration Syntax error

Если и вторая ошибка, которая указана выше

 Could not find a match for 'sort (base *,int,int base::*)' 
--------------------
База IMEI-номеров украденных и утерянных мобильных телефоновhttp://imeis.net.ru/
PM MAIL WWW ICQ   Вверх
DareDevil225
Дата 17.11.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



попробуйте изменить
Код

#include <iostream.h>

на
Код

#include <iostream>


Цитата

Если и вторая ошибка, которая указана выше

 Could not find a match for 'sort (base *,int,int base::*)' 

про это ничего не понял, можно точнее мысль выразить
PM MAIL   Вверх
SergXP
Дата 17.11.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



DareDevil225,  может все дело в компиляторе? Borland C++ 3.1 for DOS?
Что-то не понятно. 

--------------------
База IMEI-номеров украденных и утерянных мобильных телефоновhttp://imeis.net.ru/
PM MAIL WWW ICQ   Вверх
DareDevil225
Дата 17.11.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Кстати, каким компилятором пользуетесь?

Добавлено @ 15:19
Понятие namespace было добавлено в С++ где-то в середине 90-х, если не ошибаюсь, то в Borland C++ 3.1 for DOS еще не было понятия namespase.
Программы с namespace ( using namespace std; ) должны использовать iostream, без него - iostream.h.

Это сообщение отредактировал(а) DareDevil225 - 17.11.2008, 15:20
PM MAIL   Вверх
SergXP
Дата 17.11.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



изменил, стало 11 ошибок, не возможно подключить файл <iostream>

Насчет второй ошибки сам не пойму.
указывает на строку  std::sort(bd, count, &base::key);

--------------------
База IMEI-номеров украденных и утерянных мобильных телефоновhttp://imeis.net.ru/
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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