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


Автор: Metalex 5.3.2010, 00:16
Мне нужно отсортировать динамический массив обьектов класса Film. 
Код
#include <iostream>
using namespace std;

class Film
{
    char name[15];
    int year;
    char rezhiser[15];
    int n, m;
    char **a;
    int i, j;
public:
    Film ();
    ~Film () 
    {
        for (i=0; i<n; i++)
            delete a[i];
        delete [] a; 
        a=0;
    }
    void Show();
    friend void Sort (Film *A);
};

Film::Film()
{
        cout<<"Vvedite imya filma:"<<endl;
        cin>>name;
        cout<<"Vvedite god vupyska:"<<endl;
        cin>>year;
        cout<<"Vvedite rezhisera:"<<endl;
        cin>>rezhiser;
        cout<<"Vvedite kolichestvo akterov:"<<endl;
        cin>>n;
        cout<<"Vvedite max dliny imeni:"<<endl;
        cin>>m;
        cout<<"Vvedite akterov:"<<endl;
        a=new char*[n];
        for (i=0; i<n; i++)
            a[i]=new char [m];
        for (i=0; i<n; i++)
            for (j=0; j<m; j++)
                cin>>a[i][j];
}

void Film::Show()
{
    cout<<name<<" "<<year<<" "<<rezhiser<<" "<<n<<" akterov:"<<endl;
    for (i=0; i<n; i++)
    {
        for (j=0; j<m; j++)
        {
            cout<<a[i][j];
        }
        cout<<endl;
    }
    cout<<endl;
}

void Sort(Film *A)
{
    for(i=0;i<n;i++)
    {
        for(j=(n-1);j>i;j--)
        {
            if(strcmp(((Film)(A[j-1])).name, ((Film)(A[j])).name)==1)
            {
                Film x=A[j-1];
                A[j-1]=A[j];
                A[j]=x;
            }
        }
    }
}

int main()
{
    int n, i;
    cout<<"Vvedite kol-vo filmov:"<<endl;
    cin>>n;
    Film *A=new Film[n];
    cout<<endl<<"Films:"<<endl;
    for (i=0; i<n; i++)
        A[i].Show();
    Sort (A);
system ("Pause");
return 0;
}

Посмотрите, пожалуйста, мой код.. Я уверен, что он почти правильный..
Основные ошибки, которые я не могу исправить:
Код

void Sort(Film *A)

почему-то не видит i, j
и
Код

((Film)(A[j-1])).name,

не катит такое обращение... A[j-1].name тоже не катит...
Пересмотрите, пожалуйста, мой код на наличие грубых ошибок.. И помогите разобратся с этими 
Огромное спасибо.

Автор: ИванМ 5.3.2010, 00:32
Цитата(Metalex @  5.3.2010,  00:16 Найти цитируемый пост)
почему-то не видит i, j

не видит потому что i, j это члены класса Film. Надо обращаться к конкретному объекту класса или делать i, j статическими или глобальными. 
И вообще для сортировки существуют стандартные алгоритмы (std::sort). Достаточно определить оператор < или написать функцию сравнения 2х элементов.

Добавлено @ 00:47
Типа такого:
Код

#include <iostream>
#include <algorithm>

using namespace std;

class Film
{
    char name[15];
    int year;
    char rezhiser[15];
    int n, m;
    char **a;
    int i, j;
public:
    Film ();
    ~Film () 
    {
        for (i=0; i<n; i++)
            delete a[i];
        delete [] a; 
        a=0;
    }
    void Show();
    friend bool operator<(const Film& f1, const Film& f2);
};
Film::Film()
{
        cout<<"Vvedite imya filma:"<<endl;
        cin>>name;
        cout<<"Vvedite god vupyska:"<<endl;
        cin>>year;
        cout<<"Vvedite rezhisera:"<<endl;
        cin>>rezhiser;
        cout<<"Vvedite kolichestvo akterov:"<<endl;
        cin>>n;
        cout<<"Vvedite max dliny imeni:"<<endl;
        cin>>m;
        cout<<"Vvedite akterov:"<<endl;
        a=new char*[n];
        for (i=0; i<n; i++)
            a[i]=new char [m];
        for (i=0; i<n; i++)
            for (j=0; j<m; j++)
                cin>>a[i][j];
}
void Film::Show()
{
    cout<<name<<" "<<year<<" "<<rezhiser<<" "<<n<<" akterov:"<<endl;
    for (i=0; i<n; i++)
    {
        for (j=0; j<m; j++)
        {
            cout<<a[i][j];
        }
        cout<<endl;
    }
    cout<<endl;
}

