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


Автор: SergXP 17.11.2008, 12:18
Добрый день!

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

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

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 - читал эту тему, мало чего понял

Спасибо!

Автор: Lazin 17.11.2008, 12:40
используй std::sort

Код

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

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

Автор: DareDevil225 17.11.2008, 13:01
А что именно там Вам не понятно - можно поконкретнее? 
Вопрос тот же самый и ответ дан.

Код

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);

Автор: SergXP 17.11.2008, 13:49
DareDevil225,  вышла ошибка
Код

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


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

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

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

Думаю вы уже видети, что я не профи, но пытаюсь хорошо разобраться.
Спасибо.

Автор: DareDevil225 17.11.2008, 13:59
SergXP, а можно на весь код глянуть?

Автор: Cтpaнник 17.11.2008, 14:02
Код

#include <algorithm>
using namespace std;


Автор: SergXP 17.11.2008, 14:18
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;
    }
}
//------------------------------------------------------------------------//

Автор: DareDevil225 17.11.2008, 14:37
М-да, совсем все не нужно было выкладывать  smile 

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

СТранно, вроде должно работать - а в какой строке ошибку выдает и весь этот код в одном файле или в нескольких? (т.е. объявление шаблона фунции sort и indexing находятся в одном файле?)

Автор: SergXP 17.11.2008, 14:42
DareDevil225, все в одном файле.
using namespace std; - нехочет работать!  smile 

Автор: DareDevil225 17.11.2008, 14:54
SergXP, что значит не хочет? что компилятор говорит по этому поводу?

Автор: SergXP 17.11.2008, 15:04
DareDevil225,  на строку using namespace std; 
говорит
Declaration Syntax error

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

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

Автор: DareDevil225 17.11.2008, 15:10
попробуйте изменить
Код

#include <iostream.h>

на
Код

#include <iostream>


Цитата

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

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

про это ничего не понял, можно точнее мысль выразить

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

Автор: DareDevil225 17.11.2008, 15:14
Кстати, каким компилятором пользуетесь?

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

Автор: SergXP 17.11.2008, 15:19
изменил, стало 11 ошибок, не возможно подключить файл <iostream>

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

Автор: DareDevil225 17.11.2008, 15:22
SergXP, 
в общем подключай просто 
1. #include <iostream.h>
2. using namespace std; - вообще не пиши
3. и шаблонную функцию sort переименуй - например в Sort или MySort

все должно заработать

Автор: SergXP 17.11.2008, 15:27
Цитата(DareDevil225 @ 17.11.2008,  15:22)
3. и шаблонную функцию sort переименуй - например в Sort или MySort

 А это как? т.е. всмысле?

Автор: DareDevil225 17.11.2008, 15:30
Код

template <typename T, typename M>
void MySort(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;
            }
        }
    }
}


и в функции indexing вызывай
Код

MySort(bd, count, &base::key);


переименовать нужно, потому что в файле iostream.h есть своя функция sort, а поскольку пространства имен (namespace) еще не было, то происходит перекрытие методов.

Автор: Lazin 17.11.2008, 15:49
этот компилятор скоро будет отмечать 20-ти летний юбилей, как можно им пользоваться, когда есть столько альтернатив, в том числе и бесплатных?

Автор: DareDevil225 17.11.2008, 16:08
Lazin, вопрос не в том как можно им пользоваться, а как решить поставленную задачу - раз пользуются, значит либо есть только он, либо необходимо использовать только его

Автор: SergXP 17.11.2008, 16:28
DareDevil225,  таже самая ошибка. 

Автор: DareDevil225 17.11.2008, 17:33
SergXP, тогда не знаю, значит компилятор не понимает, нужно именно на нем или можно другой использовать?

Автор: SergXP 17.11.2008, 17:42
DareDevil225, ну мы используем его. А вы проверяли у себя мой код на компиляторе? Работает?

Автор: DareDevil225 17.11.2008, 18:09
У меня работает вот так
Код

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

#include <vcl.h>
#pragma hdrstop

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

#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>
//#include <graphics>
#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(int row=1;row<=5;row++)
           strcpy(data[j+1][row],data[j][row]);

           for(int 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();
}
//-----------------------------------------------------------------------//

