Операции сравнения и логические операции

Структуры

Структура (struct) — это композитный тип данных, представляющий собой набор из независимых переменных. Переменные, из которых составлена структура, называются её полями или элементами Каждое поле имеет свой тип и имя. Элементом структуры может быть переменная какого угодно типа, кроме самой структуры.

Указатели и ссылки на структуры.

1. Операция взятия адреса &. Операция разименования указателя *.

2. Операторы new и delete. Объявление и разрушение массивов.

3. Утечки памяти.

4. Использование указателя на несуществующий объект.

9. В C++ существует специальный тип указателя, который называется указателем на неопределённый тип. Для определения такого указателя вместо имени типа используется ключевое слово void в сочетании с описателем, перед которым располагается символ ptr. С одной стороны, объявленная подобным образом переменная также является объектом определённого типа - типа указатель на объект неопределённого типа. Но, с другой стороны, для объекта типа указатель на объект неопределённого типа отсутствует информация о размерах и внутренней структуре адресуемого участка памяти. Из-за этого не могут быть определены какие-либо операции для преобразования значений. Объектам типа указатель на объект неопределённого типа в качестве значений разрешается присваивать значения лишь в сочетании с операцией явного преобразования типа. В этом случае указатель на объект неопределённого типа становится обычным указателем на объект какого-либо конкретного типа. Со всеми вытекающими отсюда последствиями. Но и тогда надо постоянно напоминать транслятору о том типе данных, который в данный момент представляется указателем на объект неопределённого типа. Для указателя на объект неопределённого типа не существует способа непосредственной перенастройки указателя на следующий объект с помощью операции инкрементации. В операторе, реализующем операции инкрементации и декрементации, только с помощью операций явного преобразования типа можно сообщить транслятору величину, на которую требуется изменить первоначальное значение указателя.

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

Различают:
- простые типы данных: целые, действительные числа и др.;
- составные типы данных: массивы, строки, структуры, указатели на структуры…

Структуры: Использование структур обусловлено необходимостью объединить несколько переменных. Структуры - это, обычно, группа переменных описывающих какую-нибудь сущность. Например, в игре танк можно описать группой переменных: количество снарядов, количество горючего и т.д. У нас в примере танк будет обладать следующими параметрами: координаты и количество топлива (от нуля до двадцати). Зачем нам использовать какие-то структуры спросите Вы? Ведь переменные и так прекрасно хранятся. Причин две: переменные в структурах хранятся в одном месте и можно создавать несколько структурных переменных и у всех у них будут одинаковые характеристики. Объявления у структуры нет. Её нужно сразу определять. Тело структуры должно находиться до начала main. Когда мы определяем структуру, под неё не выделяется память. Структура - это как шаблон.

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

11. Условные операторы - это специальные коды-символы, которые могут выполнять какие-то сценарии. Условный оператор реализует выполнение определённых команд при условии, что некоторое логическое выражение (условие) принимает значение «истина» true

Условный оператор if

if (условие) {блок из одного или более операторов}

Если условие верно, то выполняется блок из одного или более операторов

Второй вариант:

if (условие) {блок 1 из одного или более операторов} else {блок 2 из одного или более операторов}

Оператор while

Цикл while - цикл с неизвестным числом повторений

while (условие) {блок из одного или нескольких операторов}

Если условие истинно (принимает не нулевое значение), то выполняется блок из одного или нескольких операторов и происходит возврат на проверку условия. Если условие ложно, происходит выход из цикла. Условие может быть составлено из нескольких выражений, с использованием || (логическое сложение "или") и &&(логическое умножение "и")

Оператор do...while

do...while - это цикл с постусловием.

Цикл do ... while - цикл с неизвестным числом повторений. В отличие от цикла while условие проверяется в конце цикла. Поэтому тело цикла выполняется хотя бы один раз

do {блок из одного или нескольких операторов} while (условие)

12. Циклы в языке Си++ позволяют программисту определить действия, которые будут повторяться пока условие остается истинным.

В языке C++ существует три вида циклов: цикл while c предусловием, цикл while с постусловием, цикл for.

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

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

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

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

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

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

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

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

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

Цикл for

При использовании цикла for необходимо задать три параметра (в круглых скобках через точку с запятой).

Первый параметр – начальное значение переменной, задается в виде присваивания переменной значения, в нашем случае – i=1.