bool operator<(const Film& f1, const Film& f2)
{
    return strcmp(f1.name, f2.name)<0;
}

int main()
{
    int n, i;
    cout<<"Vvedite kol-vo filmov:"<<endl;
    cin>>n;
    Film *A=new Film[n];
    cout<<endl<<"Films:"<<endl;
    for (i=0; i<n; i++)
        A[i].Show();
    sort(A, A+n+1);
    system ("Pause");
    return 0;
}

И конечно в идеале i и j надо сделать локальными переменными. Плохо когда в классе всякий мусор.

Автор: Metalex 5.3.2010, 09:11
Про стандартные алгритмы не знал.. Благодарю! Обьясните еще, пожалуйста, вот эту строку:
Цитата(ИванМ @  5.3.2010,  00:32 Найти цитируемый пост)
sort(A, A+n+1);


Автор: t_gran 5.3.2010, 10:13
Metalex, мог бы человеку и плюс поставить!  smile 

Автор: Metalex 5.3.2010, 13:48
t_gran, поставлю, как решу вопрос обязательно

Автор: ИванМ 6.3.2010, 15:41
Metalex, 
Цитата(Metalex @  5.3.2010,  09:11 Найти цитируемый пост)
sort(A, A+n+1);

Означает, что сортировать надо грубо говоря от A до A+n. Второй параметр должен быть больше верхней границы на единицу. 

Автор: Metalex 8.3.2010, 23:40
ИванМ, сделал по вашим наставлениям..
Получил такой код:
Код

#include <iostream>
#include <algorithm>
using namespace std;

int i, j;

class Film
{
    char name[15];
    int year;
    char rezhiser[15];
    int n, m;
    char **a;
public:
    Film ();
    ~Film () 
    {
        for (i=0; i<n; i++)
            delete a[i];
        delete [] a; 
        a=0;
    }
    void Show();
    friend bool operator<(const Film& f1, const Film& f2);
};

Film::Film()
{
        cout<<"Vvedite imya filma:"<<endl;
        cin>>name;
        cout<<"Vvedite god vupyska:"<<endl;
        cin>>year;
        cout<<"Vvedite rezhisera:"<<endl;
        cin>>rezhiser;
        cout<<"Vvedite kolichestvo akterov:"<<endl;
        cin>>n;
        cout<<"Vvedite max dliny imeni:"<<endl;
        cin>>m;
        cout<<"Vvedite akterov:"<<endl;
        a=new char*[n];
        for (i=0; i<n; i++)
            a[i]=new char [m];
        for (i=0; i<n; i++)
            for (j=0; j<m; j++)
                cin>>a[i][j];
}

void Film::Show()
{
    cout<<name<<" "<<year<<" "<<rezhiser<<" "<<n<<" akterov:"<<endl;
    for (i=0; i<n; i++)
    {
        for (j=0; j<m; j++)
        {
            cout<<a[i][j];
        }
        cout<<endl;
    }
    cout<<endl;
}

bool operator<(const Film& f1, const Film& f2)
{
    return strcmp(f1.name, f2.name)<0;
}


int main()
{
    int n, i;
    cout<<"Vvedite kol-vo filmov:"<<endl;
    cin>>n;
    Film *A=new Film[n];
    cout<<endl<<"Films:"<<endl;
    for (i=0; i<n; i++)
        A[i].Show();
    sort(A, A+n+1);
    for (i=0; i<n; i++)
        A[i].Show();
system ("Pause");
return 0;
}

Компиляция и построение прошло успешно..
Выполнение доходит до сортировки и выбивает ошибки:
http://uaimages.com/viewer.php?id=95459608.03.jpg
В чем может быть дело?