//------------------------------------------------------------------------//
#pragma argsused
int main(int argc, char* argv[])
{
    FILE *f;

    if((f=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;
    }
    return 0;
}
//---------------------------------------------------------------------------


Автор: SergXP 17.11.2008, 18:29
DareDevil225,  в моем компиляторе таже самая ошибка! Сейчас попробую в другом

Автор: SergXP 17.11.2008, 18:50
DareDevil225,  в Билдере 6 не компилируется очень много ошибок  smile:
Что делать? Уже несколько дней бьюсь с этой проблемой. Не бросайте, пжл! 
Каким еще можно компилятором проверить?  

Автор: DareDevil225 17.11.2008, 18:57
SergXP, какие ошибки хоть выдает?

Автор: SergXP 17.11.2008, 19:05
DareDevil225, очень разные и не понятные

Код

Build
  [C++ Error] auto.cpp(70): E2015 Ambiguity between 'count' and '_STL::count<_InputIter,_Tp>(_InputIter,_InputIter,const _Tp &)'
  [C++ Error] auto.cpp(72): E2015 Ambiguity between 'count' and '_STL::count<_InputIter,_Tp>(_InputIter,_InputIter,const _Tp &)'
  [C++ Warning] auto.cpp(86): W8070 Function should return a value
  [C++ Error] auto.cpp(98): E2015 Ambiguity between 'count' and '_STL::count<_InputIter,_Tp>(_InputIter,_InputIter,const _Tp &)'
  [C++ Warning] auto.cpp(118): W8070 Function should return a value
  [C++ Warning] auto.cpp(163): W8070 Function should return a value
  [C++ Error] auto.cpp(174): E2015 Ambiguity between 'count' and '_STL::count<_InputIter,_Tp>(_InputIter,_InputIter,const _Tp &)'
  [C++ Error] auto.cpp(192): E2015 Ambiguity between 'count' and '_STL::count<_InputIter,_Tp>(_InputIter,_InputIter,const _Tp &)'
  [C++ Warning] auto.cpp(197): W8070 Function should return a value
  [C++ Error] auto.cpp(219): E2015 Ambiguity between 'count' and '_STL::count<_InputIter,_Tp>(_InputIter,_InputIter,const _Tp &)'
  [C++ Warning] auto.cpp(243): W8070 Function should return a value
  [C++ Error] auto.cpp(268): E2015 Ambiguity between 'count' and '_STL::count<_InputIter,_Tp>(_InputIter,_InputIter,const _Tp &)'
  [C++ Warning] auto.cpp(279): W8070 Function should return a value
  [C++ Error] auto.cpp(327): E2015 Ambiguity between 'count' and '_STL::count<_InputIter,_Tp>(_InputIter,_InputIter,const _Tp &)'
  [C++ Warning] auto.cpp(341): W8070 Function should return a value
  [C++ Error] auto.cpp(363): E2015 Ambiguity between 'count' and '_STL::count<_InputIter,_Tp>(_InputIter,_InputIter,const _Tp &)'
  [C++ Error] auto.cpp(375): E2015 Ambiguity between 'count' and '_STL::count<_InputIter,_Tp>(_InputIter,_InputIter,const _Tp &)'
  [C++ Warning] auto.cpp(380): W8070 Function should return a value


Прикрепил свой исходник Builder

Автор: DareDevil225 17.11.2008, 19:17
Посмотрю, только завтра, с работы уже ухожу!

Автор: SergXP 17.11.2008, 19:18
Изменил переменную с count на zap, программа запускается! 

Автор: SergXP 17.11.2008, 22:45
DareDevil225,  все программа запускается без ошибок, но сортировка не происходит! 
Массив остается прежним! 

Автор: inside_pointer 18.11.2008, 02:51
рабочий пример на сишнике

Код

 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int n;
    char c;
    char s[100];
} Base;
    
int f1(Base *, Base *);
int f2(Base *, Base *);
int f3(Base *, Base *);

main()
{
    Base bd[3] = {
        { 1, 'C', "two" },
        { 3, 'A', "three" },
        { 2, 'B', "one" }
    };
    
    int i;
    int (*cmp[3])() = { f1, f2, f3 };
    
    for (i = 0; i < 3; i++) {
        qsort((void *) bd, sizeof bd / sizeof bd[0],
            sizeof(Base), (int (*)(const void *, const void *)) cmp[i]);
        {
            int i;
            
            for (i = 0; i < 3; i++)
                printf("%3d%3c%7s\n",
                    bd[i].n, bd[i].c, bd[i].s);
            putchar('\n');
        }
    }
    return 0;
}

