§ 3. Перагрузка аперацый

Алгоритмические конструкции

Как вам уже известно из курса информатики, любой алгоритм может быть записан с использованием трех базовых алгоритмических конструкций: следование, цикл и ветвление (пример 3.1).

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

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

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

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

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

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

Пример 3.1 Блок-схемы алгоритмических конструкций.

Следование

Ветвление

Цикл

  • Цикл с параметром (значение параметра изменяется от 1 до N):

  • Цикл с предусловием:

  • Цикл с постусловием:

Кроме блок-схем, для графического представления алгоритмов используют структурограммы (NS-диаграммы, диаграммы Насси — Шнейдермана).

Примеры структурограмм

Команда ветвления:

Команда цикла с предусловием:

3.2. Лагічны тып даных

Для стандартных тыпаў даных такіх як int або double ўвод і вывад рэалізаваны праз стандартныя аператары >> і <<. Гэтыя ж аператары перагружаныя для ўводу-вываду радкоў. Для карыстальніцкіх тыпаў даных, якія маюць мноства палёў, таксама можна перагрузіць аператары ўводу-вываду. Перагрузка аператараў < < і >> нашмат спрашчае працэс вываду аб'екта на экран і атрыманне карыстальнiцкага ўводу з запісам даных у аб'ект класа.

Разгледзім перагрузку аператара <<. Аператар з'яўляецца бінарным аператарам, таму яго перагрузка будзе аналагічная перагрузцы аператара «+», разгледжанай у прыкладах 3.5 і 3.6. Левым аперандам у аператара < < з'яўляецца аб'ект cout, а правым — аб'ект класа, які трэба вывесці. Аператар, які перавызначаецца, павінен вяртаць значэнне тыпу ostream, аб'ектам якога з'яўляецца cout. Параметры, апісанай функцыі, павінны быць спасылкамі (прыклады 3.7 i 3.8). Таксама спасылкай павінен быць і вынік, які вяртаецца, паколькі ostream забараняе сваё капіраванне.

Перагрузка аператара ўводу адбываецца аналагічна. Адрозненне ў тым, што cin з'яўляецца аб'ектам тыпу istream (прыклады 3.9 i 3.10). Спасылка на аб'ект класа, які з'яўляецца другім параметрам, не можа быць канстантай, паколькі аб'ект змяняецца пры ўводзе.

Пасля перазагрузкі аператараў уводу і вываду іх можна выкарыстоўваць таксама для чытання і запісу файлаў.

Прыклад 3.7. Перагрузка аператара вываду << для класа Vect, вызначанага ў прыкладзе 3.5.

Аб'ява:

friend ostream & operator << 

(ostream &, const Vect &);

Апісанне:

ostream & operator << 

(ostream &out, const Vect &p)

{

  out << p.<< " " << p.<< endl;

}

Прыклад 3.8. Перагрузка аператара вываду << для класа Matrix, вызначанага ў прыкладзе 3.6.

Аб'ява:

friend ostream & operator << 

(ostream &, const Matrix  &);

Апісанне:

ostream & operator << 

(ostream & out, const Matrix &d)

{

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

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

      out << setw(4) << d.data[i][j];

    out << endl;

  }

  out << endl;

Прыклад 3.9. Перагрузка аператара вываду >> для класа Vect, вызначанага ў прыкладзе 3.5.

Аб'ява:

friend istream & operator >> 

(istream &, Vect &);

Апісанне:

span style="font-size: medium;">istream & operator >> 
(istream &in, Vect &p)

{

    in >> p.>> p.y;

}

Прыклад 3.10. Перагрузка аператара вываду >> для класа Matrix, вызначанага ў прыкладзе 3.6

Аб'ява:

friend istream & operator >> 

(istream &, Matrix &);

Апісанне:

istream & operator >> 

(istream & in, Matrix &d)

{

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

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

      in >> d.data[i][j];

}