- •Алгоритм.
- •Множественный выбор switch.
- •Оператор do … while ( с постусловием ).
- •Do оператор ;
- •Оператор цикла for.
- •Использование операторов break и continue в циклах.
- •Функции ввода-вывода.
- •Общий вид программы.
- •Вложенные циклы.
- •Адреса и указатели.
- •Массивы.
- •Int a[10] ; // целочисленный вектор из 10 элементов.
- •Векторы.
- •Сортировка вектора.
- •Матрицы.
- •Строки.
- •Подпрограммы.
- •Директива препроцессора #define .
- •Области видимости.
- •Классы памяти.
- •Рекурсия.
- •Подготовка к зачету.
- •Структуры.
- •Int ball [4] ; // описание третьего поля – оценки.
- •Очередь.
- •Линейные списки.
- •Деревья.
- •Int n, k ; // ее размерности
- •Void print ( void ) // печать матрицы
- •Определение методов вне класса.
- •Частные и общие данные.
- •Конструктор.
- •Перегрузка операторов.
- •Неявный указатель *this.
- •Дружественные функции.
- •Класс множество.
- •Наследование.
- •Объекто-ориентированное программирование.
- •Список вопросов к экзамену.
- •Литература.
Дружественные функции.
Мы договорились, что объекты определяются как private и доступны только внутри класса, а если нужно сделать их доступными для внешней глобальной функции, которая не является функцией класса? Реализовать это можно следующим образом.
void ff ( int a, int b)
{ … } ;
class cmatr {
float **m ; // объекты класса
int n, k ;
friend void ff ( int, int) ; // декларация дружественной функции.
public : … // методы класса
}
Можно объявить дружественной функцией, как обычную функцию, так и метод другого класса.
Мы подобрались к очень важной и серьезной теме – взаимодействие классов, построение одного класса из другого. Это будет рассмотрено в теме – Наследование, а перед ней еще один пример класса.
Класс множество.
В языке С нет перечислимых типов, поэтому задачи принадлежности месяцу, цвету и т. п. решаются через оператор case. Для более интересного решения таких задач можно разработать класс множество, с использованием такого класса очень элегантно решаются задачи на пересечение, объединение множеств.
include<conio.h>
include<stdio.h>
include<stdlib.h>
// класс целочисленное множество х из len элементов
class cset {
int *x ; // объекты
int len ;
public: cset () ; // методы
cset (int *, int ) ;
int In ( int ) ;
int Get (int num) { return x[num] ; } // выдача элемента
int Getslen () { return len ; } // количество элементов во множестве
void Put ( int n, int i) { *(x+i) = n ; } // положить элемент во множество
cset operator = ( cset &) ;
cset operator ^ ( cset &) ;
}
cset::cset () // конструктор пустого множества
{ len =10 ;
x = (int*) malloc ( len*sizeof( int)) ;
for ( int i=0 ; i<len ; i++)
*(x+i) = ‘\0’ ;
}
cset::cset ( int *y, int d ) // конструктор произвольного множества из d элементов
{ len =d ;
x = (int*) malloc ( len*sizeof( int)) ;
for ( int i=0 ; i<len ; i++)
*(x+i) = *(y+i) ;
}
int cset::In( int a ) // проверка принадлежности элемента а множеству
{ int i, p = 0 ;
for ( i=0 ; i<len ; i++)
if ( *(x+i) == a ) p = 1 ;
return p ;
}
cset cset::operator = ( cset &s) // перегрузка оператора присваивания
{ for ( int i=0 ; i<s.len ; i++)
(*this).x.[i] = s.x[i] ;
(*this).len = s.len ;
return (*this) ;
}
cset cset::operator ^ ( cset &s) // создание оператора пересечения множеств
{ int *sa = (int *) malloc ((*this).Getslen()*sizeof(int)) ;
int d = 0, n ;
for ( int i = 0 ; i<(*this).Getslen() ; i++)
{ n = (*this).Get(i) ;
if ( s.In (n) )
{ *(sa+d) = n ;
d++ ;
}
}
cset st ( sa, d ) ;
return st ;
}
main() // создание двух множеств s1 и s2 и нахождение их пересечения множества r
{ int sx1[] ={1, 2, 3, 4, 5} ;
int sx2[] ={2, 3, 4, 5, 6} ;
cset s1(sx1, 5) ;
cset s2(sx2, 5) ;
cset r = s1^s2 ;
for ( int i=0 ; i<r.Getsln() ;i++) // поэлементное распечатывание r
printf ( “\n%d “< r.Get( i) ) ;
getch() ;
}