int f1(Base *p1, Base *p2)
{
    return (p1->n < p2->n) ? -1 : (p1->n == p2->n) ? 0 : 1;
}

int f2(Base *p1, Base *p2)
{
    return (p1->c < p2->c) ? -1 : (p1->n == p2->n) ? 0 : 1;
}

int f3(Base *p1, Base *p2)
{
    return strcmp(p1->s, p2->s);
}


вывод
Код

[guest@localhost tmp]$ ./test
  1  C    two
  2  B    one
  3  A  three

  3  A  three
  2  B    one
  1  C    two

  2  B    one
  3  A  three
  1  C    two

[guest@localhost tmp]$


когда сравниваются строки например, нельзя передавать в qsort указатели на них, иначе будет компилироваться и ничего не делаться, дебаггер тоже внутрь qsort не пускает, потому непонятно что там и как

здесь заданы три структуры, сначала сортировка их первых значений, потом вторых, потом третьих
ну и вывод (задана локальная переменная блока одноимённая, чтобы можно было вынести цикл за пределы если надо посмотреть структуры в первоначальном виде (а так лучше так не делать, т.к. одноимённые переменные вносят путанницу в код, плохой стиль и тд)

update: убрал совпадения (чтобы все разные были)

Автор: SergXP 18.11.2008, 10:22
inside_pointer, спасибо! Сейчас попробую! 

Автор: DareDevil225 18.11.2008, 10:34
только она не правильно работает)))

Добавлено через 2 минуты и 5 секунд
Кстати, функция indexing для каких целей нужна?

Автор: SergXP 18.11.2008, 12:03
DareDevil225, да, это точно. Не работает код.

Функция indexing - это типа индексация. Считываю из файла данные(LoadFromFile) и загоняю их в массив data
В начале кода я объявил переменную 
Код

base bd[n];


И в этот массив структур заношу все данные считанные из файла, которые находятся в массиве data.

Мне нужно было произвести индексацию всех записей, в литературе ничего ро это не нашел. Делал так, как сообразил.

Вся проблема в том, что массив структур не сортируется. 
Если имеем, допустим:

Код

bd[1].family = "Petrov";
bd[2].family = "Ivanov";
bd[3].family = "Sidorov";


то при использовании сортировки, она не происходит! Либо одни ошибки появляются, либо просто выводится список 
без сортирования. 

Автор: DareDevil225 18.11.2008, 13:44
вот так попробуйте:
Код

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

#include <vcl.h>//не знаю на вашем компиляторе понадобится или нет
#pragma hdrstop//не знаю на вашем компиляторе понадобится или нет

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

#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>
//#include <graphics>
#include <stdlib.h>
#include <dos.h>


const int n = 100;
int count;

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'
////////////////////////////////////////
template <class T, class M>
void Sort_puzirek(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;
            }
        }
    }
}

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

//////////////////////////////////////
//Sorting Binary method
//////////////////////////////////////
template <class T, class M>
void Sort_binary(T *a, size_t length, M (T::*member))
{
    for(int i = 2; i <= (int)length; i++)
    {
        int b = 1;
        int e = i-1;
        int c = (b + e)/2;
        while(b != c)
        {
            if( a[c-1].*member > a[i-1].*member )
            {
                e = c;
            }
            else
            {
                b = c;
            }
            c = (b + e )/2;
        }
        if( a[b-1].*member < a[i-1].*member )
        {
            if( a[i-1].*member > a[e-1].*member )
            {
                b = e + 1;
            }
            else
            {
                b = e;
            }
        }
        int k = i;
        T temp = a[i-1];
        while( k > b )
        {
            a[k-1] = a[k-1-1];
            k = k - 1;
        }
        a[b-1] = temp;
    }
}
//------------------------------------------------------------------------//

