Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 30.06.2009
Сообщений: 16

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

17.08.2009, 12:41. Показов 2067. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.08.2009, 12:41
Ответы с готовыми решениями:

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

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

Выборка из БД: не принимается параметр, передаваемый в представление
вобщем дело в том, что если делать ветвление, то ругается на параметр каторый передаем в представление, якобы его нет. ок да, я забил на...

19
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 12:57
Цитата Сообщение от Forza35 Посмотреть сообщение
только первым параметром должен быть не массив целых чисел, а объект класса sort.
а зачем? вы хотите одним объектом сортировать другой? вы понимаете парадигму ООП?
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.08.2009, 13:03
опишите как вы себе интерфейс вашего класса представляете. другими словами, как клиенты должны будут использовать ваш класс.
0
1 / 1 / 0
Регистрация: 30.06.2009
Сообщений: 16
17.08.2009, 13:36  [ТС]
Ну у меня еще как такого предмета ООП не было, будет только в грядущем семестре, дак я самостоятельно еще ток с ним разбираться пытаюсь. Извините, конечно мб не допонял чего, но буду работать. Я просто хотел сделать класс сортировок, и там 4 обменные сортировки как методы. и вот к примеру я создаю класс сорт, задем в самой программе.
создаю объект этого класса ну к примеру sort s(10), и дольше просто хотелось бы вызвать метод какой-нить сортировки, ну вот к примеру, s.quicksort(?,0,9). Вот как-то так
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 13:57
просто не понятно зачем объект передавать. у тебя Класс будет хранить массив, которые сортировать и методы: методы сортировок - т.е. ты выбираешь каким методом отсортировать. т.е. ты это имел ввиду? я честно говоря не совсем тебя понял.
0
1 / 1 / 0
Регистрация: 30.06.2009
Сообщений: 16
17.08.2009, 14:00  [ТС]
Так точно, я имел ввиду именно это. Можно написать тупо функции этих сортировок. Но хотелось бы единым классом сделать) вот к примеру я написал bublesort. Он без параметров дак там проблем нету, sort q(10);q.bublesort() и все. А в quicksort надо параметры передавать.
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
17.08.2009, 14:01
Классы-это объекты, например матрицы. А сортировка это метод класса, процедура или функция, хотя у вас это вроде одно и то же.
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 14:16
Цитата Сообщение от 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
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.08.2009, 14:53
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
1 / 1 / 0
Регистрация: 30.06.2009
Сообщений: 16
17.08.2009, 14:57  [ТС]
Спасибо, 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
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.08.2009, 15:00
Цитата Сообщение от 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
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 15:13
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
1 / 1 / 0
Регистрация: 30.06.2009
Сообщений: 16
17.08.2009, 15:26  [ТС]
Спасибо, что натолкнули на идею оба. Monte-Cristo, я просто не видел еще такого как создание пространство имен. Т.е. вот я его задам подключу к программе "using namespace Sorts" и тогда мне просто можно вызвать так:
bubblesort(/*массив пердаем и т.д.*/);
quicksort(/*массив пердаем и т.д.*/);
shellsort(/*массив пердаем и т.д.*/);
Соглашусь, вначале я хотел сделать фигню какую-то) Теперь вроде чуть-чуть понял, сейчас сделал как novi4ok говорил. Сейчас попробую как
Monte-Cristo.
И не могли бы вы еще помочь, чтоб не создавать отдельную тему. Почему в проекте
cоздаю класс а функция swap не работает? в консольном приложении дак работает. Хотя stdlib я подключал

Добавлено через 40 секунд
у меня Visual studio 2008
1
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
17.08.2009, 15:37
Цитата Сообщение от 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
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
17.08.2009, 16:41
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
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.08.2009, 17:04
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
рациональней использовать пространство имен.
еще лучше подошло бы для данной задачи! мне просто в голову не пришло в том момент.