Второй параметр – конечное значение переменной, задается в виде условия на значение переменной. Цикл будет исполняться, пока условие истинно, в нашем случае условие i<=n означает, что переменная i будет принимать значения до n включительно.

Третий параметр – шаг изменения переменной. Запись ++i означает, что переменная i будет увеличиваться на 1 с каждым новым исполнением цикла, запись --i – уменьшаться.

Оператор цикла for имеет следующий синтаксис:

for (int i=0; i<20; i++) {действие}

В языке Си++ нет особого подхода к вложенным циклам. Как и в других языках программирования, в Си рассматриваются внутренние и внешние циклы. Их-то и называют вложенными. Если один цикл находится внутри другого цикла, то первый цикл называют внутренним, а второй - внешним. Подобные циклы Вы чаще всего можете встретить при работе с таблицами. Например, простейшей таблицой, как известно, является таблица умножения: 2 х 2 = 4 и так далее.

Простые циклы.

Для циклов с известным количеством повторений характерно то, что задаются:

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

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

Сложные циклы.

Сложные циклы содержат внутри себя один или несколько других циклов, поэтому одни циклы оказываются включенными в состав других. Циклы, объемлющие (охватывающие) другие циклы, принято называть внешними, а циклы, входящие (включенные) во внешние циклы, - внутренними (вложенными).

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

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

13. Прототипом функции в C++ называется объявление функции, которое не содержит тело функции, но указывает имя функции, арность(кол-во аргументов), типы аргументов и возвращаемый тип данных. В то время как определение функции описывает, что именно делает функция, прототип функции может восприниматься как описание её интерфейса. В прототипе имена аргументов являются необязательными, тем не менее, необходимо указывать тип вместе со всеми модификаторами (например, указатель ли это или константный аргумент). Пример

В качестве примера, рассмотрим следующий прототип функции:

int foo(int n);

Этот прототип объявляет функцию с именем «foo», которая принимает один аргумент «n» целого типа и возвращает целое число. Определение функции может располагаться где угодно в программе, но определение требуется только в случае её использования.

В C++ в пользовательских функциях доступны параметры по умолчанию.

Пользовательские фун-и ввода и вывода.

В C++ для ввода и вывода данных используются объекты потоковых классов.

Мы уже использовали потоковые объекты для ввода/вывода данных в консольных приложениях. Ключевые слова cout и cin - это обычные объекты. А операторы извлечения из потока >> и вставки в поток << - перегруженные операции классов этих объектов.

Система классов ввода/вывода довольна сложна. Базовым классом является класс ios (от Input/Output Stream - потоковый ввод/вывод). У класса ios довольно много производных классов. На данный момент нас интересует лишь несколько.

cin и cout - объекты классов istream (от Input Stream - поток ввода) и ostream (от Output Stream - поток вывода) соответственно. Именно для этих классов перегружены операторы извлечения и вставки.

14. Указатели в C++

Указатель в C++ – это переменная, хранящая адрес некоторого объекта. Если объект имеет тип T, то указатель на него описывается следующим образом:

T* p;

При объявлении нескольких указателей символ * обязателен перед именем каждой переменной. Так, в объявлении

double* p1, p2, *p3;

Записи T* p и T *p равноценны. Запись T* p обычно читается как
«p принадлежит к типу указатель на T », а запись T *p – как «p является указателем на объект типа T».

Указателю можно присвоить либо значение 0, либо адрес объекта, используя унарный оператор взятия адреса &. Например:

int i,a[10];

int* pi=&i,*pa,*pb=0;

pa=&a[9];

Массив указателей и указатель на массив объявляются следующим образом:

int* b[10]; // массив указателей

int (*paa)[10]=&a; // указатель на массив

Можно также объявить указатель на указатель:

char c;

char* pc=&c;

char** ppc=&pc;

Указатели, инициализированные значением 0, называются нулевыми и ни на что не указывают.

Бывают случаи, когда нас интересует просто значение адреса, а не тип указываемого объекта. С этой целью в язык C++ введены указатели void*, способные хранить адрес любого объекта. В отличие от типизированных указателей, рассмотренных выше, указатели void* называются нетипизированными.

Ссылки в C++

Ссылка в C++ – это альтернативное имя (псевдоним) объекта. Это определение ỳже общего определения ссылки, данного во введении. Запись T& обозначает ссылку на объект типа T. Например, в следующем фрагменте

