![]()
Главная Обратная связь Дисциплины:
Архитектура (936) ![]()
|
Циклы 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 дружественен конкретному классу
![]() |