Операции инкремента и декремента (увеличение и уменьшение на 1)
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Вступление

Данное учебно-методическое пособие предназначено для студентов младших курсов, изучающих язык программирования С++. В большей степени пособие можно считать лабораторным практикумом, каждая лабораторная работа является значимой при изучении конкретного раздела языка С++. В пособии приведен теоретический материал каждого раздела и содержится много примеров.

Пособие ограничивается только рассмотрением структурного программирования на С++, поэтому в него не входят работа со строками класса string, работа с файловыми потоками, объектно-ориентированное программирование.

С++ - один из наиболее популярных языков программирования. Это гибкий язык с большими возможностями. После его изучения намного легче воспринимать и изучать прочие языки программирования. Этим обусловлен выбор данного языка для изучения студентами.

Для работы с программными кодами на С++ нет недостатка в программном обеспечении. Обычно используют среды разработки, в состав которых входят: редактор кодов, компилятор, отладчик и ряд других утилит. Можно использовать любую удобную среду разработки, для начала лучше ограничиваясь консольным приложением. В частности, можно использовать среду Code::Blocks.

Основные теоретические положения по языку С++

Переменные и тип данных

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

Основная цель любой программы – это обработка данных. Данные должны храниться в памяти компьютера, чтобы их можно было обработать. В памяти компьютера для хранения данных надо выделить место соответствующего размера. Данные различного типа хранятся по-разному и обрабатываются по-разному. Тип данных в программировании – очень важное понятие.

Тип данных определяет:

- внутреннее представление данных в памяти компьютера,

- множество значений, которые могут принимать величины этого типа,

- операции и функции, которые можно применять к величинам этого типа.

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

Типы данных С++ подразделяются на основные или стандартные (5 типов) и составные или производные (массивы, перечисления, структуры, ссылки, указатели, объединения, классы, …).

Основные типы данных часто называют арифметическими, так как их можно использовать в арифметических операциях.

Для описания основных типов определены следующие ключевые слова:

- int (целый);

- char (символьный);

- bool (логический);

- float (вещественный);

- double (вещественный с двойной точностью).

Первые три типа представляют целые числа, а последние два – числа с плавающей точкой. Код, который формирует компилятор для обработки целых величин, отличается от кода для величин с плавающей точкой.

Наиболее часто используется тип int. Этот тип является системно-зависимым: в ранних версиях Windows он занимает 2 байта, в 32-х разрядных ОС – 4 байта.

Тип char (символьный) может интерпретироваться как целый и может представлять целые числа в диапазоне от -128 до 127 или от 0 до 255.

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

double d1 = 2.25;                     // представление числа в формате с десятичной точкой

double d2 = 2.0E-5;                  // представление числа в экспоненциальной форме

Переменные логического типа (тип bool) могут иметь только два значения: false (ложь) и true (истина). Эти переменные фактически занимают 1 бит, но в компьютере минимальной адресуемой единицей информации является байт, поэтому переменные логического типа всегда занимают по байту памяти.

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

Если в процессе каких-то арифметических действий результат превосходит максимально допустимое значение для объявленного типа, то значения целочисленных переменных обнуляются.

 

Существует также 4 спецификатора типа, уточняющих внутреннее представление и диапазон значений стандартных типов:

- short (короткий);

- long (длинный);

- signed (знаковый);

- unsigned (беззнаковый).

Размеры типов данных можно вывести с помощью операции sizeof.

 

Минимальное и максимальное значения для целых типов зависят от реализации и приведены в заголовочном файле <limit.h>:

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

Тип void также относится к основным типам языка, но множество значений этого типа пусто. Он используется

- для определения функций, которые не возвращают значения,

- для указания пустого списка аргументов функции, // не обязательно

- как базовый тип указателей,

- в операции приведения типов.

 

Константы

 Константы используются в языке программирования, если программе запрещено изменять значение какой-либо переменной. В этом случае ее объявляют как константу. В языке С++ константы объявляются таким образом:

const int int_val = 25;                  // целая константа

const float float_val = 2.555;       // вещественная константа

const char sym = ‘+’;                  // символьная константа

Символьная константа состоит из одного символа, заключенного в одинарные кавычки, например, ‘f’, ‘3’, ‘ы’ и так далее. К разряду символьных констант относят и специальные символы.

Литеральные константы – это те значения, которые вводятся непосредственно в текст программы. Их также называют константами, поскольку после компиляции программы их значения нельзя изменить.

Строковая константа – последовательность символов кода ASCII, заключенная в двойные кавычки.

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

 

Состав языка С++

В тексте любого языка, в том числе языка программирования, можно выделить основные элементы:

- символы;

- слова;

- словосочетания;

- предложения.

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

Лексемы образуются из символов, выражения – из лексем и символов, операторы – из символов, выражений и лексем.

Алфавит языка (или его символы) – это основные неделимые знаки, с помощью которых пишутся все тексты на языке.

Алфавит языка С (С++) включает:

- прописные латинские буквы A…Z,

- строчные латинские буквы a…z, (прописные и строчные буквы в С++ различаются)

- арабские цифры 0…9,

- разделители: , | . | ; | ? | ! | / | \ | _ | # | % | & | ^ | ( | ) |- | + | = | { | } | [ | ] | ( | ) | < | > ;

- пробельные символы;

- специальные символы, необходимые для представления символов, не имеющих графического обозначения, например, \n – переход на новую строку или \a – звуковой сигнал и так далее.

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

// Однострочный комментарий в С++

/* Многострочный

      Комментарий в С++*/

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

Идентификаторы начинаются с латинской буквы и могут содержать латинские буквы, цифры и знаки подчеркивания. Длина идентификатора по стандарту не ограничена, но слишком длинные идентификаторы писать не следует, так как некоторые компиляторы налагают на длину ограничение. Для улучшения читаемости программы следует давать объектам осмысленные имена.

Существуют правила выбора идентификаторов:

- идентификатор не должен совпадать с ключевыми словами и именами используемых стандартных объектов языка;

- не рекомендуется начинать идентификатор с символа подчеркивания, так как они могут совпадать с именами системных функций или переменных.

Ключевые слова – это зарезервированные идентификаторы, которые имеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены.

Знаки операций обеспечивают прежде всего вычисление выражений. Один и тот же знак операции может употребляться в различных выражениях и по-разному интерпретироваться в зависимости от контекста.

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

 

 

Унарные операции

операция описание
1 ++ Увеличение на 1
2 -- Уменьшение на 1
3 sizeof Размер
4 ~ Поразрядное отрицание
5 ! Логическое отрицание
6 - Унарный минус (арифметическое отрицание)
7 + Унарный плюс
8 & Взятие адреса
9 * Разадресация
10 new Выделение памяти
11 delete Освобождение памяти
12 (type) Преобразование типа

 

Бинарные операции

операция Описание
1 *, / Умножение, деление
2 +, - Сложение, вычитание
3 % Остаток от деления
4 << Сдвиг влево (поразрядный)
5 >> Сдвиг вправо (поразрядный)
6 < Меньше
7 <= Меньше или равно
8 > Больше
9 >= Больше или равно
10 == Равно
11 != Не равно
12 & Поразрядная конъюнкция (И)
13 ^ Поразрядное исключающее ИЛИ
14 | Поразрядная дизъюнкция (ИЛИ)
15 && Логическое И
16 || Логическое ИЛИ
17 = Присваивание
18 *= Умножение с присваиванием
19 /= Деление с присваиванием
20 % Остаток от деления с присваиванием
21 += Сложение с присваиванием
22 -= Вычитание с присваиванием
23 <<= Поразрядный сдвиг влево с присваиванием
24 >>= Поразрядный сдвиг вправо с присваиванием
25 &= Поразрядное И с присваиванием
26 |= Поразрядное ИЛИ с присваиванием
29 ^= Поразрядное исключающее ИЛИ с присваиванием
28 . Последовательное вычитание

 

Тернарная операция в С++

Условная операция ? :

Формат операции: <операнд1> ? <операнд2> : <операнд3>

Первый операнд оценивается с точки зрения его эквивалентности нулю (0 – false, 1 – true).

Если результат вычисления операнда1 равен true, то результатом условной операции будет значение операнда2, иначе – операнда3

Пример

Необходимо, чтобы некоторая целая величина i увеличилась на 1, если ее значение не превышает n, а иначе принимала значение 1.

Условная операция в этом случае имеет вид

i = (i<n) ? i+1 : 1

 

 

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

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

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

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

Пример

6&5 6|5 6^5
110 & 101 110 | 101 111 ^ 101
100 = 4 111 = 7 010 = 2

 

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

Пример

#include <iostream>       // директива препроцессора

using namespace std;      /* std – пространство имен, эта строка должна присутствовать

                                        во все программах, если не введено другое пространство имен.

                                         В следующих примерах методического пособия эта                                                                                    строка будет отсутствовать, хотя в программах на компьютере она должна быть обязательно*/

int main ()

{ cout <<5 + 2<<endl;                    // 7

cout <<10 - 3<<endl;                   // 7

cout <<25 * 2<<endl;                   // 50

cout <<9 / 5<<endl;                      // 1

cout <<9 % 5<<endl;                   // 4

cout <<9 / 5.0<<endl;                   // 1.8

return 0;

}