Цитата Сообщение от skvor Посмотреть сообщение
Forza35, мне кажется, вы думаете в обратную сторону.
При объектно-ориентированном подходе, в вашей задаче,...
все зависит от того, какую задачу мы пытаемся решить: создать удобный инструмент для сортировки, или изощриться приделать о-ориентированый подход во что бы то ни стало.
как дополнение: суть объектно-ориентированного подхода не в том, чтобы на каждый пук написать class{..., а представить в виде иерархии классов (очень важно! иначе все это теряет основное преимущество) сущности предметной области решаемой задачи. а здесь у нас - массив целых, который мы хотим иметь возможность сортировать разными способами. и все!
1
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
17.08.2009, 17:17
Цитата Сообщение от novi4ok Посмотреть сообщение
все зависит от того, какую задачу мы пытаемся решить
Ну, это хозяин пусть сам решает - пишем сортировку или в ООП-е разбираемся. Но я не видел ни одного человека, который начал бы осваивать ООП с программы, для которой использование ООП целесообразно. Даже для студенческих задач 2 курса, думаю нет практической надобности в объектах.
0
1 / 1 / 0
Регистрация: 30.06.2009
Сообщений: 16
18.08.2009, 00:59  [ТС]
Ну, как я сказал, у меня ООП еще не было. Только будет. А это мне просто про обменную сортировку надо подготовить материал к сентябрю и сделать вообще в Delphi. Но я выбрал C++. Потому, что планирую развиваться в этой области. Еще раз спасибо всем. Сделаю через пространство имен.

Добавлено через 2 часа 39 минут 42 секунды
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <ctime>
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;
}
class sort
{
private:
int *s;
int n;
public:
sort(int N)
{
n=N;
s=new int[n];
}



void qs()
{
quicksort(s,0,n-1);
}

void randomize(int maxvalues)
{
srand(time(NULL));
for(int j=0;j<n;j++)
s[j]=rand()%maxvalues;
}
void show()
{ for(int j=0;j<n;j++)
cout<<s[j]<<" ";
}
};
int main()
{
sort q(10);
q.randomize(100);
q.qs();
q.show();
getch();
return 0;



}
решил проблему примерно так. Что скажете на такое решение? Но сделаю все равно через namespace. Ток я в проекте windows form не знаю где описывать namespace sort, а как создавать class знаю. Мб подскажете тогда где? у меня Visual studio 2008.
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
18.08.2009, 09:12
Цитата Сообщение от skvor Посмотреть сообщение
Но я не видел ни одного человека, который начал бы осваивать ООП с программы, для которой использование ООП целесообразно
ООП - это сложная штука. и чтобы его понять очень желательно прочитать книжечки по "объектно ориентированному анализу и проектированию". А то люди слово класс написали - и всё, у них программа теперь ООП
0
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
18.08.2009, 11:53
Цитата Сообщение от zim22 Посмотреть сообщение
ООП - это сложная штука. и чтобы его понять очень желательно прочитать книжечки по "объектно ориентированному анализу и проектированию". А то люди слово класс написали - и всё, у них программа теперь ООП
Это уже не ко мне. Вы смешали две большие разницы - использование классов, и возможную самооценку подобной программы, которую, конечно, нельзя называть объектно-ориентированной.

std::cout<<"Хело волд"; //Тоже объектно ориентированный подход
Нельзя заставлять читать всего Бьярна нашего Страуструпа, понимаете-ли и до конца, прежде чем писать "Здравствуй, Мир!"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.08.2009, 11:53
Помогаю со студенческими работами здесь

Как передать параметр из jsp java страницы в функцию javascript и возвратить обратно другой параметр
На jsp странице имеется динамически формируемая таблица с чекбоксами в первой колонке каждой строки &lt;tbody&gt; ...

Решение системы уравнений: написать функцию, которая как параметр будет использовать другую функцию
Ребята помогите разобраться с указателем на функцию! у меня решается система ДУ методом Рунге_кутта. я хочу написать функцию, которая...

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

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

Не передается параметр в функцию
Доброго дня уважаемые коллеги. Столкнулся с проблемой и никак не могу решить. Помогите пожалуйста. Есть кусочек кода: Задумка такая...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru