Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






Циклы for. Циклы while. Циклы do-while. Разница между циклами



Рассмотрим пример оператора цикла for:

for ( ; ; ) ;

Его заголовок состоит из пустого оператора (ему соответствует первая точка с запятой) и разделителя, который разделяет два пустых выражения. Тело цикла - пустой оператор.

Пустое выражение, определяющее условие выполнения цикла for интерпретируется как всегда истинное условие. Отсутствие условия выполнения предполагает безусловное выполнение.

. принципы работы этого оператора. Цикл состоит из четырёх этапов.

· Прежде всего, выполняется оператор инициализации цикла. Если он не пустой, выражение за выражением, слева направо. Этот этап можно назвать этапом инициализации цикла. Он выполняется один раз, в самом начале работы цикла.

· Затем вычисляется значение выражения, которое располагается слева от оператора инициализации. Это выражение называется выражением условия продолжения цикла. Сам этап можно назвать этапом определения условий выполнимости.

· Если значение этого выражения отлично от нуля (т.е. истинно), выполняется оператор цикла. Этот этап можно назвать этапом выполнения тела цикла.

· После этого вычисляются значения выражений, которые располагаются слева от выражения условия продолжения цикла. Этот этап можно назвать этапом вычисления шага цикла.

· На последних двух этапах могут измениться значения ранее определённых переменных. А потому следующий цикл повторяется с этапа определения условий выполнимости.

Цикл while с предусловием позволяет выполнить одну и ту же последовательность действий пока проверяемое условие истинно. При этом условие записывается до тела цикла и проверяется до выполнения тела цикла.

При выполнении цикла while сначала проверяется условие. Если оно ложно, то цикл не выполняется и управление передается на следующую инструкцию после тела цикла while. Если условие истинно, то выполняется инструкция, после чего условие проверяется снова и снова выполняется инструкция. Так продолжается до тех пор, пока условие будет истинно. Как только условие станет ложно, работа цикла завершится и управление передастся следующей инструкции после цикла.

Синтаксис цикла while ("пока") c предусловием такой:

while (условие) { блок инструкций }

Следующий фрагмент программы напечатает на экран квадраты всех целых чисел от 1 до 10: int i=1;

while (i<=10) { cout<<i*i<<endl; ++i; }

В этом примере переменная i внутри цикла изменяется от 1 до 10. Такая переменная, значение которой меняется с каждым новым проходом цикла, называется счетчиком. Заметим, что после выполнения этого фрагмента значение переменной i будет равно 11, поскольку именно при i==11 условие i<=10 впервые перестанет выполняться.



Цикл while ("пока") с постусловием

Цикл "пока" с постусловием отличается от цикла с предусловием тем, что сначала выполняется блок цикла, а потом проверяется условие. Если условие истинно, то цикл будет выполнен еще раз, и так до тех пор, пока условие будет истинно. Синтаксис цикла с постусловием такой (обратите внимание на обязательную точку с запятой после условия):

do { Блок инструкций } while (условие);

Поскольку условие проверяется после выполнения тела цикла, то блок цикла с постусловием всегда будет выполнен хотя бы один раз, независимо от истинности условия. Это может привести к ошибкам, поэтому использовать цикл while с постусловием следует только тогда, когда это действительно упрощает алгоритм.

111. Аналогично шаблонам функций. определяется шаблон семейства классов:

template<список_параметров_шаблона> определение_класса

Шаблон семейства классов определяет способ построения отдельных классов подобно тому, как класс определяет правила построения и формат отдельных объектов. В определении класса, входящего в шаблон, особую роль играет имя класса. Оно является не именем отдельного класса, а параметризованным именем семейства классов. Как и для шаблонов функций, определение шаблона класса может быть только глобальным. Какой бы тип ни имели элементы массива (целый, вещественный, с двойной точностью и т.д.), в этом классе должны быть определены одни и те же базовые операции, например доступ к элементу по индексу и т.д. Если тип элементов вектора задавать как параметр шаблона класса, то система будет формировать вектор нужного типа (и соответствующий класс) при каждом определении конкретного объекта.



Следующий шаблон автоматически формирует классы векторов с указанными свойствами:

// vector.h - шаблон векторов

template<class T> // T - параметр шаблона

class Vector

