Практическое занятие 3. Операции и выражения. Линейные программы

 

Операции и выражения

 

Если в программе все операторы выполняются последо­вательно, один за другим, такая программа называется линейной.

 

Для вычислений в программе используются выражения, которые состоят из:

· операндов, задающих данные для вычислений;

· знаков операций, задающих действия;

· круглых скобок для изменения порядка выполнения операций.

 

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

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

Если в одном выражении записано несколько операций одинакового приоритета, то унарные операции, условная операция и операции присваивания выполняются справа налево, остальные – слева направо:

 

a = b = c º a = (b = c)

a + b + c º (a + b) + c


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

В состав стандартной библиотеки (файл math.h) входят математические функции (табл. 3.2). Чтобы использовать их в программе, необходимо с помощью препроцессорной директивы подключить заголовок <cmath>:

 

#include <cmath>

using namespace std;

Таблица 3.1. Основные операции языка С++

  Ранг Операция Краткое описание
    :: доступ к области видимости (указание кон­текста): унарная форма – доступ к внешнему объекту (::x); бинарная форма – указание пространства имён (s::x)
бин.   . прямой выбор выделение компонента
–> косвенный выбор составного объекта
унарные   + + постфиксный инкремент: x+ +
– – постфиксный декремент: x– –
тип() преобразование типа; тип должен быть пред­ставлен одним идентификатором (стиль С): int(x)
typeid() определение типа операнда, необходимо включение заголовка <typeinfo>: typeid(x)
static_cast преобразования типов c указанием дополнительной информации (стиль С++): static_cast<тип>(x), dynamic_cast<тип>(x), const_cast<тип>(x), reinterpret_cast<тип>(x)
dynamic_cast
const_cast
reinterpret_cast
бин () круглые скобки (слева от скобок – первый операнд, внутри скобок – второй)
[ ] индексирование (при работе с массивами)
унарные   + + префиксный инкремент: + +x
– – префиксный декремент: – – x
sizeof() размер объекта или типа: sizeof(x), sizeof(тип)
~ поразрядное отрицание (побитовая инверсия): ~x
! логическое отрицание (операнд – целый, вещественный или указатель):!x
арифметическое отрицание (унарный минус): -x
+ унарный плюс: +x
& взятие адреса: &x
* обращение по адресу (разыменование): *ptr
new выделение динамической памяти: new тип
унарн.   delete высвобождение динамической памяти: delete ptr
(тип) преобразование типа (стиль С): (int)x
  Ранг Операция Краткое описание
бинарные   .* доступ к компоненту объекта по указателю на компонент
->*
  * умножение: x*y
/ деление (для целых операндов результат округляется до целого отбрасыванием дробной части): x/y
% остаток от деления (только целые операнды): x%y
  + сложение
вычитание
  << сдвиг влево операнды – целые, 2-й операндкол-во разрядов,
>> сдвиг вправо на которое сдвигается 1-й
  < меньше операнды –
<= меньше или равно арифметического
> больше типа или указатели,
>= больше или равно результат – false
  == равно (равно 0) или true
!= не равно (не равно 0)
  & поразрядная конъюнкция (И) операнды
  ^ поразрядное исключающее ИЛИ целые
  | поразрядная дизъюнкция (ИЛИ)
  && логическое И операнды – арифметич.
  || логическое ИЛИ типа или указатели
тернар.   ?:
условие? оператор1: оператор2 true (¹0) false (=0)
 
 

 

 


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

 

бинарные   = присваивание (переменная = выражение)
*= умножение с присваиванием (x/=2 º x=x/2)
/= деление с присваиванием
%= остаток от деления с присваиванием
+= сложение с присваиванием
−= вычитание с присваиванием
<<= сдвиг влево с присваиванием
>>= сдвиг вправо с присваиванием
&= поразрядное И с присваиванием
|= поразрядное ИЛИ с присваиванием
^= поразрядное исключающее ИЛИ с присваиванием
  Ранг Операция Краткое описание
ун   trow генерация исключения: throw исключение
бин   , последовательное вычисление (слева напра­во); результат – значение самого правого выражения

 

 

В таблице 3.2 iType может быть либо int, либо long int, fType может быть либо float, либо double, либо long double.

Могут понадобиться формулы преобразования математи­ческих функций:

· log ba = (log ca)/(log cb);

· sec(x) = 1/cos(x);

· arcctg(x) = π/2 – arctg(x);

· и т.д.

 

Рассмотрим пример линейной программы, вычисляющей значения выражения .

Значения параметров x и y вводятся с клавиатуры. Результат вычисления z выводится в консольное окно.

// Листинг 3.1

// Для использования константы M_PI

#define _USE_MATH_DEFINES

#include <iostream>

#include <cmath>// Для использованиямат. функций

using namespace std;

 

int main() {

// Поддержка русского языка в Visual Studio

setlocale(LC_ALL, "Russian");

 

double x, y, z;

cout << "Введите x и y" << endl;

cin >> x >> y; // Ввод исходных данных

 

// Вычисление выражения

z = ((x - 1)*sqrt(x) - (y-1) * sqrt(y)) /(sqrt(x*x*x*y)+y*x+x*x-x)+cos(5./4*M_PI);

 

// Вывод результата

cout << "Результат: z = " << z << endl;

 

return 0;

}

Результат выполнения программы:

Введите x и y

3 5

Результат: z = -0.875113

 

Таблица 2.2. Математические функции языка С++

(файлы <math.h>, <cmath>)

Функция Прототип Описание
abs iType abs(iType i); абсолютное значение целого i
abs fType abs(fType x); абсолютное значение вещественного x
acos fType acos(fType x); возвращает arccos x в рад, x Î[–1;1]
asin fType asin(fType x); возвращает arcsin x в рад, x Î[–1;1]
atan fType atan(fType x); возвращает arctg x в радианах
atan2 fType atan2(fType y,fType x); возвращает arctg(y / x) в рад
ceil fType ceil(fType x); округление вещественного x вверх
cos fType cos(fType x); cos x (x – в радианах)
cosh fType cosh(fType x); гиперболический косинус x
exp fType exp(fType x); экспонента e x
fabs fType fabs(fType x); абсолютное значение вещественного x
floor fType floor(fType x); округление вещественного x вниз
fmod fType fmod(fType x, fType y); остаток от деления нацело x на y
labs long int labs(long int l); абсолютное значение целого
log fType log(fType x); натуральный логарифм ln x
log10 fType log10(fType x); десятичный логарифм lg x
pow fType pow(fType x, fType y); степенная функция xy
pow fType pow(fType x, int i); степенная функция xi
sin fType sin(fType x); возвращает sin x (x – в рад)
sinh fType sinh(fType x); гиперболический синус x
sqrt fType sqrt(fType x); квадратный корень
tan fType tan(fType x); возвращает tg x
tanh fType tanh(fType x); гиперболический тангенс x

 

 

Логические операции

Логическая унарная операция

! – логическое отрицание (НЕ, NOT) значения операнда; результат false (если операнд истинный) или true (если операнд ложный). Логические константы false и true в языках С и С++ соответствуют целым числам: 0 – ложь и не нуль – истина. Поэтому отрицанием любого ненулевого числа будет 0 (то есть, false), а отрицанием нуля будет 1 (то есть, true). Таким образом:!1 равно 0;!2 равно 0;!(-5.2) равно 0;!0 равно 1;

 

Логические бинарные операции

&& – конъюнкция (И, AND) арифметических операндов или отношений. Результат false (0) или true (1);

|| – дизъюнкция (ИЛИ, OR) арифметических операндов или отношений. Результат false (0) или true (1).

 

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

– логическое отрицание (логическое НЕ),

– конъюнкция (логическое И),

– дизъюнкция (логическое ИЛИ).

 

// Листинг 3.2

#include <iostream>

using namespace std;

 

int main() {

// Поддержка русского языка

setlocale(LC_ALL, "Russian");

double a, b, c;

bool rezult;

cout << "Введите a, b и c\n";

cin >> a >> b >> c; // Ввод исходных данных

// Вычисление выражения

rezult =!(!a ||!b && c);

// Вывод результата

cout << "Результат: rezult = " << rezult << endl;

return 0;

}

 

Результаты выполнения двух запусков программы:

1. Введите a, b и c

0 0 5.4

Результат: rezult = 0

 

2. Введите a, b и c

3.4 7.2 0

Результат: rezult = 1

 

Поразрядные (побитовые) операции

& – поразрядная конъюнкция (И, AND) битовых представ­лений значений целочисленных операндов;

| – поразрядная дизъюнкция (ИЛИ, OR) битовых пред­ставлений значений целочисленных операндов;

^ – поразрядное исключающее ИЛИ (XOR) битовых пред­ставлений значений целочисленных операндов;

~ – дополнение до единицы (поразрядное отрицание НЕ, NOT).

 

Рассмотрим программу, использующую поразрядные опе­рации:

 

// Листинг 3.3

#include <iostream>

using namespace std;

 

int main() {

// Дополнение до единицы (операция поразрядного

cout << ~0 << " "; // отрицания НЕ)

// Поразрядное И (AND)

cout << (3&5) << " ";

// Поразрядное ИЛИ (OR)

cout << (3|5) << " ";

// Поразрядное исключающее ИЛИ (XOR)

cout << (3^5) << endl;

return 0;

}

 

Результат выполнения программы:

-1 1 7 6

 

Целочисленная константа по умолчанию имеет тип int (32 двоичных разряда). Константа 0 имеет внутреннее представле­ние: . После выполнения поразрядной операции НЕ нули становятся единицами, а единицы – нулями: , (это есть внутреннее представление константы –1). Рассмотрим, как выполняются поразрядные операции.

 

Выполнение операции 3&5:

0…………0011 внутреннее представление числа 3

& побитовая операция И (AND)

0…………0101 внутреннее представление числа 5

------------------- результат:

0…………0001 внутреннее представление числа 1.

 

Выполнение операции 3|5:

0………..0011 внутреннее представление числа 3

| побитовая операция ИЛИ (OR)

0………..0101 внутреннее представление числа 5

------------------- результат:

0……..…0111 внутреннее представление числа 7.

 

Выполнение операции 3^5:

0………..0011 внутреннее представление числа 3

^ побитовая операция исключающее ИЛИ

0………..0101 внутреннее представление числа 5

------------------- результат:

0……..…0110 внутреннее представление числа 6.

 

Рассмотрим программу, вычисляющую выражение с пораз­рядными операциями: (Ац МОД2 Вц) И НЕ(Ац ИЛИ Сц). Через Aц, Вц, Сц обозначены целые части вещественных переменных a, b, c. Значения переменных a, b, c вводятся с клавиатуры. Результат расчёта выводится в консольное окно. ИЛИ, И, МОД2 (исклю ­ чающее или), НЕ – поразрядные операции. Для вычисления целых частей a, b, c воспользуемся операцией приведения типа: целая часть a в стиле С (int)a или в стиле С++ static_cast<int>(a).

 

// Листинг 3.4

#include <iostream>

using namespace std;

 

int main() {

// Установка поддержки русского языка

setlocale(LC_ALL, "Russian");

double a, b, c;

int rezult;

cout << "Введите a, b и c\n";

cin >> a >> b >> c; // Ввод исходных данных

// Вычисл-е выражения с поразрядными операциями

rezult = (static_cast<int>(a)

^ static_cast<int>(b)) &

~(static_cast<int>(a)|static_cast<int>(c));

// или так:

// rezult = ((int)a^(int)b)&~((int)a|(int)c);

// Вывод результата

cout << "Результат: rezult = "

<< rezult << endl;

return 0;

}

 

Результат выполнения программы:

Введите a, b и c

3.5 5.4 0.25

Результат: rezult = 4

Покажем, что получен правильный результат вычисления:

 

1) (int)3.5^(int)5.4 = 3^5 = 6 = 0...0110

2) (int)3.5|(int)0.25 = 3|0 = 3 = 0...011

3) ~3 = 1...100

4) 0...0110&0...0100 = 0...0100 = 4

 

Задание.

1. Создать программу на языке С++ для расчёта z1 и z2 по двум формулам (результаты расчёта по обеим формулам должны совпадать). Значения аргументов вводить с клавиатуры. Результаты расчётов выводить на экран.

2. Создать программу на языке С++ для вычисления зна­чений двух выражений с логическими операциями (результаты этих выражений должны совпадать) и одного выражения с поразрядными операциями. Значения вещественных переменных a, b, c вводить с клавиатуры. Через Aц, Вц, Сц обозначены целые части значений a, b, c. Результаты выводить на экран.

Вариант 1

1.

2. а) б)

в) (Aц ИЛИ Bц) И (Aц ИЛИ Cц)

 

Вариант 2

1.

2. а) б)

в) (Aц И Bц) ИЛИ (Aц И Cц)

 

Вариант 3

1.

2. а) б) в) Aц И (Bц ИЛИ Cц)

Вариант 4

1.

2. а) б) в) Aц ИЛИ Bц ИЛИ Cц

 

Вариант 5

1.

2. а) б) в) (Aц ИЛИ Bц) И Cц

 

Вариант 6

1.

2. а) б)

в) (Aц И Bц) ИЛИ (Aц И Cц)

Вариант 7

1.

2. а) б)

в) (Aц ИЛИ Bц) МОД2 (Aц ИЛИ Cц)

Вариант 8

1.

2. а) б)

в) (Aц МОД2 Bц) И НЕ(Aц ИЛИ Cц)

 

Вариант 9

1.

2. а) б)

в) НЕ(Aц ИЛИ Bц) И (Aц ИЛИ Cц)

 

Вариант 10

1.

2. а) б)

в) НЕ(Aц ИЛИ Bц) И (Aц МОД2 Cц)

 

Вариант 11

1.

2. а) б) в) (Aц И Bц) МОД2 Cц

 

Вариант 12

1.

2. а) б) в) (Aц ИЛИ Bц) И Cц

 

Вариант 13

1.

2. а) б)

в) (Aц ИЛИ Bц) МОД2 (Bц ИЛИ Cц)

Вариант14

1.

2. а) б)

в) (Aц МОД2 Bц) ИЛИ (Aц МОД2 Cц)

Вариант 15

1.

2. а) б)

в) НЕ(Aц ИЛИ Bц ИЛИ Cц)

Вариант 16

1.

2. а) б)

в) (Aц ИЛИ Bц) И (Aц ИЛИ Cц)

Вариант 17

1.

2. а) б) в) Aц ИЛИ Bц ИЛИ Cц

Вариант 18

1.

2. а) б)

в) (Aц МОД2 Bц) И НЕ(Aц ИЛИ Cц)

Вариант 19

1.

2. а) б)

в) (Aц ИЛИ Bц) МОД2 (Aц ИЛИ Cц)

Вариант 20

1.

2. а) б) в) (Aц И Bц) МОД2 Cц

Вариант 21

1.

2. а) б)

в) НЕ(Aц ИЛИ Bц) И (Aц ИЛИ Cц)

Вариант 22

1.

2. а) б)

в) (Aц И Bц) ИЛИ (Aц И Cц)

Вариант 23

1.

2. а) б)

в) Aц И (Bц ИЛИ Cц)


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: