Опубликован: 10.12.2015 | Уровень: для всех | Доступ: платный
Лекция 19:

Определение классов

< Лекция 18 || Лекция 19 || Лекция 20 >

Классы являются расширением типа struct и образуют абстрактный тип, необходимый для объектно-ориентированного программирования. Классы содержат данные и функции, оперирующие этими данными (методы классов). Ниже приводится пример простого класса stat, с помощью которого генерируется массив случайных чисел. Из объявления класса видно, что он содержит вещественый массив data и прототипы двух функций randomization и print, стоящие после служебного слова public, что означает, что эти функции доступны и вне класса. С классом связана переменная statistic. Описания функций (методов класса) располагаются вне класса (хотя можно описывать функции и всамом классе), при этом используется операция уточнения области видимости ::. Вызов функций-членов класса по значению происходит в главной функции, при этом используется оператор уточнения принадлежности к структуре (классу) точка (.). Нужно сказать что такой способ вызова методов класса не является единственным. В следующих примерах будут рассмотрены другие варианты.

//==========================================================
// Name        : class_random.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

#include<stdlib.h>

#define size 100 //Максимальный размер массива

class stat{

	double data[size];

public:
	//Функция генерации случайных чисел
	double randomization(int m, int n);
	//Функция печати
	void   print        (int m, int n);

} statistic;

double stat::randomization(int m, int n)
{
	double a;
	int i;
	for(i=0;i<m;i++)
	{
	a=(double)(rand()/((double)RAND_MAX+1)*n);
	data[i]=a;
	}
	return data[i];
}

void stat::print(int m, int n)
{
	for(int i=0;i<m;i++)
	{
		cout<<"\n"<<data[i];
	}
	cout<<"\n"<<endl;
}

int main() {
	int array_size;
		int range_size;

		cout<<"\nEnter array size please ";
		cin>>array_size;

		cout<<"\nEnter range size please ";
		cin>>range_size;

		statistic.randomization(array_size, range_size);
		statistic.print(array_size, range_size);
	return 0;
}

Результат:

Enter array size  please  5
Enter array range please  7

0.00875854
3.94498
1.35309
5.66101
4.09494

В следующей программе с классом stat связывается переменная statistic уже в главной функции, а не при объявлении класса, как это было в первом случае. Для печати используется параметризованная функция print. Программа сортирует вещественные массивы с помощью алгоритма пузырьковой сортировки и целочисленные массивы методом C.A.R. Hoare (алгоритм быстрой сортировки) (Г. Шилдт /Теория и практика С++).

//==========================================================
// Name        : class_sort.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

#include<stdlib.h>

class stat{

public:

void bubble (double *data, int m);//Пузырьковая сортировка
void quick(int *item, int count); //Быстрая сортировка
void    qs(int *item, int left, int right);

};

//пузырьковая сортировка
void stat::bubble (double *data, int m)
{
	register int a,b;
	double t;
	for(a=1;a<m;++a)
		for(b=m-1;b>=a;--b)
		{
			if(data[b-1]>data[b])
			{
				//Перестановка значений
				t=data[b-1];
				data[b-1]=data[b];
				data[b]=t;
			}
		}
}

//Входная функция быстрой сортировки
void stat::quick(int *item, int count)
{
	qs(item,0,count-1);
}

//функция быстрой сортировки
void stat::qs(int *item, int left, int right)
{
	register int i,j;
	int x,y;

	i=left;
	j=right;
	x=item[(left+right)/2];

	do
	{
		while(item[i]<x && i<right) i++;
		while(x<item[j] && j>left ) j--;

		if(i<=j)
		{
			y=item[i];
			item[i]=item[j];
			item[j]=y;
			i++;
			j--;
		}
	}
	while(i<=j);
	if(left<j)  qs(item,left,j);
	if(i<right) qs(item,i,right);
}

template <class type> void print  (type beta[], int m)
{
	for(int i=0;i<m;i++)
	{
		cout<<"  "<<beta[i];
	}
	cout<<"\n"<<endl;
}

int main() {
	double alpha[]={1.15, 6.28, -4.75, 2.13, 0.87};
	int array_size=sizeof(alpha)/sizeof(alpha[0]);
	cout<<"\nOriginal matrix: ";
	print(alpha,array_size);
	cout<<"\nBubble sorting: ";

	stat statistic;
	statistic.bubble(alpha,array_size);
	print(alpha,array_size);

	int beta[]={1,15,3,-4,14};
	int array_size_int=sizeof(beta)/sizeof(beta[0]);
	cout<<"\nOriginal matrix: ";
	print(beta, array_size_int);
	cout<<"\nQuick sorting: ";

	statistic.quick(beta, array_size_int);
	print(beta, array_size_int);
	return 0;
}

Результат:

Original matrix: 1.15 6.28 -4.75 2.13 0.87
Bubble sorting:  -4.75 0.87 1.15 2.13 6.28
Original matrix: 1 15 3 -4 14
Quick sorting:   -4 1 3 14 15
< Лекция 18 || Лекция 19 || Лекция 20 >
Зося Ковалева
Зося Ковалева

Хочу получить удостоверение. Сколько стоит оплата?

Aleksey Aplaev
Aleksey Aplaev
Россия, Chelybinsk
Александр Сидоров
Александр Сидоров
Россия, Самара