Расставьте приоритеты в арифметическом выражении. Приоритеты операций

Приветствую вас, уважаемые читатели блога сайт! В прошлый раз мы рассматривали вопрос о во встроенном языке 1С:Предприятие 8. Сегодня мы поговорим о о приоритетах арифметических операций примитивных типов данных , а также рассмотрим несколько подряд идущих арифметические операций. Давайте, посмотрим!

Из программы школы, вы знакомы с тем, что наивысшими приоритетом в арифметических операциях являются круглые скобки «()».
Если выражение находится в круглых скобках, то прежде всего будет исполняться именно оно. Следующим по приоритету идут унарные операции «+» и «-», унарная операция означает, что указывается операция и одно значение, например «-5». Третьими выполняются операции умножения и деления и в самую последнюю очередь сложение и вычитание. Давайте рассмотрим как это работает:

99+15/5*8

В этом случае вначале 15 будет разделено на 5, полученное число умножено на 6 и третья операция: 99 прибавиться к полученному числу. Далее следующее простое выражение 10+5/2+1. Понятно, что первым будет исполнятся операция деления, дальше будет исполнятся операция сложения. Если использовать скобки:

(90+30)/(7+5)

В этом случае в начале мы сложим 90 и 30 и поделим все это на 7+5 и в этом случае выражение будет равно 10. Рассмотрим другие операции, которые возможны в программном коде 1С:Предприятие 8. Возможно, вы работали в PHP, где возможен такой оператор i++; или i—; . Это инкремент или декремент на одну единицу. Исполнение таких операторов в 1С невозможно, но возможен оператор i++1; и j—1; . Давайте разберём их подробнее. Это вполне нормальный оператор. Откроем модуль любого справочника в Конфигураторе:

Конфигурация -> Справочники -> Номенклатура, правой кнопкой мыши вызовем пункт Открыть модуль объекта .

Чтобы не было ошибки объявим переменную в этом программном коде:

A=0; b=a++1;

Если проверить на синтаксические ошибки, то их не будет. Даже если выражение разместить на разных строках:

A=0; b=a+ +1;

Вообще, переводы строк не оказывают влияния на выполнение операторов. Как будет работать подобный оператор? Компилятор языка 1С вначале выполнит унарную операцию плюса, то есть +1 даст 1 и потом к a прибавит единицу. Это то же самое что сложить a с единицей. Точно так же можно написать:

A=0; b=a+-1;

Сначала выполняется унарная операция минуса, получается -1, затем складывается минус и плюс и получается -1. Соответственно это тоже самое, что и i-1 . Нужно знать о таких специфических операциях и понимать, как они будут выполнятся. Это поможет правильно расставлять приоритеты арифметических операциях в соответствии с тем порядком, о котором мы говорим.

Итак, мы выяснили, что система спокойно отрабатывает операцию где встречается две подряд арифметические операции например ++ , +-, -+, а что будет если мы напишем несколько арифметических операций подряд? Это можно проверить. Для этого откроем 1С:Предприятие из Конфигуратора в режиме отладки, клавиша «F5». Поставим точку останова, клавиша «F9», в конце нашего выражения и введём простое выражение в табло. В Конфигураторе откроем пункт меню Отладка -> Табло.

Запишем в табло выражение 3+++5 , обратите внимание, на выходе у нас получается ошибка в выражении. Платформа такого преобразования сделать не может. Выражение 3++5 срабатывает, а вот с тремя плюсами система уже не понимает, чего конкретно от неё хотят. Но если поставить скобки 1++(+2) , то всё это будет выполнено корректно. Как видим, чтобы правильно организовать работу арифметических операций, необходимо хорошо понимать приоритеты их выполнения. В следующей статье мы рассмотрим .

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

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

Обычный знак деления (/ ) в Паскале используется как дробное деление, то есть, делит вещественные числа, и результат деления – вещественное число. Даже если поделить 6 на 3, результат будет не 2, а 2.0, то есть, вещественное число. Кроме дробного деления есть ещё деление без остатка div . Оно работает только с целыми числами, и результат деления – целое число. Остаток игнорируется. Если же, наоборот, нужен остаток от деления, используется операция mod . Например, выражение 20 div 6 даёт 3 , а результат выражения 20 mod 6 равен 2 . Пробелы в этих выражениях пропускать нельзя. Операция mod будет полезна при определении, делится ли одна величина на другую. Если остаток от деления равен нулю, - значит, делится без остатка.

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

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

Ассоциативность — направление выполнения операций в случае, если операции имеют одинаковый приоритет.

В таблице 1 показаны основные операции в С++, их приоритет выполнения и ассоциативность.

Таблица 1 — Приоритет операций в С++
Приоритет Операция Ассоциативность Описание
1 :: слева направо унарная операция разрешения области действия
операция индексирования
() круглые скобки
. обращение к члену структуры или класса
-> обращение к члену структуры или класса через указатель
2 ++ слева направо постфиксный инкремент
постфиксный декремент
3 ++ справа налево префиксный инкремент
префиксный декремент
4 * слева направо умножение
/ деление
% остаток от деления
5 + слева направо сложение
вычитание
6 >> слева направо сдвиг вправо
<< сдвиг влево
7 < слева направо меньше
<= меньше либо равно
> больше
>= больше либо равно
8 == слева направо равно
!= не равно
9 && слева направо логическое И
10 || слева направо логическое ИЛИ
11 ?: справа налево условная операция (тернарная операция)
12 = справа налево присваивание
*= умножение с присваиванием
/= деление с присваиванием
%= остаток от деления с присваиванием
+= сложение с присваиванием
-= вычитание с присваиванием
13 , слева направо запятая

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

// не правильное выражение int value = 5; cout << value += 3; //(ОШИБКА) передаем в поток вывода значение переменной value + 3

Компилятор не поймет выражения в строке 3, так как операция сдвига влево имеет больший приоритет нежели операция суммирования с присваиванием. В итоге программу с таким выражением даже нельзя будет запустить. Суть в том, что компилятор понимает это выражение не так как мы, а совсем по-другому. Как будет рассуждать компилятор: «В выражении две операции, причём первая операция << имеет больший приоритет, чем вторая += , значит передам сначала в поток вывода значение переменной value , а потом прибавлю 3 к?????? А не к чему прибавить 3, так как переменная value передаётся в поток вывода.» Вот в этом и заключается ошибка, а чтобы её не было необходимо просто поставить круглые скобки.

// правильное выражение int value = 5; cout << (value += 3); // передаем в поток вывода значение переменной value + 3

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

Лекция 4 Кафедра Прикладной математики М-703, тел. 362-79-62 К.т.н., профессор Глаголев Виктор Борисович, комн. Ж-405б, тел. 362-73-28 http://glagvik.narod2.ru/index.htm Арифметические операции Приоритет арифметических операций Математические функции Массивы Логические операции Приоритет операций


Операции и функции VB располагает большим набором встроенных функций. Их можно разделить на несколько категорий: Финансово-математические функции Математические функции Функции обработки строк Функции преобразования типов Прочие функции


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


Арифметические операции

Операции отношения


Приоритет операций Если в выражении использовано несколько операций, то в первую очередь выполняются операции, имеющие наивысший приоритет. Если приоритет операций одинаковый, то они выполняются слева направо. a + b/c + d (a + b)/(c + d) Примеры Выражение Код


Математические функции

Углы выражаются в радианах. В проекте необходимо выполнить импорт пространства имен System.Math, добавив в начало исходного кода (до объявления первого модуля или класса) строку Imports System.Math. Иначе перед именем каждой функции будет необходимо добавлять название класса, например: Math.Sin(x)


Импорт в проект пространства имен System.Math


Функции Int и Fix возвращают значение, равное целой части числа, тип которого совпадает с типом аргумента. Синтаксис: Int(число) и Fix(число) Обязательный аргумент число – это любое допустимое числовое выражение.


Различие между функциями Int и Fix состоит в том, что для отрицательного значения аргумента функция Int возвращает ближайшее отрицательное целое число, меньшее либо равное указанному, а Fix ближайшее отрицательное целое число, большее либо равное указанному. Например, функция Int преобразует -8.4 в -9, а функция Fix преобразует -8,4 в -8.


Функция Rnd возвращает значение типа Single, содержащее случайное число, меньшее 1 и большее или равное 0. Перед первым вызовом функции Rnd надо использовать инструкцию Randomize () без аргумента для инициализации генератора случайных чисел.


Пример. Игра «Угадай число» Условие игры Компьютер загадывает некоторое случайное целое число k из диапазона 0 – 100. Следует угадать загаданное число, сделав как можно меньше попыток. После каждой попытки компьютер сообщает, загаданное число больше или меньше предложенного числа.


Таблица данных


Блок-схема алгоритма Генерация случайного числа k от 0 до 100 Ввод k1 a



Интерфейс


Значения свойств


Программный код

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


Например, ссылки a(7) или a1(2, 9) означают, что: а – это имя одномерного массива (вектора) с одним индексом, элемент массива имеет значение индекса равное 7. а1- это имя двумерного массива (матрицы). Об этом говорит применение двух индексов для определения элемента массива.


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


Имя массива Индекс (номер позиции) элемента массива km Пример массива c именем km типа Integer показаний счетчика километров на спидометре автомобиля в начале каждого месяца в течении года:


Как и простые переменные, массивы объявляются с помощью инструкций Dim, Static, Private или Public. Примеры объявления массивов: Dim x() As Single Dim y(,) As Single


Объявлен одномерный массив с именем x и двумерный массив y. Об этом говорят скобки в объявлении после имени каждого массива. При объявлении двумерного массива между скобок должна стоять запятая. Объявление верхних границ индексов в этих примерах отложено на потом (такие массивы называют динамическими). Одномерный массив называют вектором. Двумерный массив называют матрицей.


Для объявления верхней границы индекса и размещения в памяти массивов следует поместить инструкцию: Redim x(10), y(4,5) Здесь заданы значения верхних границ каждого индекса массивов.


Индекс массива x может принимать значение в диапазоне от 0 до 10. Массив x имеет 11 элементов. Первый индекс массива y может принимать значение в диапазоне от 0 до 4. Второй индекс массива y может принимать значение в диапазоне от 0 до 5. Массив y имеет 30 элементов (произведение числа строк на число столбцов).


При объявлении массива можно выполнить его инициализацию: Dim z() As Single = {1.3, -2.7, _ 14.6, -5} В этом примере объявлен одномерный массив z, имеющий 4 элемента, значения которых заданы списком инициализации. Массив, при объявлении которого верхние границы индексов не были указаны (динамический массив), можно неоднократно переобъявлять с помощью инструкции ReDim.


Среди инструкций внутри процедуры можно записать: ReDim y(5, 10) Далее этот массив может быть переобъявлен: ReDim y(5, 20)


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


Инструкция ReDim Preserve может увеличить размер массива, сохраняя при этом его содержимое. В следующем примере показывается, как можно увеличить размер массива a4 на 10 элементов без уничтожения текущих значений элементов массива. Пусть был объявлен массив: Dim a4 () As Integer Затем в программе установлен размер этого массива: ReDim a4 (n)



Если при объявлении массива задаются верхние границы индексов, то такой массив называется фиксированным. Пример Dim s(10) As Single Dim b(4, 5) As Integer К фиксированным массивам инструкция ReDim неприменима.


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


Если же в левой части оператора присвоения стоит динамический массив, то совпадение числа элементов не обязательно. Число элементов массива в левой части оператора присвоения при необходимости изменится.


Пример. Dim a() As Integer = {1, 2, 3, 4}, _ b(), i As Integer b = a For i = 0 To 3 MsgBox(b(i)) Next Последовательно на экране в окне функции MsgBox будет выведено: 1, 2, 3, 4.


Пример 1 Вычислить среднее арифметическое k заданных чисел.


Применяемые данные Исходные данные: k – переменная целого типа, число заданных величин; a() – массив типа Single, значения заданных величин. Результаты: s – переменная типа Single, значение среднего арифметического.


Промежуточные: Сумма – переменная типа Single, значение суммы первых k элементов массива a; i – переменная целого типа, значение индекса элемента массива a.


Блок-схема алгоритма (1) (2) 1


(3) (4) (5) (6) (7) (8) 1 2 Нет



Посмотрим на эту блок-схему с точки зрения базовых структур, которые в нее входят. Блоки 1 – 2 составляют последовательную структуру (следование), которую мы назовем Структура 1. Блоки 3 – 8 относятся к циклу. Эту структуру мы назовем Структура 2. Блоки 9 и 10 – это опять последовательная структура, которую мы назовем Структура 3.


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


Интерфейс проекта Текстовое поле предназначено для вывода результатов вычислений. Нажатие на кнопку приведет к запуску вычислений.


Интерфейс проекта


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


Выполнение проекта должно начаться с щелчка на кнопке BtnПуск. Следовательно в код проекта должна входить подпрограмма BtnПуск_Click, выполнение которой запускается событием Click, происшедшим с кнопкой BtnПуск (щелчком на этой кнопке).


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


Ниже показан код, который получится после создания заготовки подпрограммы BtnПуск_Click.

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

В строках с 1 по 5 тела этой процедуры объявляются данные. В строке 6 выполняется очистка текстового поля. Для этого применяется метод Clear. Если этого не сделать, то при многократных запусках проекта информация, выводимая в текстовом поле при очередном запуске, будет добавляться к информации, выведенной в нем при предыдущих запусках.


В строке 7 обеспечивается ввод значения переменной k. Правильность выполнения ввода данных рекомендуется всегда контролировать. Именно с этой целью в строке 8 значение переменной k выводится в текстовом поле. В строке 9 выполняется размещение массива a в памяти.


В строках с 10 по 12 выполняется ввод значений элементов массива a. Значение элемента a(0) при этом не вводится. Наличие этого элемента мы будем игнорировать. Он ни где не будет применяться. В строках с 13 по 16 значения введенных элементов массива a выводятся для контроля в текстовом поле.


В строках с 17 по 20 выполняется вычисление значения переменной s. И, наконец, в строке 21 обеспечивается вывод значения переменной s в текстовом поле.


Обратите внимание на то, что в программе нет инструкции i = 1, а также инструкции i = i + 1, несмотря на то, что эти инструкции есть в блок-схеме. Нет также проверки условия i <= k. Выполнение всех этих действий обеспечивает инструкция цикла For … Next.


Обратите внимание на то, что в программе также нет инструкции sum = 0. Значение 0 переменная sum получила в результате ее объявления. Можно удалить инструкцию Dim i As Integer. Инструкция цикла For … Next является блоком. Переменная i внутри блока получит тип Integer автоматически (по типу начального и конечного значений параметра), но действовать будет только внутри блока.


Логические операции В VB.NET определены логические операции: And (логическое умножение), Or (логическое сложение), Not (логическое отрицание), а также Xor (логическое исключительное сложение). Операция Not имеет следующий синтаксис: Not Операнд


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


Операция Not Not Операнд


Операция And имеет два операнда:Операнд 1 And Операнд 2 Результат операции And определяет таблица:


Операция And имеет значение True только тогда, когда оба операнда имеют значение True. Пример Неравенство a ? x ? b следует записать: a <= x And x <= b Неправильно написать: a <= x <= b


Операция Or также имеет два операнда: Операнд 1 Or Операнд 2 Результат операции Or дан в таблице:


Операция Or имеет значение True, если хотя бы один операнд (и даже оба вместе) имеют значение True. Пример: Условие «х не принадлежит отрезку » следует записать: x < a Or x > b или Not(a <= x And x <= b)


Xor (логическое исключительное сложение) Результат операции Xor дан в таблице: Операция Xor имеет значение True, если один из операндов (но не оба вместе) имеют значение True.


В VB.NET определены также логические операции: AndAlso и OrElse. Операция AndAlso очень похожа на операцию And. Она также выполняет логическое умножение для двух логических операндов (Boolean).


Основным различием между AndAlso и And является то, что AndAlso допускает сокращенное, неполное вычисление операндов. Если для первого операнда в AndAlso вычисляется значение False, второй операнд не вычисляется и возвращается значение False операции AndAlso.


Аналогично операция OrElse очень похожа на операцию Or. Она выполняет сокращенное логическое сложение двух логических операндов. Если первый операнд в выражении OrElse равен True, второй операнд не вычисляется и возвращается True для операции OrElse.