Операции отношений в программировании, как в математике, используются для сравнений. В языке С++ есть такие операции отношений:

<  - меньше

<= - меньше или равно

Ø - больше

>=  - больше или равно

== - равно

!= - не равно

Пример  

bool b;

b = 5 > 2;                   // b примет значение true

b = 7 < 4;                    // b примет значение false

В ранних версиях С++ не было логического типа данных, его заменял тип int. Работает и с этим типом данных.

Пример  

int b;

b = 5 > 2;                   // b примет значение 1

b = 7 < 4;                    // b примет значение 0

К логическим операциям относятся:

&& - логическое “И”

|| - логическое “ИЛИ”

! - логическое отрицание

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

bool b;

b = y < exp (x) && y > 0 && x > 2 && x < 5

 

Свойства логических операций представлены в таблице истинности:

 

V1 V2 ! V2 V1 && V2 V1 || V2
false false true false false
false true false false true
true false   false true
true true   true true

 

Поразрядные операции или операции с разрядами (битами) нельзя применять к переменным типа float или double. К таким операциям относятся:

& - поразрядное “И”

| - поразрядное “ИЛИ”

~ - поразрядная инверсия

<<  - сдвиг влево

>> - сдвиг вправо

Поразрядные операции выполняются в соответствии с таблицей истинности, где false = 0, true = 1, причем каждый разряд рассматривается независимо от других разрядов.

Условная операция

Мы уже рассматривали ее среди операций, но здесь уместно ее сравнить с условным оператором.

Условная операция включает три операнда и имеет синтаксис:

переменная = выражение ? значение1 : значение2;

Такая запись является аналогом условного оператора

if (выражение) переменная = значение1;

else переменная = значение2;

Условный оператор и условная операция в результате компиляции формируют практически идентичный код. Разница состоит в том, что в случае условного оператора обращение к переменной происходит дважды, следовательно, дважды вычисляется ее адрес, в случае условной операции – лишь один раз. С другой стороны, программу с условными операторами понимать лучше.

Пример

… if (a > b) max = a;

   else max = b;             эквивалентно max = (a > b) ? a : b;

 

Оператор цикла с параметром

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

Синтаксис оператора:

for (выражение1; выражение2; выражение3) оператор;

в случае, если тело цикла состоит из одного оператора или

for (выражение1; выражение2; выражение3)

{ оператор1;

оператор2;

оператор n;

}

если тело цикла состоит из нескольких операторов (составной оператор).

Здесь выражение1 называется инициализирующим выражением и выполняется один раз перед тем, как будет произведен анализ выражения2. Выражение2 называется условием выполнения цикла. Выражение2 анализируется перед каждой итерацией цикла. Если выражение2 истинно (отлично от 0), то цикл продолжает свою работу, иначе прекращается. Выражение3 обычно служит для изменения параметров цикла, например, для приращения счетчика. На месте выражения1 и выражения3 могут быть записаны последовательности операторов через запятую. Эти последовательности операторов обязательно заканчиваются точкой с запятой.

Любая из частей оператора for может быть опущена (точки с запятой при этом надо оставить на своих местах!).

Например, оператор, вычисляющий сумму чисел от 1 до 100, выглядит следующим образом:

for (int i = 1, S = 0; i <= 100; i++)

S += i;

Пример

Найти все делители натурального числа (целого положительного).

 

#include <iostream>

int main( )

{ int num, half, div;

cout << “Введите число:”;

cin >> num;

for (half = num / 2, div = 2; div <= half; div++)

  if (!(num % div))

         cout << div << endl;

return 0;

}

 

Оператор for в языке С++ обладает очень большими возможностями.

1) Приращение счетчика может быть в порядке убывания.

for (i = 5, r = 1; i >= 1; i--)

r = r * y;

2) Приращение счетчика может быть отличным от единицы.

for (n = 5; n <= 61; n += 15)

    cout << n;

3) Счетчик может изменяться не только путем сложения и вычитания.

for (k = 100; k < 185; k *= 1.2)

  cout << k;

4) В качестве счетчика может использоваться выражение.

 for (k = 1; z < 200; z = 5 * k + 23)

cout << z;

5) Неполный список выражений в заголовке цикла.

for (p = 2; p <= 200;)

  p = p + n / k;

В этом случае приращение определяется в теле цикла.

6) Первое выражение в заголовке цикла может быть произвольным.

for (cout << “Вводите числа”; p <= 30;)

     cin >> p;

 

Операторы передачи управления

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

- оператор безусловного перехода goto;

- оператор выхода из цикла break;

- оператор перехода к следующей итерации цикла continue;

- оператор возврата из функции return.

 

Оператор goto

Оператор безусловного перехода имеет формат:

goto метка;

В теле той же функции должна присутствовать ровно одна конструкция вида:

метка: оператор;

Оператор передает правление на помеченный оператор.

Использование этого оператора оправдано в двух случаях: принудительный выход вниз по тексту программы из нескольких вложенных циклов или переключателей; переход из нескольких мест функции в одно.

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

 

Оператор break

Оператор break служит для продолжения работы программы после принудительного окончания текущего цикла. Например,

for (; ;) { …

             if (выражение) break;

          }

Такой цикл for (его называют открытым) выполняется бесконечно, break передает управление на первый оператор после цикла.

 

Оператор continue

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

Пример

Найти сумму положительных элементов последовательности из 100 чисел.

 

#include <iostream>

int main( )

{ int а, s = 0;

for (i = 1; i <= 100; i++)

  { cout << “Введите число:”;

         cin >> a;

        if (a <=0 ) continue;

         s += a;

   }  

cout << “Сумма положительных элементов:” << s << endl;

return 0;

}

 

Оператор return

Оператор возврата из функции return завершает выполнение функции и передает управление в точку ее вызова. Этот оператор мы видим в конце главной функции main() любой программы на языке С++ и увидим позже, когда будем писать в программах пользовательские функции. Синтаксис оператора:

return выражение;

Выражение должно иметь скалярный тип.

 

Порядок выполнения работы

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

 

Контрольные вопросы

1. Какова структура оператора цикла с параметром? Как выполняется цикл с параметром?

2. Могут ли параметр цикла, его начальное и конечное значения в цикле с параметром в языке С++ быть разных типов? Обоснуйте ответ.

3. Может ли цикл быть вложен внутрь другого? Если да, то какова глубина этой вложенности?

4. Для цикла с параметром напишите его полный эквивалент с помощью циклов с пред- и постусловием.

 

Содержание отчета

1. Титульный лист отчета

2. Запись алгоритма решения каждой задачи

3. Тексты программы на языке С++

4. Скриншоты результатов, выводимых на экран для заранее подготовленных тестовых примеров для каждой задачи

Инициализация указателей

Указатели чаще всего используют при работе с динамической памятью (heap – куча). Это свободная память, в которой можно во время выполнения программы выделять место в соответствии с потребностями программы.

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

Рассмотрим способы инициализации указателей.

1) Присваивание указателю адреса существующего объекта:

- с помощью операции получения адреса

int a = 5;

int *p = &a; // в указатель записывается адрес а

int *p (&a);   // то же самое другим способом

                     - с помощью значения другого инициализированного указателя

                          int *r = p;

                     - с помощью имени массива или функции, которые трактуются как адрес

                           int b[10];   // массив

                           int *t = b;   // присваивание адреса начала массива

                            …

                            void f(int a) {/* …*/}  // определение функции

                            void (*pf) (int);              // указатель на функцию

                            pf = f;                             // присваивание адреса функции

2) Присваивание указателю адреса области памяти в явном виде:

char *vp = (char *)0×B8000000;

Здесь 0×B8000000 – шестнадцатеричная константа, (char *) – операция приведения типа: константа преобразуется к типу “указатель на char”.

3) Присваивание указателю пустого значения или NULL.

int * u1 = NULL;

int * u2 = 0;

NULL – это пустой указатель, указатель, равный 0, заготовка для ключа, который похож на ключ, но им невозможно открыть ящик с динамической переменной. Рекомендуется в С++ использовать просто 0, так как это значение типа int будет правильно преобразовано в соответствии с контекстом. Объектов с нулевым адресом нет, это гарантируется, поэтому пустой указатель можно использовать для проверки, ссылается указатель на конкретный объект или нет.

4) Выделение памяти в куче и присваивание адреса первого байта этой памяти указателю.    

- с помощью операции new (C++)

int *n = new int;                  // 1

float *t = new float(25.172) // 2

int *m = new int (10);         // 3

int *q = new int [10];           // 4

В операторе 1 new выполняет выделение достаточного для размещения величины типа int участка динамической памяти и записывает адрес первого байта этого участка в переменную n. Память под указатель n выделяется на этапе компиляции.

В операторах 2 и 3 кроме описанных выше действий производится инициализация динамических переменных.

В операторе 4 new выполняет выделение памяти под 10 величин типа int (массив из 10 элементов) и записывает адрес начала этого участка в переменную q, которую можно трактовать как имя массива. Через имя можно обращаться к любому элементу массива обычным образом.

Освобождение памяти, выделенной с помощью операции new, должно выполняться с помощью операции delete. При этом переменная-указатель сохраняется и может инициализироваться повторно.

Например, освобождение памяти может происходить так:

delete n; delete m; delete []q; free (u);

Если память выделялась как new[], то освобождать ее надо как delete [], при этом размерность массива не указывается. Если квадратных скобок нет, то ошибок не выдается, а помечен как свободный будет только первый элемент массива, а остальные элементы станут мусором, так как доступа к ним не будет.

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

int *( *p[10])( ); //

Здесь объявляется массив из 10 указателей на функции без параметров, возвращающих указатели на int.

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

При интерпретации сложных описаний придерживаются правила “изнутри наружу”:

- если справа от имени есть квадратные скобки, это массив, если круглые – это функция,

- если слева есть звездочка, это указатель на проинтерпретированную ранее конструкцию,

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

- в последнюю очередь интерпретируется спецификатор типа.

 

Операции с указателями

С указателями можно выполнять следующие операции: разыменование или косвенное обращение к объекту (*), присваивание, сложение с константой, вычитание, инкремент (++), декремент (--), сравнение, приведение типов.

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

Пример

#include <iostream>

int main ( )

{ int x = 1;

int *uk;  // объявили указатель на целое

uk = &x; // положили в переменную-указатель адрес переменной x

x *= 2;   // x = x * 2;

*uk *= 2;   // удвоение х путем использования указателя на х

*uk = *uk + 10; // увеличение *uk, а следовательно и x на 10

// отобразить значение переменной x на экране можно двумя способами

cout << *uk << endl;    // через указатель

cout << x << endl;        // непосредственно

return 0;

}

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

Инкремент перемещает указатель к следующему элементу массива, декремент – к предыдущему. Фактически значение указателя изменяется на величину sizeof(тип).

Разность двух указателей – это разность их значений, деленная на размер типа в байтах ( в применении к массивам разность указателей, например, на третий и шестой элементы равна трем). Суммирование двух указателей не допускается.

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

Пример

*p++ = 10;

Операции разыменования и инкремента имеют одинаковый приоритет. Инкремент постфиксный, он выполняется после выполнения операции присваивания. Таким образом, сначала по адресу, записанному в указателе p, будет записано значение 10, а затем указатель будет увеличен на количество байт, соответствующее его типу. То есть,

*p = 10; p++;

Выражение (*p)++, напротив, инкрементирует значение, на которое ссылается указатель.

Указатели и массивы

В языке С++ связь между указателями и массивами настолько тесная, что программисты чаще предпочитают работать с массивами путем использования указателей. В С/C++ имя массива – это его адрес, который также является адресом его первого элемента.

Мы работали с массивом, индексируя его.

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

ukm        ukm + 1     ukm + 2     

 

m[0] m[1] m[2] m[3] m[4]

            m

 

int m[5];  // // объявляется массив из 5 элементов

int *ukm; // указатель на целое

ukm = &m[0]; // ukm будет указывать на нулевой элемент массива m или

                       // ukm будет содержать адрес элемента m[0]

Таким образом, в определенном смысле выражение m[0] является аналогом разыменованного указателя ukm.

Если ukm указывает на некоторый элемент массива, то ukm + 1 указывает на следующий элемент, ukm + i – на i-тый после ukm, ukm – i - на i-тый элемент перед ukm. Другими словами, если ukm указывает на m[0], то

*(ukm+i) – есть содержимое m[i]. Приоритет операции * выше, чем операции +, поэтому скобки необходимы.

Тип и размер элементов массива при этом не имеют значение, так как мы говорим здесь о памяти, занимаемой объектом массив. Смысл слов “добавить единицу к указателю” заключается в том, что переменная-указатель будет указывать на следующий элемент объявленного типа, а не на следующую ячейку памяти.

Под массив компилятор выделяет кусок памяти и сопоставляет ему идентификатор m. m – это указатель-константа, который содержит адрес нулевого элемента массива m, изменять этот адрес вы не можете, но разыменовывать указатель-константу вы, разумеется, можете.

Результаты выражений m[i], *(m+i), *(ukm+i) будут одинаковы. Однако можно написать выражение *(ukm++), но нельзя написать *(m++) именно потому, что ukm – это переменная-указатель, а m – это указатель-константа.

Пример

#include <iostream>

const int M = 10;

int mas[M];                     // глобальный массив

 

int main ()

{ int *ukm;          // указатель на целое

ukm = mas;

for (int i = 0; i < M; i++)

mas[i] = i;            // инициализация элементов массива с помощью индексов

for (int i = 0; i < M; i++)

cout << *ukm++ << ‘ ‘; // вывод значений массива с помощью указателей

cout << endl;

for (int i = 0; i < M; i++)

{ ukm = &mas[i];

   cout << *ukm << ‘ ‘;

}

cout << endl;

for (int i = 0; i < M; i++)

cout << *(mas+i) << ‘ ‘;     

cout << endl;

return 0;

}

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

Указатели можно сравнивать с помощью выражений вида (p1 < p2) или (p1 <= p2). Однако эти операторы сравнения работают корректно только при сравнении ближних указателей. В случае дальних указателей гарантировать правильность работы этих выражений нельзя.

Лабораторная работа 1

Простейшие программы

Вариант 1

Написать программу для решения следующей задачи:

Найти сумму цифр заданного трехзначного числа.

 

Вариант 2

Написать программу для решения следующей задачи:

Найти целую часть и остаток от деления двух целых отрицательных чисел.

 

Вариант 3

Написать программу для решения следующей задачи:

Найти периметр и площадь прямоугольного треугольника по длинам двух катетов.

---------------------------------------------------------------------------------------------------------------------------

Вариант 4

Написать программу для решения следующей задачи:

Найти третью с конца цифру заданного шестизначного числа.

 

Вариант 5

Написать программу для решения следующей задачи:

Вычислить длину окружности, площадь круга и объем шара одного и того же заданного радиуса.

 

Вариант 6

Написать программу для решения следующей задачи:

Найти среднее арифметическое трех чисел.

-------------------------------------------------------------------------------------------------------

Вариант 7

Написать программу для решения следующей задачи:

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

 

Вариант 9

Написать программу для решения следующей задачи:

Поменять местами значения переменных x, y, z так, чтобы в x оказалось значение переменной y, в y – значение переменной z, а в z – прежнее значение переменной x.

---------------------------------------------------------------------------------------------------------

Вариант 10

Написать программу, которая печатает True или False в зависимости от того, выполняется ли условие:

Первая заданная дата (день, месяц) предшествует второй (в пределах одного года).

 

Вариант 12

Написать программу для решения следующей задачи:

Приписать к заданному двузначному числу такое же справа.

Вариант 11

Написать программу, которая печатает True или False в зависимости от того, выполняется ли условие:

Код первого введенного символа предшествует коду второго введенного символа.

Коды символов также вывести на печать.

 

Вариант 13

Написать программу, которая печатает True или False в зависимости от того, выполняется ли условие:

Для произвольных вещественных чисел а. b и с определить, имеет ли уравнение аx*x+bx+c=0 хотя бы одно вещественное решение.

 

Вариант 14

Написать программу, которая печатает True или False в зависимости от того, выполняется ли условие: среди цифр заданного трехзначного числа есть одинаковые.

---------------------------------------------------------------------------------------------------------------------------

Вариант 15

Написать программу для решения следующей задачи:

Вычислить среднее геометрическое двух заданных положительных чисел.

------------------------------------------------------------------------------------------------------

Вариант 16

Написать программу для решения следующей задачи:

Найти произведение цифр заданного четырехзначного числа.

 

Вариант 17

Написать программу, которая печатает True или False в зависимости от выполнения условия: x лежит вне отрезков [2,5] и [-1,1].

 

Вариант 18

Написать программу, которая печатает True или False в зависимости от выполнения условия: x принадлежит отрезкам [2,5] и [-1,1].

 

Вариант 19

Написать программу для решения следующей задачи:

 Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.

 

Вариант 20

Написать программу для решения следующей задачи:

 Найти площадь кольца, для которого известны внутренний и внешний радиусы.

 

Вариант 21

Написать программу для решения следующей задачи:

Полторы кошки за полтора часа съедают полторы мышки. Сколько мышек съедят X кошек за Y часов?

 

Вариант 22

Написать программу для решения следующей задачи:

Дано x. Получить значения -2x +3x*x-4x*x*x и 1+2x-3x*x+4x*x*x. Позаботиться об экономии операций.

-----------------------------------------------------------------------------------------------------------------

Вариант 23

Написать программу для решения следующей задачи:

Дана длина ребра куба. Найти площадь грани, площадь полной поверхности и объем этого куба.

---------------------------------------------------------------------------------------------------------------------------

Вариант 24

Написать программу для решения следующей задачи:

Даны два действительных числа x и y. Вычислить их сумму, разность, произведение и частное.

 

Вариант 25

Написать программу для решения следующей задачи:

Найти расстояние между точками с координатами (x1, y1) и (x2, y2).

 

Вариант 26

Написать программу для решения следующей задачи:

Вычислить дробную часть среднего геометрического трех заданных положительных чисел.

 

Вариант 27

Написать программу для решения следующей задачи:

По координатам трех вершин некоторого треугольника найти его площадь и периметр.

---------------------------------------------------------------------------------------------------------------------------

Вариант 28

Написать программу для решения следующей задачи:

Исходные данные – два момента времени одних суток, выраженные в часах и минутах. Первый момент времени предшествует второму. Напишите оператор, определяющий интервал между этими двумя моментами времени. Результат должен быть выражен в часах и минутах.

 

---------------------------------------------------------------------------------------------------

Вариант 29

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

 

Вариант 30

Написать программу, которая печатает True или False в зависимости от выполнения условия: среди первых трех цифр из дробной части заданного положительного числа есть цифра 0.

 

Вариант 31

Написать программу для решения следующей задачи:

Даны два числа. Найти среднее арифметическое кубов этих чисел и среднее геометрическое модулей этих чисел.

---------------------------------------------------------------------------------------------------------------------------

Вариант 32

Написать программу, которая печатает True или False в зависимости от выполнения условия:

Сумма цифр заданного трехзначного числа является четным числом.

 

 

Лабораторная работа 2

Программы с повторениями (операторами цикла)

Вариант 1

1. Написать программу нахождения суммы цифр натурального числа N.

2. Вводится последовательность ненулевых чисел, 0 – конец последовательности. Вычислить среднее арифметическое всех положительных членов последовательности.

Вариант 2

1. Найти сумму тех цифр натурального числа, которые больше пяти.

2. Вводится последовательность из N произвольных чисел. Определить, сколько раз последовательность меняет знак.

 

Вариант 3

1. Найти двузначное число, равное квадрату числа его единиц, сложенному с кубом его десятков.

2. Найти наименьший элемент в последовательности целых чисел, 0 – конец последовательности.

 

Вариант 4

 1. Определить, сколько раз заданная цифра встречается в произвольном натуральном числе.

 2. Вводится последовательность ненулевых чисел, 0 – конец последовательности. Посчитать, сколько в ней отрицательных чисел, и сумму положительных чисел.

 

Вариант 5

1. Натуральное число из N цифр называется числом Армстронга, если сумма его цифр, возведенных в N-ую степень, равна самому числу. Получить все числа Армстронга, состоящие из трех, четырех и пяти цифр.

2. Вводится последовательность натуральных чисел, признак окончания ввода – число, оканчивающееся двумя семерками. Найти количество удвоенных нечетных чисел в последовательности.

 

Вариант 6

1. Дано натуральное число N. Выяснить, сколько раз в нем встречается его максимальная цифра.

2. Дано натуральное К. Напечатать К-тую цифру последовательности 12345678910111213..., в которой выписаны подряд все натуральные числа.

 

Вариант 7

1. Дано натуральное число N. Найти сумму первой и последней цифры этого числа.

2. Вводится последовательность ненулевых чисел, 0 – конец последовательности. Вывести на печать только четные числа.

--------------------------------------------------------------------------------------------------------------------------

Вариант 8

1. Дано натуральное число N<=99. Дописать к нему введенную пользователем цифру К в конец и в начало.

2. Вводится последовательность из N целых чисел. Найти наименьший элемент из тех чисел последовательности, которые больше 10.

 

 

Вариант 9

1. Дано натуральное число N. Верно ли, что в нем на четных местах стоит цифра А.

2. Дана последовательность из N целых чисел. Определить, со скольких отрицательных чисел она начинается.

 

Вариант 10

1. Приписать по единице в начало и конец записи числа N.

2. Вводится последовательность из N целых чисел. Является ли она знакопеременной.

---------------------------------------------------------------------------------

Вариант 11

1. Дано натуральное число N. Определить, равна ли первая цифра числа его последней цифре.

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

 

Вариант 12

1. Дано натуральное число. Определить, сколько раз в записи числа встречается цифра пять.

2. Вводится последовательность из N целых чисел. Вычислить сумму положительных элементов последовательности, порядковые номера которых нечетны.

--------------------------------------------------------------------------------------------------------

Вариант 13

1. Дано натуральное число. Определить, является ли четной первая цифра в записи числа.

2. Вводится последовательность из N целых чисел. Определить количество чисел в наиболее длинной подпоследовательности из подряд идущих нулей.

 

Вариант 14

1. Найти количество четных цифр целого положительного числа.

2. Дана последовательность из N целых чисел. Найти порядковый номер наименьшего числа последовательности.

 

Вариант 15

1. Поменять местами первую и последнюю цифры числа. Например, из числа 1254 должно получиться число 4251.

2. Вводится последовательность ненулевых чисел, 0 – конец последовательности. Определить, является ли последовательность возрастающей.

 

Вариант 16

1. Найти сумму четных делителей заданного натурального числа N.

2. Вводится последовательность положительных чисел, 0 – конец последовательности. Найти максимальное среди введенных чисел. Определить, сколько раз оно встретилось в последовательности и превышает ли число его вхождений одну треть от общего количества введенных чисел.

 

Вариант 17

1. Приписать к исходному натуральному числу N такое же число.

2. Вводится последовательность из N целых чисел. Вычислить сумму отрицательных элементов последовательности, порядковые номера которых четны.

 

Вариант 18

1. Дано натуральное четырехзначное число. Определить, является ли оно палиндромом. Например, палиндромами являются числа 2222, 4114 и так далее.

2. Найти наименьший элемент в последовательности целых чисел, 0 – конец последовательности.

 

Вариант 19

1. Дано натуральное число. Определить, сколько раз первая цифра встречается в данном числе.

2. Вводится последовательность из N целых чисел. Найти сумму отрицательных чисел.

------------------------------------------------------------------------------------------------------------

Вариант 20

1. Дано натуральное число. Верно ли, что данное число начинается на А, а заканчивается на В (цифры А и В вводятся с клавиатуры).

2. Вводится последовательность из N целых чисел. Найти наименьшее среди положительных чисел.

----------------------------------------------------------------------------------------------------------------

Вариант 21

1. Найти все такие натуральные числа, которые делятся на 7 и сумма цифр которых кратна 7.

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

--------------------------------------------------------------------------------------

Вариант 22

1. Выяснить, является ли разность максимальной и минимальной цифр числа четной.

2. Вводится последовательность целых чисел, за которой следует 0. Определить два наименьших числа.

 

Вариант 23

1. Дано натуральное число N. Найти среднее арифметическое значение цифр числа, стоящих на нечетных местах.

2. Вводится последовательность из N целых чисел. Найти наибольшее из всех отрицательных чисел.

----------------------------------------------------------------------------------------------------------------------------

Вариант 24

1. Найти все натуральные числа, не превосходящие заданного N, которые делятся на каждую из своих цифр.

2. Вводится последовательность ненулевых целых чисел, 0 – конец последовательности. Определить, какой элемент встречался чаще, максимальный или минимальный.

 

 

Вариант 25

1. Из заданного натурального числа удалить все цифры А. А вводится с клавиатуры.

2. Вводится последовательность ненулевых чисел, 0 – конец последовательности. Определить два наибольших числа среди отрицательных.

 

Вариант 26

1. Дано натуральное число. Изменить число, приписав в конец числа максимальную из его цифр.

2. Дана последовательность из N чисел. Определить, сохраняет ли она знак.

 

Вариант 27

1. Определить, существует ли натуральное четырехзначное число, сумма пятых степеней цифр которого равна самому числу.

2. Вводится последовательность вещественных чисел, за которой следует 0. Найти наименьшее из всех положительных чисел.

 

Вариант 28

1. Дано натуральное число. Найти цифровой корень числа.

Число 12345, цифровой корень находится так: 1+2+3+4+5 = 15, 1+5 = 6 – это цифровой корень для числа 12345.

2. Вводится последовательность чисел, 0 – конец последовательности. Определить, сколько в ней пар соседних равных элементов.

----------------------------------------------------------------------------------------------------

Вариант 29

1. Найти сумму только тех цифр натурального числа, которые меньше пяти.

2. В очереди за билетами стоят мужчины и женщины. Какое количество мужчин стоит в очереди до первой женщины.

Вариант 30

 1. Дано натуральное число. Верно ли, что оно начинается и заканчивается одной и той же цифрой.

 2. Вводится последовательность ненулевых чисел, 0 – конец последовательности. Посчитать, сколько в ней отрицательных чисел, порядковые номера которых четные.

 

Вариант 31

1. Натуральное число из N цифр называется числом Армстронга, если сумма его цифр, возведенных в N-ую степень, равна самому числу. Получить все числа Армстронга в заданном интервале.

2. Вводится последовательность положительных чисел, признак окончания ввода – число, являющееся степенью 3. Найти максимальное из введенных чисел и определить номер его первого вхождения.

----------------------------------------------------------------------------------------------------------------------------

Вариант 32

1. Дано натуральное число. Верно ли, что сумма цифр данного числа равна А (А вводится с клавиатуры).

2. Вводится последовательность из N целых чисел. Определить длину максимальной подпоследовательности из подряд идущих чисел.

-------------------------------------------------------------------------------------------------------------------

Вариант 33

1. Определить, существует ли натуральное четырехзначное число, равное четвертой степени суммы своих цифр.

2. Вводится последовательность из N целых чисел. Определить номер последнего нечетного члена последовательности.

 

Вариант 34

1. Дано натуральное число N. Поменять порядок цифр числа на обратный. Например, из числа 12345 получим 54321.

2. Вводится последовательность чисел, 0 – конец последовательности. Определить, содержит ли последовательность хотя бы два равных соседних числа, и подсчитать число таких пар.

 

Вариант 35

1. Дано натуральное число N. Найти сумму первой и последней цифры этого числа.

3. Вводится последовательность ненулевых чисел, 0 – конец последовательности. Найти число соседств двух положительных членов.

--------------------------------------------------------------------------------------------------------------------------

Вариант 36

1. Дано натуральное число N. Найти количество четных цифр числа.

2. Вводится последовательность из N целых чисел. Выяснить, какое число встречается в последовательности раньше – положительное или отрицательное.

                                                                                                                                                                        

Вариант 39

1. Дано натуральное число N. Переставить первую и последнюю цифру числа.

2. Вводится последовательность из целых чисел, оканчивающаяся нулем. Найти количество наибольших чисел последовательности.

 

Вариант 40

1. Найти все автоморфные числа из промежутка от N до M. Автоморфным называется число, которое равно последним цифрам своего квадрата. Например, 5 и 25, 25 и 625.

2. Вводится последовательность ненулевых чисел, 0 – конец последовательности. Найти длину максимальной подпоследовательности подряд идущих нечетных чисел.

 

Вариант 41

1. Дано натуральное число N. Переставить его цифры так, чтобы образовалось максимальное число, записанное теми же цифрами.

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

------------------------------------------------------------------------------------------------------------

Вариант 42

1. Дано натуральное число. Верно ли, что его можно одинаково читать слева направо и справа налево.

2. Вводится последовательность из N целых чисел. Найти номер последнего из наименьших чисел.

--------------------------------------------------------------------------------------------------------------------------

Вариант 43

1. Верно ли, что в данном числе нет данной цифры А (цифру А вводить с клавиатуры).

2. Вводится последовательность целых чисел, за которой следует 0. Найти сумму тех из них, которые кратны пяти.

 

Вариант 38

1. Дано натуральное число N, кратное 3. Найдем сумму кубов цифр числа. К полученному числу применим такое же преобразование. Составить программу выполнения описанного преобразования.

2. Вводится последовательность вещественных чисел, оканчивающаяся нулем и состоящая более чем из одного ненулевого элемента. Определить номер числа по абсолютной величине самого близкого к своему номеру.

                                                                                                                                                                    

Вариант 37

1. Дано натуральное число N. Выбросите из записи этого числа цифры 3 и 7, оставив прежним порядок остальных цифр. Например, из числа 3171507377 должно получиться 1150.

2. Вводится последовательность ненулевых чисел, оканчивающаяся нулем. Определить номер меньшего из двух наибольших членов последовательности.

 

Вариант 44

1. Найти количество нечетных делителей натурального числа N.

2. Вводится последовательность ненулевых чисел, оканчивающаяся нулем. Вывести на экран порядковые номера положительных элементов последовательности.

 

Лабораторная работа 3

Программы с функциями в С++

Вар. 1

Найти натуральное число в интервале от 1 до N с максимальной суммой делителей.

 

Вар. 2

Дано натуральное число N. Вычислить S = 2! + 4! + ... + 2N!.

 

Вар. 3

Дано два натуральных числа. Определить, является ли первое число перевертышем второго.

 

Вар. 4

Вычислить площадь правильного шестиугольника со стороной А, используя подпрограмму вычисления площади треугольника.

Вар. 5

Составить программу нахождения наибольшего общего делителя четырех заданных чисел.

 

Вар. 6

Даны натуральное число N, действительное число а. Вычислить 

 S = 1/a + 1/a2 +...+1/a 2N-2. Написать функцию нахождения степени числа.

 

Вар. 7

Даны 3 натуральных числа. Определить, в каком из них сумма цифр больше.

 

Вар. 8

Написать программу, подсчитывающую число сочетаний без повторения из N элементов по К элементов:

                           C(N,K) = N!/K!(N - K)!

 

Вар. 9

Даны три числа. Определить, в каком из них больше цифр.

 

Вар. 10

Даны два натуральных числа M и N (M<=9999, N<=9999). Проверить, есть ли в записи числа М цифры, одинаковые с цифрами в записи числа N.

 

Вар. 11

Составить программу нахождения наименьшего общего кратного трех натуральных чисел. НОК (А, В) = А*В/НОД (А, В).

 

Вар. 12

Дано 4 числа. Вывести на экран наименьшую из первых цифр заданных чисел.

 

Вар. 13

Составить программу нахождения наибольшего общего делителя и наименьшего общего кратного двух натуральных чисел. НОК (А, В) = А*В/НОД (А, В). Написать рекурсивную версию функции НОД.

 

Вар. 14

Даны три стороны одного треугольника и три стороны другого треугольника. Определить, являются ли эти треугольники равновеликими.

 

Вар. 15

Среди чисел от 300 до 500 найти все простые, начиная с заданного числа М.

 

Вар. 16

Написать программу вычисления суммы факториалов всех нечетных чисел от 1 до 9.

 

Вар. 17

Написать программу, подсчитывающую число сочетаний с повторениями из N элементов по К элементов. Примените формулу

   C(N,K) = (N+K-1)!/K!(N - 1)!

 

Вар. 18

Найти все натуральные числа из промежутка от 1 до 200, у которых число делителей равно N.

Вар. 19

В книге N страниц. Составить программу, которая будет находить, сколько цифр понадобится для того, чтобы занумеровать все страницы этой книги.

 

Вар. 20

Натуральные числа a, b, c называются числами Пифагора, если выполняется условие: a2 + b2 = c2. Напечатать все числа Пифагора, меньшие N.

 

Вар. 21

Для делимости числа на 3 требуется, чтобы сумма цифр числа делилась на 3. Написать функцию проверки делимости числа N, вводимого с клавиатуры, на 3.

Использовать функцию в программе.

 

Вар. 22

Для делимости числа на 5 требуется, чтобы последняя цифра числа была 0 или 5. Написать функцию проверки делимости числа N, вводимого с клавиатуры, на 5.

Использовать функцию в программе.

 

Вар. 23

Для делимости числа на 4 требуется, чтобы число из последних двух цифр делилось на 4. Написать функцию проверки делимости числа N, вводимого с клавиатуры, на 4.

Использовать функцию в программе.

 

Вар. 24

Вывести на экран все простые трехзначные числа.

 

Вар. 25

Для делимости числа на 8 требуется, чтобы число из последних четырех цифр делилось на 8. Написать функцию проверки делимости числа N, вводимого с клавиатуры, на 8.

Использовать функцию в программе.

 

Вар. 26

Составить программу, которая находит цифровой корень числа. Цифровой корень находится суммой через сумму цифр до тех пор, пока эта сумма сама не станет цифрой.

Вар. 27

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

 

Вар. 28

Каждое составное число можно единственным способом представить в виде произведения простых чисел. Например, 20 = 2*2*5. Составить программу разложения на простые множители двух заданных чисел.

 

Вар. 29

Два натуральных числа называются ‘дружественными’, если каждое из них равно сумме всех делителей другого, за исключением его самого (таковы, например, 220 и 284). Напечатать все пары “дружественных” чисел, не превосходящих заданного натурального числа.

 

Вар. 29

Дано натуральное число N. Определить все простые числа, не превосходящие N.

Вар. 30

Найти все автоморфные числа из промежутка от А до В. Число называется автоморфным, если квадрат этого числа заканчивается этим же числом (например, 6 – квадрат 36, 25 – квадрат 625).

 

Вар. 32

Дан прямоугольник со сторонами А и В, где А, В – натуральные числа. Начинаем отсекать от него квадраты. Сколько таких квадратов можно отсечь, если каждый раз отсекать самый большой квадрат?

 

Вар. 33

Счастливым считается тот автобусный билет, у которого сумма трех первых цифр равна сумме трех последних цифр. Определить все счастливые билеты из интервала от N до M.

 

Вар. 34

Аня нарвала яблок и поровну раздала своим сестрам Оле, Маше и Тане, а что осталось, съела. Оля свои яблоки поделила между тремя сестрами, а что осталось, съела. То же самое сделали Маша и Таня. Сколько яблок оказалось у каждой сестры?

 

Вар. 35

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

 

Вар. 36

Составить программу, проверяющую, является ли число палиндромом (например, 12721 –палиндром).

 

Вар. 37

Даны две дроби А/B и C/D (A, B, C, D – натуральные числа). Составить программу деления этих дробей. Ответ должен быть несократимой дробью.

 

Вар. 38

Даны две дроби А/B и C/D (A, B, C, D – натуральные числа). Составить программу вычитания из первой дроби второй. Ответ должен быть несократимой дробью.

 

Вар. 39

Напечатать все совершенные числа в интервале от М до К. (Число называется совершенным, если оно равно сумме всех своих делителей, включая единицу и исключая себя).

 

Вар. 40

Введено число N, например, 59. Оно не палиндром. Перевернем его, получим 95. Найдем сумму чисел 59 и 95 – 154. Перевернем это число – 451. Находим сумму – 605. Еще раз: 506 и 605. Получим палиндром – 1111. Найти для всех натуральных чисел из интервала от 50 до 80 количество шагов, необходимых для сведения их к палиндромам, с помощью предлагаемой схемы.

 

Вар. 41

Дано N целых чисел. Найти среди них число с наибольшим количеством делителей.

 

Вар. 31

Привести дробь 1+1/2+1/3+...+1/20 к несократимому виду.

 

 

 

Лабораторная работа 4

Программы с одномерными массивами (векторами) в С++

Вар. 1

  1. Найти сумму тех элементов массива, которые кратны трем или пяти.

----------------------------------------------------------------------------------------------------------

Вар. 2

  1. Найти сумму элементов массива с k1-ого по k2-ой.

----------------------------------------------------------------------------------------------------------

Вар. 3

  1. Найти сумму элементов массива, имеющих нечетные индексы.

----------------------------------------------------------------------------------------------------------

Вар. 4

  1. Умножить все элементы массива, кратные двум, на второй элемент массива.

 

----------------------------------------------------------------------------------------------------------

Вар. 5

  1. Вывести индексы тех элементов массива, значения которых больше заданного числа К.

----------------------------------------------------------------------------

Вар. 6

  1. Найти удвоенную сумму положительных элементов массива.

----------------------------------------------------------------------------------------------------------

Вар. 7

  1. Найти количество тех элементов массива, значения которых не превосходят некоторое заданное число.

----------------------------------------------------------------------------------------------------------

Вар. 8

  1. Найти индексы всех четных элементов массива и поместить их в другой массив.

----------------------------------------------------------------------------------------------------------

Вар. 9

  1. Найти количество элементов массива, которые кратны трем или пяти.

----------------------------------------------------------------------------------------------------------

Вар. 10

  1. Найти сумму индексов четных элементов массива.

-------------------------------------------------------------------------------------------------

Вар. 11

  1. Найти индексы всех элементов массива с минимальным значением.

----------------------------------------------------------------------------------------------------------

Вар. 12

  1. Найти сумму элементов массива до наибольшего элемента массива.

----------------------------------------------------------------------------------------------------------

Вар. 13

  1. Найти сумму индексов положительных элементов массива.

----------------------------------------------------------------------------------------------------------

Вар. 14

  1. Вывести индексы тех элементов, значения которых больше значения предыдущего элемента.

----------------------------------------------------------------------------------------------------------

Вар. 15

  1. Найти индекс первого элемента, который делится на три с остатком 2.

-----------------------------------------------------------------------------------------

Вар. 16

  1. Найти сумму индексов тех элементов массива, которые кратны трем.

----------------------------------------------------------------------------------------------------------

Вар. 17

  1. Найти произведение четных элементов массива.

----------------------------------------------------------------------------------------------------------

Вар. 18

  1. Найти произведение элементов массива, имеющих четные индексы.

----------------------------------------------------------------------------------------------------------

Вар. 19

  1. Умножить все элементы массива, которые меньше 10, на третий элемент массива.

----------------------------------------------------------------------------------------------------------

Вар. 20

  1. Вывести индексы тех элементов, значения которых равны заданному числу К.

----------------------------------------------------------------------------------------------------------

Вар. 21

  1. Найти количество тех элементов массива, значения которых превосходят некоторое заданное число.

----------------------------------------------------------------------------------------------------------

Вар. 22

  1. Вывести на печать значения всех четных элементов массива.

----------------------------------------------------------------------------------------------------------

Вар. 23

  1. Поместить индексы тех элементов массива, которые кратны трем, в новый массив.

----------------------------------------------------------------------------------------------------------

Вар. 24

  1. Найти сумму индексов четных элементов массива.

----------------------------------------------------------------------------------------------------------

Вар. 25

  1. Найти количество нечетных элементов массива.

---------------------------------------------------------------------------------------------

Вар. 26

  1. Найти среднее значение элементов массива, исключая первый и последний его элементы.

----------------------------------------------------------------------------------------------------------

Вар. 27

  1. Найти индекс наименьшего элемента массива.

----------------------------------------------------------------------------------------------------------

Вар. 28

  1. Найти сумму индексов отрицательных элементов массива.

----------------------------------------------------------------------------------------------------------

Вар. 29

  1. Вывести индексы тех элементов, значения которых больше 5.

----------------------------------------------------------------------------------------------------------

Вар. 30

  1. Найти индекс последнего элемента массива, который делится на пять с остатком 1

-------------------------------------------------------------------------------------------------

Лабораторная работа 5

Программы с двумерными массивами (матрицами) в С++

Вар. 1

Дана квадратная целочисленная матрица. Найти сумму и число элементов матрицы, которые находятся под главной диагональю. Распечатать левую половину матрицы до диагонали.

-----------------------------------------------------------------------------------------------------------

Вар. 2

Дана квадратная действительная матрица. Найти сумму и число элементов матрицы, которые находятся над главной диагональю и на ней. Распечатать правую половину матрицы, начиная с диагонали. 

-----------------------------------------------------------------------------------------------------------

Вар. 3

Дана матрица. Найти сумму и число положительных элементов каждого столбца матрицы. Результат напечатать в виде двух строк.

-----------------------------------------------------------------------------------------------------------

Вар. 4

Дана матрица. Найти сумму и число отрицательных элементов каждой строки матрицы. Результат напечатать в виде двух столбцов.

 

Вар. 5

Дана матрица. Найти в каждой строке матрицы самый левый максимальный элемент и поместить его в строке на первое место. Распечатать первый столбец.

-----------------------------------------------------------------------------------------------------------

Вар. 6

Дана матрица. Найти в ней столбцы, в которых положительных элементов больше, чем отрицательных. Распечатать эти столбцы.

-----------------------------------------------------------------------------------------------------------

Вар. 7

Дана матрица. Найти в матрице строки, в которых есть нулевые элементы. Распечатать эти строки и индексы нулевых элементов.

-----------------------------------------------------------------------------------------------------------

Вар. 8

Дана квадратная матрица. Найти в каждом столбце наибольший элемент и поменять его местами с элементом на главной диагонали в этом же столбце. Напечатать матрицу.

Вар. 9

Дана матрица. Найти строку с наибольшей суммой элементов. Напечатать эту строку и сумму элементов.

-----------------------------------------------------------------------------------------------------------

Вар. 10

Дана матрица. Найти в каждой строке матрицы самый правый минимальный элемент и поместить его в строке на последнее место. Распечатать последний столбец.

 

Вар. 11

Дана матрица. Поменять местами первый столбец и столбец, в котором находится первый нулевой элемент. Распечатать матрицу.

-----------------------------------------------------------------------------------------------------------

Вар. 12

Дана квадратная матрица. Переставить местами элементы над главной диагональю и под главной диагональю. Распечатать матрицу.

-----------------------------------------------------------------------------------------------------------

Вар. 13

Дана квадратная матрица. Найти сумму элементов, расположенных на диагоналях, параллельных главной, включая главную. Напечатать матрицу.

-----------------------------------------------------------------------------------------------------------

Вар. 14

Дана матрица. Найти столбец с наименьшей суммой элементов. Напечатать этот столбец и сумму элементов.

-----------------------------------------------------------------------------------------------------------

Вар. 15

Дана матрица. Найти сумму элементов, расположенных по периметру и сумму элементов, расположенных на главной диагонали.

 

Вар. 16

Дана матрица. Поменять местами первую строку и строку, в которой находится первый отрицательный элемент. Распечатать матрицу.

-----------------------------------------------------------------------------------------------------------

Вар. 17

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

-----------------------------------------------------------------------------------------------------------

Вар. 18

Дана матрица. Найти в первом и последнем столбце матрицы максимальные элементы. Поменять местами эти элементы и напечатать матрицу.

-----------------------------------------------------------------------------------------------------------

Вар. 19

Дана матрица. Найти сумму положительных элементов в каждой строке матрицы. Поместить их в массив и распечатать этот массив как вектор.

-----------------------------------------------------------------------------------------------------------

Вар. 20

Дана матрица. Найти в ней строки, в которых нет отрицательных элементов. Распечатать эти строки.

-----------------------------------------------------------------------------------------------------------

Вар. 21

Дана матрица. Найти в матрице строки, в которых есть отрицательные элементы. Распечатать эти строки.

-----------------------------------------------------------------------------------------------------------

Вар. 22

Дана квадратная матрица. Найти в каждой строке наибольший элемент и поменять его местами с элементом на главной диагонали в этой же строке. Напечатать матрицу.

-----------------------------------------------------------------------------------------------------------

Вар. 23

Дана матрица. В заданном столбце найти наименьший элемент. Напечатать этот столбец.

-----------------------------------------------------------------------------------------------------------

Вар. 24

Дана матрица. Найти в каждой строке матрицы самый правый максимальный элемент и поместить его в строке на последнее место. Распечатать последний столбец.

-----------------------------------------------------------------------------------------------------------

Вар. 25

Дана квадратная матрица. Найти максимальный элемент среди элементов, находящихся выше главной диагонали. Указать его индексы.

-----------------------------------------------------------------------------------------------------------

Вар. 26

Дана квадратная матрица. Найти максимальный и минимальный элементы среди элементов, расположенных на побочной диагонали матрицы.

-----------------------------------------------------------------------------------------------------------

Вар. 27

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

-----------------------------------------------------------------------------------------------------------

Вар. 28

Дана матрица. Найти для каждой строки матрицы сумму максимального и минимального элементов. Распечатать в виде столбца.

-----------------------------------------------------------------------------------------------------------

Лабораторная работа 6

Программы с динамическими массивами (векторами и матрицами) в С++

Вар. 1

Написать программу, в которой создается динамический массив. Размер массива – случайное число (то есть генерируется случайное число, которое определяет размер массива). Заполнить массив симметричными значениями: первый и последний элемент получает значение 1, второй и предпоследний элемент получают значение 2, и так далее.

 

Вар.2

Написать программу, в которой создается два динамических массива (разной длины). Массивы заполняются случайными числами. Затем создается третий динамический массив, и его размер равен сумме размеров первых двух массивов. Третий массив заполняется так: сначала в него записываются значения элементов первого массива, а затем значения элементов второго массива.

 

Вар.3

Написать программу, в которой создается два динамических массива одинакового размера. Массивы заполняются случайными числами. Затем создается третий динамический массив, и его размер в два раза больше размера каждого из первых двух массивов. Третий массив заполняется поочередной записью элементов из первых двух массивов: сначала записывается значение элемента первого массива, затем значение элемента второго массива, затем снова первого и снова второго, и так далее.

 

Вар.4

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

 

Вар.5

Написать программу, в которой создается динамический массив. Размер его определяется случайным образом. Массив заполняется случайными числами. Вывести элементы массива в обратном порядке.

 

Вар.6

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

 

Вар.7

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

 

Вар.8

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

 

Вар.9

Написать программу, в которой создается динамическая прямоугольная матрица. Размер ее определяет пользователь. Матрица заполняется по желанию пользователя или с клавиатуры, или случайным образом вещественными числами. Заменить все положительные элементы матрицы на отрицательные и наоборот.

 

Вар.10

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

 

Вар.11

Написать программу, в которой создается динамический одномерный массив. Размер его определяет пользователь. Массив заполняется случайным образом. Найти сумму элементов между первым минимальным элементом и последним максимальным.

 

Вар.12

Написать программу, в которой создается динамическая прямоугольная целочисленная матрица. Размер ее определяет пользователь. Матрица заполняется с клавиатуры. Определить номер самого левого столбца, содержащего только положительные элементы. Если такого столбца нет, то вывести соответствующее сообщение.

 

 Вар.13

Написать программу, в которой создается динамический одномерный массив. Размер его определяет пользователь. Массив заполняется случайным образом целыми числами. Найти количество в нем максимальных элементов.

 

 Вар.14

Написать программу, в которой создается динамический одномерный массив. Размер его определяет пользователь. Массив заполняется с клавиатуры вещественными числами. Найти минимальный элемент среди отрицательных элементов. Если отрицательных элементов нет, то выдать соответствующее сообщение.

 

Вар.15

Написать программу, в которой создается динамический одномерный массив. Размер его является случайным числом. Массив заполняется случайным образом целыми элементами.  Найти количество максимальных и минимальных элементов массива.

 

 

Вступление

Данное учебно-методическое пособие предназначено для студентов младших курсов, изучающих язык программирования С++. В большей степени пособие можно считать лабораторным практикумом, каждая лабораторная работа является значимой при изучении конкретного раздела языка С++. В пособии приведен теоретический материал каждого раздела и содержится много примеров.

Пособие ограничивается только рассмотрением структурного программирования на С++, поэтому в него не входят работа со строками класса string, работа с файловыми потоками, объектно-ориентированное программирование.

С++ - один из наиболее популярных языков программирования. Это гибкий язык с большими возможностями. После его изучения намного легче воспринимать и изучать прочие языки программирования. Этим обусловлен выбор данного языка для изучения студентами.

Для работы с программными кодами на С++ нет недостатка в программном обеспечении. Обычно используют среды разработки, в состав которых входят: редактор кодов, компилятор, отладчик и ряд других утилит. Можно использовать любую удобную среду разработки, для начала лучше ограничиваясь консольным приложением. В частности, можно использовать среду Code::Blocks.

Основные теоретические положения по языку С++

Переменные и тип данных

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

Основная цель любой программы – это обработка данных. Данные должны храниться в памяти компьютера, чтобы их можно было обработать. В памяти компьютера для хранения данных надо выделить место соответствующего размера. Данные различного типа хранятся по-разному и обрабатываются по-разному. Тип данных в программировании – очень важное понятие.

Тип данных определяет:

- внутреннее представление данных в памяти компьютера,

- множество значений, которые могут принимать величины этого типа,

- операции и функции, которые можно применять к величинам этого типа.

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

Типы данных С++ подразделяются на основные или стандартные (5 типов) и составные или производные (массивы, перечисления, структуры, ссылки, указатели, объединения, классы, …).

Основные типы данных часто называют арифметическими, так как их можно использовать в арифметических операциях.

Для описания основных типов определены следующие ключевые слова:

- int (целый);

- char (символьный);

- bool (логический);

- float (вещественный);

- double (вещественный с двойной точностью).

Первые три типа представляют целые числа, а последние два – числа с плавающей точкой. Код, который формирует компилятор для обработки целых величин, отличается от кода для величин с плавающей точкой.

Наиболее часто используется тип int. Этот тип является системно-зависимым: в ранних версиях Windows он занимает 2 байта, в 32-х разрядных ОС – 4 байта.

Тип char (символьный) может интерпретироваться как целый и может представлять целые числа в диапазоне от -128 до 127 или от 0 до 255.

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

double d1 = 2.25;                     // представление числа в формате с десятичной точкой

double d2 = 2.0E-5;                  // представление числа в экспоненциальной форме

Переменные логического типа (тип bool) могут иметь только два значения: false (ложь) и true (истина). Эти переменные фактически занимают 1 бит, но в компьютере минимальной адресуемой единицей информации является байт, поэтому переменные логического типа всегда занимают по байту памяти.

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

Если в процессе каких-то арифметических действий результат превосходит максимально допустимое значение для объявленного типа, то значения целочисленных переменных обнуляются.

 

Существует также 4 спецификатора типа, уточняющих внутреннее представление и диапазон значений стандартных типов:

- short (короткий);

- long (длинный);

- signed (знаковый);

- unsigned (беззнаковый).

Размеры типов данных можно вывести с помощью операции sizeof.

 

Минимальное и максимальное значения для целых типов зависят от реализации и приведены в заголовочном файле <limit.h>:

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

Тип void также относится к основным типам языка, но множество значений этого типа пусто. Он используется

- для определения функций, которые не возвращают значения,

- для указания пустого списка аргументов функции, // не обязательно

- как базовый тип указателей,

- в операции приведения типов.

 

Константы

 Константы используются в языке программирования, если программе запрещено изменять значение какой-либо переменной. В этом случае ее объявляют как константу. В языке С++ константы объявляются таким образом:

const int int_val = 25;                  // целая константа

const float float_val = 2.555;       // вещественная константа

const char sym = ‘+’;                  // символьная константа

Символьная константа состоит из одного символа, заключенного в одинарные кавычки, например, ‘f’, ‘3’, ‘ы’ и так далее. К разряду символьных констант относят и специальные символы.

Литеральные константы – это те значения, которые вводятся непосредственно в текст программы. Их также называют константами, поскольку после компиляции программы их значения нельзя изменить.

Строковая константа – последовательность символов кода ASCII, заключенная в двойные кавычки.

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

 

Состав языка С++

В тексте любого языка, в том числе языка программирования, можно выделить основные элементы:

- символы;

- слова;

- словосочетания;

- предложения.

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

Лексемы образуются из символов, выражения – из лексем и символов, операторы – из символов, выражений и лексем.

Алфавит языка (или его символы) – это основные неделимые знаки, с помощью которых пишутся все тексты на языке.

Алфавит языка С (С++) включает:

- прописные латинские буквы A…Z,

- строчные латинские буквы a…z, (прописные и строчные буквы в С++ различаются)

- арабские цифры 0…9,

- разделители: , | . | ; | ? | ! | / | \ | _ | # | % | & | ^ | ( | ) |- | + | = | { | } | [ | ] | ( | ) | < | > ;

- пробельные символы;

- специальные символы, необходимые для представления символов, не имеющих графического обозначения, например, \n – переход на новую строку или \a – звуковой сигнал и так далее.

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

// Однострочный комментарий в С++

/* Многострочный

      Комментарий в С++*/

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

Идентификаторы начинаются с латинской буквы и могут содержать латинские буквы, цифры и знаки подчеркивания. Длина идентификатора по стандарту не ограничена, но слишком длинные идентификаторы писать не следует, так как некоторые компиляторы налагают на длину ограничение. Для улучшения читаемости программы следует давать объектам осмысленные имена.

Существуют правила выбора идентификаторов:

- идентификатор не должен совпадать с ключевыми словами и именами используемых стандартных объектов языка;

- не рекомендуется начинать идентификатор с символа подчеркивания, так как они могут совпадать с именами системных функций или переменных.

Ключевые слова – это зарезервированные идентификаторы, которые имеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены.

Знаки операций обеспечивают прежде всего вычисление выражений. Один и тот же знак операции может употребляться в различных выражениях и по-разному интерпретироваться в зависимости от контекста.

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

 

 

Унарные операции

операция описание
1 ++ Увеличение на 1
2 -- Уменьшение на 1
3 sizeof Размер
4 ~ Поразрядное отрицание
5 ! Логическое отрицание
6 - Унарный минус (арифметическое отрицание)
7 + Унарный плюс
8 & Взятие адреса
9 * Разадресация
10 new Выделение памяти
11 delete Освобождение памяти
12 (type) Преобразование типа

 

Бинарные операции

операция Описание
1 *, / Умножение, деление
2 +, - Сложение, вычитание
3 % Остаток от деления
4 << Сдвиг влево (поразрядный)
5 >> Сдвиг вправо (поразрядный)
6 < Меньше
7 <= Меньше или равно
8 > Больше
9 >= Больше или равно
10 == Равно
11 != Не равно
12 & Поразрядная конъюнкция (И)
13 ^ Поразрядное исключающее ИЛИ
14 | Поразрядная дизъюнкция (ИЛИ)
15 && Логическое И
16 || Логическое ИЛИ
17 = Присваивание
18 *= Умножение с присваиванием
19 /= Деление с присваиванием
20 % Остаток от деления с присваиванием
21 += Сложение с присваиванием
22 -= Вычитание с присваиванием
23 <<= Поразрядный сдвиг влево с присваиванием
24 >>= Поразрядный сдвиг вправо с присваиванием
25 &= Поразрядное И с присваиванием
26 |= Поразрядное ИЛИ с присваиванием
29 ^= Поразрядное исключающее ИЛИ с присваиванием
28 . Последовательное вычитание

 

Тернарная операция в С++

Условная операция ? :

Формат операции: <операнд1> ? <операнд2> : <операнд3>

Первый операнд оценивается с точки зрения его эквивалентности нулю (0 – false, 1 – true).

Если результат вычисления операнда1 равен true, то результатом условной операции будет значение операнда2, иначе – операнда3

Пример

Необходимо, чтобы некоторая целая величина i увеличилась на 1, если ее значение не превышает n, а иначе принимала значение 1.

Условная операция в этом случае имеет вид

i = (i<n) ? i+1 : 1

 

 

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

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

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

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

Пример

6&5 6|5 6^5
110 & 101 110 | 101 111 ^ 101
100 = 4 111 = 7 010 = 2

 

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

Пример

#include <iostream>       // директива препроцессора

using namespace std;      /* std – пространство имен, эта строка должна присутствовать

                                        во все программах, если не введено другое пространство имен.

                                         В следующих примерах методического пособия эта                                                                                    строка будет отсутствовать, хотя в программах на компьютере она должна быть обязательно*/

int main ()

{ cout <<5 + 2<<endl;                    // 7

cout <<10 - 3<<endl;                   // 7

cout <<25 * 2<<endl;                   // 50

cout <<9 / 5<<endl;                      // 1

cout <<9 % 5<<endl;                   // 4

cout <<9 / 5.0<<endl;                   // 1.8

return 0;

}

Операции отношений в программировании, как в математике, используются для сравнений. В языке С++ есть такие операции отношений:

<  - меньше

<= - меньше или равно

Ø - больше

>=  - больше или равно

== - равно

!= - не равно

Пример  

bool b;

b = 5 > 2;                   // b примет значение true

b = 7 < 4;                    // b примет значение false

В ранних версиях С++ не было логического типа данных, его заменял тип int. Работает и с этим типом данных.

Пример  

int b;

b = 5 > 2;                   // b примет значение 1

b = 7 < 4;                    // b примет значение 0

К логическим операциям относятся:

&& - логическое “И”

|| - логическое “ИЛИ”

! - логическое отрицание

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

bool b;

b = y < exp (x) && y > 0 && x > 2 && x < 5

 

Свойства логических операций представлены в таблице истинности:

 

V1 V2 ! V2 V1 && V2 V1 || V2
false false true false false
false true false false true
true false   false true
true true   true true

 

Поразрядные операции или операции с разрядами (битами) нельзя применять к переменным типа float или double. К таким операциям относятся:

& - поразрядное “И”

| - поразрядное “ИЛИ”

~ - поразрядная инверсия

<<  - сдвиг влево

>> - сдвиг вправо

Поразрядные операции выполняются в соответствии с таблицей истинности, где false = 0, true = 1, причем каждый разряд рассматривается независимо от других разрядов.

Операции инкремента и декремента (увеличение и уменьшение на 1)

Операция инкремента прибавляет единицу к операнду, а операция декремента – вычитает от операнда единицу.

Эти операции имеют две формы записи:

- префиксную – когда операция записывается перед операндом,

- постфиксную – когда операция записывается после операнда

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

Оператор j = ++i представляет префиксную форму записи и эквивалентен i++; j = i;

Оператор j = i++ представляет постфиксную форму записи и эквивалентен j = i; i++;

 

Пример 1

Пусть имеем x=3, y=3

Выведем на экран

cout << “значение префиксного выражения: ”<< ++x << endl;

cout << “значение постфиксного выражения: ”<< у++ << endl;

cout << “значение х после приращения: ”<< ++x << endl;

cout << “значение у после приращения: ”<< ++x << endl;

 

После запуска программы на экране будет напечатано

значение префиксного выражения: 4

значение постфиксного выражения: 3

значение х после приращения: 4

значение у после приращения: 4

 

Пример 2

#include <iostream>                                      // директива препроцессора

 

int main ()

{ int sum, a = 2, b = 5;

sum = a + b++;

cout <<a<<’ ‘<<b<<’ ‘<<sum<<endl;                   // 2 6 7

sum = a + ++ b;

cout <<a<<’ ‘<<b<<’ ‘<<sum<<endl;                   // 2 7 9

return 0;

}

Здесь sum = a + b++ означает ”сложить a и b, присвоить результат sum и увеличить значение переменной b на единицу”, а запись sum = a + ++b означает “увеличить b на единицу, сложить a и b и присвоить результат переменной sum”.

Операция присваивания (=) в языке С++ помимо обычной формы имеет форму представления, называемую операцией с присваиванием. Использование этого представления ускоряет работу программы. Например, выполнение оператора a = a + 25 приводит к двукратному определению адреса переменной a: для нахождения исходного значения и для присваивания результата. Эту избыточность можно ликвидировать, записав a += 25. Здесь адрес определяется всего один раз, так как оператор интерпретируется как “к содержимому переменной a прибавить 25”.

Полный набор операций с присваиванием: _-=, *=, /=, +=, %=, <<=, >>=, ^=, |=.

Пример

b += 50; // b = b + 50;

d %= 2;  // d = d % 2;

 

Операции выполняются в соответствии с приоритетами

 

ранг операции Ассоциативность
1 ( )., [ ], ->, :: à
2 Унарные операции: !, ~, +, -, ++, --, &, *, (тип), sizeof, new, delete ß 
3 Мультипликативные бинарные операции *, /, % à
4 Аддитивные бинарные операции +, - à
5 <<, >> à
6 <, <=, >, .= à
7 ==, != à
8 & à
9 ^ à
10 | à
11 && à
12 || à
13 ? : ß
14 =, *=, +=, -=, /=, %=, ^=. <<=. >>=&= ß
15 . à

Операции ранга 1 имеют наивысший приоритет. Операции одного ранга имеют одинаковый приоритет, и если их в выражении несколько, то они выполняются в соответствии с правилом ассоциативности либо слева направо, либо справа налево.

 

Выражения

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

Примеры.

b = (a + 0.12) / 6;

x && y || !x

 

Преобразование типов

Язык С++, являясь языком типизированным, позволяет тем не менее достаточно свободно обращаться с выражениями, оперирующими различными типами данных. В этом случае операнды приводятся к некоторому общему типу. Приведение выполняется в соответствии со следующими правилами:

1. Автоматически производятся только те преобразования, которые превращают операнды с меньшим диапазоном значений в операнды с большим диапазоном значений, поскольку это происходит без какой-либо потери информации, например,

int i_var = 5;

float f_var = 2.5, summa;

summa = i_var + f_var;

2. Выражения, в которых могла бы теряться информация (например, при присваивании длинных целых более коротким или вещественным целым), могут вызвать предупреждение, но они допустимы.

int i;

float f = 3.24;

i = f;             // допустимо, но с предупреждением (Warning) при трансляции

Для любого выражения можно явно указать преобразование его типа, используя так называемое приведение типа. Операция приведения типа имеет три возможные формы записи:

int_v = (int) float_v;

int_v = int float_v;

int_v = static_cast <int> (float_v);

Во всех трех формах записи идет преобразование вещественного значения в целое. Первые две формы считаются устаревшими, хотя транслируются и корректно работают.

Приведение типа – потенциально опасная операция, поэтому применять ее следует только тогда, когда программист осознает безусловную необходимость этого и понимает, что получится в результате.

 

Дата: 2019-04-23, просмотров: 242.