//////////////////////////////////
//  Sorting Fast
//////////////////////////////////
template <class T, class M>
void Sort_fast(T *a, size_t left, size_t right, M (T::*member)){
    if ((int)left >= (int)right) return;
    int i;
    int j;
    int m;
    for (i = (int)left, j = (int)right, m = 1; i < j; m>0?j--:i++)
    {
        if ( a[i].*member > a[j].*member ){
            T temp = a[i];
            a[i] = a[j];
            a[j] = temp;
            m = -m;
        }
    }
    Sort_fast( a, (int)left, i-1, member );
    Sort_fast( a, i+1, (int)right, member );
    return;
}
//--------------------------------------------------------------------//

/////////////////////////////////////
// Load from file Register Auto
/////////////////////////////////////
LoadFromFile()
{
    count = 0;
    clrscr();
    FILE *f;

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

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

    while(!feof(f))
    {
        fscanf(f,"%c\n%c\n%d\n%c\n%c\n",
                        &bd[count].family,
                        &bd[count].model,
                        &bd[count].num_dvig,
                        &bd[count].color,
                        &bd[count].city);
        bd[count].key = count+1;
        count++;
    }
    fclose(f);
}

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

//////////////////////////////////
// Print Base on Display
//////////////////////////////////

print_base()
{
    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(int i=0;i<count;i++)
    {
        gotoxy(1,i+3);  cprintf("%d",bd[i].key);
        gotoxy(4,i+3);  cprintf("%c",bd[i].family);
        gotoxy(19,i+3); cprintf("%c",bd[i].model);
        gotoxy(34,i+3); cprintf("%d",bd[i].num_dvig);
        gotoxy(49,i+3); cprintf("%c",bd[i].color);
        gotoxy(64,i+3); cprintf("%c",bd[i].city);
    }
       //    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!";
        return 0;
    }
    //
    //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){
                    if( cursor == 1 )
                        Sort_puzirek(bd, count, &base::family);
                    else if( cursor == 2 )
                        Sort_puzirek(bd, count, &base::model);
                    else if( cursor == 3 )
                        Sort_puzirek(bd, count, &base::num_dvig);
                    else if( cursor == 4 )
                        Sort_puzirek(bd, count, &base::color);
                    else if( cursor == 5 )
                        Sort_puzirek(bd, count, &base::city);
                }
                if(tp==2){
                 if( cursor == 1 )
                        Sort_binary(bd, count, &base::family);
                    else if( cursor == 2 )
                        Sort_binary(bd, count, &base::model);
                    else if( cursor == 3 )
                        Sort_binary(bd, count, &base::num_dvig);
                    else if( cursor == 4 )
                        Sort_binary(bd, count, &base::color);
                    else if( cursor == 5 )
                        Sort_binary(bd, count, &base::city);
                }
                if(tp==3){
                 if( cursor == 1 )
                        Sort_fast(bd, 0, count-1, &base::family);
                    else if( cursor == 2 )
                        Sort_fast(bd, 0, count-1, &base::model);
                    else if( cursor == 3 )
                        Sort_fast(bd, 0, count-1, &base::num_dvig);
                    else if( cursor == 4 )
                        Sort_fast(bd, 0, count-1, &base::color);
                    else if( cursor == 5 )
                        Sort_fast(bd, 0, count-1, &base::city);
                }
                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()
{
    clrscr();
    Sort_fast(bd, 0, count-1, &base::key);
    print_base();
    return 0;
}
//-----------------------------------------------------------------------//

