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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с вызовом функции 
V
    Опции темы
Warchief
Дата 24.5.2007, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Помогите пожалуйста!!! 
Задача написать програму для сортировке чего-угодно методом 'quick sort', с использованием template классов. В принципе сам алгоритм не проблема(надеюсь). Не знаю просто как вызвать методы класса в int main. Вот примерно структура программы(функции, которые пустые, я напишу сам). Объясните как мне вызвать эти функции в int main пожалуйста. Вот код:

Код
#include <iostream>
using namespace std;

template <class Item>
class Array
{
    private:
        Item *arrayPtr;
        int size;
    public:
        Array(int n)
        {
            size=n;
            arrayPtr = new Item [n];
        }
        Item & operator[] (int index)
        {
            return arrayPtr[index]
        }
        };





template <class Item>
class Sort
{
private:
    void partition1(Array<Item*>& A,int l, int r)
    {
    
    
    
    }
public:
    void qSort(Array<Item*>& A, int l, int r)
    {}

    void generateAscending(Array<Item*>& A,int n)
    {
     int n=22;  // заполнить массив
     Array<int> A(n);
     for (int i = 0; i < n; i++) 
         A[i] = i+1;
     for (int i = 0; i < n; i++) 
         cout<<A[i]<<" ";
    }
    
};

int main()
{
      Sort<int> t; // здесь я пытаюсь вызвать функцию generateAscending, но не работает 
     t.generateAscending(А,int n); // подскажите как нужно пожалуйста(функция генерирует массив, который должен будет сортироваться в дальнейшем)

    system ("pause");
};



Спасибо зарание!!!

Это сообщение отредактировал(а) Warchief - 24.5.2007, 11:17
PM MAIL ICQ Skype   Вверх
v_nikolaev
Дата 24.5.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



массив то объявлен как локальная переменная для функции и он убивает параметр A или я что-то недоглядел?

Добавлено @ 11:25
generateAscending(А,int n)

зачем в вызове функции указывать int?

Добавлено @ 11:33
в теле функции нужно убрать определение массива.

Array<int> A(n);

Надо будет добавить функцию-член класса Array, которая увеличивает размер массива и использовать её.

Объявляешь Array в main - передаёшь его нужной функции класса Sort...

Array<Item*>& A   -   а почему не Array<Item>& A. Тут получается специализация для указателей, разве не так?

Это сообщение отредактировал(а) v_nikolaev - 24.5.2007, 11:34
PM MAIL   Вверх
Warchief
Дата 24.5.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если я вызываю функцию так:  t.generateAscending(А,n) то компайлер говорит:

quicksort.cpp(55) : error C2065: 'А' : undeclared identifier
quicksort.cpp(55) : error C2065: 'n' : undeclared identifier


Так как мне быть? я уже просто измучался с этим вызовом. :(

Добавлено через 2 минуты и 3 секунды
Цитата(v_nikolaev @ 24.5.2007,  11:23)
Array<Item*>& A   -   а почему не Array<Item>& A. Тут получается специализация для указателей, разве не так?



Так посртавленно задание.
PM MAIL ICQ Skype   Вверх
Fazil6
Дата 24.5.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Warchief @  24.5.2007,  11:36 Найти цитируемый пост)
quicksort.cpp(55) : error C2065: 'А' : undeclared identifierquicksort.cpp(55) : error C2065: 'n' : undeclared identifier

так они (A и n) не определены у тебя.
PM MAIL   Вверх
Warchief
Дата 24.5.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Fazil6 @ 24.5.2007,  11:39)
Цитата(Warchief @  24.5.2007,  11:36 Найти цитируемый пост)
quicksort.cpp(55) : error C2065: 'А' : undeclared identifierquicksort.cpp(55) : error C2065: 'n' : undeclared identifier

так они (A и n) не определены у тебя.

Всё окончательно запутался :(

А разве это не определение?

Код
    void generateAscending(Array<Item*>& A,int n)
    {
     int n=22;  // заполнить массив
     Array<int> A(n);
     for (int i = 0; i < n; i++) 
         A[i] = i+1;
     for (int i = 0; i < n; i++) 
         cout<<A[i]<<" ";
    }


Это сообщение отредактировал(а) Warchief - 24.5.2007, 11:43
PM MAIL ICQ Skype   Вверх
v_nikolaev
Дата 24.5.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Что-то такое можно предложить:

Код
#include <iostream>
using namespace std;

template <class Item>
class Array
{
    private:
        Item *arrayPtr;
        int size;
    public:
        Array()
        {
            size = 0;
            arrayPtr = 0;
        }
        
        ~Array()
        {
            if ( arrayPtr )
               delete[] arrayPtr;
        }
        
        Array(int n)
        {
            size = n;
            arrayPtr = new Item [n];
        }

        Item & operator[] (int index)
        {
            return arrayPtr[index];
        }
        
        void SetSize( unsigned n)
        {
            if ( arrayPtr && size != n )
               delete[] arrayPtr;
            arrayPtr = new Item [n];
        }
};





class Sort
{
private:
    void partition1(Array<Item>& A,int l, int r)
    {
    
    
    
    }
public:
    void qSort(Array<Item>& A, int l, int r)
    {}

    void generateAscending(Array<Item>& A,int n)
    {
     A.SetSize( n);
     for (int i = 0; i < n; i++) 
         A[i] = i+1;
     for (int i = 0; i < n; i++) 
         cout<<A[i]<<" ";
    }
    
};

// Пригодится ещё эта функция для сортировки, 
// чтобы не настраивать шаблон явно на нужные типы
template <class Item>
void Swap( Item& a, Item& b )
{
   Item c = a;
   a = b;
   b = c;
}

int main()
{
     Array<int> a;
     Sort t; 
     t.generateAscending(a,n);

    system ("pause");
};





Это сообщение отредактировал(а) v_nikolaev - 24.5.2007, 11:54
PM MAIL   Вверх
Fazil6
Дата 24.5.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Warchief @  24.5.2007,  11:43 Найти цитируемый пост)
А разве это не определение?

нет. Это не то.

Цитата(Warchief @  24.5.2007,  11:36 Найти цитируемый пост)
Так посртавленно задание.

или я ничего не понял или тебе еще надо писать частичную специализацию Array для указателей

вот так тот кусок который у тебя написан будет работать, но для int , а не для int*
Код

#include <iostream>
using namespace std;

template <class Item>
class Array
{
private:
    Item *arrayPtr;
    int size;
public:
    Array(int n)
    {
        size=n;
        arrayPtr = new Item [n];
    }
    Item & operator[] (int index)
    {
        return arrayPtr[index];
    }
};





template <class Item>
class Sort
{
private:
    void partition1(Array<Item*>& A,int l, int r)
    {



    }
public:
    void qSort(Array<Item*>& A, int l, int r)
    {}

    void generateAscending(Array<Item>& A,int n)
    {
        //int n=22;  // заполнить массив
        //Array<int> A(n);
        for (int i = 0; i < n; i++) 
            A[i] = i+1;
        for (int i = 0; i < n; i++) 
            cout<<A[i]<<" ";
    }

};

int main()
{
    int n = 22;
    Sort<int> t; // здесь я пытаюсь вызвать функцию generateAscending, но не работает 
    Array<int> A(n);
    
    t.generateAscending(A, n); // подскажите как нужно пожалуйста(функция генерирует массив, который должен будет сортироваться в дальнейшем)

    system ("pause");
};

PM MAIL   Вверх
v_nikolaev
Дата 24.5.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Кстати, зачем сорт темплейтный?
PM MAIL   Вверх
Warchief
Дата 24.5.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(v_nikolaev @ 24.5.2007,  11:57)
Кстати, зачем сорт темплейтный?

Точно не знаю сам(не сказали), дали имена функциий и сказали допишите программу. 
В програме должно быть несколько вариантов быстрой сортироки(различие только в выборе опорного элемента). Может быть поэтому...

Подскажите, пожалуйста всё-таки, чего не хватает чтобы работали функции с generateAscending(Array<Item*>& A,int n), а не generateAscending(Array<Item>& A,int n). Т.к. иначе задание не выполненно. :(


Пасиб вам за помощь!!!

Это сообщение отредактировал(а) Warchief - 24.5.2007, 12:06
PM MAIL ICQ Skype   Вверх
Fazil6
Дата 24.5.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(v_nikolaev @  24.5.2007,  11:57 Найти цитируемый пост)
Кстати, зачем сорт темплейтный?

видимо, чтобы связать Sort и Array

может быть вот так тебе надо?
Код

#include <iostream>
using namespace std;

template <class Item>
class Array
{
private:
    Item *arrayPtr;
    int size;
public:
    Array(int n)
    {
        size=n;
        arrayPtr = new Item [n];
    }
    Item & operator[] (int index)
    {
        return arrayPtr[index];
    }

    ~Array()
    {
        delete [] arrayPtr;
    }
};


template <class Item>
class Sort
{
private:
    void partition1(Array<Item*>& A,int l, int r)
    {



    }
public:
    void qSort(Array<Item*>& A, int l, int r)
    {}

    void generateAscending(Array<Item *>& A,int n)
    {
        for (int i = 0; i < n; i++)
        {
            A[i] = new Item(i+1);
        }

        for (int i = 0; i < n; i++) 
            cout<< *A[i]<<" ";
        
    }

};

int main()
{
    int n = 22;
    Sort<int> t; // здесь я пытаюсь вызвать функцию generateAscending, но не работает 
    Array<int*> A(n);
    
    t.generateAscending(A, n); // подскажите как нужно пожалуйста(функция генерирует массив, который должен будет сортироваться в дальнейшем)

    
    
    system ("pause");
};


Добавлено @ 12:17
правда тут еще надо деструктор
Код

~Array()
    {
        delete [] arrayPtr;
    }



Это сообщение отредактировал(а) Fazil6 - 24.5.2007, 12:19
PM MAIL   Вверх
Warchief
Дата 24.5.2007, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Fazil6 @  24.5.2007,  12:12 Найти цитируемый пост)
может быть вот так тебе надо?



Вот спасибо, вороде то, что нужно, попробую дальше раобраться с самим сортом  smile 
PM MAIL ICQ Skype   Вверх
v_nikolaev
Дата 24.5.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Warchief @ 24.5.2007,  12:05)
Цитата(v_nikolaev @ 24.5.2007,  11:57)
Кстати, зачем сорт темплейтный?

Точно не знаю сам(не сказали), дали имена функциий и сказали допишите программу. 
В програме должно быть несколько вариантов быстрой сортироки(различие только в выборе опорного элемента). Может быть поэтому...

Подскажите, пожалуйста всё-таки, чего не хватает чтобы работали функции с generateAscending(Array<Item*>& A,int n), а не generateAscending(Array<Item>& A,int n). Т.к. иначе задание не выполненно. :(

суть такая (задание немного кривое).

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

Темплейтный Sort, я могу объяснить лишь как способ не использовать функцию swap, о которой я упоминал.

А вообще все сортировки могли бы быть и просто шаблонными функциями а Sort - нетемплейтным.

Если  темплейтный, то generateAscending(Array<Item*>& A,int n) не является специализацией для указателей - я слегка ошибся, просто не увидел сразу, что Sort - шаблон.

Оставляешь Sort шаблоном

Функцию generateAscending пишешь так:

void generateAscending(Array<Item*>& A,int n)
{
    // Если n больше реальной длины массива, и указатели 
    // ни на что не указывают, то мы получим падающую прогу
    // хрень в общем.
     for (int i = 0; i < n; i++) 
         *A[i] = i+1;
     for (int i = 0; i < n; i++) 
         cout<<A[i]<<" ";
}


Но вообще то всё это не очень умно и работать в нашей программе это не будет - ведь объекты, указатели на которые хранятся в массиве, надо сами где-то хранить... 
generateAscending - тогда имеет бессмысленый параметр размера массива - мы ведь не можем его просто так увеличить, да ещё и присвоить значения несуществующим элементам.

бардак какой-то в задании.

Добавлено через 2 минуты и 35 секунд
Цитата(Fazil6 @ 24.5.2007,  12:12)
Цитата(v_nikolaev @  24.5.2007,  11:57 Найти цитируемый пост)
Кстати, зачем сорт темплейтный?

видимо, чтобы связать Sort и Array

может быть вот так тебе надо?
Код

#include <iostream>
using namespace std;

template <class Item>
class Array
{
private:
    Item *arrayPtr;
    int size;
public:
    Array(int n)
    {
        size=n;
        arrayPtr = new Item [n];
    }
    Item & operator[] (int index)
    {
        return arrayPtr[index];
    }

    ~Array()
    {
        delete [] arrayPtr;
    }
};


template <class Item>
class Sort
{
private:
    void partition1(Array<Item*>& A,int l, int r)
    {



    }
public:
    void qSort(Array<Item*>& A, int l, int r)
    {}

    void generateAscending(Array<Item *>& A,int n)
    {
        for (int i = 0; i < n; i++)
        {
            A[i] = new Item(i+1);
        }

        for (int i = 0; i < n; i++) 
            cout<< *A[i]<<" ";
        
    }

};

int main()
{
    int n = 22;
    Sort<int> t; // здесь я пытаюсь вызвать функцию generateAscending, но не работает 
    Array<int*> A(n);
    
    t.generateAscending(A, n); // подскажите как нужно пожалуйста(функция генерирует массив, который должен будет сортироваться в дальнейшем)

    
    
    system ("pause");
};


Добавлено @ 12:17
правда тут еще надо деструктор
Код

~Array()
    {
        delete [] arrayPtr;
    }

в деструкторе надо убивать ещё элементы массива.


а зачем связывать класс сорт и массив???
PM MAIL   Вверх
Fazil6
Дата 24.5.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(v_nikolaev @  24.5.2007,  12:21 Найти цитируемый пост)
в деструкторе надо убивать ещё элементы массива.

да, надо, но возлагать на контейнер в данном случае не нужно, как впрочем и заполнение его возлагать на класс Sort. Array не знает что в нем  хранится и если заполняли его оператором new вне контейнера, то и delete для конкретного элемента нужно делать вне Array до его удаления
PM MAIL   Вверх
Warchief
Дата 25.5.2007, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот с вашей помощью вроде написал:
Посмотрите пожалуйста, может нужно что-нибудь подправить? Есть ещё вопрос, после того как я массив сгенерирован, как мне сделать с него копию? Методы partition1..3 отличаются только тем,что элемент пивот вцчисляется по разному. функции qSort1...3 вызывают соответствующий метод partition

Код
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

template <class Item>
class Array 
{
private:
    Item *arrayPtr;
    int size;
public:
    Array(int n)
    {
        size=n;
        arrayPtr = new Item [n];
    }
    Item & operator[] (int index)
    {
        return arrayPtr[index];
    }
    Array(Array<Item*> & A)
    {
                       A.size=size;
                       A.arrayPtr=arrayPtr;
                       }

};





template <class Item>
class Sort
{
private:
       int partition1(Array<Item*>& A,int l, int r)
   { 
       int q = (r+l)/2, x = *A[q]; 
       swap(A, q, r); 
        
       int i = l - 1; 
       for (int j = l; j <= r-1; j++) 
           if (*A[j] <= x) 
           { 
                   i = i + 1; 
                   swap(A, i, j); 
           } 
       swap(A, i+1, r); 
       return (i + 1); 
   } 
       int partition2(Array<Item*>& A,int l, int r)
       {
               int q = l, x = *A[q];
       swap(A, q, r); 
       
       int i = l - 1; 
       for (int j = l; j <= r-1; j++) 
           if (*A[j] <= x) 
           { 
                   i = i + 1; 
                   swap(A, i, j); 
           } 
       swap(A, i+1, r); 
       return (i + 1); 
       }
 int partition3(Array<Item*>& A,int l, int r)//
       {
               int q = r, x = *A[q]; //пивот 
       swap(A, q, r); 
       // пивот теперь справа
       int i = l - 1; 
       for (int j = l; j <= r-1; j++) 
           if (*A[j] <= x) 
           { 
                   i = i + 1; 
                   swap(A, i, j); 
           } 
       swap(A, i+1, r); 
       return (i + 1); 
       }

public:
    void swap(Array<Item*>& A, int element1, int element2)// меняем местами элементы
        {
            int temp;   
            temp = *A[element1];   
            *A[element1] = *A[element2]; 
            *A[element2] = temp;  
        }

    void qSort1(Array<Item*>& A, int l, int r)
    {    int q;
        
        if (l >= r)  return;
        
        q = partition1(A,l,r);
        qSort1(A,l,q-1);
        qSort1(A,q+1,r);
        
        
         }
       void qSort2(Array<Item*>& A, int l, int r)
    {    int q;
        
        if (l >= r)  return;
        
        q = partition2(A,l,r);
        qSort2(A,l,q-1);
        qSort2(A,q+1,r);
        
        
         }
          void qSort3(Array<Item*>& A, int l, int r)
    {    int q;
        
        if (l >= r)  return;
        
        q = partition3(A,l,r);
        qSort3(A,l,q-1);
        qSort3(A,q+1,r);
        
        
         }
     
    void generateAscending(Array<Item*>& A,int n)// массив с увеличивающимися элементами
    {
        for (int i = 0; i < n; i++)
        {
            *A[i] = i;
        }

       // for (int i = 0; i < n; i++) 
       //     cout<< *A[i]<<" ";            
        
    }
    void generateDecreasing(Array<Item*>& A,int n) массив с уменьшающимися елементами
    {  
        for (int i = 0; i < n; i++)  
        { 
            *A[i] = n-i; 
        } 
 
      //  for (int i = 0; i < n; i++) 
      //      cout<< *A[i]<<" "; 
         
    }

    void generateRandom(Array<Item*>& A,int n)//случайно сгенерированный массив
    {
        srand(time(NULL));  
        for (int i = n-1; i >= 0; i--)
        {
                      
            *A[i] = (rand()%n);
        }

       // for (int i = 0; i < n; i++) 
        //    cout<< *A[i]<<" ";
        
    }
};

int main()
{
    int n;
    cout<<"Vvedite 4islo"<<endl;
    cout<<"Vvod: ";cin>>n;
    Sort<int> t; 
    Array<int*> A(n);
    
        for (int i = 0; i < n; i++)
                {
                  A[i] = new int;
                 }
    t.generateRandom(A, n); // 
    
    Array<int*> B=A;

     clock_t tt; //засекаем время
     tt=clock();
     t.qSort1(A,0,n-1);//сортируем
     tt=clock()-tt;//считаем время
     printf("Time: %ld msec\nResult: %g\n",tt*1000/CLK_TCK);
        //for (int i = 0; i < n; i++) 
            //cout<< *A[i]<<" ";  
    system ("pause");     
};

PM MAIL ICQ Skype   Вверх
v_nikolaev
Дата 25.5.2007, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



for (int j = l; j <= r-1; j++)

так разве пишут в C-ях?
for (int j = l; j < r; j++) разницы то нет, но стиль правильнее, имхо smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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