С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Forza35
1 / 1 / 0
Регистрация: 30.06.2009
Сообщений: 16
#1

Параметр передаваемый в функцию - C++

17.08.2009, 12:41. Просмотров 1229. Ответов 19
Метки нет (Все метки)

Добрый день, уважаемые, посетители форума.
Вот я написал быструю сортировку:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// quicksort.cpp: главный файл проекта.
 
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;
 
int partition(int s[],int l,int r)
{
    int i=l,j=r,x=s[r];
    while(true)
    {
        if(i<j)
        {
        while(s[i]<x)
        {
            i++;
        }
            
        while(s[j]>x)
        {
            j--;
            if(j==l)
                break;
        }
        if(s[i]==s[j])
        break;
        else
        swap(s[i],s[j]);
 
        }
        else
            break;
    }
    return i;
}
void quicksort(int s[],int l,int r)
{
    if(l<r)
    {
        int med=partition(s,l,r);
        quicksort(s,l,med-1);
        quicksort(s,med+1,r);
    }
    else
        return;
}
Хочу сделать класс sort, который будет выглядеть примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class sort
{
private:
int *s;
int nl
public:
sort(int N)
{
n=N;
s=new int[n];
}
};
И одним из методов должен быть quicksort, только первым параметром должен быть не массив целых чисел, а объект класса sort. Как это сделать? я думал примерно так sort q. и после точки надо написать поле, но у меня Intellisense ругается и не выводит поля(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2009, 12:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Параметр передаваемый в функцию (C++):

Шаблоны функции и указатель на функцию передаваемый в функцию - C++
Привет! Вопрос такой: Если я пишу сортировку, например, bubbleSort и хочу помимо массива и его размера передать ещё и указатель на функцию,...

Ограничен ли буфер, передаваемый в функцию send - C++
Вопрос: ограничен ли размер буфера, передаваемого в функцию send, размером MTU?

Как правильно вызвать функцию с указателем на другую функцию как параметр - C++
Вот вариант: double f(double x) { ... } double k(double (*f)(double), double y) { ...

Передать параметр в функцию - C++
Не могу передать параметр в функцию с помощью функции pthread_create(&amp;thread2,NULL,Determinant, (void *) &amp;b); ...

Как передать параметр в функцию? - C++
void Delete(Computer *pcomputer) { unsigned int RemoveComputer; int NumberCopy; NumberCopy = NumberOfComputers; cout &lt;&lt;...

Переписать функцию, добавив параметр - C++
Нужна срочно помощь. Необходимо переписать функцию, что балы с параметром. struct Service { char S_Name; char S_Code; ...

19
Monte-Cristo
2791 / 1377 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 12:57 #2
Цитата Сообщение от Forza35 Посмотреть сообщение
только первым параметром должен быть не массив целых чисел, а объект класса sort.
а зачем? вы хотите одним объектом сортировать другой? вы понимаете парадигму ООП?
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.08.2009, 13:03 #3
опишите как вы себе интерфейс вашего класса представляете. другими словами, как клиенты должны будут использовать ваш класс.
0
Forza35
1 / 1 / 0
Регистрация: 30.06.2009
Сообщений: 16
17.08.2009, 13:36  [ТС] #4
Ну у меня еще как такого предмета ООП не было, будет только в грядущем семестре, дак я самостоятельно еще ток с ним разбираться пытаюсь. Извините, конечно мб не допонял чего, но буду работать. Я просто хотел сделать класс сортировок, и там 4 обменные сортировки как методы. и вот к примеру я создаю класс сорт, задем в самой программе.
создаю объект этого класса ну к примеру sort s(10), и дольше просто хотелось бы вызвать метод какой-нить сортировки, ну вот к примеру, s.quicksort(?,0,9). Вот как-то так
0
Monte-Cristo
2791 / 1377 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 13:57 #5
просто не понятно зачем объект передавать. у тебя Класс будет хранить массив, которые сортировать и методы: методы сортировок - т.е. ты выбираешь каким методом отсортировать. т.е. ты это имел ввиду? я честно говоря не совсем тебя понял.
0
Forza35
1 / 1 / 0
Регистрация: 30.06.2009
Сообщений: 16
17.08.2009, 14:00  [ТС] #6
Так точно, я имел ввиду именно это. Можно написать тупо функции этих сортировок. Но хотелось бы единым классом сделать) вот к примеру я написал bublesort. Он без параметров дак там проблем нету, sort q(10);q.bublesort() и все. А в quicksort надо параметры передавать.
0
Puporev
Модератор
52590 / 40435 / 13750
Регистрация: 18.05.2008
Сообщений: 93,607
17.08.2009, 14:01 #7
Классы-это объекты, например матрицы. А сортировка это метод класса, процедура или функция, хотя у вас это вроде одно и то же.
0
Monte-Cristo
2791 / 1377 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 14:16 #8
Цитата Сообщение от Forza35 Посмотреть сообщение
А в quicksort надо параметры передавать
ну это понятно. я понять не могу, зачем передавать объект в quicksort?

Добавлено через 6 минут 2 секунды
Делается все это приблизительно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class CSort
{
    private:
        int *Array; // собственно, сам массив
        int n;      // кол-во элементов массива
    public:
        CSort(int N)
        {
            n = N;
            Array = new int[n];
            // ну тут в приницпе можно еще и заполнять как-то
        }
        
        ~Csort()
        {
            delete[] Array;
        }
        
        void bubblesort()
        {
            // вот тут ты уже просто, берешь и прямо сортируешь массив
            // Array.
        }
        
        void quicksort(/* передаешь параметры сортировки */)
        {
            // вот тут ты тоже просто, берешь и прямо сортируешь массив
            // Array.
        }       
};
Добавлено через 47 секунд
можно добавить методы для заполнения массива
1
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.08.2009, 14:53 #9
Monte-Cristo, хочу покритиковать и ваше решение. танцевать будем от потенциального клиента. что ему нужно?
0. у клиента есть массив чего-то (пускай для простоты - целых) известной длины. и он хочет этот массив упорядочить в той же памяти.
1. Forza35 хочет предложить несколько методов, причем сгруппировать их в специальный класс.

спрашивается:
зачем нам для этой цели нужен вообще объект такого класса? чтоб была возможность вызвать конструктор-деструктор?

что и для кого мы собираемся здесь хранить?
C++
1
2
3
    private:
        int *Array; // собственно, сам массив
        int n;      // кол-во элементов массива
Forza35, не нужно стремиться при каждом решении обязательно применить все что вы успели выучить, или бояться показаться недостаточно объекно-ориентированым. мир решаемых задач очень многообразен для того, чтобы втиснуть его в рамки любой технологии. не забывайте здравый смысл, и старайтесь выбрать наиболее простое решение из возможных (не забывая предусмотреть некоторую гибкость, но не перегибать с этим тоже )

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
class CMySort {
  static sortMeghodOne (int *pArray, unsigned long size){
   ...
  }
  static sortMeghodTwo (int *pArray, unsigned long size, ... some additional arguments){
   ...
  }
  static sortMeghodThree (int *pArray, unsigned long size, ... some additional arguments){
   ...
  }
...  
}
использование - примитивное:

C++
1
2
3
int array [3] = {3,-20,200};
CMySort::sortMeghodOne (array, 3);
...
1
Forza35
1 / 1 / 0
Регистрация: 30.06.2009
Сообщений: 16
17.08.2009, 14:57  [ТС] #10
Спасибо, Monte-Cristo, что ты со мной возишься) Но вот я так и делал как ты предлагаешь, только вот проблема вот в чем(мб я и не допонимаю что-нибудь) в функции main я создам объект типа Csort. а в сортировку мне надо передать объект типа инт(int s[]) но у меня же не будет в главной программе объекта типа int, а будет объект Csort)
вот как будет выглядеть:
C++
1
2
3
4
5
int main()
{
Csort q(10); 
q.quicksort( ,0,9); 
}
вот первым параметром у меня должен быть целочисленный массив, точней указатель на него, а у меня есть только объект типа Csort.

Добавлено через 3 минуты 4 секунды
Спасибо вам обоим)
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.08.2009, 15:00 #11
Цитата Сообщение от Forza35 Посмотреть сообщение
Спасибо, Monte-Cristo, что ты со мной возишься) Но вот я так и делал как ты предлагаешь, только вот проблема вот в чем(мб я и не допонимаю что-нибудь) в функции main я создам объект типа Csort. а в сортировку мне надо передать объект типа инт(int s[]) но у меня же не будет в главной программе объекта типа int, а будет объект Csort)
вот как будет выглядеть:
C++
1
2
3
4
5
int main()
{
Csort q(10); 
q.quicksort( ,0,9); 
}
вот первым параметром у меня должен быть целочисленный массив, точней указатель на него, а у меня есть только объект типа Csort.

Добавлено через 3 минуты 4 секунды
Спасибо вам обоим)
ну вот, теперь оказывается, что и сортировать ничего не нужно. главное - класс чтоб был
0
Monte-Cristo
2791 / 1377 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 15:13 #12
novi4ok, критика это хорошо.
Но, позволь возразить:

Цитата Сообщение от novi4ok Посмотреть сообщение
зачем нам для этой цели нужен вообще объект такого класса? чтоб была возможность вызвать конструктор-деструктор?
у Forza35 изначально был код, в котором это маячило:
Цитата Сообщение от Forza35 Посмотреть сообщение
private:
int *s;
int nl
во-вторых, если необходимы только функции сортировок, тогда рациональней использовать пространство имен. (имхо, он для этих целей и создавался).
Как вариант, использовать static методы класса. Но это сводится уже к противостоянию структур и классов ( в c++ и те и те поддерживают методы.. да они отличаются спецификатором доступа по-умолчанию, но как правило, программист всегда их задает вручную (чтоб наверняка)).

С пространством имен это выглядело бы так:

C++
1
2
3
4
5
6
namespace Sorts 
{
    bubblesort(/*массив пердаем и т.д.*/);
    quicksort(/*массив пердаем и т.д.*/);
    shellsort(/*массив пердаем и т.д.*/);
}
и вызывались бы они так:

C++
1
Sorts::bublesort(/*массив пердаем и т.д.*/);
0
Forza35
1 / 1 / 0
Регистрация: 30.06.2009
Сообщений: 16
17.08.2009, 15:26  [ТС] #13
Спасибо, что натолкнули на идею оба. Monte-Cristo, я просто не видел еще такого как создание пространство имен. Т.е. вот я его задам подключу к программе "using namespace Sorts" и тогда мне просто можно вызвать так:
bubblesort(/*массив пердаем и т.д.*/);
quicksort(/*массив пердаем и т.д.*/);
shellsort(/*массив пердаем и т.д.*/);
Соглашусь, вначале я хотел сделать фигню какую-то) Теперь вроде чуть-чуть понял, сейчас сделал как novi4ok говорил. Сейчас попробую как
Monte-Cristo.
И не могли бы вы еще помочь, чтоб не создавать отдельную тему. Почему в проекте
cоздаю класс а функция swap не работает? в консольном приложении дак работает. Хотя stdlib я подключал

Добавлено через 40 секунд
у меня Visual studio 2008
1
Monte-Cristo
2791 / 1377 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 15:37 #14
Цитата Сообщение от Forza35 Посмотреть сообщение
Т.е. вот я его задам подключу к программе "using namespace Sorts" и тогда мне просто можно вызвать так:
bubblesort(/*массив пердаем и т.д.*/);
quicksort(/*массив пердаем и т.д.*/);
shellsort(/*массив пердаем и т.д.*/);
угу.
в принципе, если сделать как сказал novi4ok - то тогда,
ты будешь к функциям тоже ссылаться через спецификатор доступа ::.. т.е.
класс::метод
но это возможно только для static методов. но нп мое имхо, пространство имен для этих целей и создавалось.

Добавлено через 2 минуты 4 секунды
Цитата Сообщение от Forza35 Посмотреть сообщение
И не могли бы вы еще помочь, чтоб не создавать отдельную тему. Почему в проекте
cоздаю класс а функция swap не работает? в консольном приложении дак работает.
потому что, наверное, swap входит в пространство имен std;
в консольном приложении ты наверное прописывал всегда
C++
1
using namespace std;
для доступа к swap попробуй вызвать его так:
C++
1
std::swap
0
skvor
640KB мне хватило на всё.
118 / 49 / 2
Регистрация: 07.06.2009
Сообщений: 442
17.08.2009, 16:41 #15
Forza35, мне кажется, вы думаете в обратную сторону.

При объектно-ориентированном подходе, в вашей задаче, надо не в функцию передавать массив, а самому массиву приделать метод, который будет его самого сортировать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
class ClassArray
{ public:
     Type Array; //Некоторое описание собственно массива
     void Sort() { .... } //Описание функции (метод), которая может сортировать Array
}
main()
{ ClassArray A; //Объявление объекта (экземпляр массива)
   .......... //Инициализация
   .......... //Вывод первоначального значения массива
  A.Sort(); //Сортировка
  .......... //Вывод результата
}
Ну где-то так, если не задавать вопросы про разные там сокрытия данных и т.п.
0
17.08.2009, 16:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2009, 16:41
Привет! Вот еще темы с ответами:

Как передать параметр в функцию? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; void test(int); int main() { int n = 1; for (int i = 0; i &lt;...

Передать функцию как параметр - C++
По сути, нужно отсортировать созданный массив, то есть передаваемой функцией будет функция сортировки. Подскажите как это реализовать. ...

Не меняется переданный в функцию параметр - C++
Почему end при выходе из функции не становится 1, а остается 0 ???? #include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; ...

Передать метод, как параметр, в функцию - C++
Добрый день. Есть функция, которая должна в качестве параметра принимать указатель на метод класса. Причем сам метод может быть обычным,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.