//------------------------------------------------------------------------//
#pragma argsused//не знаю на вашем компиляторе понадобится или нет
int main(int argc, char* argv[])
{
    FILE *f;

    if((f=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;
    }
    return 0;
}
//---------------------------------------------------------------------------


Добавлено @ 13:46
У меня на Borland Developer Studio 2006 все работает без проблем и как надо

Автор: SergXP 18.11.2008, 14:34
DareDevil225,  компилирую на Borland C++ 6 Builder
Компилируется без ошибок.
Данные из файла считываются не правильно.

Файл base.txt содержит в себе записи и имеет вид:
Код


1
Ivanov
Lexus
777
Silver
Pobeda,7

2
Petrov
Vaz
351
Green
Tereshkova

3
Akimov
Gaz
843
White
Volgogradskay

Сейчас попробую настроить вывод из файла.

Автор: SergXP 18.11.2008, 15:01
DareDevil225,  прошу прощения, спасибо за код. Но к сожалению мне нужно сначала считывать в массив. а потом уже присвоить к структуре.

Автор: Vyacheslav 18.11.2008, 15:16
Цитата(Lazin @  17.11.2008,  15:49 Найти цитируемый пост)
этот компилятор скоро будет отмечать 20-ти летний юбилей, как можно им пользоваться, когда есть столько альтернатив, в том числе и бесплатных?

Вы наверное хотели сказать 30- летний?  smile 
Цитата

# Borland C++ 3.1 — (1992) Представление оконного IDE и заготовок приложений (application frameworks) (OWL 1.0, Turbovision 1.0)

Автор: DareDevil225 18.11.2008, 18:03
SergXP,
Цитата

к сожалению мне нужно сначала считывать в массив. а потом уже присвоить к структуре. 

не понимаю для каких целей это нужно(в задаче я этого не заметил  smile ), но тогда измените две функции LoadFromFile() и SaveInFile():
в LoadFromFile() сначала считывате в ваш массив и затем в этой же функции заполняете структуру данными из массива.
в SaveInFile() тогда сначала заполняете массив данными из структуры а потом сохраняете в файл этот массив.

Но в любом случае, в остальных функциях необходимо работать только со структурой, исходя из задания.

Автор: YanTsys 18.11.2008, 18:13
Код который привел DareDevil225, нормально откомпилировался только заменил count на count1
но есть ошибки в самой программе

Когда включаешь пузырьковую сортировку по фамилии в функцию 
sort_puzirek (int tp )
должна передаваться двойка, ( так как в data[i][1] содержится key а family содержится в data[i][2] )
а при проверке видно что туда передается единичка




Автор: DareDevil225 18.11.2008, 18:38
Цитата(YanTsys @ 18.11.2008,  18:13)
Код который привел DareDevil225, нормально откомпилировался только заменил count на count1
но есть ошибки в самой программе

Когда включаешь пузырьковую сортировку по фамилии в функцию 
sort_puzirek (int tp )
должна передаваться двойка, ( так как в data[i][1] содержится key а family содержится в data[i][2] )
а при проверке видно что туда передается единичка

в моем коде нет функции sort_puzirek (int tp ), не нужно путать! Полностью все не проверял по причине нехватки времени

А в программе приведенной до этого есть есть еще много недочетов.

Автор: YanTsys 18.11.2008, 18:56
Извините не уточнил, имел в виду код который вы привели в посте Дата 17.11.2008, 18:09
А то что код ваш я и не утверждал smile




Автор: SergXP 18.11.2008, 19:11
DareDevil225, 
YanTsys,   smile 
Пытаюсь добавить массив при чтении. Насчет каких недочетов вы утверждаете?  smile 

Автор: SergXP 18.11.2008, 21:32
Мне необходимо:
по каждому полю создать индекс, это сделано
и вывести таблицу упорядоченную по полю фамилия используя массив индекса.

Интересно получается со всеми сортировками разобрался, а с этой никак не получается.  smile 

Автор: DareDevil225 19.11.2008, 10:59
Цитата(SergXP @ 18.11.2008,  21:32)
Мне необходимо:
по каждому полю создать индекс, это сделано
и вывести таблицу упорядоченную по полю фамилия используя массив индекса.

Интересно получается со всеми сортировками разобрался, а с этой никак не получается.  smile

А можно поподробнее, что именно необходимо - не совсем понял из вашего описания

Автор: SergXP 19.11.2008, 12:24
Имеется файл base.txt
В нем записано несколько записей:
Код

1
Ivanov
Lexus
777
Silver
Pobeda,7

2
Petrov
Vaz
351
Green
Tereshkova

3
Akimov
Gaz
843
White
Volgogradskay


Считываем эти записи в массив char data[21][6][255]; Это находится в функции LoadFromFile();

Нужно проивести индексацию записей, т.е. ведь на самом деле получается 3 записи, это в данном примере.
Вот к примеру первая запись:
Код

1                     // это data[zap][1]
Ivanov            // это data[zap][2]
Lexus             // это data[zap][3]
777
Silver
Pobeda,7       // это data[zap][6]

переменная zap - это номер записи, в данном примере она равна 1

В функции indexing - мне необходимо по каждому полю создать индекс и вывести исходную таблицу упорядлченную по полю family и спользуя массив индекса.
Я это понял так и сделал:
Создал структуру base.
Объявил переменную base bd[n];
И данной функции присвоил значения из массива, полученного в функции LoadFromFile();
Допустим для первой записи получим результат:
Код

1                     // это data[zap][1] и это же bd[zap].key
Ivanov            // это data[zap][2] и это же bd[zap].family
Lexus             // это data[zap][3] и это же bd[zap].model
777
Silver
Pobeda,7       // это data[zap][6] и это же bd[zap].adres


Т.е. получился массив структур bd
и произошла индексация.

Теперь не обходимо вывести упорядоченную таблицу

Код

№   Family    Model     Num     Color         Adres
=======================================
3    Akimov    Gaz        843      White      Volgogradskay

1    Ivanov     Lexus    777      Silver       Pobeda,7

2    Petrov     Vaz        351      Green      Tereshkova

Вот так должна выйти на экран таблица с упорядоченными записями по полю Family;

Прошу помогите разобраться.

Автор: YanTsys 19.11.2008, 12:29
Цитата(SergXP @ 18.11.2008,  19:11)
YanTsys,   smile 
Насчет каких недочетов вы утверждаете?  smile

Не знаю может вы уже тот код и не рассматриваете
Но когда запускаю на исполнение код из сообщения Дата 17.11.2008, 18:09

То если в нем выбираешь сортировку 
 >> Sorting 'Puzirek'
то при выборе сортировки

       Sorting Puzirek
 Key Sorting:
    Family
 *  Model
    Motor
    Color
    Adres
    Back

По полю Model на самом деле идет сортировка по полю Family

т.е. в функцию sort_puzirek (int tp )
передается значение на 1 меньше чем нужно


Автор: SergXP 19.11.2008, 13:20
YanTsys, понятно, но это не так страшно.  smile 
Меня сейчас больше волнует вопрос сортировки массива структур. 

Автор: DareDevil225 19.11.2008, 13:34
Цитата

Считываем эти записи в массив char data[21][6][255]; Это находится в функции LoadFromFile();


Все правильно, так и считывайте, только потом еще и заполняете массив структур bd.
Можете сразу же вызвать функцию indexing,  в которой просто вызываете один из методов сортировки для массива структур.
И потом выводите на экран.

Цитата

Меня сейчас больше волнует вопрос сортировки массива структур. 

Привели же уже весь код сортировки и вы написали 
Цитата

Интересно получается со всеми сортировками разобрался
 так что же еще не понятно?

Автор: SergXP 19.11.2008, 14:15
DareDevil225,  массив структур не сортируется у меня, вообще! 
Код

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;
            }
        }
    }
}



Через эту функцию делаю, не сортируется все равно! 
Вот прикрепил проект написанный в Borland C++ 6 Builder. Посмотрите пожалустайта. :(
Запускаю сортировку sort(bd, zap-2, &base::family);

И затем вывожу на экран:

Код

for (i=1;i<=zap-2;i++)
    {
        cout<<bd[i].family<<endl;
    }


Данные не сортируются и выводятся так как написаны в файле.  smile 

Автор: DareDevil225 19.11.2008, 15:22
Естественно не будет работать - структуру-то изменили на
Код

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

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

Цитата

И затем вывожу на экран:
Код

for (i=1;i<=zap-2;i++)
    {
        cout<<bd[i].family<<endl;
    }



здесь тоже можете получить access violation при выходе за пределы инициализированной части массива, аккуратнее нужно использовать индексы массивов

Добавлено через 5 минут и 11 секунд
YanTsys, написал
Цитата

По полю Model на самом деле идет сортировка по полю Family

т.е. в функцию sort_puzirek (int tp )
передается значение на 1 меньше чем нужно

SergXP, на что вы ответили
Цитата

YanTsys, понятно, но это не так страшно.   
Меня сейчас больше волнует вопрос сортировки массива структур. 

это как раз страшно (сделали верное замечание)- у вас это наблюдается во всем коде, соответственно при малейшем телодвижении - программа падает, а это совсем не есть гуд

Автор: SergXP 19.11.2008, 17:16
DareDevil225, ага, терь начинаю понимать в чем ошибка. 
Создаю структуру:
Код

struct base
{
    int  key;
    char family;
    char model;
    int  num_dvig;
    char color;
    char city;
};
base bd[n];



Почему появляется такая ошибка, если присваивать?
Код

bd[1].family = data[2][2]; //  Cannot convert 'char *' to 'char'
printf("%s",bd[1].family);


Автор: DareDevil225 19.11.2008, 18:33
есть такой вопрос, ваш компилятор понимает тип AnsiString?

Добавлено @ 18:35
Если есть, то вот код:
Код

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

#include <vcl.h>
#pragma hdrstop

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

#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>
//#include <graphics>
#include <stdlib.h>
#include <dos.h>

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

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

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

struct index
{
    int key;
    int num;

};


index ind[n],z,ind2;
base bd[n];


//---------------------------------------------------------------------//
////////////////////////////////////////
//  Spisok
////////////////////////////////////////
/*spisok()
{
        int i;
        clrscr();
        p=(base_sp *)malloc(sizeof(DL));
        p->val = 10;
        p->k=NULL;
        dl=(base_sp *)malloc(sizeof(DL));
        dl->val=7;
        dl->k=p;
        i = 1;
        if (i<0 || i>zap) printf("\n нет элемента");
        else printf("d[%d]=%s ",i,bd[i].family);
        cout<<endl;
        cout<<"Press any key...";
        getche();
}   */
//-------------------------------------------------//
////////////////////////////////////////
//  Sorting method 'Puzirek'
////////////////////////////////////////
sort_puzirek (int tp)
{
    char trash[255];

    for (int i=1; i<=zap ; i++)
    {
       for (int j=1; j<=zap-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<=zap;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(int row=1;row<=5;row++)
           strcpy(data[j+1][row],data[j][row]);

           for(int 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;
    zap=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;
        zap++;
        row++;
    }
    int i;
    i=0;

    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<=zap;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 = data[i][2];
        bd[i].model  = data[i][3];
        bd[i].num_dvig =(int *) data[i][4];
        bd[i].color = data[i][5];
        bd[i].city = 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",zap+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,zap,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();


    cout<<"#####################################"<<endl;
    for(i=1;i<=zap-1;i++)
    {

        bd[i-1].key      = (int ) data[i][1];
        bd[i-1].family = data[i][2];
        bd[i-1].model = data[i][3];
        bd[i-1].num_dvig = (int ) data[i][4];
        bd[i-1].color = data[i][5];
        bd[i-1].city = data[i][6];
        /*cout<<bd[i].key<<'. '<<endl;
        cout<<"Family: "<<bd[i].family<<endl;
        cout<<"Model: "<<bd[i].model<<endl;
        cout<<"Num_dvig: "<<bd[i].num_dvig<<endl;
        cout<<"Color: "<<bd[i].color<<endl;
        cout<<"City: "<<bd[i].city<<endl;   */

    }
   // sort_strok();
   sort(bd, zap-1, &base::family);
    cout<<"###########################"<<endl;
    for (i=1;i<=zap-1;i++)
    {
        cout<<bd[i-1].family.c_str()<<endl;
    }

 

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

//------------------------------------------------------------------------//
#pragma argsused
int main(int argc, char* argv[])
{
    FILE *f;

    if((f=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("Spisok");
        textbackground(BLACK);

        textcolor(4);
        gotoxy(5,12);
        if (cursor == 8) 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) spisok();
            if (cursor==7) return 0;
        }

        if (key==27) return 0;;

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


код рабочий, но не все ошибки исправлял, связанные с индексами массивов

Цитата(SergXP @ 19.11.2008,  17:16)
Почему появляется такая ошибка, если присваивать?
Код

bd[1].family = data[2][2]; //  Cannot convert 'char *' to 'char'
printf("%s",bd[1].family);

Ошибка появляется потому, что data - это массив символов, а в структуре хранится только один символ

Автор: SergXP 19.11.2008, 19:20
DareDevil225,  smile вы меня спасли!!! Все сортировка теперь работает!! Огромное спасибо! 
 smile 

Сейчас буду пытаться разобраться со всеми не правильностями, которые были у меня. Просто мне это не для того, чтобы кто-то написал я тупо вставил и поблагодарил, я хочу все разобрать построчно, и понять. Искрене вам благодарен и признателен. 

Я до этого сидел долго и не мог никак сделать, если бы не ваша помощь, долго бы еще сидел. 

С C++ я еще знаком не важно, поэтому и возникали глупые вопросы.

Еще раз спасибо Огромное!  smile 

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