int i=1;

int& r=i;

объявляется ссылка на переменную i, в результате чего как r, так и i ссылаются на один и тот же объект целого типа. Теперь значение переменной i можно изменить через ссылку r:

r=2; // i получит значение 2

r++; // i получит значение 3

В момент объявления ссылка обязательно должна инициализироваться объектом соответствующего типа. После объявления повторная инициализация ссылки невозможна. Обратите внимание, что для обозначения ссылочного типа используется тот же символ &, что и для оператора взятия адреса. Что именно имеется в виду, ясно из контекста: знак & после имени типа используется для объявления ссылки, в остальных случаях он обозначает оператор взятия адреса. Заметим также, что могут существовать объекты, вообще не имеющие собственного имени; ссылка для них выступает в роли единственного имени и предоставляет единственный способ доступа. Ссылку можно представлять себе как константный указатель, который всегда разыменован. Однако необходимо помнить, что, в отличие от указателя, память под ссылку не выделяется, т. е. сама ссылка не является объектом! Именно поэтому не имеет смысла объявление указателя на ссылку, ссылки на ссылку или массива ссылок: Ссылка же на указатель является распространенной практикой:

int *p;

int*& rp=p;

Ссылочные переменные- это замена указателей в C++. первого типа ссылочных переменных - жёсткие ссылки. Жёсткая ссылочная переменная - это синоним другой переменной. $a = 5; $b = &$a; $a = 8; echo $b; Теперь объясняю, что здесь написано. Вначале мы создаём переменную a, которой присваиваем значение 5. Дальше мы создаём жёсткую ссылку b на переменную a. Затем изменяем переменную a. И ввиду того, что b - это синоним a, у нас изменяется и b тоже. То есть значение одно, а переменных, ссылающихся на это значение, две. Переходим ко второму типу (и последнему) ссылочных переменных в PHP, к символическим ссылкам. Символическая ссылка - это переменная, которая содержит строковое значение с именем другой переменной. Советую вдуматься в это определение, чтобы стало понятно. И сразу пример:

<?php
$a = 17.1;
$b = "a";
echo $$b;
?>

В результате, как не трудно догадаться, вылезет число "17.1". Обратите внимание, что мы использовали конструкцию из двух знаков "$". Такая конструкция добирается до значения переменной, на которую ссылается символическая ссылка.

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

15. Перегрузка функций является особенностью языка C++, которой нет в языке С. Как вы увидите, перегрузка функций достаточно удобна и может улучшить удобочитаемость ваших программ. Перегрузка функций позволяет вам использовать одно и то же имя для нескольких функций с разными типами параметров. Для перегрузки функций просто определите две функции с одним и тем же именем и типом возвращаемого значения, которые отличаются количеством параметров или их типом. Перегрузка функций позволяет вашим программам определять несколько функций с одним и тем же именем и типом возвращаемого значения. Одним из наиболее общих случаев использования перегрузки является применение функции для получения определенного результата, исходя из различных параметров. Перегрузка функций улучшает удобочитаемость программ . Перегрузка функций C++ позволяет вашим программам определять несколько функций с одним и тем же именем. Перегруженные функции должны возвращать значения одинакового типа*, но могут отличаться количеством и типом параметров. До появления перегрузки функций в C++ программисты языка С должны были создавать несколько функций с почти одинаковыми именами. К сожалению программисты, желающие использовать такие функции, должны были помнить, какая комбинация параметров соответствует какой функции. С другой стороны, перегрузка функций упрощает задачу программистов, требуя, чтобы они помнили только одно имя функции. Что надо знать: 1. Перегрузка функций предоставляет несколько "взглядов" на одну и ту же функцию внутри вашей программы. 2. Для перегрузки функций просто определите несколько функций с одним и тем же именем и типом возвращаемого значения, которые отличаются только количеством и типом параметров. 3. В процессе компиляции C++ определит, какую функцию следует вызвать, основываясь на количестве и типе передаваемых параметров. 4. Перегрузка функций упрощает программирование, позволяя программистам работать только с одним именем функции.

Операции сравнения и логические операции

!(логическое НЕ) <(меньше) <=(меньше либо равно) >(больше) >=(больше либо равно) ==(равно) !=(не равно) &&(логическое И) ||(логическое ИЛИ)