Автор: ИванМ 9.3.2010, 01:02
в общем не правильно я написал. Надо не sort(A, A+n+1), а sort(A, A+n);
и еще добавить оператор= в класс
Код

Film& operator=(const Film& f)
    {
        strcpy(name, f.name);
        strcpy(rezhiser, f.rezhiser);
        year=f.year;
        n=f.n;
        m=f.m;
        a=new char*[n];
        for(int i=0;i<n;i++)
        {
            a[i]=new char[m];
            strcpy(a[i], f.a[i]);
        }
        return *this;
    }

Если все вместе, то так (я еще конструктор чуть переделал, то бы вводилось char*, а не char, можешь оставить как было если так нравится)
Код

#include <iostream>
#include <algorithm>
using namespace std;
int i, j;
class Film
{
    char name[15];
    int year;
    char rezhiser[15];
    int n, m;
    char **a;
public:
    Film ();
    ~Film () 
    {
        for (i=0; i<n; i++)
            delete[] a[i];
        delete [] a; 
        a=0;
    }
    void Show();
    Film& operator=(const Film& f)
    {
        strcpy(name, f.name);
        strcpy(rezhiser, f.rezhiser);
        year=f.year;
        n=f.n;
        m=f.m;
        a=new char*[n];
        for(int i=0;i<n;i++)
        {
            a[i]=new char[m];
            strcpy(a[i], f.a[i]);
        }
        return *this;
    }
    friend bool operator<(const Film& f1, const Film& f2);
};
Film::Film()
{
        cout<<"Vvedite imya filma:"<<endl;
        cin>>name;
        cout<<"Vvedite god vupyska:"<<endl;
        cin>>year;
        cout<<"Vvedite rezhisera:"<<endl;
        cin>>rezhiser;
        cout<<"Vvedite kolichestvo akterov:"<<endl;
        cin>>n;
        cout<<"Vvedite max dliny imeni:"<<endl;
        cin>>m;
        cout<<"Vvedite akterov:"<<endl;
        a=new char*[n];
        for (i=0; i<n; i++)
            a[i]=new char [m];
        for (i=0; i<n; i++)
            cin>>a[i];
}
void Film::Show()
{
    cout<<name<<" "<<year<<" "<<rezhiser<<" "<<n<<" akterov:"<<endl;
    for (i=0; i<n; i++)
    {
        cout<<a[i];        
        cout<<endl;
    }
    cout<<endl;
}
bool operator<(const Film& f1, const Film& f2)
{
    return strcmp(f1.name, f2.name)<0;
}
int main()
{
    int n, i;
    cout<<"Vvedite kol-vo filmov:"<<endl;
    cin>>n;
    Film *A=new Film[n];
    cout<<endl<<"Films:"<<endl;
    for (i=0; i<n; i++)
        A[i].Show();
    sort(A, A+n);
    for (i=0; i<n; i++)
        A[i].Show();
system ("Pause");
return 0;
}

А вообще в идеале лучше создавать объекты Film динамически и потом помещать его в list (а не в массив) и потом сортировать.
Так и легче и не нужно копировать лишний раз объекты и код получится короче.

Добавлено через 7 минут и 52 секунды
Еще как вариант:
Код