{public:

Vector(int); // Конструктор класса vector

~Vector() // Деструктор

{ delete [] data; }

// Расширение действия (перегрузка) операции "[]":

T &operator [](int i)

{ return data [i]; }

protected:

T *data; // Начало одномерного массива

int size; // Количество элементов в массиве};

// vector.cpp

// Внешнее определение конструктора класса:

template<class T> Vector <T>::Vector(int n)

{ data = new T[n]; size = n;};

Когда шаблон введен, у программиста появляется возможность определять конкретные объекты конкретных классов, каждый из которых параметрически порожден из шаблона.В программе шаблон семейства классов с общим именем Vector используется для формирования двух классов с массивами целого и символьного типов. В соответствии с требованием синтаксиса имя параметризованного класса, определенное в шаблоне (в примере Vector), используется в программе только с последующим конкретным фактическим параметром (аргументом), заключенным в угловые скобки. Параметром может быть имя стандартного или определенного пользователем типа. В данном примере использованы стандартные типы int и char. Использовать имя Vector без указания фактического параметра шаблона нельзя - никакое умалчиваемое значение при этом не предусматривается.

Реализация компонентной функции шаблона класса, которая находится вне определения шаблона класса, должна включать дополнительно следующие два элемента: Определение должно начинаться с ключевого слова template, за которым следует такой же список_параметров_типов в угловых скобках, какой указан в определении шаблона класса. За именем_класса, предшествующим операции области видимости (::), должен следовать список_имен_параметров шаблона.

template<список_типов>

тип_возвр_значения имя_класса<список_имен_параметров>::имя_функции(список_параметров)

{ ... }

112. шаблон семейства классов: template<список_параметров_шаблона> определение_класса

Шаблон семейства классов определяет способ построения отдельных классов подобно тому, как класс определяет правила построения и формат отдельных объектов. В определении класса, входящего в шаблон, особую роль играет имя класса. Оно является не именем отдельного класса, а параметризованным именем семейства классов. Как и для шаблонов функций, определение шаблона класса может быть только глобальным. Следуя авторам языка и компилятора Си++, рассмотрим векторный класс (в число данных входит одномерный массив). Какой бы тип ни имели элементы массива (целый, вещественный, с двойной точностью и т.д.), в этом классе должны быть определены одни и те же базовые операции, например доступ к элементу по индексу и т.д. Если тип элементов вектора задавать как параметр шаблона класса, то система будет формировать вектор нужного типа (и соответствующий класс) при каждом определении конкретного объекта. Следующий шаблон автоматически формирует классы векторов с указанными свойствами: // vector.h - шаблон векторов

template<class T> // T - параметр шаблона

class Vector{

public:

Vector(int); // Конструктор класса vector

~Vector() // Деструктор {

delete [] data;}

// Расширение действия (перегрузка) операции "[]":

T &operator [](int i) {

return data [i];}

protected:

T *data; // Начало одномерного массива

int size; // Количество элементов в массиве

};

// vector.cpp

// Внешнее определение конструктора класса:

template<class T> Vector <T>::Vector(int n)

{

data = new T[n];

size = n;

};

 

113. Шаблоны определяются с помощью ключевого слова template и предназначены для определения функций и классов способных работать с различными типами входных и выходных параметров. Шаблоны и наследование связаны следующим образом:

шаблон класса может быть производным от шаблонного класса;

шаблон класса может являться производным от нешаблонного класса;

шаблон класса может быть производным от шаблона класса;

нешаблонный класс может быть производным от шаблона класса.

Шаблонные функции:

Объявление:

template <class T> // или template <typname T>;

T max(T val1, T val2, T val3)

{

T max = val1;

if(val2 > max) max=val2;

if(val3 > max) max=val3;

return max;

}

Использование:

int rez = max(1,10,3);

float rez = max(0.5,9.99,6.78);

Шаблоны и друзья:

friend void f1(); //друг любого класса

friend void f2(x<T> &); //друг конкретного класса

friend void A::f4(); //друг любого класса

friend void C<T>::f5(x<T> &); //друг конкретного класса

friend class Y; //класс Y дружественен любому классу

friend class Z<T>; //класс Y дружественен конкретному классу

 


Эта страница нарушает авторские права

allrefrs.ru - 2017 год. Все права принадлежат их авторам!