Примечание. Все операции в результате дают значение типа bool.

Операции сравнения и логические операции в результате дают значение типа bool, то есть true или false. Если же такое выражение встречается в контексте, требующем целого значения, true преобразуется в 1, а false – в 0.

Логические операции и выражения сравнения.

В языке отсутствует особый базовый тип данных для представления логических значений "ИСТИНА" и "ЛОЖЬ". Для этой цели используются значения целой переменной. Значение 0 всегда является "ложью". Значение 1 -"истиной".Такие значения дают операции сравнения и логические операции. Вообще, в широком смысле любое ненулевое значение является истинным.

ЛОГИЧЕСКИЕ ОПЕРАЦИИ И (&&) , ИЛИ (||) и НЕ (!) едины для всех языков программирования и соответствуют логическим функциям И, ИЛИ и НЕ для логических (булевых) переменных. Операция Иимеет результатом значение "истина" тогда и только тогда, когда оба ее операнда истинны, то есть по отношению к операндам -утверждениям звучит как "одновременно оба". Операция ИЛИ имеет результатом значение "истина", когда хотя бы один из операндов истинен, то есть характеризуется фразой "хотя бы один":

if (a < b && b < c) // если ОДНОВРЕМЕННО ОБА a < b и b < c, то...

if (a==0 || b > 0) // если ХОТЯ БЫ ОДИН a==0 или b > 0, то...

Логические операции И и ИЛИ имеют еще одно свойство. Если в операции И первый операнд имеет значение "ложь", а в операции ИЛИ -"истина", то вычисление выражения прекращается, потому что значение его уже становится известным ("ложь" -для И, "истина" -для ИЛИ). Поэтому возможны выражения, где в первом операнде операции И проверяется корректность некоторой переменной, а во втором -она же используется с учетом этой корректности:

if (a >=0 && sin(sqrt(a)) >0) ...

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

Особо следует отметить операцию логической инверсии (отрицания) -"!". Значение "истина" она превращает в "ложь" и наоборот. Если считать значением "истина" любое ненулевое значение целой переменной, то эту операцию для целых следует понимать как проверку на 0:

while(!k) {...} // эквивалентно while(k==0) {...}

Так же логические операции: x==y, x<y,x<=y,x>=y.

В языке Си принято следующее правило: истина - это любое ненулевое значение; ложь - это нулевое значение. Выражения, использующие логические операции и операции отношения, возвращают 0 для ложного значения и 1 для истинного.

4.операции инкремента и декремента (или увеличения и уменьшения). Операторы этих операций выглядят соответственно так: ++ и -- . Что же они делают? При операции увеличения значение операнда увеличивается на 1, а при операции уменьшения - уменьшается на 1. Необычность операторов ++ и -- в том, что их можно использовать и как префиксные (помещая перед переменной: ++n), и как постфиксные (помещая после переменной: n++). В обоих случаях значение n увеличивается на 1, но выражение ++n увеличивает n до того, как его значение будет использовано, а n++ — после того. Предположим, что переменная n содержит число 5, тогда

x = n++;

присвоит x значение 5, а

x = ++n;

присвоит x значение 6. И в том и в другом случае n станет равным 6. Операторы инкремента и декремента можно применять только к переменным. Выражения вроде (i + j)++ недопустимы.

5. Указатель – это переменная, содержащая адрес другой переменной. Типичная компьютерная система содержит массив последовательно пронумерованных (адресуемых) ячеек памяти, с которыми можно работать по отдельности либо целыми непрерывными группами. Указатель представляет собой группу ячеек памяти, которые содержат адрес какой-либо переменной. Синтаксис объявления указателя на переменную:

тип *имя_указателя

Например,

int *px;

double *yx;

Указатели принято инициализировать при объявлении либо нулем (т.е. указатель не содержит адреса и не указывает ни на какой объект), либо адресом другой переменной. Например,

int *px = 0; // указатель инициализируется нулем

int x;

int *px = &x; // указатель инициализируется адресом переменной х

Одноместная унарная операция & дает адрес объекта (переменной). В этом случае говорят, что px указывает на x. Одноместная операция * называется операцией ссылки по указателю или разыменовывания. Применяя ее к указателю, получаем объект (переменную), на который он указывает.

Наши рекомендации