#include <iostream>
#include <algorithm>
using namespace std;
int i, j;
class Film
{
    char name[15];
    int year;
    char rezhiser[15];
    int n, m;
    char **a;
public:
    Film ();
    ~Film () 
    {
        for (i=0; i<n; i++)
            delete[] a[i];
        delete [] a; 
        a=0;
    }
    void Show();
    friend bool cmp(const Film* f1, const Film* f2);
};
Film::Film()
{
        cout<<"Vvedite imya filma:"<<endl;
        cin>>name;
        cout<<"Vvedite god vupyska:"<<endl;
        cin>>year;
        cout<<"Vvedite rezhisera:"<<endl;
        cin>>rezhiser;
        cout<<"Vvedite kolichestvo akterov:"<<endl;
        cin>>n;
        cout<<"Vvedite max dliny imeni:"<<endl;
        cin>>m;
        cout<<"Vvedite akterov:"<<endl;
        a=new char*[n];
        for (i=0; i<n; i++)
            a[i]=new char [m];
        for (i=0; i<n; i++)
            cin>>a[i];
}
void Film::Show()
{
    cout<<name<<" "<<year<<" "<<rezhiser<<" "<<n<<" akterov:"<<endl;
    for (i=0; i<n; i++)
    {
        cout<<a[i];        
        cout<<endl;
    }
    cout<<endl;
}
bool cmp(const Film* f1, const Film* f2)
{
    return strcmp(f1->name, f2->name)<0;
}
int main()
{
    int n, i;
    cout<<"Vvedite kol-vo filmov:"<<endl;
    cin>>n;
    Film **A=new Film*[n];
    cout<<endl<<"Films:"<<endl;
    for (i=0; i<n; i++)
    {
        A[i]=new Film;
        A[i]->Show();
    }
    sort(A, A+n, cmp);
    for (i=0; i<n; i++)
    {
        A[i]->Show();
        delete A[i];
    }
    delete []A;
system ("Pause");
return 0;
}

Здесь лучше что не создаем лишних копий. И короче получается.

Автор: Metalex 10.3.2010, 20:54
Вот немного переделал:
Код

#include <iostream>
#include <string>
using namespace std;

int i, j;

class Film
{
    char name[15];
    int year;
    char rezhiser[15];
    int n, m;
    char **a;
public:
    Film ();
    ~Film () 
    {
        for (i=0; i<n; i++)
            delete [] a[i];
        delete [] a; 
        a=0;
    }
    void Show();
    void sort(Film *A, int n);
    void input();
};

Film::Film()
{
}

void Film::input () 
{
    cout<<"Vvedite imya filma:"<<endl;
    cin>>name;
    cout<<"Vvedite god vupyska:"<<endl;
    cin>>year;
    cout<<"Vvedite rezhisera:"<<endl;
    cin>>rezhiser;
    cout<<"Vvedite kolichestvo akterov:"<<endl;
    cin>>n;
    m=15;
    cout<<"Vvedite akterov:"<<endl;
    a=new char*[n];
    for (i=0; i<n; i++)
        a[i]=new char [m];
    for (i=0; i<n; i++)
        cin>>a[i];
}

void Film::sort(Film *A, int n)
{
    Film t;
    for (i=0; i<n; i++) 
    {
        for (j=i+1; j<n; j++)
        {
            if (strcmp(A[i].name, A[j].name)>0)
            {
                t=A[i];
                A[i] = A[j];
                A[j] = t;
            }
        }
    }
}

void Film::Show()
{
    cout<<name<<" "<<year<<" "<<rezhiser<<" "<<n<<" akterov:"<<endl;
    for (i=0; i<n; i++)
    {
        cout<<a[i]<<endl;
    }
}

int main()
{
    int n, i;
    cout<<"Vvedite kol-vo filmov:"<<endl;
    cin>>n;
    Film *A=new Film[n];
    //Ввод
    for (i=0; i<n; i++)
    {
        A[i].input();
    }
    //Вывод
    cout<<endl<<"Films:"<<endl;
    for (i=0; i<n; i++)

        A[i].Show();
    //Сортировка
    A[0].sort(A, n);

    for (i=0; i<n; i++)
        A[i].Show();
system ("Pause");
return 0;
}

Но, почему-то, когда доходит до сортировки, программа выбивает ошибки....
Помогите мне их найти и устранить, пожалуйста! smile 

Автор: t_gran 11.3.2010, 05:55
Цитата

Помогите мне их найти и устранить, пожалуйста!

Вам помогать себе дороже. За что минус-то поставили? Я Вас пожурил, но репутацию Вам же не порчу!
А-а-а-а... Наверно это у Вас такая благодарность за помощь http://forum.vingrad.ru/topic-291070.html и http://forum.vingrad.ru/topic-291674.html.

Большое спасибо http://forum.vingrad.ru/users/dov за восстановление!

Что по мне, то я репутацию вам портить не буду, просто больше не буду пытаться помочь.

Автор: Metalex 11.3.2010, 09:08
t_gran, дело ваше.

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