Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

ЗАДАНИЕ 1. ПРОСТЕЙШИЕ КЛАССЫ И ОБЪЕКТЫ Цель задания ~ изучение приёмов объектного программирования с и

Работа добавлена на сайт samzan.net:


ЗАДАНИЕ 1.  ПРОСТЕЙШИЕ  КЛАССЫ  И  ОБЪЕКТЫ

Цель заданияизучение  приёмов объектного программирования с использованием классов, объектов, конструкторов, деструкторов.

Основные понятия

Класс представляет собой тип, определяемый пользователем, и в простейшем случае имеет вид:

сlass имя_класа{

//члены класса

};

Объект – это экземпляр класса или переменная типа класс. Класс задаёт целую категорию объектов

Список членов класса включает данные-члены (далее – данные), представляющие объект, и функции-члены (далее – функции), выполняющие действия над ними. Все объекты имеют общие функции, но каждый объект создаёт и поддерживает свои собственные данные.

По умолчанию все данные и функции класса являются закрытыми (private), т.е. доступны только в пределах класса. Чтобы сделать их доступными вне класса, используется модификатор public. Обычно данные класса объявляются как private, а функции – как public:

class Samp{

 int n, m;  // private-данные

public:

 init();    // public-функции

};

Для создания объекта испольуют имя класса как спецификатор типа данных:

Samp ob1;  // создание объекта ob1 класса Samp

Доступ к закрытым членам класса осуществляется через открытые функции класса. К открытым членам класса можно обращаться, используя имя объекта и операцию точка (.):

ob1.init();  // вызов функции init()

Функции класса определяют как обычные функции, но перед именем функции пишется имя класса и операция разрешения области видимости (::):

Samp::init(){ // определение функция init() класса Samp

    n = 10;    m = 20;

}

Определение функции класса может находиться и внутри описания класса. Такие функции называются inline-функциями.

Дружественные функции – это функции, которые не являются членами класса, но имеет доступ к закрытым членам класса (но только через объект). Отличительным признаком дружественной функции является ключевое слово friend. Дружественная функция задаётся и вызывается как обычная функция, может быть дружественной более чем одному классу, может быть членом одного класса и дружественной другому.

Конструктор – это специальная функция класса, которая вызывается автоматически при создании объекта и предназначена для его инициализации. Конструктор должен иметь тоже имя, что и класс, должен быть открытым членом класса, может быть перегружен, может иметь параметры, но не может возвращать значение, даже типа void. Если класс не содержит ни одного конструктора, конструктор по умолчанию создаётся компилятором как функция без параметров и с пустым телом.

Конструктор по умолчанию – это конструктор, который совсем не имеет параметров или у которого все параметры заданы как аргументы по умолчанию (их можно задавать только в прототипе конструктора внутри определения класса). Класс может иметь только один конструктор по умолчанию.

Деструктор – это функция класса, которая вызывается автоматически при удалении объекта. Имя деструктора начинается c символа тильды (~), непосредственно за которым следует имя класса. Деструктор не может иметь параметров, не может возвращать значение, его нельзя перегружать. Класс должен иметь только один деструктор или ни одного, в этом случае он создаётся компилятором как пустая функция (без параметров и с пустым телом).

Примеры выполнения задания

// Пример 1.1. Определение класса для нахождение суммы, произведения

// двух целых чисел, создание объекта, использование конструктора.

#include <iostream.h>

class Chisla{   // класс Chisla

 int a, b;   // данные a и b класса

public:

 Chisla(int x, int y); // конструктор с параметрами

 int sum();   // функция sum() – для выч. суммы

 int mult();   // функция mult() для выч. произведения

 show();   // функция show() – для вывода чисел

};

Chisla:: Chisla (int x, int y){ // определение конструктора

 a = x; b = y;   // инициализация a, b

}

int Chisla::sum(){   // определение функции sum()

 return a + b;

}

int Chisla::mult(){   // определение функции mult()

 return a * b;

}

Chisla::show(){   // определение функции show()

 cout<<" a = "<<a<<” b = “<<b<<endl;

}

main(){    // функция main()

 system (“cls”);   // для очистки экрана

 int n, m;

 int s, pr;

 cout<<"vvedi chisla: ";

 cin>>n>>m;    //ввод чисел

 Chisla ob(n, m);   // создание объекта ob типа Chisla

 ob.show();    // вызов функции show()

 s = ob.sum();   // вызов функции sum()

 pr = ob.mult();   // вызов функции mult()

 cout<<”summa = “<<s<<” mult = “<<pr<<endl;

// можно вызов функций вставлять в cout

//  cout<<”summa = “<<ob.sum()<<” mult = “<<ob.mult()<<endl;

 system(“pause”);   // задержка экрана

}

// Пример 1.2. Определение класса для нахождение суммы цифр

// заданного натурального числа.

#include <iostream.h>

class Cifra{    // класс Cifra

 long chislo;

 int sum;

public:

 Cifra(long n);   // конструктор

 summa();    // функция получения суммы цифр числа

 show();    // функция вывода суммы цифр числа

};

Cifra::Cifra(long n){  // определение конструктора

 chislo = n;    // инициализация переменной chislo

}

Cifra::summa(){   // определение функции summa()

 sum = 0;

 long rab = chislo;

 while(rab){    // цикл для выделения цифр числа

   sum = sum + rab % 10;  // и их суммирования

   rab = rab / 10;

 }

}

Cifra::show(){   // определение функции show()

 cout<<"summa cifr= "<<sum<<endl;

}

int main(){    // функция main()

 system (“cls”);

 long n;

 cout<<"vvedi chislo: ";

 cin>>n;     // например, введём 31456

 Cifra ob(n);    // создание объекта ob типа Cifra

 ob.summa();    // вызов функции summa()

 ob.show();    // summa cifr = 19

 system(“pause”);   // задержка экрана

 return 0;

}

// Пример 1.3. Определение класса для нахождения суммы цифр

// натуральных чисел из диапазона от n до m

#include <iostream.h>

class Cifra{

   long n, m;    // определение диапазона чисел

   int sum;

public:

   Cifra (long x, long y);  // конструктор

   summa();    // функция для суммы цифр числа

   show(int a);   // функция вывода суммы цифр числа

};

Cifra::Cifra(long x, long y){ // определение конструктора

   n = x; m= y;   // инициализация n, m

}

Cifra::summa(){  // определение функции summa()

 for(long i = n; i < m; i++){

   sum = 0;

   long rab = i;

   while(rab){     // цикл для выделения цифр числа

     sum=sum+rab%10;  // и их суммирования в реоеменной

     rab/=10;      // класса sum

   }

   show(i);

 }

}

Cifra::show(int i){  // определение функции show()

   cout<<"summa cifr chicla "<<i<<" = "<<sum<<endl;

}

int main(){    // функция main()

   long n, m;

   cout<<"vvedi chisla diapazona: ";

   cin>>n>>m;      //ввод чисел для диапазона

   Cifra ob(n, m);    // создание объекта ob типа Cifra

   ob.summa();   // вызов функции summa()

   system(“pause”);   // задержка экрана

   return 0;

}

// Пример 1.4. Определить, образуют ли цифры заданного натурального

// числа возрастающую последовательность. Создать класс.

#include <iostream.h>

class poslCifr{   // класс poslCifr

   int a;

public:   

   poslCifr(int n);

   show();

   vozr();

};

poslCifr:: poslCifr (int n){  // определение конструктора

  a = n;     // инициализация

}

poslCifr::show(){

cout<<" a= "<<a<<endl;

}

poslCifr::vozr(){

 int r = a;  int flag = 0;

 int cpr, csl;   // переменные для запоминания цифр

 cpr = r%10;  r = r / 10;

 while (r>0){

   csl = r%10;

   if(csl > cpr){flag = 1; break;}  // знак > так как выделение цифр

   r = r / 10;    // начинается с последней цифры

   cpr = csl;

 }

 if(flag == 0)cout<<"uporaydocheni"<<endl;

 else cout<<"no uporaydocheni"<<endl;

}

int main(){    // функция main()

   int chislo;

   cout<<"vvedi chislo: ";

   cin>>chislo;    //ввод числа

   poslCifr ob(chislo);  // создание объекта ob

   ob.show();    // вызов функции show()

   ob.vozr();    // вызов функции vozr()

   system("pause");   // задержка экрана

   return 0;

}

Постановка задания

Определить класс для решения задач вычислительного характера, предусмотрев в нём функции для инициализации, ввода, вывода данных класса, функции для доступа к членам класса и для работы с объектами данного класса. Написать программу, которая демонстрирует использование созданного класса.

Варианты контрольных заданий

  1.  Определить, сколько значащих цифр в натуральном числе n.

и найти сумму цифр числа, кратных k.

  1.  Для натурального числа n найти первую цифру и сумму всех его остальных цифр.
  2.  Найти среднее арифметическое цифр натурального числа n, отличных от заданной цифры k.
  3.  Определить количество и произведение цифр, меньших 5, используемых при записи натурального числа n.
  4.  По заданному натуральному числу n получить число m, записанное цифрами исходного числа в обратном порядке.
  5.  Выяснить, образуют ли цифры данного натурального числа n убывающую (возрастающую) последовательность.
  6.  Определить количество и произведение  нечётных цифр в натуральном числе n.
  7.  Определить максимальную цифру в натуральном числе n и подсчитать, сколько раз она в нём встречается.
  8.  Вычислить сумму цифр натурального числа n, находящихся на нечётных позициях, и произведение цифр, находящихся на чётных позициях (нумерация позиций идёт слева направо).
  9.  Найти все четырехзначные числа, сумма цифр которых равна заданному числу n.
  10.  Найти все четные четырехзначные числа, цифры которых следуют в порядке возрастания или убывания.
  11.  Получить все четырехзначные числа, в записи которых встречаются только цифры 0, 2, 3, 7.
  12.  Найти все четырёхзначные числа и подсчитать количество чисел, произведение цифр которых равна заданному числу k
  13.  Для двух натуральных чисел n и m найти наибольший общий делитель (НОД – максимальное число, на которое делятся без остатка оба числа), используя алгоритм Евклида (вычитаем из большего числа меньшее до тех пор, пока они не сравняются).
  14.  Найти наименьшее общее кратное (НОК) натуральных чисел n и m (НОК(n, m) = Abs(n * m) / НОД (n, m)).
  15.  Даны длины трёх отрезков a, b, c. Определить возможность построения треугольника и его вид (разносторонний, равнобедренный, равносторонний).
  16.  Для точки с координатами (x,  y) определить, находится ли она внутри треугольника с вершинами в (-2, 0), (2, 0), (0, 2) или нет, и выдать соответствующее сообщение.
  17.  Найти действительные корни квадратного уравнения, если заданы его коэффициенты.
  18.  Определить, является ли целое число простым. Число простое, если оно натуральное, больше единицы и делится только на 1 и на само себя.
  19.  Найти числа из диапазона [n, m], для которых куб суммы его цифр равен самому числу.
  20.  Найти сумму натуральных чисел из диапазона [n, m], в записи которых используются только цифры 3, 5, 7.
  21.  Найти все пятизначные числа и подсчитать  количество чисел, средняя цифра которых равна сумме крайних цифр.
  22.  Получить все пятизначные числа, в записи которых встречаются только цифры 0, 2, 3, 7.
  23.  Найти все числа-палиндромы на отрезке [n, m], при возведении которых в квадрат получают также числа-палиндромы. Число называется палиндромом, если его запись читается одинаково слева направо и справа налево, например 12321.
  24.  Если все цифры натурального числа n различны, то вывести сообщение “Да”, иначе – сообщение “Нет”.
  25.  Выяснить, есть ли в записи натурального числа n две одинаковые цифры и выдать соответствующее сообщение.
  26.  Выяснить, является ли разность максимальной и минимальной цифр заданного натурального числа n чётной, и выдать соответствующее сообщение.
  27.  Заменить в натуральном числе n все цифры 3 на цифру 5. Вывести изменённое число или сообщение “Нет”, если изменений не было.
  28.  Получить все натуральные числа, меньшие заданного числа n, в записи которых нет одинаковых цифр.
  29.  Даны натуральные числа n и m. Найти сумму k младших цифр числа n и k старших цифр числа m.
  30.  Определить, является ли число 2n+m симметричным, т. е. запись числа содержит чётное количество цифр и совпадают его левая и правая половинки.
  31.  Поменять местами k старших разрядов с k младшими разрядами заданного натурального числа n.
  32.  Заданное натуральное число n  разложить на простые множители и найти их количество и сумму.
  33.  Выяснить, есть ли в записи натурального числа n последовательность из k одинаковых цифр.
  34.  В заданном натуральном числе n найти наибольшую по длине возрастающую (убывающую) последовательность цифр.
  35.  Определить, сколько раз каждая десятичная цифра встречается в записи натурального числа n.
  36.  Заданное натуральное число n преобразовать так, чтобы его цифры следовали в порядке возрастания (убывания).
  37.  Перевести целое число n из десятичной системы счисления в двоичную, используя алгоритм деления на 2.
  38.  Перевести целое число n из десятичной системы счисления в шестнадцатеричную, используя алгоритм деления на 16.
  39.  Даны натуральные числа p и q. Найти все натуральные числа, меньшие p и взаимно простые с q. Взаимно простые числа – это два числа, для которых НОД равен единице.
  40.  Даны натуральные числа p и q. Найти все делители числа q, взаимно простые с p.
  41.  Среди натуральных чисел из диапазона [n, m] найти число с максимальной суммой своих простых делителей.
  42.  Дано натуральное число n > 13. Получить все пары простых чисел, разность между которыми равна 4, а сами числа меньше n.
  43.  Найти все простые числа, не превосходяшие заданное натуральное число n, двоичная запись которых представляет собой симметричную последовательность нулей и единиц (начинающуюся единицей).
  44.  Определить, является ли число n совершенным. Совершенное число n равно сумме всех своих делителей, не превосходящих n. Например, 6 = 1 + 2 + 3 или 28 = 1 + 2 + 4 + 7 + 14.
  45.  Найти все совершенные числа из диапазона натуральных чисел [n, m] (на сегодня известно 24 совершенных числа; все они чётные; четвёртое число не превышает значения 9999).
  46.  Два натуральных числа называют дружественными, если каждое из них равно сумме всех делителей второго не считая самого этого числа. Найти все пары дружественных чисел на отрезке [n, m].
  47.  Для заданного натурального числа n  найти все меньшие его автоморфные числа. Автоморфным называется число, совпадающее с младшими цифрами  своего квадрата, например, 52 = 25, 62 = 36, 252 = 625.

ЗАДАНИЕ 2.  МАССИВЫ  –  ЧЛЕНЫ   КЛАССА

Цель задания – получение практических навыков создания и использования классов в случае, когда членами класса являются мссивы.

Основные понятия

Массивы являются наиболее часто используемыми структурами данных, представляющими собой совокупность элементов одного и того же типа. Наиболее часто в программах применяются одномерные и двумерные массивы (матрицы), но язык С++ позволяет работать и с многомерными массивами.

Одномерный массив представляет собой совокупность однотипных элементов, имеющих одно имя (имя массива), при этом доступ к каждому элементу массива осуществляется по имени массива и индексу элемента. Индекс первого элемента всегда 0, далее следуют 1, 2, и т.д.

int b[10];     // объявление массива b из 10 целых чисел

int a[5] = {1, 2 ,3, 4, 5}; // объявление и иинициализация массива

int c = a[2];   // c = 3

for(int i = 0; i < 5; i++) // доступ к элементам массиваa удобнее

 cout<<a[i]<<’ ‘;  // всего осуществлять, пользуясь циклом for

//  или  *(a+i), т. к. имя массива является указателем на начало массива

Любой доступ к элементу массива, осуществляемый индексированием, может быть выполнен с помощью указателя. При этом обычно программа работает быстрее, а во многих случаях имеет место экономия памяти. Адресация элементов массива с помощью указателей выполняется следующим образом:

int  a[4];    int  *pa;  // указатель pa на тип int

pa = a;    // pa присваивается адрес массива a

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

 cout<<*pa++<<’ ‘; // доступ к элементам массива

// или cout<<*(pa+i); или cout<<pa[i];

Отметим, что прибавление к указателю единицы обеспечивает переход к следующему элементу массива, а также то, что имя массива является константным указателем, поэтому его нельзя изменять, но можно присваивать указателям соответствующего типа.

Чаще всего одномерные массивы используются для создания символьных строк. В С++ строка определяется как массив значений типа char, который завершается нулевым символом (‘\0’). Доступ к элементам строки осуществляется так же, как доступ к элементам любого массива.

char[] = “123456”;    // инициализация строки

gets(str);     // ввод строки

cout<<"stroka== "<<str<<endl;  // вывод строки

for(i = 0; str[i]; i++);

  cout<<str[i];    // доступ к элементам строки

Двумерный массив (матрица) – представляет собой массив одномерных массивов. Каждый элемент массива имеет два индекса – номер строки и номер столбца, которые указываются в отдельных квадратных скобках. Например:

int b[3][4];   // объявление двумерного массива

int a[2][2] = {{1, 2},  // явная инициализация 0-й строки

{3, 4}};  // явная инициализация 1-й строки

for(int i = 0; i < 3; i++) // запонение и обработку матриц производят,

  for(int j = 0; j < 4; j++) // пользуясь вложенными циклами

     cout<<a[i][j]<<’ ‘;  // доступ к элементам массива или *(a[i]+j)

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

Динамические массивы – это массивы, для которых выделяется память и определяется размер во время выполнения программы. Создаётся динамический массив с помощью операции new и указателя. После завершения использования массива выделенную под массив память освобождают с помощью операции delete. Явно инициализировать динамические массивы нельзя.

Создание одномерного динамического массива:

int n;   cin>>n;  // ввод размерности массива n

int *p;    // объявление указателя p на целый тип

p= new int[n];  // выделение памяти для массива

delete [] p;   // удаление выделенной памяти

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

 cout<<p[i]<<’ ‘;  // доступ к элементам массива с индексом i

    // или *(p+i)

Если с помощью операции new невозможно выделить требуемый объём памяти, то операция new возвратит нулевой указатель. ого массива с индексом i допускаются выражения.

Создание динамической строки :

char *pstr; cin>> len;

pstr = new char[len];

delete [] pstr;   // удаление строки

Создание двумерного динамического массива из n строк и m столбцов:

int n, m;  int ** p;  // указатель p на массив указателей

cin>>n; cin>>m;

p = new *int[n];  // память под массив указателей на строки

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

 p [i] = new int[m];  // выделение памяти для каждой строки

for(int i = 0; i < 3; i++) // доступа к элементам массива

  for(int j = 0; j < 4; j++)

     cout<< p [i][j]<<’ ‘ // или *( p [i] + j) или   *(*( p + i) + j)

Удаление двумерного динамического массива происходит в несколько этапов:

for(int i = 0; i < n; i++) // удаление одномерных массивов (строк)

 delete [] p[i];

delete [] p;  // удаление массива указателей на строки

Следует помнить, что выделенная память для двумерного динамического массива не представляет собой сплошной участок, поскольку она выделяется несколькими операциями new.

Примеры выполнения задания

// Пример 2.1. Определение класса для работы с одномерным массивом

// (статическим). Нахождение суммы элементов массива.

#include <iostream.h>

const int max_n = 50;

class Massiv{ // определение класса Massiv

 int a[max_n]; // объявление массива a

 int n;   // размерность массива

 int sum;  // сумма элементов массива

public:

 Massiv(int k); // конструктор с параметром

 summa();  // функция нахождение суммы элементов массива

 show();  // функция вывода массива

};

Massiv::Massiv(int k){  // определение конструктора

 n = k;     // инициализация n

 for(int i = 0; i < n; i++)  // инициализация массива

   a[i] = random(n);   // случайными числами

}

Massiv::summa(){   // определение функции summa()

 sum = 0;

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

   sum = sum + a[i];

}

Massiv::show(){   // определение функции show()

 cout<<"Massiv a: ";

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

   cout.width(4);    cout<<a[i]<<" ";

 }

 cout<<endl;

 cout<<"Summa elementov massiva a= "<<sum<<endl;

}

main(){

 int kol;

 cout<<"Vvedi chislo elementov:";  cin>>kol;

 Massiv ob(kol);  // создание объекта ob типа Massiv

 ob.summa();  // вызов функции summa()

 ob.show();   // вызов функции show()

 system("pause");  // задержка экрана

}

Результат:

Vvedi chislo elementov:6

massiv a: 2 4 0 2 0 0

Summa elementov massiva a = 8

// Пример 2.2. Определение класса для работы с одномерным массивом

// (динамическим). Нахождение суммы элементов массива.

#include <iostream.h>

class Massiv{  // определение класса Massiv

 int n;

 int *p;   // указатель на тип int

 int sum;

public:

 Massiv(int k);  // конструктор

 ~Massiv(){delete [] p;} // деструктор определён в классе

 summa();

 show();

};

Massiv::Massiv(int k){ // определение конструктора

 n = k;    // инициализация n

 p = new int[n];  // выделение динамической памяти под массив

 if(!p){

   cout<<"no memory"<<endl;

   exit(1);

 }

 for(int i = 0; i < n; i++)  // инициализация массива

   p[i] = random(n);

}

Massiv::summa(){  // определение функции summa()

 sum = 0;

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

   sum = sum + p[i];

}

Massiv::show(){  // определение функции show()

 cout<<"Massiv=="<<endl;

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

  cout.width(4);

  cout<<p[i]<<" ";

 }

 cout<<"\n Summa elementov massiva = "<<sum<<endl;

}

main(){

 int kol;

 cout<<"Vvedi chislo elementov:";     cin>>kol;

 Massiv ob(kol);  // создание объекта ob типа Massiv

 ob.summa();

 ob.show();

 system("pause");  // задержка экрана

}

Результат:

Vvedi chislo elementov:7

Massiv==

3 2 1 4 4 0 1 6

Summa elementov massiva = 21

// Пример 2.3. Определение класса для работы с двумерным статическим // массивом. Нахождение максимального элемента в каждой строке.

#include <iostream.h>

const int max_n = 10;

class Matr{   // определение класса Matr

 int a[max_n][max_n];  // матрица a

 int b[max_n];  // одномерный массив b

 int n;    // число строк в матрице a

 int m;    // число столбцов в матрице a

public:

 Matr(int k, int l);  // конструктор

 max_strok();  // функция поиска максимального элемента

 show_matr();  // функция вывода матрицы

 show_mas();  // функция вывода массива

};

Matr::Matr(int k, int l){  // определение конструктора

 n = k;  m = l;

 for (int i = 0;i < n; i++)  // инициализация матрицы

   for (int j = 0; j < m; j++)

     a[i][j] = random(n*m);

}

Matr::max_strok(){  // определение функции max_strok()

 int max;

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

   max = a[i][0];

   for (int j = 0; j < m; j++)

    if( a[i][j] > max) max = a[i][j];

   b[i] = max;   // максимальный элемент cтроки –> b[i]

 }

}

Matr::show_matr(){ // определение функции show_matr()

 cout<<"Matrix== "<<endl;

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

   for (int j = 0; j < m; j++){

     cout.width(4);   cout<<a[i][j]<<" ";

   }

   cout<<endl;

 }

}

Matr::show_mas(){  // определение функции show_mas()

 cout<<"Massiv b== "<<endl;

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

     cout<<b[i]<<" ";

 cout<<endl;

}

main(){   // функция main()

 int n, m;

 cout << "Vvedi kolichestvo strok i stolbcov ";  cin>>n>>m;

 Matr ob(n, m);  // создание объекта ob типа Matr

 ob.show_matr();

 ob.max_strok();    ob.show_mas();

 system("pause");  // задержка экрана

}

Результат:

Vvedi kolichestvo strok i stolbcov: 3 4

Matrix==

  2   1   0   2

  0   0   0   0

  0   2   2   0

Massiv b==

  2   0   2

// Пример 2.4. Определение класса для работы с динамическим

// двумерным массивом. Использование деструктора.

#include <iostream.h>

#include <stdlib.h>

class Matr{

   int **a;   // указатель на массив указателей

   int n, m;   // размерности матрицы

public:

   Matr(int k, int l);  // конструктор

   ~Matr();   // деструктор

   void show_matr(); // функция вывода матрицы

};

Matr::Matr(int k, int l){  // определение конструктора

 n = k;  m = l;

 a = new int*[n];   // память под массив указателей

 if(a == NULL){

  cout<<"No memory"<<endl;

  exit(1);

 }

 for(int i = 0;i < n; i++){  // цикл для выделения памяти

   a[i] = new int[m];  //  для каждой строки матрицы

   if(a[i] == NULL){

     cout<<"No memory"<<endl;

     exit(1);

   }

   for(int j = 0; j < m; j++)  // заполнение i-ой строки

     *(a[i]+j) = random(100); // или a[i][j] = random(100);

 }

}

Matr::~Matr(){   // определение деструктора

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

   delete [] a[i];   // удаление строк

 delete [] a;    // удаление массива указателей

}

void Matr::show_matr(){  // определение show_matr()

 cout<<"Matrix== "<<endl;

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

  for (int j = 0; j < m; j++){

   cout.width(4);

   cout<<a[i][j]<<" ";

  }

 cout<<endl;

  }

}

main(){

 int n, m;

 cout<<"Vvedi n, m: ";  cin>>n>>m;

 Matr ob(n, m);  // создание объекта ob типа Matr

 ob.show_matr();  // вызов функции show_matr()

   system("pause");  // задержка экрана

}

Результат:

Vvedi n, m: 3 4

Matrix==

 40  20  12  76

 88  72  92  12

 13  60  77  19

// Пример 2.5. Определение класса для работы с символьным массивом

#include <iostream.h>

class Stroka{

   char* str;

   int len;

public:

   Stroka (char* s);

void show();

};

Stroka::Stroka(char* s){

   len=strlen(s);

   str=s;

   str[0]='x';

}

void Stroka::show(){

   cout<<"str== "<<str<<endl;

   cout<<"len== "<<len<<endl;

}

main(){

   char s[11];

   cout<<" Vvedi stroku"<<endl;

   gets(s);

   cout<<" v main stroka=="<<s<<endl;

//    strcpy(s, "1234566");

    Stroka ob(s);

    ob.show();

   system("pause");  // задержка экрана

}

// Пример 2.6. Определение класса для работы с

// динамическим символьным массивом

#include <iostream.h>

class Stroka{

   char* str;

   int len;

public:

   Stroka (char* s);

   ~Stroka();

   show();   

};

Stroka::Stroka(char* s){

   len = strlen(s);

   str=new char[len+1];

   strcpy(str, s);

   str[0] = 'x';

}

Stroka::~Stroka(){

delete []str;

}

Stroka::show(){

   cout<<"show str== "<<str<<endl;

   cout<<"show len== "<<len<<endl;

}

main(){  

   int n = 10;

   char *s = new char[n];

   cout<<"vvedi stroku: ";

   gets(s);

//   strcpy(s, "1234566");

    Stroka ob(s);

    ob.show();

    cout<<"v main s== "<<s<<endl;

    delete []s;

   system("pause");

}

Постановка задания

Определить класс для решения задач, использующих одномерные массивы или двумерные массивы предусмотрев в нём функции для инициализации, ввода, вывода переменных, массивов, объявленных в классе, функции для доступа к членам класса и для работы с объектами данного класса. Написать программу, которая демонстрирует использование созданного класса для работы с одномерными массивами или двумерными массивами (статическими, динамическими).

Варианты контрольных заданий

Одномерные   МАССИВЫ  члены класса

  1.  В массиве А(N) определить количество пар одинаковых соседних элементов и количество перемен знаков.
  2.  В массиве А(N) поменять местами первый положительный и последний отрицательный элементы, а также найти сумму элементов, стоящих между ними.
  3.  В массиве А(N) найти максимальное и минимальное отклонения значений элементов от их среднего значения.
  4.  В массиве А(N) найти номер элемента, сумма которого со следующим за ним элементом максимальна, и номер элемента, сумма которого с предыдущим элементом минимальна.
  5.  В массиве А(N) найти минимальный из положительных элементов и максимальный из отрицательных элементов.
  6.  В массиве А(N) найти первый отрицательный элемент, предшествующий максимальному элементу, и последний положительный элемент, стоящий за минимальным элементом.
  7.  В массиве А(N) найти сумму элементов, расположенных между первым и вторым нулевыми элементами.
  8.  В массиве А(N) поменять местами последний отрицательный элемент с максимальным элементом.
  9.  В массиве А(N) найти максимальный элемент среди четных элементов и минимальный элемент среди нечетных элеметов.
  10.  В массиве А(N) все четные элементы заменить максимальным элементом, а нечетные минимальным элементом.
  11.  В массиве А(N) найти первый отрицательный элемент, кратный заданному числу р, заменить его индексом и поставить в начало массива.
  12.  В массиве А(N) выбрать все элементы, встречающиеся один раз.
  13.  В массиве А(N) выбрать без повторений все элементы, встречающиеся более одного раза.
  14.  В массиве А(N) подсчитать количество различных элементов.
  15.  В массиве А(N) найти максимальный из элементов, встречающихся в массиве только по одному разу.
  16.  В массиве А(N) найти наименьшее количество элементов, которые надо удалить из данного массива, чтобы осталась возрастающая последовательность.
  17.  Из всех участков массива А(N), сплошь состоящих из нулей, выбрать самый длинный и отметить индексы его начала и конца.
  18.  В массиве А(N) найти наибольшую по длине возрастающую последовательность чисел и определить её длину.
  19.  В массиве А(N) найти последовательность наибольшей длины из знакочередующихся элементов и отметить индексы её начала и конца.
  20.  В массиве А(N) найти наименьшую по длине убывающую последовательность чисел и отметить индексы её начала и конца.
  21.  Преобразовать заданный массив A(N) натуральных чисел так, чтобы цифры каждого его элемента были записаны в обратном порядке.
  22.  В массиве А(N) переставить элементы, стоящие на нечётных местах с элементами, стоящими на чётных местах.
  23.  Удалить из массива А(N) элементы, стоящие за первым максимальным элементом, количество цифр которых равно заданному k.
  24.  Из массива А(N) удалить все отрицательные элементы, стоящие перед первым наименьшим элементом.
  25.  Удалить из массива А(N) элементы, стоящие между первым максимальным элементом и последним отрицательным элементом.
  26.  Из массива А(N) удалить все четные положительные элементы, стоящие после первого максимального элемента.
  27.  Из массива А(N) удалить все элементы, стоящие между первым минимальным и последним максимальным элементами.
  28.  Удалить из массива A(N) последнюю группу элементов, представляющих собой знакочередующийся ряд.
  29.  Преобразовать  заданный массив A(N), оставив из всех цепочек идущих подряд одинаковых элементов только один такой элемент.
  30.  В массив А(N) вставить после первого максимального элемента k наименьших элементов.
  31.  В массив А(N) вставить максимальный элемент после каждого четного отрицательного элемента.
  32.  В массив А(N), упорядоченный по возрастанию, вставить k различных чисел, не нарушая упорядоченности.
  33.  Для каждого из элементов массива А(N) определить число его вхождений в массив.
  34.  Элемент называется локальным минимумом (максимумом), если у него нет соседа, меньшего (большего), чем он сам. Найти все локальные минимумы и максимумы в заданном массиве A(N).
  35.  Элементы массива А(N) упорядочить в порядке возрастания или убывания в зависимости от признака.
  36.  Получить из двух упорядоченных по возрастанию массивов третий массив, также упорядоченный по возрастанию.
  37.  В массиве А(N) встречаются лишь числа от 1 до 20. Упорядочить элементы массива в порядке частоты встречаемости чисел.
  38.  Если максимальный элемент массива А(N) число четное, то все элементы, стоящие за ним , расположить в порядке возрастания.
  39.  Все положительные элементы массива А(N), значения которых находятся в заданных пределах, примкнуть к последнему максимальному элементу, расположив по убыванию.
  40.  Положительные элементы массива А(N) переставить в конец массива и расположить в порядке убывания.
  41.  Отрицательные элементы массива А(N) переставить в начало массива и расположить в порядке возрастания.
  42.  В целочисленном массиве А(N) элементы массива, являющиеся простыми числами, расположить в порядке возрастания.
  43.  В массиве А(N) найти последовательность максимальной длины из элементов, которые имеют чередующиеся знаки и расположены по возрастанию модулей.
  44.  Умножить два целых больших числа. Для таких чисел вещественный тип неприемлем, а типа long int недостаточно, так как в числе больше 10 цифр. Для хранения такого числа предлагается использовать одномерный массив, каждый элемент которого представляет собой одну десятичную цифру числа. Цель задания – получение практических навыков создания и использования классов в случае, когда членами класса являются двумерные массивы.

Двумерные   МАССИВЫ  –  члены класса

  1.  В массиве А(N, M) найти:
  2.  среднее арифметическое элементов по периметру;
  3.  номер строки с максимальным числом нулей;
  4.  максимальный элемент строк, не содержащих нулей;
  5.  сумму элементов столбцов, содержащих хотя бы один ноль.
  6.  В массиве А(N, M) найти количество строк, элементы которых  образуют арифметическую прогрессию.
  7.  Строки массива А(N, M), не содержащие положительных элементов, заменить нулевыми элементами.
  8.  В массиве А(N, M) подсчитать количество строк и столбцов, составленных из попарно различных чисел.
  9.  В массиве А(N, М) найти минимум среди сумм элементов диагоналей, параллельных главной диагонали и максимум среди сумм элементов диагоналей, параллельных побочной диагонали.
  10.  В массиве А(N, М) найти индекс строки, среднее арифметическое положительных элементов которой является наименьшим.
  11.  В массиве А(N, М) найти сумму тех элементов, в записи которых используются только цифры 0, 1, 2, 3.
  12.  В массиве А(N, М) найти сумму элементов тех столбцов, все элементы которых кратны заданному числу р.
  13.  В матрице А(N, N) найти первую строку, не содержащую отрицательных элементов, и умножить ее как вектор на матрицу А.
  14.  В массиве А(N, М) найти строку и столбец, для которых количество перемен знаков максимально.
  15.  В массиве А(N, N) найти максимальную сумму среди сумм элементов диагоналей, параллельных главной диагонали.
  16.  В массиве А(N, N) поменять местами максимальные элементы нижнего и верхнего треугольников относительно главной диагонали.
  17.  Минимальные элементы строк массива А(N, М), не содержащих отрицательных элементов, заменить произведением их индексов.
  18.  В массиве А(N, М) найти максимальный и минимальный элементы среди элементов тех строк, которые упорядочены по возрастанию или по убыванию.
  19.  В массиве А(N, М) заменить на обратные величины максимальные элементы строк, не содержащих четных элементов.
  20.  В массиве А(N, М) сменить знаки элементов строки и столбца, на пересечении которых находится минимальный элемент.
  21.  В массиве А(N, М) минимальный элемент каждого столбца заменить суммой положительных элементов этого же столбца.
  22.  Элементы столбцов целочисленного массива А(N, М), не содержащих положительных элементов, заменить суммой их цифр.
  23.  В каждой строке массива А(N, М) сменить знаки элементов, находящихся между первым и последним максимальными элементами данной строки.
  24.  В массиве А(N, М) сменить знаки минимальных элементов столбцов, не содержащих отрицательных элементов.
  25.  В массиве А(N, М) поменять местами столбцы, содержащие максимальное и минимальное количество чётных элементов.
  26.  В каждой строке массива А(N, М) найти и удалить максимальные  и минимальные элементы.
  27.  В массиве А(N, М) удалить столбец с минимальным произведением элементов и строку с максимальной суммой элементов.
  28.  В массиве А(N, M) расположить столбцы в порядке убывания их минимальных элементов.
  29.  массиве А(N, М) упорядочить элементы каждой строки верхнего треугольника по возрастанию, нижнего по убыванию, диагональные элементы оставить без изменения.
  30.  В массиве А(N, M) расположить строки так, чтобы сначала шли строки, у которых положительных элементов больше, чем отрицательных, затем с одинаковым числом положительных и отрицательных элементов и последними, чтобы шли строки, имеющие положительных элементов меньше, чем отрицательных.
  31.  В массиве А(N, M) часть строк состоит из нулей. Переместить нулевые строки в конец массива.
  32.  В массиве А(N, M) расположить строки в порядке возрастания элементов главной диагонали (побочной диагонали).
  33.  В массиве А(N, M) элементы строк, начинающихся с отрицательного элемента,  расположить  в порядке возрастания.
  34.  В массиве А(N, М) элементы столбцов, не содержащих нулевых элементов, расположить в порядке убывания.
  35.  В массиве А(N, М) расположить строки в порядке возрастания их максимальных элементов.
  36.  В массиве А(N, М) расположить столбцы в порядке возрастания количества перемен знаков в каждом столбце.
  37.  В массиве А(N, М) строки с нечётными индексами упорядочить по убыванию, а с чётными – по возрастанию.
  38.  В массиве А(N, М) строку с максимальным количеством знакочередующихся элементов поменять местами с первой строкой.
  39.  массиве А(N, N), где N четное, переставить друг с другом центрально-симметричные квадраты.
  40.  В массиве А(N, M) переставить строки в порядке убывания количества содержащихся в них положительных элементов.
  41.  В каждой строке массива А(N, М) найти максимальный из элементов, встречающихся в строке только один раз.

ЗАДАНИЕ 3.  МАССИВЫ   ОБЪЕКТОВ,   УКАЗАТЕЛИ

Цель задания – изучение приёмов объектного программирования для работы с массивами объектов, указателями на объекты и массивы объектов.

Основные понятия

Массив объектов создаётся аналогично массиву переменных стандартного типа:

myClass  a[4]; // одномерный массив объектов a типа myClass

myClass  b[2][4]; // двумерный массив объектов b типа myClass

Если класс содержит конструктор, массив объектов может быть проинициализирован, причём конструктор будет вызван столько раз, сколько элементов содержит массив:

myClass ob[4] = {1, -2, 5, 6};

Известно, что доступ к членам объекта осуществляется с помощью операции “точка” (.). Однако доступ к члену объекта можно получить и через указатель на этот объект. В этом случае используется операция стрелка (->):

myClass ob;  // объект типа myClass

myClass *uk;  // указатель на тип myClass

uk = &ob;  // указателю присваивается адрес объекта ob

ob.set(10);  // вызов функции через операцию “точка”

uk–>set(10);  // вызов функции через операцию “стрелка”

При работе с массивом объектов также можно использовать указатели:

myClass ob[5]; // массив объектов типа myClass

myClass *p;  // указатель на тип myClass

p = ob;   // указатель на нулевой элемент массива объектов ob

p++;   // указатель на следующий элемент массива

p--;   // указатель на предыдущий элемент массива

С++ содержит специальный указатель this, который автоматически передаётся любой функции класса при её вызове и указывает на объект, генерирующей вызов. При этом  *this представляет сам объект. Дружественным функциям указатель this не передаётся.

Динамический объект можно создать с помощью указателя и операцию new:

Samp*uk = new Samp(4, 6);

При размещении объекта автоматически вызывается его конструктор, и объекту передаются значения 4 и 6.

Для разрушения динамического объекта используется операция delete, который может помещаться в деструкторе:    delete uk;

Динамический массив объектов создаётся аналогично обычному динамическому масcиву:

Samp *p;  // указатель на тип Samp

p = new Samp[4]; // одномерный динамический массив объектов

Конструктор будет вызван четыре раза, если он присутствует в классе.

Динамический массив объектов нельзя явно инициализировать, поэтому наряду с другими конструкторами в классе должен присутствовать конструктор по умолчанию.

Для освобождения памяти, занимаемой динамическим массивом объектов, используется  операция delete. Например, для удаления динамически размещённого одномерного массива объектов следует использовать следующую форму операции delete:

delete [ ] p;

Постановка задания

Определить класс, предусмотрев в нём функции для инициализации, ввода, вывода переменных членов класса, функции для доступа к членам класса. Сформировать динамический массив объектов данного класса и определить функции для работы с созданным массивом. Написать программу, которая с помощью меню демонстрирует использование функций созданного класса.

Примеры выполнения задания

// Пример 4.1. Создается класс Student. Формируется динамический массив

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

// сформированный список студентов; список студентов заданного факультета;

// список студентов для заданных факультета и курса.

#include <cstring.h>

#include <iostream.h>

#include <iomanip.h>

struct date{    // структура - дата рождения

 int mon;

 int year;

};

const size=10;

class Student{    // класс Student

  char fam[size];

  date t;

  char fac[size];

  int kurs;

public:

  Student();

  char* getfac();

  int   getkurs();

  show();

};

Student::Student(){

      cout << "Input fam\n";      cin >> fam;

      cout << "Input date of birthday\n";

      cout << "Month:" << endl;   cin >> t.mon;

      cout << "Year:" << endl;    cin >> t.year;

      cout << "Input facultet\n"; cin >> fac;

      cout << "Input kurs\n";     cin >> kurs;

}

//=======     show    =================

Student::show(){

cout<<"| "<<setw(9)<<fam<<"  | "<<setw(4)<<t.mon<<"    |  ";

cout<<setw(5)<<t.year<<" | "<<setw(4)<<fac<<"  | "<<setw(2);

cout<<kurs<<" |"<<endl;

}

//=======     getfac    =================

char* Student::getfac(){

     return fac;

}

//=======     getkurs    =================

int Student::getkurs(){

     return kurs;

}

vivod(Student *spis, int n); // вывод списка студентов

spisfac(Student *spis,int n);  // список студентов заданного факультета

spisfackurs(Student *spis,int n);//  список студ. заданных фак. и курса

shapka();

main(){

 Student *spis;

 int n, q;

 cout<<"Input a number of students: "<< endl; cin>>n;

 spis = new Student[n];          //динамический массив объектов

 while(true){

//    system("cls");

   cout<<"viberite nomer comandi(1-4)"<<endl;

   cout<<"1-write display "<<endl;

   cout<<"2-spisok  fakulteta "<<endl;

   cout<<"3-spisok  fakulteta i kursa"<<endl;

   cout<<"4-vixod"<<endl;

    cin>>q;

   switch(q)

   {

     case 1:vivod  (spis,n);break;

     case 2:spisfac(spis,n);break;

     case 3:spisfackurs(spis,n);break;

     case 4:exit(1);

   }

 }

    cout << "Press any key !" << endl;

    delete [] spis;

    system("pause");

}

//=====вывод шапки=====

shapka(){

cout<<"|--------------------------------------------|"<<endl;

cout<<"|   Family   |  month  |  year  |  fac  |kurs|"<<endl;

cout<<"|--------------------------------------------|"<<endl;

}

//=====список всех студентов==========================

vivod(Student *spis, int n){

  shapka();

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

   spis[i].show();

}

//=======список студентов заданного факультета========

spisfac(Student *spis, int n){

     int i;

     char fac[size];

     cout<<"vivod studentov zadannogo faculty"<<endl;

     cout << "Input faculty" << endl;

     cin >> fac;

     shapka();

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

      if(strcmp(spis[i].getfac(),fac)==0)spis[i].show();

}

//=======список студентов заданных факультета и курса==

spisfackurs(Student *spis, int n){

    int i,k;

    char fac[size];

     cout<<"vivod studentov zadannogo faculty i course"<<endl;

     cout << "Input faculty" << endl;

     cin >> fac;

     cout << "Input the course" << endl;

     cin >> k;

     shapka();

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

       if ((strcmp(spis[i].getfac(),fac)==0)&&(spis[i].getkurs()==k))

           spis[i].show();

}

Варианты контрольных заданий

Abiturient: Фамилия, Имя, Отчество, Адрес, Оценки. Вывести:

  1.  список абитуриентов, имеющих неудовлетворительные оценки;
    1.  список абитуриентов, средний балл у которых выше заданного;
    2.  список абитуриентов, средний балл у которых ниже заданного;
    3.  список абитуриентов в алфавитном порядке.

Aeroflot: Номер рейса, Пункт назначения, Время вылета, Информация о наличии свободных мест. Вывести:

  1.  информацию об указанном рейсе;
    1.  список рейсов и время вылета для заданного пункта назначения;
    2.  билет для пассажира, если есть свободные места на указанный рейс, или предложить другой рейс, если на этот рейс нет билетов.

Automobile: Марка автомобиля, Год выпуска, Номер, Фамилия владельца.  Вывести:

список автомашин не старше заданного года выпуска;

список автомашин заданной марки, упорядочив его по году выпуска (фамилии владельца).

сведения об автомашинах в алфавитном порядке.

Boots: Артикул, Наименование, Размер, Количество пар, Стоимость одной пары. Артикул начинается с буквы D для дамской, с М – для мужской, с С – для детской обуви.  Вывести:

информацию о наличии и стоимости обуви артикула ХХ;

списки дамской, мужской и детской обуви заданного размера, имеющиеся в наличии, и число пар каждой модели;

список наименований всей обуви в алфавитном порядке.

Book: Автор, Название, Издательство, Год.  Вывести:

  1.  список книг заданного автора в алфавитном порядке;
  2.  список книг, выпущенных заданным издательством;
  3.  список книг, выпущенных после заданного года.

Bus: Фамилия водителя, Номер автобуса, Номер маршрута, Марка, Год начала эксплуатации. Вывести:

  1.  список автобусов для заданного номера маршрута;
  2.  список автобусов, которые эксплуатируются больше 10 лет;
  3.  список водителей в алфавитном порядке.

Bus: Номер автобуса, Фамилия водителя, Возраст водителя, Номер маршрута.Вывести:

списки автобусов, находящихся в парке, и автобусов, находящихся на маршруте, упорядочив их в порядке возрастания номеров автобусов (номеров маршрутов);

средний возраст водителей автобусного парка и фамилии самого старшего и самого младшего водителей;

список водителей в алфавитном порядке и их возраст.

Baggage: Фамилия пассажира, Количество мест багажа и Вес каждого места багажа. Вывести:

список пассажиров в алфавитном порядке;

фамилию пассажира с наибольшим количеством мест багажа;

фамилию пассажира с наименьшим весом багажа.

Bank: Номер филиала сбербанка, Номер лицевого счёта вкладчика, Фамилия вкладчика, Размер вклада.  Вывести:

для каждого филиала списки вкладчиков, упорядоченные по алфавиту и по сумме вклада

для каждого филиала справку об общей сумме вкладов и средний размер вклада.

Customer: Фамилия, Имя, Отчество, Адрес, Телефон, Номер кредитной карточки.  Вывести:

список покупателей в алфавитном порядке;

список покупателей, у которых номер кредитной карточки находится в заданном интервале.

Contest: Название страны, Вид спорта, Фамилия и Имя призёра, Тип медали (золото, серебро, бронза). Вывести:

список призёров страны NNN в алфавитном порядке;

список призёров, упорядоченный по названию страны;

списки призёров мужчин и женщин по типу медали.

Championship: Название команды, Количество забитых мячей, Количество пропущенных мячей, Количество выигрышей. Вывести:

список команд  в порядке убывания забитых мячей;

список команд  в порядке убывания количества выигрышей;

File: Имя файла, Тип файла, Дата создания, Количество обращений к файлу. Вывести:

список файлов (имя, тип), созданных ранее указанной даты;

список файлов, упорядоченный по имени (типу, дате создания, количеству обращений);

список файлов заданного типа по возрастанию количества обращений к ним.

House: Фамилия владельца, Адрес, Этаж, Количество комнат, Площадь. Вывести:

список квартир, имеющих заданное число комнат;

список квартир, отсортированный по размеру площади;

список жильцов в алфавитном порядке;

список жильцов, имеющих площадь, превосходящую заданную.

Library: Шифр темы, Шифр книги, Фамилия автора, Название книги, Год издания.  Вывести:

список книг по заданной теме, выпущенных после заданного года издания;

список книг заданного автора в порядке возрастания года издания;

список книг для заданного года издания, расположив в алфавитном порядке фамилии авторов.

Phone: Фамилия, Адрес, Номер, Время междугородних разговоров.  Вывести:

  1.  сведения об абонентах, пользовавшихся междугородней связью;
  2.  список  абонентов в алфавитном порядке.

Phone: Фамилия абонента, Адрес, Номер телефона. Вывести:

список абонентов в порядке возрастания номеров телефонов;

список жильцов, фамилии которых начинаются на заданную букву, имеют телефон в доме, адрес которого вводится;

список телефонов, начинающихся с цифры Х.

Person: Фамилия, Адрес, Образование, Год рождения. Вывести:

  1.  список граждан, возраст которых превышает заданный;
  2.  список граждан с высшим образованием;
  3.  список граждан в алфавитном порядке.

Product: Наименование, Цена, Срок хранения. Вывести:

  1.  список товаров для заданного наименования;
  2.  список товаров для заданного наименования, цена которых не превосходит заданную;
  3.  список товаров, срок хранения которых больше заданного.

Student: Фамилия, Имя, Отчество, Адрес, Факультет, Курс. Вывести:

  1.  список студентов заданного факультета;
    1.  список студентов заданного курса;
    2.  списки студентов для заданных факультета и курса.

Student: Фамилия и Имя студента, Курс, Группа, Оценки, полученные в сессию. Вывести:

для каждого курса список отличников в алфавитном порядке

для заданного курса список студентов в порядке убывания среднего балла.

для заданных курса список студентов, имеющих неудовлетворительные оценки;

список студентов, сдавших все дисциплины.

Student: Фамилия и Имя студента, Курс, Группа, Место проживания. Вывести:

список студентов в алфавитном порядке, проживающих в общежитии;

список студентов по курсам, нуждающихся в общежитии;

для каждого курса и группы список и количество студентов, проживающих в своей квартире, в общежитии и на квартире.

Student: Фамилия и Имя студента, Курс, Группа, Оценки, полученные в сессию.  Вывести:

список студентов заданного курса и группы, имеющих неудовлетворительные оценки;

список студентов заданного курса, средний балл которых больше четырёх, упорядочив их по алфавиту.

Swimming: Номер заплыва, Дистанция, Фамилия участника и Время. Вывести:

  1.  список участников всех заплывов в алфавитном порядке;
  2.  список участников каждого заплыва, упорядоченный в порядке убывания результатов заплыва;
  3.  среднее время во всех заплывах и в каждом заплыве определить трёх победителей.

Train: Пункт назначения, Номер поезда, Время отправления, Число общих мест, Купейных, Плацкартных. Вывести:

  1.  список поездов, следующих до заданного пункта назначения, упорядоченный по номеру поезда;
  2.  список поездов, следующих до заданного пункта назначения и отправляющихся после заданного часа;
  3.  список поездов, следующих до заданного пункта назначения и имеющих общие места (купейные, плацкартные).

Worker: Шифр цеха, Фамилия рабочего, Пол, Год рождения, Образование, Год поступления на работу. Вывести:

список работников моложе 35 лет, не имеющих среднего образования;

для каждого цеха средний возраст мужчин и женщин;

для каждого цеха список работников со стажем более 5 лет в алфавитном порядке.

Worker: Фамилия, Должность, Стаж работ, Зарплата. Вывести:

  1.  список работников, стаж работы которых превосходит заданное число лет;
  2.  список работников, зарплата которых превосходит заданную;
  3.  список работников, занимающих заданную должность.

ЗАДАНИЕ 4.  ПЕРЕГРУЗКА   ОПЕРАЦИЙ

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

Основные понятия

В С++ операции, также как и функции, можно перегружать. Перегружаются почти все операции, за исключением некоторых:  .,  .*,  ::,  :?,  sizeof.

Для перегрузки операции задаётся оператор-функция (операторная функция), которая является либо членом класса, либо дружественной классу, для которого она задана:

тип имя_класса::operator #(список параметров){

//

}

Здесь вместо знака # ставится знак перегружаемой операции.

Существуют некоторые ограничения на перегрузку операций: нельзя менять приоритет операций; нельзя менять число операндов операций; нельзя создавать новые операции; оператор-функции не могут иметь аргументов по умолчанию.

Бинарные операции перегружается как функции класса с одним параметром или как дружественные функция с двумя параметрами. Один из этих параметров должен быть либо объектом класса, либо ссылкой на объект этого класса.

Унарные операции имеют один операнд, поэтому унарная операция класса перегружается  как функция без параметров или как дружественная функция с одним параметром. Этот параметр должен быть или объектом, или ссылкой на объект этого класса.

Ссылка на некоторый объект может рассматриваться как указатель, который при работе с ним всегда разыменовывается. Для определения ссылки применяется унарная операция &. Ссылка не создаёт копию объекта, а лишь является другим именем объекта. Чаще всего ссылки используются для передачи аргументов в функции.

Операция присваивания перегружается для случая, когда нежелательно побитовое копирование, но только как функция класса. Функция оperator=() возвращает *this, так как функция возвращает объект, которому присваивается значение, т. е. левый операнд в операторе изменяется. Это позволяет выполнить любую цепочку присваиваний (ob1 = ob2 = ob3).

Перегрузка операций ввода-вывода “>>” и “>>” в С++ предусмотрена для выполнения ввода-вывода объектов класса.

Для вывода объектов создаётся оператор-функция (функция вставки символов в объект), общий формат которой имеет вид:

ostream& operator<<(ostream &stream, имя_класса obj){

   // …

  return stream;

}

Первый параметр в функции является ссылкой на объект типа ostream. Это означает, что поток stream должен быть потоком вывода. Второй параметр получает выводимый объект (он, если это нужно, тоже может быть параметром-ссылкой). Функция возвращает ссылку на объект типа ostream что позволяет использовать операцию << в ряде последовательных выражений вывода (cout<<ob1<<ob2<<ob3).

Для ввода объектов создаётся оператор-функция (функция извлечения символов из потока), формат которой имеет следующий вид:

istream& opepator>>(istream &stream, имя_класса &obj){

 //

 return stream;

}

Первый параметр – ссылка на объект типа istream, т. е. поток stream должен быть потоком ввода. Второй параметр – ссылка на объект, получающий вводимую информацию. Функция возвращает ссылку на объект типа istream, что позволяет использовать операцию >> в ряде последовательных выражений ввода (cin>>ob1>>ob2>>ob3).

Следует помнить, что пользовательские функции ввода-вывода не должны быть членами класса, для ввода-вывода данных которого они предназначены. Они могут быть дружественными функциями этого класса или просто независимыми функциями.

Примеры выполнения задания

// Пример 4.1. Перегрузка операций ввода-вывода объектов.

// Нахождение наименьшего делителя числа.

#include <iostream.h>

class Factor{

   int num;            //число

   int min_del;   //наименьший делитель

public:

   Factor(){};

   delit();

   friend ostream& operator<<(ostream &stream, Factor ob);

   friend istream& operator>>(istream &stream, Factor &ob);

};

Factor::delit(){

   int n;

   int i = num;

   for(n = 2; n < (i/2); n++)

   if(i%n == 0) break;

   if(n < (i/2)) min_del = n;

   else min_del = 1;

}

istream& operator>>(istream &stream, Factor &ob){

   cout<<"Vvedi chslo:";

   stream>>ob.num;

   return stream;

}

ostream& operator<<(ostream &stream, Factor ob){

   stream << endl;

   stream << ob.min_del<< " min delitel chisla  ";

   stream << ob.num << '\n';

   return stream;

}

main(){  // функция main()

 Factor ob;  // создание объекта ob

 cin>>ob;      // ввод объекта ob

 ob.delit();    // вызов функции del()

 cout << ob;   // вывод объекта ob

 system(“pause”);

}

Результат:

Vvedi chslo:12

2 min delitel chisla 12

// Пример 4.2. Перегружается операция + для сложения объектов,

// члены класса – одномерный массив и его размерность.

// Объект в функцию operator+() передаётся по ссылке, возвращается

// по значению. Возвратить ссылку на объект функция не может,

// т. к. объект tempлокальный

#include <iostream.h>

const n_max = 10;

class Mas{    // определение класса Mas

 int a[n_max];   // объявление массива

 int n;     // размерность массива

public:

  Mas();    // конструктор по умолчанию

  Mas(int k);    // конструктор с параметром

  Mas operator+(Mas &ob); // функция operator+()

  friend  ostream& operator<<(ostream &stream , Mas ob);

  friend  istream& operator>>(istream &stream , Mas &ob);

};

Mas::Mas(int k){   // определение конструктора

  n = k;     // инициализация n

}

// оператор-функция ввода объекта

istream& operator>>(istream &stream , Mas &ob){ 

 int i;

  for(i = 0; i < ob.n; i++){

   cout<<"Vvedi a["<<i<<"] ";

   stream>>ob.a[i];

  }

  return stream;

}

// оператор-функция вывода объекта

ostream& operator<<(ostream &stream , Mas ob){

  int i;

  for(i = 0; i < ob.n; i++)

   stream<<ob.a[i]<<" ";

  stream<<endl;

 return stream;

}

Mas Mas::operator+(Mas &ob){  // функция operator+()

  Mas temp(n);  

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

   temp.a[i] = a[i] + ob.a[i];

 return temp;   // возврат объекта temp

}

main(){   // функция main()

  int n1;

  cout<<"Vvedi razmernost massiva: "; cin>>n1;

  Mas ob1(n1), ob2(n1), ob3(n1);  // создание объектов

  cout<<"Vvedi ob1:"<<endl;  cin>>ob1; // ввод объекта ob1

 cout<<"Vvedi ob2:"<<endl;  cin>>ob2; // ввод объекта ob2

 cout<<"ob1 = ";   cout<<ob1;   // вывод объекта ob1

 cout<<"ob2 = ";   cout<<ob2;   // вывод объекта ob2

 ob3 = ob1 + ob2;     //  ob1 + ob2

  cout<<"ob3 = ";   cout<<ob3;   // вывод объекта ob3

  system(“pause”);

}

Результат:

Vvedi razmernost massiva: 5

ob1= 1 2 3 4 5    ob2= 2 3 4 5 6    ob3= 3 5 7 9 11

// Пример 4.3. Перегружается операция + для сложения объектов,

// членами которых являются динамические одномерные массивы.

// Объект в функцию operator+() передаётся по ссылке, возвращается по

// значению, поэтому объект в функцию operator=() передаётся по

// значению. Используется конструктор копии.

#include <iostream.h>

class Mas{

int *a;

int n;

public:

Mas();

Mas(int k);                    //конструктор с параметром

Mas(const Mas &ob);            //конструктор копии

~Mas();

Mas operator+(Mas &ob);        //функция operator+

Mas& operator=(Mas ob);        //перегрузка =

friend  ostream& operator<<(ostream& stream , Mas ob);

friend  istream& operator>>(istream& stream , Mas &ob);

};

Mas::Mas(int k){

cout<<"Constructor:  "<<endl;

n=k;

a=new int[n];

}

istream& operator>>(istream& stream , Mas& ob){

int i;

for(i=0;i<ob.n;i++){

 cout<<"Vvedi a["<<i<<"] ";   stream>>ob.a[i];

}

return stream;

}

ostream& operator<<(ostream& stream , Mas ob){

int i;

for(i=0;i<ob.n;i++)

  stream<<ob.a[i]<<" ";

stream<<endl;

return stream;

}

Mas& Mas::operator=(Mas ob){

 n=ob.n;

 cout<<" Vxod  operator= "<<endl;

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

  a[i]=ob.a[i];

 cout<<" End   operator= "<<endl;

 return *this;

}

Mas Mas::operator+(Mas& ob){

cout<<" Vxod operator+ "<<endl;

Mas temp(ob.n);

cout<<" temp.a[i]= ";

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

 temp.a[i] = a[i] + ob.a[i];

 cout<<temp.a[i]<<' ';

}

cout<<endl<<" End operator+ "<<endl;

return temp;

}

Mas::Mas(const Mas &ob){

cout<<" vxod Copy "<<endl;

n=ob.n;

a=new int[n];

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

 a[i]=ob.a[i];

cout<<" end Copy "<<endl;

}

Mas::~Mas(){

cout<<"Destructor "<<endl;

delete []a;

}

main(){

int n1;

cout<<"Vvedi razmernost massiva: "; cin>>n1;

Mas ob1(n1),ob2(n1),ob3(n1);

cout<<"Vvedi ob1"<<endl;cin>>ob1;

cout<<"Vvedi ob2"<<endl;cin>>ob2;

cout<<"ob1= "; cout<<ob1;

cout<<"ob2= "; cout<<ob2;

ob3=ob1 + ob2;

cout<<"ob3= "; cout<<ob3;

 system(''pause'');

}

// Пример 4.4. Перегружаются операции ”+” и “!” для объектов-матриц:

// "+" – для сложения объектов-матриц;

// "!"для определения кол-ва строк матрицы, не содерж. нулевых элементов.

// Перегружаются операции “>>” и “<<” для ввода/вывода объектов.

// Объект передаётся в оператор-функцию operator+()  по ссылке,

// возвращается объект из функции operator+() по значению.

#include <iostream.h>

const n_max=10, m_max=10;

class Matrix{

int a[n_max][m_max];

int n, m;

public:

 Matrix(int k, int l);

 Matrix operator+(Matrix &ob);   // функция operator+()

 int operator!();    // функция operator!()

 friend  ostream& operator<<(ostream& stream , Matrix ob);

 friend  istream& operator>>(istream& stream , Matrix &ob);

 };

Matrix::Matrix(int k, int l){  // определение конструктора

cout<<"Constructor "<<endl;

n=k; m=l;

}

Matrix Matrix::operator+(Matrix &ob){  // определение operator+()

cout<<" Vxod operator+()"<<endl;

Matrix temp(n, m);

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

 for(int j=0;j<m;j++)

  temp.a[i][j]=a[i][j]+ob.a[i][j];

cout<<" End operator+()"<<endl;

return temp;

}

int Matrix::operator!(){   //  определение operator!()

 cout<<" Vxod operator!()"<<endl;

int k1=0;

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

 for(int j=0;j<m;j++)

  if (a[i][j]==0){k1++;break;}

 int kol=n-k1;

 cout<<" End operator!()"<<endl;

 return kol;

}

istream& operator>>(istream& stream , Matrix &ob){    // ввод объекта

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

 for(int j=0;j<ob.m;j++){

  cout<<"a["<<i<<" "<<j<<"] ";stream>>ob.a[i][j];

 }

return stream;

}

ostream& operator<<(ostream& stream , Matrix ob){ // вывод объекта

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

 for(int j=0;j<ob.m;j++){

  stream.width(4);

  stream<<ob.a[i][j];

 }

 stream<<endl;

}

stream<<endl;   return stream;

}

main(){

int n, m;

cout<<"***OVERLOAD***"<<endl;

cout<<"Vvedi razmernost matrix: ";cin>>n>>m;

Matrix ob1(n,m),ob2(n,m);

cout<<"Vvedi matrix 1"<<endl;

cin>>ob1;   cout<<endl<<ob1;

cout<<"Vvedi matrix 2"<<endl;

cin>>ob2;   cout<<endl<<ob2;

Matrix ob3(n,m);

ob3=ob1+ob2;

cout<<"Summa of matrix..."<<endl;

cout<<ob3;

int kol;     kol=!ob1;

cout<<"kol="<<kol<<endl;

kol=!ob2;    cout<<"kol="<<kol<<endl;

system("pause");

}

// Пример 4.5. Перегружается операция “+” для объектов-матриц,

// использующих динамическую память. В функцию operator+()

// объект передаётся по ссылке, возвращается объект по значению,

// поэтому в функцию operator=() объект передаётся по значению.

//Используется конструктор копии.

#include <iostream.h>

class Matrix{   // определение класса Matrix

 int **a;      //указатель на массив указателей

 int n, m;

public:

 Matrix(int k, int l );

 ~Matrix();

 Matrix(const Matrix &ob);  //конструктор копии

 Matrix operator+(Matrix &ob);  //функция operator+()

 Matrix& operator=(Matrix ob);  //функция operator=()

 friend  ostream& operator<<(ostream &stream , Matrix &ob);

 vvod();     //функция ввода матрицы

};

Matrix::Matrix(int k, int l){  // конструктор

 n = k; m = l;

a = new int *[n];

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

   a[i] = new int[m];

}

Matrix::~Matrix(){    // деструктор

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

 delete []a[i];

delete []a;

}

Matrix::Matrix(const Matrix &ob){ // конструктор копирования

 a = new int*[ob.n];

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

   a[i] = new int[ob.m];

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

   for(int j = 0; j < ob.n; j++)

     a[i][j] = ob.a[i][j];

 n = ob.n;    m = ob.m;

}

Matrix Matrix::operator+(Matrix &ob){ // функция operator+()

 Matrix temp(n,m);  

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

   for(int j = 0; j < m; j++)

     temp.a[i][j] = a[i][j]+ob.a[i][j];

 return temp;

}

Matrix& Matrix::operator=(Matrix ob){ // функция operator=()

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

   for(int j = 0; j < m; j++)

     a[i][j] = ob.a[i][j];

 return *this;

}

ostream &operator<<(ostream &stream , Matrix &ob){ // вывод

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

   for(int j = 0; j < ob.m; j++)

   {

      stream.width(4);

      stream<<ob.a[i][j];

   }

   stream<<endl;

 }

 return stream;

}

Matrix::vvod(){ // функция ввода vvod()

 cout<<"Vvedi matrix"<<endl;

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

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

     cout<<"a["<<i<<" "<<j<<"] ";cin>>a[i][j];

   }

}

main(){

 int n, m;

 cout<<"Vvedi razmernost matrix: "; cin>>n>>m;

 cout<<"***OVERLOAD***"<<endl;

 Matrix ob1(n, m), ob2(n, m);

 ob1.vvod();     // ввод объекта ob1

 cout<<ob1;    // вывод объекта ob1

 ob2.vvod();    // ввод объекта ob2

 cout<<ob2;    // вывод объекта ob2

 Matrix ob3(n, m);

 ob3 = ob1 + ob2;   // ob3 = ob1 + ob2

 cout<<"Summa of matrix== "<<endl;    cout<<ob3; 

system("pause");

}

Постановка задания

Определить класс, который должен включать в себя конструктор, деструктор, операторные функции, обеспечивающие перегрузку стандартных операций для работы с объектами данного класса. Для указанного класса также перегрузить операции << и >> для ввода и вывода объектов.

Написать программу, демонстрирующую концепцию перегрузки операторов.

Варианты контрольных заданий

  1.  Задан вектор в n-мерном евклидовом пространстве. Реализовать:
  2.  сложение векторов;
  3.  вычитание векторов;
  4.  скалярное произведение векторов;
  5.  векторное произведение векторов;
  6.  умножение вектора на скаляр.
  7.  В британском формате дата задаётся как число/месяц/год. Реализовать с учётом (и без учёта) високосных годов:
  8.  сложение даты и заданного количества дней;
  9.  вычитание из даты заданного количества дней;
  10.  сложение двух дат;
  11.  вычитание из одной даты другой;
  12.  вычисление числа дней, прошедших между двумя датами.
  13.  Время задаётся в формате час, минута, секунда. Реализовать следующие операции (учесть переход через 24 часа):
  14.  сложение времени и заданного количества секунд;
  15.  вычитание из времени заданного количества секунд;
  16.  сложение двух моментов времени;
  17.  вычитание из одного момента времени другого;
  18.  подсчёт числа секунд между двумя моментами времени, лежащими в пределах одних суток.
  19.  Комплексное число задаётся своим модулем и углом (например, число 10 * (cos( / 6) + i *sin( /6)) задаётся парой (10, /6)).    Реализовать:
  20.  сложение чисел, вычитание чисел;
  21.  произведение чисел, деление чисел;
  22.  возведение в целочисленную степень;
  23.  извлечение квадратного корня.
  24.  Комплексное число задаётся своей вещественной и мнимой частями (например, 5 +3i задаётся парой (5, 3)). Реализовать:
  25.  сложение чисел, вычитание чисел;
  26.  произведение чисел, деление чисел ;
  27.  возведение в целочисленную степень;
  28.  извлечение квадратного корня.
  29.  Определить класс для работы с объектом “полином”. Реализовать следующие операции:
  30.  сложение двух полиномов, вычитание двух полиномов;
  31.  умножение полинома на число;
  32.  вычисление значения полинома в точке x;
  33.  дифференцирование полинома;
  34.  интегрирование полинома.
  35.  Определить класс для работы с объектом “ множество целых чисел”. Реализовать следующие операции:
  36.  объединение двух множеств;
  37.  пересечение двух множеств;
  38.  разность двух множеств;
  39.  добавление элемента во множество;
  40.  удаление элемента из множества.
  41.  Определить класс для работы с объектом “рациональная дробь” вида m/n. Реализовать следующие операции:
  42.  сложение и вычитание двух дробей;
  43.  умножение двух дробей;  деление двух дробей;
  44.  приведение дроби к несократимому виду;
  45.  вывод дроби в виде m/n;
  46.  сравнение двух дробей.
  47.  Определить класс для работы с квадратной матрицей. Реализовать следующие операции:
  48.  сложение матриц, вычитание матриц;
  49.  умножение матрицы на скаляр, деление матрицы на скаляр;
  50.  транспонирование матрицы;
  51.  умножение матрицы слева на её транспонированную матрицу.
  52.  Определить класс для работы с квадратной матрицей. Получить величину к одним из нижеуказанных способов и выполнить умножение матрицы на значение к:
  53.  к – количество строк матрицы, не содержащих ни одного нулевого элемента;
  54.  к – количество столбцов матрицы, содержащих хотя бы один нулевой элемент;
  55.  к – количество отрицательных элементов в тех строках матрицы, которые содержат хотя бы один нулевой элемент;
  56.  к – номер строки матрицы, в которой находится наибольшая по длине возрастающая последовательность;
  57.  к – сумма всех чётных элементов матрицы, стоящих после нечётных элементов;
  58.  к – максимальный элемент среди элементов строк матрицы, упорядоченных по возрастанию или убыванию.
  59.  Определить класс для работы с квадратной матрицей. Сформировать вектор B одним из нижеуказанных способов и умножить его на заданную матрицу:
  60.  B – первая из строк матрицы, не содержащих ни одного положительного элемента;
  61.  B – строка матрицы, среднее арифметическое элементов которой минимально;
  62.  B – последний из столбцов матрицы, в которых имеются одинаковые элементы;
  63.  B – последний из столбцов матрицы, содержащих минимальное количество различных элементов;
  64.  B – первая из строк матрицы с максимальным количеством знакочередующихся элементов;
  65.  каждый элемент вектора В равен количеству отрицательных элементов соответствующей строки матрицы, кратных 3 или 5;
  66.  каждый элемент вектора В равен количеству максимальных элементов соответствующей строки матрицы;
  67.  каждый элемент вектора В равен количеству минимальных элементов соответствующего столбца матрицы.
  68.  Определить класс для работы с квадратной матрицей. Получить новую матрицу путём преобразования заданной матрицы одним из нижеуказанных способов и сложить её с исходной матрицей:
  69.  поменять местами максимальные элементы нижнего и верхнего треугольников матрицы относительно главной диагонали;
  70.  в каждой строке матрицы поменять местами первый максимальный и последний минимальный элементы;
  71.  элементы строк матрицы, содержащих хотя бы одно простое число, расположить в порядке возрастания;
  72.  элементы столбцов матрицы, не содержащих нулевых элементов, расположить в порядке убывания;
  73.  элементы каждой строки матрицы, кратные заданному числу p, переставить в начало строки и расположить их в порядке  возрастания;
  74.  положительные элементы каждого столбца матрицы переставить в конец столбца и расположить их в порядке убывания.
  75.  Определить класс для работы с квадратной матрицей. Получить новую матрицу путём преобразования заданной матрицы одним из нижеуказанных способов и умножить её на исходную матрицу:
  76.  переставить строки матрицы в порядке возрастания элементов первого столбца;
  77.  заменить максимальные элементы строк матрицы, не содержащих чётных элементов, на обратные величины;
  78.  элементы каждого столбца матрицы, стоящие за первым максимальным элементом столбца, расположить в порядке возрастания;
  79.  элементы столбцов матрицы, не содержащих положительных элементов, заменить суммой их цифр;
  80.  заменить нулями элементы матрицы, стоящие на пересечении строк и столбцов, содержащих хотя бы один нулевой элемент.
  81.  Определить класс для работы с «Булевой матрицей» размерности (n, m). Реализовать следующие операции:
  82.  логического сложения матриц;
  83.  логического умножения матриц;
  84.  инверсии матриц;
  85.  получения количества строк матрицы, не содержащих ни одного нулевого элемента.
  86.  Известно, что в каждой строке и каждом столбце квадратной матрицы имеется единственный отрицательный элемент; переставить строки матрицы так, чтобы отрицательные элементы находились на главной диагонали.

ЗАДАНИЕ 5. НАСЛЕДОВАНИЕ

Цель задания – получение практических навыков создания и построения иерархии классов, изучение виртуальных функций и использование их для реализации динамического полиморфизма.

Постановка задания

Определить базовый класс и наследующие его производные классы.

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

В заданиях перечисляются только обязательные переменные и функции класса. Можно задавать дополнительные переменные и функции, если они не отменяют обязательные и обеспечивают дополнительные удобства при работе с данными классами.

Пример выполнения задания

// Пример 5.1. Определить базовый класс Строка, предусмотрев ввод,

// вывод строки, получение длины строки, очистку строки.

// Определить производный класс Десятичная Строка. Предусмотреть

// ввод, вывод десятичных чисел,  проверку, является ли введённая

// строка десятичным числом, если нет - присвоить ей нулевое значение,

// сравнение двух чисел.

#include<iostream.h>

#include<conio.h>

#include<string.h>

#define N 100

class Stroka {   // определение базового класса Stroka

  protected:

   char str[N];

public:

    Stroka (){str[0]='\0'; }

    virtual void create(); // создание строки

    show();   // вывод строки

    int length();   // определение длины строки

    clear();   // очистка строки

 };

class DecStroka : public Stroka { // опр. производного класса DecStroka

  public:

    void create();   // создание строки

    bool isnumber();   // проверка строки на число

    int operator==(DecStroka ); // сравнение двух строк

};

int menu();    //  меню

Stroka::create() {  // создание строки базового класса

 cout<<"Input your stroky: ";

 flushall();    gets(str);

}

Stroka::show(){   // вывод строки

 int i=0;

 cout<<"Your stroka: (";

 cout<<str;    cout<<')'<<endl;

}

int Stroka::length(){   // определение длины строки

 int i=0;

 while(!str[i]=='\0')    i++;

 return i;

}

Stroka::clear(){   // очистка строки

  *str='\0';

  cout<<"Your stroka ochichena "<<endl;

}

 DecStroka::create(){ // создание строки производного класса

  char s[N];      char c;

  cout<<"Do you want your number will be positive or negative ? (+/-) ";

  cin>>c;

  str[0]=c;    str[1]='\0';

  cout<<"Input your decstroky: ";

  flushall();

  gets(s);      strcat(str, s);

 }

bool DecStroka::isnumber(){ // проверка строки на число

 bool pr(true);

 int k=0;     int l(0);

 if(str[0]=='+'||str[0]=='-')  k=1;

 l = length();    // вызов length() базового класса

 for(int j=k;j<l;j++) {

   if(str[j]>='0'&& str[j]<='9') pr=true;

   else{      pr=false;      break;    }

}

 if(!pr) {    cout<<"Your stroka isn't a number "<<endl;

    clear(); }

 else  cout<<"Your stroka is a number "<<endl;

 show();    // вызов show() базового класса

 return pr;

}

int DecStroka::operator==(DecStroka ob){  // сравнение двух строк

 return !strcmp(str,ob.str);

}

int main (){

 int m, l=0;

 Stroka *p;   // указатель на базовый класс Stroka

 Stroka ob;   // объект класса Stroka

 DecStroka d_ob1,d_ob2,d_ob3,d_ob4;

 p=&ob;  // указатель установлен на объект базового класса

 while (1){

  m=menu();

  switch (m){

   case 1: clrscr();            p->create();          getch (); break;

   case 2: clrscr();            ob.show();            getch(); break;

   case 3: clrscr();  l = ob.length();  

 cout<<" dlina  stroki = ";  cout<<l;  getch(); break;

   case 4: clrscr();            p->clear();              getch(); break;

   case 5: clrscr();            p = &d_ob1;           p->create();        getch(); break;

   case 6: clrscr();            d_ob1.show();         getch(); break;

   case 7: clrscr();            d_ob1.isnumber();   getch(); break;

   case 8: clrscr();

           cout<<"Input two number "<<endl<<endl;

           d_ob1.create();            d_ob2.create();

           if (d_ob1.isnumber()&& d_ob2.isnumber())

            if (d_ob1==d_ob2) cout<<"Your chicla ravnu "<<endl;

            else  cout<<"Your chicla ne ravnu "<<endl;

           else    cout<<"Your stroka isn't a number "<<endl;

           getch(); break;

   case 9: clrscr();           exit(1); break;

  }

 }

 return 0;

}

 int menu(){    // меню

   int m;

   do{

    clrscr();

    cout<<" 1: Sozdat stroky "<<endl;

    cout<<" 2: Show stroky "<<endl;

    cout<<" 3: Opredelit dliny stroki"<<endl;

    cout<<" 4: Ochistit stroky "<<endl;

    cout<<" 5: Sozdat dec_stroky "<<endl;

    cout<<" 6: Show dec_stroky "<<endl;

    cout<<" 7: Opredelit if your sroka is a number "<<endl;

    cout<<" 8: Proverit dva chisla na ravenstvo "<<endl;

    cout<<" 9: Exit "<<endl;

    cin>>m;

   }while(m<1 || m>9);

  return m;

 }

Варианты заданий

  1.  Создать абстрактный класс Работник фирмы и производные классы Менеджер, Администратор, Программист.
  2.  Создать базовый класс Домашнее животное и производные классы Собака, Кошка, Попугай. С помощью конструктора установить имя каждого животного и его характеристики.
  3.  Создать базовый класс Садовое дерево и производные классы Яблоня, Вишня, Груша и другие. С помощью конструктора автоматически установить номер каждого дерева. Принять решение о пересадке каждого дерева в зависимости от возраста и плодоношения.
  4.  Определить классы и их иерархию, продемонстрировать использование введённых конструкций при работе Учащийся: Школьник, Студент.
  5.   Определить классы и их иерархию , продемонстрировать использование введённых конструкций при работе с Музыкальный инструмент: Ударный, Струнный, Духовой.
  6.  Определить классы и их иерархию, продемонстрировать использование введённых конструкций при работе с  Человек: Студент, Преподаватель.
  7.  Определить базовый класс для работы с прямоугольными матрицами, предусмотрев следующие операции:
  8.  сложение матриц;
  9.  вычитание матриц;
  10.  умножение матрицы на скаляр;
  11.  деление матрицы на скаляр;
  12.  перестановка строк матрицы по заданному вектору транспозиции.

В производном классе переопределить указанные операции для квадратных матриц, добавив следующие операции:

  1.  транспонирование матрицы;
  2.  умножение матриц;
  3.  умножение матрицы слева на её транспонированную матрицу.
  4.  Определить базовый класс Vector, предусмотрев операции:
  5.  проверку двух векторов на ортогональность;
  6.  определение количества единиц в векторе;
  7.  определение позиции самой левой единицы в векторе.

В производном классе BoolVector (компоненты вектора принимают значения из множества {0,1}) переопределить указанные операции для Vector, добавив следующие операции:

  1.  поразрядная конъюнкция (&);
  2.  поразрядная дизъюнкция (|);
  3.  поразрядная инверсия (~);
  4.  присваивание (=).
  5.  Определить базовый класс Vector, предусмотрев  операции:
  6.  проверка двух векторов на ортогональность;
  7.  определение количества нулевых компонент.

