Скачать 496.92 Kb.
|
Раздел инициализации и объявления служит для объявления переменных цикла и/или придания переменным цикла первоначальных значений. Раздел объявления и инициализации выполняется только один раз. Переменные объявленные в этом разделе являются локальными относительно тела цикла. Разрешается инициализировать несколько переменных, записывая их через запятую. Условие продолжения цикла определяет, когда следует завершить выполнение цикла. Может содержать выражения сравнения, включая составные. Если в результате вычисления получается false (нуль), тогда цикл завершается. Раздел модификации выполняются после каждой итерации цикла и служат обычно для изменения параметров цикла. В части инициализации и модификаций можно записать несколько операторов через запятую. Тело цикла - простой или составной оператор. Любая из частей оператора for может быть опущена (но точки с запятой надо оставить на своих местах). Пример 3.1: for(;;i++); // Пример бесконечно выполняющегося цикла for (int i = 1, s = 0; i<=100; i++) s += i; // Cумма чисел от 1 до 100 for (int i = 1, s = 0; i<=100; i++, s += i); i=5;for(i<10;;i++){cout<
Цикл типа while. Цикл while представляет собой цикл for без разделов инициализации и модификации. Цикл while – цикл с предусловием. while (условие продолжения цикла) тело цикла Порядок выполнения: Вычисляется условие продолжения цикла. Если результат вычисления true (не ноль) выполняется тело цикла. Далее возвращаемся к условию продолжения цикла. Пример 3.2. Запрашиваем и выводим символы, пока не будет нажата клавиша «Q» или «q». //Переменную ch инициализируем на тот случай если там уже код выхода char ch=0; while(ch!='Q' && ch!='q') { cin>>ch; cout< Цикл типа do … while является циклом с постусловием и выполняется по меньшей мере один раз. do тело цикла while (условие продолжения цикла); Порядок выполнения: Проверка истинности условия продолжения цикла происходит после выполнения тела цикла. Тело цикла повторяется пока условие продолжения цикла истинно (не равно нулю). Пример. Перепишем предыдущий пример с использованием цикла с постусловием. //Нет необходимости инициализировать переменную ch char ch; do{cin>>ch; cout< Оператор break инициирует выход из цикла, в котором он содержится. Оператор break может быть использован в циклах всех трех типов. Действие оператора распространяется только на тот цикл, непосредственно в котором он находится. Пример 3.3. Некоторый генератор чисел выдает числа из промежутка [a,b). Экспериментатор суммирует эти числа вплоть до первого отрицательного числа. Проведя десять опытов экспериментатору необходимо найти среднее арифметическое этих сумм.
Оператор continue вызывает пропуск оставшейся части итерации внутри цикла и переход к следующей итерации. Пример 3.4. Сгенерировать 100 случайных чисел из промежутка [a,b). Найти сумму чисел, делящихся на 5. srand(time(NULL)); int summ=0;int a=-10, b=30; for (int i=0,n=0;i<100;i++){ n=rand() % (b-a)+a; if (n% 5!=0) continue;//нижеследующее суммирование не происходит summ+=n; }; cout << summ << endl; Оператор goto оператор безусловного перехода. Имеет формат: goto метка; Метка определяется как идентификатор: оператор;. Использование оператора goto не рекомендуется за исключением случаев принудительного выхода из нескольких вложенных циклов или конструкций выбора switch. ПОЛЬЗОВАТЕЛЬСКИЕ ТИПЫ ДАННЫХ Ключевое слово typedef используется для того чтобы задать типу новое имя. typedef тип новое_имя [ размерность ]; Такое переименование часто используется для облегчения переносимости программ при наличии машинно-зависимых типов. Размерность в квадратных скобках указывается при необходимости определить новый тип как массив. Примеры: typedef unsigned UINT; typedef char Message[100]; UINT i. j; Message msg[10]; // массив из 10 строк по 100 символов Указатели и ссылки Указатель — переменная, диапазон значений которой состоит из адресов ячеек памяти и специального значения — нулевого адреса. Значение нулевого адреса не является реальным адресом и используется только для обозначения того, что указатель в данный момент не может использоваться для обращения ни к какой ячейке памяти. В C++ различают указатели на объект, указатели на функцию, указатели на void Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа (основного или составного). Объявление указателя на объект: тип *имя; Например, int *а, *с; //указатели на ячейки памяти, которые содержат целые числа. Указатель на void применяется в тех случаях, когда конкретный тип объекта, адрес которого требуется хранить, не определен. Для работы с областью памяти, на которую указывает void-указатель необходимо этот указатель приводить к указателю на конкретный тип. Любой указатель может быть сведен к указателю на void. Указатель может быть константой или переменной, а также указывать на константу или переменную. Если поставить модификатор const стоит непосредственно перед именем указателя (после *), то получим константный указатель. Если const стоит непосредственно перед или после типа (перед *) в результате получим указатель константу. Для инициализации указателей можно использовать операцию получения адреса &. Для определения «пустого», никуда не указывающего указателя используется определенная в стандартной библиотеке константа NULL. Операция разадресации (разыменование) - предназначена для доступа к величине, адрес которой хранится в указателе. Синтаксически определяется с помощью *перед именем указателя. Пример 4.1. int i=1; const int *p1; // указатель на константу типа int //int const *p1; тоже самое int *const p2=&i; /* константный указатель на объект типа int необходимо всегда инициализировать */ const int *const p3=&i; /* константный указатель на константу типа int необходимо всегда инициализировать */ //int const *const p3=&i; тоже самое p1=&i; // связали указатель на константу с переменной //*p1=2;//ошибка. содержание через адрес менять нельзя. i=10;// но так можно поменять значение по адресу p1 //p2++; ошибка адрес изменять нельзя Операции с указателями.
Пример 4.2. unsigned int A = 0xFFF0030; // указатель pint указывает на область памяти меньшей разрядности unsigned short int *pint = (unsigned short int*) &A; unsigned char* pchar = (unsigned char *) &A; // размер области еще меньше cout<< *pint << endl<<*pchar; // первоначальная информация потеряна.
Пример 4.3.
Работа с динамической памятью В С++ используется два способа работы с динамической памятью:
Операция new выделение участка динамической памяти, достаточного для размещения величины заданного типа и записывает адрес начала этого участка в переменную указатель. С помощью круглых скобок можно произвести инициализация выделенной динамической памяти. int* n = new int; int* m = new int (10); Освобождение памяти, выделенной с помощью операции new, должно выполняться с помощью delete. При этом освобождается только память, указатель же может быть проинициализирован и использован далее. delete n; delete m; Семейство функций malloc Функция free: void free(void *block); освобождает блок памяти, выделенный функциями calloc, malloc или realloc. Функция malloc: void *malloc(size_t size); обеспечивают выделение блока памяти, размером size байт. Блок не обнуляется. Функция возвращает указатель (void) на блок выделенной памяти. Если для размещения блока недостаточно памяти, функция malloc возвращает NULL. Если аргумент size равен 0, то функция возвращает NULL. int n = 100; // q указывает на блок памяти достаточный для хранения ста чисел типа float float *q = (float *) malloc(n * sizeof(float)); Функция calloc: void * calloc(size_t nitems, size_t size); выделяет блок памяти размером nitems*size. Блок обнуляется. calloc возвращает указатель (void) на выделенный блок. calloc возвращает NULL, если недостаочно памяти для выделения нового блока, или nitems или size равны 0. int n = 100; /* q указывает на блок памяти в котором расположено сто нулевых значений типа float */ float *q = (float *) calloc(n , sizeof(float)); Функция realloc: void * realloc(void *block, size_t size); пытается изменить предварительно выделенный блок до размера в size байт. Аргумент block указывает на блок памяти, полученный при вызове функций malloc, calloc или realloc. Если block является нулевым указателем, realloc работает также как и malloc. Блока памяти сохраняет состояние (или копирует значения в другой блок). Возвращаемый адрес блока может отличаться от исходного. Если блок не может быть выделен или size равно 0, то realloc возвращает NULL. int n = 100; float *q = (float *) calloc(n , sizeof(float)); // пробуем увеличить блок в два раза. q = (float *) realloc(q , sizeof(float)*2*n); Ссылка указатель, который всегда разыменован. тип & имя; Ссылки не могут быть неинициализированными, за исключением случаев, когда они передаются в качестве параметров функций либо определены через спецификатор extern (на самом деле ссылка инициализирована в другом месте программы). Ссылки не могут указывать в никуда. Ссылка не может быть переопределена, т.е. сослаться на другой объект. Нельзя делать ссылку на ссылку, указатель на ссылку, массив ссылок. int i = 1; int& ref = i;// ref и i теперь ссылаются на один int int x = ref;// x = 1 ref = 2;// i = 2; ref++; // i увеличивается на 1 i+=3; // значение по ссылке ref увеличится на 3 Перечисления Перечисляемый тип - тип данных, чьё множество значений представляет собой ограниченный список идентификаторов. В С++ значения перечисляемого типа представляют собой список целочисленных констант. enum [ имя_типа ] { списокконстант }; Имя типа задается в том случае, если в программе требуется определять переменные этого типа. Константы могут инициализироваться присваиванием. При отсутствии инициализатора первая константа обнуляется, а каждой следующей присваивается на единицу большее значение, чем предыдущей. Имена перечисляемых констант должны быть уникальными, а значения могут совпадать. Пример: enum numbers{two = 2, three, four, ten = 10, eleven, fifty = ten + 40}; Переменной типа перечисление можно присваивать лишь переменную такого же типа либо одну из констант перечисления. Над перечислениями и базовыми скалярными типами определены операции сравнения. При этом происходит автоматическое приведение типов. Пример 4.4. enum numbers{two = 2, three, four, ten = 10, eleven, fifty = ten + 40}; int main(){ numbers n1,n2; //определяем две переменные перечисляемого типа int i; char c; double d; // вспомогательные переменные n1=eleven; //присваиваем переменной одну из констант перечисления n2=n1; // присваивание над двумя переменными перечислениями i=n1; d=n1; c=eleven; // перечисляемый тип сводится к базовым // далее примеры сравнений перечислений между собой и переменными базовых типов. if (n1>=n2) cout<<"ok"< if ((eleven==d) && (n2==i) && (c!=four)) cout<<"ok"< // n2=i; n2=c; n2=d; // ОШИБКА приведения типов return 0;} |
Применение многопроцессорных вычислительных систем (мвс) ставит две задачи построения параллельных алгоритмов: распараллеливание... | Основы программирования и конфигурирования в корпоративных информационных системах | ||
Описать основные элементы структуры программы ( Раздел интерфейса, раздел реализации, раздел инициализации) | Цель контрольной работы – закрепление и проверка знаний, полученных студентами заочной формы обучения в процессе самостоятельного... | ||
Виртом в 1971 г., играет особую роль и в практическом программировании, и в его изучении. С непревзойденной четкостью в нем реализованы... | Методические указания предназначены для выполнения курсовой работы по дисциплине «Объектно-ориентированное программирование» для... | ||
Хотя набор стандартных функций электронных таблиц достаточно широк, для некоторых задач он либо недостаточен, либо выполнение таких... | Интерфейс среды matlab (окно команд, окно рабочего пространства, окно истории команд, окно «текущая папка», окно Details, меню Start,... | ||
Назовите основные разделы науки о языке и единицы языка, изучаемые в этих разделах | Представительством Европейского Союза в России для облегчения понимания правил конкурса для потенциальных российских участников.... |
Поиск Главная страница   Заполнение бланков   Бланки   Договоры   Документы    |