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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Сортировка динамического массива обьекта клас 
:(
    Опции темы
Metalex
Дата 5.3.2010, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне нужно отсортировать динамический массив обьектов класса 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 тоже не катит...
Пересмотрите, пожалуйста, мой код на наличие грубых ошибок.. И помогите разобратся с этими 
Огромное спасибо.


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
ИванМ
Дата 5.3.2010, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(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 надо сделать локальными переменными. Плохо когда в классе всякий мусор.

Это сообщение отредактировал(а) ИванМ - 5.3.2010, 00:48
PM MAIL   Вверх
Metalex
Дата 5.3.2010, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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




--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
t_gran
Дата 5.3.2010, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Metalex, мог бы человеку и плюс поставить!  smile 


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Metalex
Дата 5.3.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



t_gran, поставлю, как решу вопрос обязательно


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
ИванМ
Дата 6.3.2010, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Metalex, 
Цитата(Metalex @  5.3.2010,  09:11 Найти цитируемый пост)
sort(A, A+n+1);

Означает, что сортировать надо грубо говоря от A до A+n. Второй параметр должен быть больше верхней границы на единицу. 
PM MAIL   Вверх
Metalex
Дата 8.3.2010, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

Компиляция и построение прошло успешно..
Выполнение доходит до сортировки и выбивает ошибки:
user posted image
В чем может быть дело?


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
ИванМ
Дата 9.3.2010, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



в общем не правильно я написал. Надо не 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;
}

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

Это сообщение отредактировал(а) ИванМ - 9.3.2010, 01:04
PM MAIL   Вверх
Metalex
Дата 10.3.2010, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот немного переделал:
Код

#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 


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
t_gran
Дата 11.3.2010, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Цитата

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

Вам помогать себе дороже. За что минус-то поставили? Я Вас пожурил, но репутацию Вам же не порчу!
А-а-а-а... Наверно это у Вас такая благодарность за помощь тут и тут.

Большое спасибо Dov за восстановление!

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


Это сообщение отредактировал(а) t_gran - 11.3.2010, 06:03


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Metalex
Дата 11.3.2010, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



t_gran, дело ваше.


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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