Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аленский. лекции по проге.doc
Скачиваний:
19
Добавлен:
11.11.2018
Размер:
1.35 Mб
Скачать

§ 1. Примеры

П р и м е р 1. Разработаем простейший класс для работы с двумя целыми числами. В класс включим конструктор и следующие функции: вывод двух целых чисел; вычисление их суммы; проверка, делится ли одно число на другое без остатка; изменение двух целых чисел по правилу: наименьшее число или оба, если они одинаковы, умножаем на величину par, которая передаётся как параметр функции при её вызове.

class FirstCl // Описание класса с именем FirstCl

{ int a,b; // поля класса, т. е. переменные

public: // атрибут доступа (см. § 2)

/* Заголовок конструктора. Это функция, которая имеет то же имя, что и класс; тип возвращаемого значения не записывается.*/

FirstCl(int x, int y);

/* Заголовки четырёх функций (методов) класса, оформленных как внешние. Они похожи на прототипы обычных самостоятельных функций, только поля класса, т. е. два целых числа, в качестве параметров не записываем */

void MyPrint();

int MySum();

bool MyTest();

/* Метод, который изменяет поля класса. Метод может использовать дополнительные параметры, которые не являются полями класса. У нас это число, на которое умножаем, наименьшее из двух чисел, или оба, если они одинаковы. */

void Change (int );

}; // конец описания класса

/* Текст внешнего конструктора. Перед именем внешнего конструктора и каждой внешней функции записываем имя класса и операцию “::” (разрешение области видимости). */

FirstCl::FirstCl (int x, int y)

{ a=x; b=y;

};

// Тексты четырёх внешних методов.

void FirstCl::MyPrint()

{ cout<<"\nThe first number "<<a<< " The second number "<<b <<endl;

} ;

int FirstCl::MySum()

{ return a+b;

};

/* Логическая функция, возвращающая true или false в зависимости от того, делится ли a на b без остатка (для 10 и 3 — false, 3 и 10 — false, 10 и 2 — true, 2 и 10 — false). */

bool FirstCl::MyTest()

{return !(a%b)? true : false;

};

void FirstCl::Change (int par)

{ if (a>b) b*=par;

else if (a<b) a*=par;

else { b*=par; a*=par;

}

};

/* В головной функции создаём объект, т. е. переменную типа класс, и вызываем включённые в класс методы. */

int main(int argc, char* argv[])

{ FirstCl obj(10,2);

/* Объявили объект obj и одновременно с этим вызвали конструктор, с помощью которого создаётся объект, и в класс передаются числа 10 и 2. Методы (функции) этого объекта будут выполняться для этих чисел. Повторно при вызове методов класса эти числа не передаём. Как и для самостоятельных функций, при объявлении объекта можно в качестве “фактических параметров” для конструктора передать не только константы, а и значения предварительно объявленных и определённых, например, введённых, переменных:

int A,B; cin>>A>>B;

FirstCl obj(A,B ); */

/* При вызове функций записываем имя объекта (obj), но не класса, и после точки имя функции (MyPrint). */

obj.MyPrint();

cout<<"\nSum "<<obj.MySum();

if (obj.MyTest()) cout<<"\n-----";

else cout<<"\n+++++";

obj.Change(10); cout<<"\nChanging ";

obj.MyPrint();

getch(); return 0;

}

При вызове функций класса есть аналогия с обычными самостоятельными функциями, не членами класса. Функции типа void вызываются отдельно (obj.MyPrint(); obj.Change(10);). Вызов функции с возвращаемым с помощью return единственным результатом записывается непосредственно в выражении, а значит, в операторе, в котором используется значение функции

(if (obj.MyTest() ) …).

Ещё раз обратим внимание на следующие особенности вызова методов класса:

  • перед именем метода записывается имя объекта (а не класса!) и после точки имя метода. При необходимости в скобках записываем фактические параметры (см. функцию Change);

  • поля класса передаются в объект с помощью конструктора. При вызове каждого метода повторно передавать эти числа, как для обычных функций, не надо. Передаём только те параметры, которые не включены в класс (параметр Par для метода Change).

П р и м е р 2. Разработать класс для работы с одномерным массивом наибольшей размерности 20. В отличие от первого примера, все функции оформим как встроенные. Их назначение приведено в комментариях:

#define MaxSize 20

/*Определили макрос, используемый в качестве наибольшей размерности массива */

class ClArray

{ int n;

float A[MaxSize];

public:

/* Конструктор инициализирует только одно поле — размерность массива. При этом осуществляется проверка передаваемого значения. Массив, который является вторым полем класса, определяется с помощью функции MyInp */

ClArray (int m)

{ n=m; if (n>MaxSize || n<1) n=10;

} ;

// Функция (метод) для ввода массива.

void MyInp()

{ int x=1, y; y=wherey();

for(int i=0; i<n; i++, x+=7)

{ gotoxy(x,y); cin>>A[i];

}

} ;

/* Функция (метод) для “цветного” вывода массива. При этом числа num выводятся цветом С1, а остальные — цветом С2 */

void MyOut(int C1, int C2, float num)

{ cout<<endl;

for ( int i=0; i<n; i++)

{ if (A[i]==num) textcolor ( C1 );

else textcolor ( C2 );

cprintf ( "%10.4f", A[i] );

}

}

/* Логическая (булевская) функция (метод), возвращающая true или false в зависимости от того, найдено число t в массиве или нет */

bool Test (float t)

{ for (int i=0; i<n; i++)

if (A[i]==t) return true;

return false;

}

/* Функция (метод), которая в массиве каждое наибольшее число меняет на наименьшее и наоборот. Кроме того, функция возвращает наибольшее и наименьшее значения. */

void MyChange ( float &mx, float &mn)

{ mx=mn=A[0];

for(int i=0; i<n; i++)

{ mx= A[i]>mx? A[i] : mx;

mn= A[i]<mn? A[i] : mn; }

for(int i=0; i<n; i++)

if (A[i]==mx) A[i]=mn;

else if (A[i]==mn) A[i]=mx;

} // end of the last function

} ; // end of class

/* В головной функции в цикле создаём объекты, то есть работаем с несколькими одномерными массивами, пока не введём в качестве размерности число 0. */

int main()

{ int N=5; float num;

do { ClArray ObArr(N);

ObArr.MyInp(); // ввод массива

while(1) // цикл для поиска нескольких чисел в массиве

{ cout<<"\n Number for find (1000 -- exit)"; cin>>num;

if (num==1000) break;

ObArr.MyOut ( 2, 5, num); // вывод массива разным цветом

if ( ObArr.Test ( num ) )

cout <<" \n Find the number " ;

else cout<<"\n Do not find the number ";

cout<<num;

}

float MyMx, MyMn;

/* Изменяем массив и возвращаем в функцию main наибольшее (MyMx) и наименьшее (MyMn) значения. */

ObArr.MyChange(MyMx, MyMn);

/* Вывод массива с выделением другим цветом наибольшего значения (MyMx). */

ObArr.MyOut(2,5,MyMx);

/* Вывод массива с выделением другим цветом наименьшего значения (MyMn). */

ObArr.MyOut(2,5,MyMn);

cout<< "\n Size of array (0 -- exit)"; cin>>N;

} while ( N);

return 0;

}