Правила стандартных арифметических преобразований

Исходный тип Преобразуется в Правила преобразований
char int Расширение нулем или знаком в зависимости от умолчания для char
unsigned char int Старший байт заполняется нулем
signed char int Расширение знаком
short int Сохраняется то же значение
unsigned short unsigned int Сохраняется то же значение
enum int Сохраняется то же значение
битовое поле int Сохраняется то же значение

Для арифметических преобразований имеется следующая последовательность выполнения:

  1. Все короткие целые типы преобразуются в типы наименьшей длины в соответствии с таблицей. Затем оба значения, участвующие в операции, принимают тип int или float либо double в соответствии со следующими правилами.
  2. Если один из операндов имеет тип long double, то второй тоже будет преобразован в long double.
  3. Если п.2 не выполняется и один из операндов есть double, другой приводится к типу double.
  4. Если пп.2-3 не выполняются и один из операндов есть float, другой приводится к типу float.
  5. Если пп.2-4 не выполняются (оба операнда целые) и один операнд long int, а другой unsigned int, то, если long int может представить все значения unsigned int, последний преобразуется к long int; иначе оба операнда преобразуются к unsigned long int.
  6. Если пп.2-5 не выполняются и один операнд есть long, другой преобразуется к long
  7. Если пп.2-6 не выполняются и один из операндов есть unsigned, другой приводится к типу unsigned.
  8. Если пп.2-7 не выполнены, то оба операнда принадлежат типу int

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

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

Правила стандартных арифметических преобразований - student2.ru

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

Например, 15 / 3 = 5; 18 / 5 = 3; 123 / 10 = 12, 7 / 10 = 0. Но! 18 / 5.0 = 3.6, 7.0 / 10 = 0.7

С помощью операции % можно найти остаток от деления одного целого числа на другое.

Например, 15 % 3 = 0; 18 % 5 = 3; 123 % 10 = 3, 7 % 10 = 7.

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

Математические функции из библиотеки math.h

Математическая запись Запись на C++ Назначение
cos x cos(x) Косинус x радиан
sin x sin(x) Синус x радиан
tg x tan(x) Тангенс x радиан
chx cosh(x) Гиперболический косинус x радиан
shx sinh(x) Гиперболический синус x радиан
th x tanh(x) Гиперболический тангенс x радиан
arccosx acos(x) Арккосинус числа x
arcsinx asin(x) Арксинус числа x
arctg x atan(x) Арктангенс числа x
ex exp(x) Значение e в степени x
xy pow(x,y) Число x в степени y
|x| fabs(x) Модуль числа x
Правила стандартных арифметических преобразований - student2.ru sqrt(x) Квадратный корень из x
ln x log(x) Натуральный логарифм x
log10x log10(x) Десятичный логарифм x

Примеры записи математических выражений:

Математическая запись Запись на C++
1. x2 – 7x + 6 pow(x,2) - 7 * x + 6
2. Правила стандартных арифметических преобразований - student2.ru (fabs(x) - fabs(y)) / (float)(1 + fabs(x * y))
3. Правила стандартных арифметических преобразований - student2.ru log(fabs((y - sqrt(fabs(x))) * (x - y / (z + pow(x,2) / 4.0))))

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

В отличии от языка Pascal в С++ нет логического типа - вместо него используется 0 в качестве Лжи и отличное от нуля число в качестве Истины. Составными частями логических выражений могут быть: числа (0 или неравные ему), отношения.

Например, 1) Y = 0; 2) Z = 1; 3) LogPer = A > B; 4) Log1 = (A = = B) && (C < = D).

Как видно из примеров, отношение — это два выражения, разделенных между собой знаком операции отношения (>, <, = =, !=, <=, >=). Отношение является простейшей конструкцией логического выражения. Оно вычисляет результат отличный от нуля, если выполняется заданное соотношение, и 0 — в противном случае.

Примечание. Несмотря на то, что операции отношения ==, !=, >=, <= определены для вещественных типов, реально они в большинстве случаев корректно не работают в силу того, что множество вещественных величин, представимых в памяти ЭВМ, дискретно. Поэтому их следует, если это возможно, избегать. В том случае, когда всё-таки для вещественных возникает необходимость вычисления указанных отношений, разумно проверять вещественные величины не на равенство, а на близость расположения друг к другу, т.е. заменять отношения вида A == B отношениями вида |A-B|<E, где E — достаточно малое по абсолютной величине число (в общем случае — так называемое машинное епсилон).

В языке С++ операции отношения определены для целых и вещественных типов. Операции отношения могут быть выполнены также над символьными переменными. Сравнение идет по индексам в соответствии с лексикографической упорядоченностью в таблице кодов ASCII. Эта упорядоченность предполагает, что "1"<"2", "a"<"b", "B"<"C" и т.д.

Логическое выражение — это логический операнд или последовательность логических операндов, разделенных между собой знаками логических операций (!, &&, ||).

Порядок действий при вычислении значения логического выражения в Си++:

  1. вычисляются значения в скобках;
  2. вычисляются значения функций;
  3. выполняется унарная операция — отрицание(!);
  4. выполняются операции отношения;
  5. выполняется операция &&;
  6. выполняются операции ||.

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

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

Задача 1. Скорость первого автомобиля v1 км/ч, второго — v2 км/ч, расстояние между ними s км. Какое расстояние будет между ними через t ч, если автомобили движутся в разные стороны?

Согласно условию задачи искомое расстояние s1=s+(v1+v2)t (если автомобили изначально двигались в противоположные стороны) или s2=|(v1+v2)t-s| (если автомобили первоначально двигались навстречу друг другу).

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

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

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

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

Задача 2. Записать логическое выражение, принимающее значение 1, если точка лежит внутри заштрихованной области, иначе — 0.

Правила стандартных арифметических преобразований - student2.ru

Прежде всего обратим внимание на то, что эту сложную фигуру целесообразно разбить на несколько более простых: треугольник, лежащий в I и IV координатных четвертях и треугольник, лежащий во II и III четвертях. Таким образом, точка может попасть внутрь одной из этих фигур, либо на линию, их ограничивающую. Количество отношений, описывающих какую-либо область, обычно совпадает с количеством линий, эту область ограничивающих. Чтобы точка попала внутрь области, необходима истинность каждого из отношений, поэтому над ними выполняется операция AND. Так вся область была разбита на несколько, то между отношениями, описывающими каждую из них, используется операция OR.

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

(X >= 0) && (Y >= 1.5 * X – 1) && (Y <= X)

|| (X <= 0) && (Y >= –1.5 * X – 1) && (Y <= –X)

Задача 3. Вычислить значение выражения

Правила стандартных арифметических преобразований - student2.ru

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

Контрольные вопросы и задания

1. Что такое величина?

2. Какие величины называют аргументами? результатами? промежуточными величинами? Приведите примеры.

3. Каковы атрибуты величины?

4. Какие величины называют постоянными? переменными? Приведите примеры.

5. Какие простые типы величин существуют в языке C++?

6. Что определяет тип величины?

7. Расскажите о простых типах данных и их атрибутах.

8. Как осуществляется потоковый ввод данных в языке C++? Приведите примеры.

9. Как осуществляется потоковый вывод данных в языке C++? Приведите примеры.

10. Какова общая структура программы в языке C++?

11. Расскажите об операторе присваивания и преобразовании типов.

12. Что такое формат вывода?

13. Расскажите о правилах вычисления алгебраического выражения. Приведите прмеры.

14. Расскажите о правилах вычисления логического выражения. Приведите прмерыи.

15. Расскажите о логических операциях. Приведите примеры.

16. Приведите примеры задач, имеющих линейный алгоритм решения.

17. Определите, какой суммарный объём памяти требуется под переменные в каждом из примеров 1–3 в вышеприведенном тексте.

18. Каково назначение следующей программы?

// программа Example

#include <iostream.h>

void main()

{

int n;

cout << "Введите натуральное трёхзначное число: ";

cin >> n;

cout << "Искомая величина: " << N / 100 + N / 10 % 10 + N % 10;

}

19. Задайте на координатной плоскости некоторую область, которую можно описать математическими уравнениями и заштрихуйте её. Запишите логическое выражение, принимающее значение 1, если точка (x, y) лежит внутри заштрихованной области, иначе — 0.

20. Выпишите несколько алгебраических выражений и запишите их на языке C++.

21. Запишите алгебраические выражения, соответствующие следующим записям на языке C++:

а) (a + b) / c; б) a + b / c; в) a / b / c; г) a / (b * c);

д) (a + b) / (d + c); е) a + b / (d + c);

ё) a + b / d + c; ж) (a + b) / d + c.

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