Ю. А. Медведев основы программирования на языке c++


Скачать 496.92 Kb.
НазваниеЮ. А. Медведев основы программирования на языке c++
страница2/5
ТипДокументы
1   2   3   4   5
Раздел инициализации и объявления служит для объявления переменных цикла и/или придания переменным цикла первоначальных значений. Раздел объявления и инициализации выполняется только один раз. Переменные объявленные в этом разделе являются локальными относительно тела цикла. Разрешается инициализировать несколько переменных, записывая их через запятую.

Условие продолжения цикла определяет, когда следует завершить выполнение цикла. Может содержать выражения сравнения, включая составные. Если в результате вычисления получается 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<

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

//не правильный вариант

for (int i=1, d=3.14; i<=10; d+=3.14,++i)

cout << sin(d)<

//Правильный вариант

int i; double d;

for ( i=1, d=3.14; i<=10; d+=3.14,++i)

cout << sin(d)<






Цикл типа while.

Цикл while представляет собой цикл for без разделов инициализации и модификации. Цикл while – цикл с предусловием.

while (условие продолжения цикла) тело цикла

Порядок выполнения: Вычисляется условие продолжения цикла. Если результат вычисления true (не ноль) выполняется тело цикла. Далее возвращаемся к условию продолжения цикла.

Пример 3.2. Запрашиваем и выводим символы, пока не будет нажата клавиша «Q» или «q».

//Переменную ch инициализируем на тот случай если там уже код выхода

char ch=0; while(ch!='Q' && ch!='q') { cin>>ch; cout<


Цикл типа dowhile является циклом с постусловием и выполняется по меньшей мере один раз.

do тело цикла while (условие продолжения цикла);

Порядок выполнения: Проверка истинности условия продолжения цикла происходит после выполнения тела цикла. Тело цикла повторяется пока условие продолжения цикла истинно (не равно нулю).

Пример. Перепишем предыдущий пример с использованием цикла с постусловием.

//Нет необходимости инициализировать переменную ch

char ch; do{cin>>ch; cout<Управляющие операторы в циклах.

Оператор break инициирует выход из цикла, в котором он содержится. Оператор break может быть использован в циклах всех трех типов. Действие оператора распространяется только на тот цикл, непосредственно в котором он находится.

Пример 3.3. Некоторый генератор чисел выдает числа из промежутка [a,b). Экспериментатор суммирует эти числа вплоть до первого отрицательного числа. Проведя десять опытов экспериментатору необходимо найти среднее арифметическое этих сумм.

#include

#include

#include

#include

using namespace std;

int main(){

srand(time(NULL));

double summ=0;int a=-10, b=30;

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

while (true){

n=rand() % (b-a)+a;

if (n<0) break;

s+=n;

};

summ+=s;

};

cout << summ/10<
return 0;

}

Оператор 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; // первоначальная информация потеряна.

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

  • Инкремент увеличивает значение указателя на величину sizeof(тип).

  • Декремент уменьшает значение указателя на величину sizeof(тип).

  • Сложение (вычитание) указателей с константой увеличивает(уменьшает) их значение на величину константа*sizeof(тип)

  • Разность двух указателей — это разность их значений, деленная на размер типа в байтах.

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

  • Поскольку адреса представляют собой беззнаковые целые числа, операции сравнения проводятся над указателями так, как бы они были целыми числами

Пример 4.3.

int *ptr, a[10]; // указатель на int и массив

ptr=&a[5]; // адрес элемента a[5]

ptr++; // равно адресу элемента a[6]

ptr--; // равно адресу элемента a[5]

//----------------------------------------------------------

int *ptr1, *ptr2, a[10];

int i=2;

ptr1=a+(i+4); // равно адресу элемента a[6]

ptr2=ptr1-i; // равно адресу элемента a[4]

//-----------------------------------------------------------


int *ptr1, *ptr2, a[10];

int i;

ptr1=a+4;

ptr2=a+9;

i=ptr1-ptr2; // равно 5

i=ptr2-ptr1; // равно -5

//---------------------------------------------------

int *ptr1, *ptr2, a[10];

ptr1=a+5;

ptr2=a+7;

if (prt1>ptr2) a[3]=4;

/* значение ptr1 меньше значения ptr2 и поэтому оператор a[3]=4 не будет выполнен.

*/


Работа с динамической памятью

В С++ используется два способа работы с динамической памятью:

  • операции new и delete;

  • семейство функций mallос (наследие языка С).

Операция 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;}
1   2   3   4   5

Похожие:

Ю. А. Медведев основы программирования на языке c++ iconЕ. Н. Акимова основы программирования на языке фортран учебное пособие
Применение многопроцессорных вычислительных систем (мвс) ставит две задачи построения параллельных алгоритмов: распараллеливание...

Ю. А. Медведев основы программирования на языке c++ iconТоп-программа «Разработчик 1С» примерная программа дисциплины
Основы программирования и конфигурирования в корпоративных информационных системах

Ю. А. Медведев основы программирования на языке c++ iconВопросы к зачету по дисциплине Основы программирования
Описать основные элементы структуры программы ( Раздел интерфейса, раздел реализации, раздел инициализации)

Ю. А. Медведев основы программирования на языке c++ iconОсновы программирования
Цель контрольной работы – закрепление и проверка знаний, полученных студентами заочной формы обучения в процессе самостоятельного...

Ю. А. Медведев основы программирования на языке c++ iconПаскаль как язык структурно-ориентированного программирования
Виртом в 1971 г., играет особую роль и в практическом программировании, и в его изучении. С непревзойденной четкостью в нем реализованы...

Ю. А. Медведев основы программирования на языке c++ iconМетодические указания содержат общие понятие объектно-ориентированного...
Методические указания предназначены для выполнения курсовой работы по дисциплине «Объектно-ориентированное программирование» для...

Ю. А. Медведев основы программирования на языке c++ iconМетодические указания по выполнению лабораторных работ на алгоритмическом...
Хотя набор стандартных функций электронных таблиц достаточно широк, для некоторых задач он либо недостаточен, либо выполнение таких...

Ю. А. Медведев основы программирования на языке c++ iconЛабораторная работа №1: Интерфейс среды matlab и основы программирования....
Интерфейс среды matlab (окно команд, окно рабочего пространства, окно истории команд, окно «текущая папка», окно Details, меню Start,...

Ю. А. Медведев основы программирования на языке c++ iconВведение в науку о языке
Назовите основные разделы науки о языке и единицы языка, изучаемые в этих разделах

Ю. А. Медведев основы программирования на языке c++ iconРуководство для заявителей
Представительством Европейского Союза в России для облегчения понимания правил конкурса для потенциальных российских участников....

Вы можете разместить ссылку на наш сайт:


Все бланки и формы на filling-form.ru




При копировании материала укажите ссылку © 2019
контакты
filling-form.ru

Поиск