В производном классе ТРОИЧНЫЙ ВЕКТОР (компоненты вектора принимают значения из множества {0,1,2}) переопределить указанные операции для Vector, добавив следующие операции:

  1.  присваивание (=);
  2.  поразрядная конъюнкция двух не ортогональных векторов (&): 0&0=0, 1&1=1, 2&2=2, 0&2=0, 2&0=0, 1&2=1, 2&1=1;
  3.  индексирование ([]).
  4.  Определить базовый класс МАТРИЦА для работы с целочисленной матрицей, предусмотрев следующие операции:
  5.  получение  числа единиц в матрице;
  6.  удаление повторяющихся строк.

В производном классе БУЛЕВА МАТРИЦА переопределить указанные операции, добавив следующие операции:

  1.  поэлементная конъюнкция двух матриц (&);
  2.  поэлементная дизъюнкция двух матриц (|);
  3.  произведение двух матриц;
  4.  присваивание (=).
  5.  Определить базовый класс Символ, предусмотрев следующие операции:
  6.  ввод, вывод символов;
  7.  перевод символов из нижнего регистра в верхний;
  8.  сравнение символов.

В производном классе Строка переопределить указанные операции, добавив следующие операции:

  1.  получение длины строки;
  2.  определить количество символов в самом длинном слове;
  3.  определить слова с заданным количеством символов и вывести их в алфавитном порядке;
  4.  определить и вывести в алфавитном порядке все слова, начинающиеся и заканчивающиеся гласной буквой.
  5.  следующие операции:
  6.  Определить базовый класс Символ, предусмотрев следующие операции:
    1.  ввод, вывод символов;
    2.  перевод символов из нижнего регистра в верхний;
    3.  сравнение символов.

В производном классе Строка переопределить указанные операции, добавив следующие операции:

  1.  получение длины строки;
  2.  определить количество символов в самом коротком слове;
  3.  определить количество символов ‘a’ в последнем слове строки;
  4.  определить количество слов, в которых содержится хотя бы один заданный символ;
  5.  определить количество слов, оканчивающихся гласной буквой;
  6.  определить в каждом слове количество символов, отличных от букв;
  7.  определить порядковый номер заданного слова и количество символов в нём;
  8.  Определить базовый класс Строка, предусмотрев следующие операции:
  9.  ввод, вывод строки;
  10.  получение длины строки.
  11.  определение первого вхождения заданного символа.

В производном классе Строка_Идентификатор переопределить указанные операции, добавив следующие операции:

  1.  определение, является ли введённая строка идентификатором;
  2.  перевод всех символов строки_идентификатора в верхний регистр;
  3.  перевод всех символов строки_идентификатора в нижний регистр;
  4.  Определить базовый класс Строка, предусмотрев следующие операции:
  5.  ввод, вывод строки;
  6.  получение длины строки;
  7.  проверку строк на равенство.

В производном классе Битовая_Строка переопределить указанные операции, добавив следующие операции:

  1.  оределение, является ли строка битовой строкой;
  2.  изменение знака битовой строки на противоположный (перевести число в дополнительный код);
  3.  сложение битовых строк.
  4.  Определить базовый класс Строка, предусмотрев операции:
  5.  ввод, вывод строки;
  6.  получение длины строки;
  7.  проверку строк на равенство.

В производном классе Десятичная_Строка переопределить указанные операции, добавив следующие операции:

  1.  определение, является ли введённая строка десятичным числом;
  2.  сложение десятичных чисел;
  3.  вычитание десятичных чисел.
  4.  Определить базовый класс Строка, предусмотрев операции:
  5.  ввод, вывод строки;
  6.  получение длины строки;
  7.  проверку строк на равенство.

В производном классе Комплексное_число (Строка состоит из двух полей, разделённых символом i. Каждое из полей может содержать только символы десятичных цифр и символы – или +. Символы – и + могут находиться только в первой позиции числа, причём символ + может отсутствовать, в этом случае число считается положительным. Содержимое данной строки рассматривается как комплексное число, например, 35i14 ,-4i100, +3-i21) переопределить указанные операции, добавив следующие операции:

  1.  определение, представляет ли введённая строка комплексное число;
  2.  сложение комплексных чисел;
  3.  вычитание комплексных чисел;
  4.  умножение комплексных чисел;
  5.  проверка чисел на равенство.
  6.  Определить базовый класс Строка, предусмотрев операции:
  7.  ввод, вывод строки;
  8.  получение длины строки;
  9.  определение количества слов в строке.

В производном классе Текст переопределить указанные операции, добавив следующие операции:

  1.  в восклицательных предложениях текста найти и вывести без повторений все слова заданной длины;
  2.  из каждого предложения текста удалить слова, встречающиеся более одного раза;
  3.  определить в тексте самую длинную цепочку слов, начинающихся на гласную букву.
  4.  все слова каждого предложения текста вывести в алфавитном порядке;
  5.  в каждом предложении текста найти и вывести в алфавитном порядке все слова “перевёртыши” (одинаково читаются слева направо и справа налево).
  6.  Определить базовый класс Строка, предусмотрев операции:
  7.  ввод, вывод строки;
  8.  получение длины строки;
  9.  определение количества слов в строке.

В производном классе Текст переопределить указанные операции, добавив следующие операции:

  1.  определить количество слов и предложений в тексте;
  2.  определить предложения с максимальным количеством слов;
  3.  найти в каждом предложении текста  без повторений слова минимальной длины;
  4.  Определить базовый класс Строка, предусмотрев операции:
  5.  ввод, вывод строки;
  6.  получение длины строки;
  7.  выделение слов в строке при нажатии произвольной клавиши.

В производном классе Текст переопределить указанные операции, добавив следующие операции:

  1.  поочерёдно выделить каждое предложение текста;
  2.  поочерёдно выделить каждое предложение текста, а в выделенном предложении – поочерёдно все слова;
  3.  поочерёдно выделить каждое предложение текста, а в выделенном предложении – все слова, в которых буквы расположены в алфавитном порядке;
  4.  поочерёдно выделить каждое предложение текста, а в выделенном предложении – поочерёдно заданное слово;
  5.  Определить базовый класс Строка, предусмотрев операции:
  6.  ввод, вывод строки;
  7.  получение длины строки;
  8.  выделение слов в строке при нажатии произвольной клавиши.

В производном классе Текст переопределить указанные операции, добавив следующие операции:

  1.  выделить последнее предложение текста, а в выделенном предложении – поочерёдно все буквы ‘a’;
  2.  выделить каждое слово текста, содержащее максимальное количество символов;
  3.  поочерёдно выделить в тексте каждое слово, заданное слово;
  4.  поочерёдно выделить в тексте заданные слова, которые нужно поменять местами (заданные слова вводить с клавиатуры);
  5.  поочерёдно выделить все слова текста, содержащие цифры;
  6.  поочерёдно выделить в тексте все слова максимальной длины.
  7.  Определить базовый класс Множество и производный класс Кольцо (операции сложения и умножения, обе коммутативные и ассоциативные, связанные законом дистрибутивности. Сложение обладает обратной операций – вычитанием).

Ввести кольца целых чисел многочленов, система классов целых чисел, сравнимых по модулю. Кольцо является полем, если в нём определена операция деления, кроме деления на ноль. Рациональные числа, дробно рациональные функции.

  1.  Определить классы и их иерархию, продемонстрировать использование введённых конструкций при работе с Меню: Горизонтальное, Вертикальное, Иерархическое.
  2.  Определить классы и их иерархию, продемонстрировать использование введённых конструкций при работе с Окно: Стековое, Слоёное, Всплывающее.
  3.  Создать базовый класс Polygon . Класс должен содержать методы для рисования многоугольника, вычисления его периметра, нахождения площади и др. Построить производный класс Triangle, который содержит также методы для нахождения точки пересечения медиан, длин медиан, длин биссектрис, координат точек пересечения биссектрис со сторонами треугольника, длин высот треугольника.
  4.  Создать класс Point  и производные от него классы ColorPoint и Line. На основе классов ColorPoint и Line создать класс ColorLine. Все классы должны иметь методы для установки и получения значений всех координат, а также изменения цвета и получения текущего цвета.

Оглавление

[1] ЗАДАНИЕ 1.  ПРОСТЕЙШИЕ  КЛАССЫ  И  ОБЪЕКТЫ

[1.1] Основные понятия

[1.2] Примеры выполнения задания

[1.3] Постановка задания

[1.4] Варианты контрольных заданий

[2] ЗАДАНИЕ 2.  МАССИВЫ  –  ЧЛЕНЫ   КЛАССА

[2.1] Основные понятия

[2.2] Примеры выполнения задания

[2.3] Постановка задания

[2.4] Варианты контрольных заданий

[2.4.1] Одномерные   МАССИВЫ  –  члены класса

[2.4.2] Двумерные   МАССИВЫ  –  члены класса

[3] ЗАДАНИЕ 3.  МАССИВЫ   ОБЪЕКТОВ,   УКАЗАТЕЛИ

[3.1] Основные понятия

[3.2] Постановка задания

[3.3] Примеры выполнения задания

[3.4] Варианты контрольных заданий

[4] ЗАДАНИЕ 4.  ПЕРЕГРУЗКА   ОПЕРАЦИЙ

[4.1] Основные понятия

[4.2] Примеры выполнения задания

[4.3] Постановка задания

[4.4] Варианты контрольных заданий

[5] ЗАДАНИЕ 5. НАСЛЕДОВАНИЕ

[5.1] Постановка задания

[5.2] Пример выполнения задания

[5.3] Варианты заданий

[6] Оглавление

54

PAGE  56




1. а ~ мировоззренческая позиция согласно которой наука является высшей ценностью развития человеческой циви
2. Информатика для заочного отделения 2013 2014 г
3. 26 основных понятий политического анализа
4.  1621658305 ГАЛУШКО Євген Сергійович ПІДВИЩЕННЯ ЕФЕКТИВНОСТІ ВИКОРИСТАННЯ ІННОВАЦІЙНОГ
5. Тема- Эволюция концепций маркетинга Начало формы Конец формы Традиционной концепции маркетинга н
6. Право как социальное явление правосознание, правоотношения, правовые институты и организации
7. Пять условий покаяния ~ Выдающийся ученый имам факъих шейх Мухаммад ибн Солих альУ
8. Доклад- Сарказм
9. Правила безопасного поведения в криминогенных ситуациях
10. Введение.6
11. ЖИЗНЕОБЕСПЕЧЕНИЕ В НАУЧНОЙ ЛИТЕРАТУРЕ 1
12. рынок это оригинальное единство строгой науки и умение эффективно работать на рынке
13. Выставка- последующая обработка данных
14. по теме- Всё что вы хотели узнать об ипотеке Вопросы для обсуждения- 1
15. ВведениеРаспад СССР великой ядерной державы центра обширной системы союзов коренным образом изменил полож
16. 20г. ФЕДЕРАЛЬНЫЙ ГОСУДАРСТВЕННЫЙ ОБРАЗОВАТЕЛЬНЫЙ СТАНДАРТ НАЧАЛЬНОГО П.
17. образовательная ~ расширить кругозор учащихся познакомить с получением и структурой хлопчатобумажных тка
18. Детский сад 6 Берёзка п
19. на тему договір міни Виконав- студент 3 курсу 2 груп
20. Дівчинка 9 років перенесла ревматичний поліартрит зараз вона не спокійна постійно гримасує часто висуває