Арифметические операции приоритет арифметических операций математические функции массивы логические операции приоритет операций. Приоритет операций. Cложные математические выражения Приоритет выполнения операций

Лекция 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.

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

Приоритеты арифметических операций системы MATLAB в порядке убывания представлены в таблице 1.5. Заметим, что приоритет в выполнении арифметических операци обычный. Операции одинакового приоритета выполняются в порядке слева направо. Круглые скобки могут изменить этот порядок), причем степень вложения скобок не ограничивается.

Таблица 1.5. Приоритет арифметических операций в системе MATLAB.

Арифметические выражения.

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

Арифметическое выражение задает то, что должно быть вычислено в численном (реже символьном) виде. В таблице 1.6. ниже приведены примеры простейших арифметических выражений, записанных по правилам системы MATLAB и по общематематическим правилам.

Таблица 1.6. Некоторые примеры простейших арифметических выражений, записанных по правилам системы MATLAB и по общематематическим правилам.

Разница в записях, представленных в таблице 1.6. достаточно очевидна. В системе MATLAB арифметические выражения записываются в виде одной строки, причем вместо запятой в качестве разделителя целой и дробной частей числа используется точка (а никак не запятая!). Арифметические выражения строятся на основе чисел, констант, переменных, операторов и разных спецзнаков. Специфика системы MATLAB состоит в том, что арифметические выражения задаются в виде одной строки. Так, например, записывается как 2^5. Знак «;» (точка с запятой) в конце строки блокирует вывод результата вычислений, однако системная переменная ans позволяет вывести результат вычислений (в режиме командной строки):

>> 2^5; >> ans ans =

Пример. Требуется вычислить следующие арифметические выражения:

1) при

2) при

3) при

4) при

Текст М-файла.



k=2;r=2;x=2;y=1; r1=abs(r)^(5*x*y)+tan(3*k) x=.5; r2=sqrt(log(x)^2+1)+3*x^(1/3) x=1; y=2; z=3; r3=(x+3*y)/(2*z)-3*abs(x)*exp(x+y)/(x+y)+1/(1+1/(1+1/x)) x=0.3; r4=sin(x/2)^3+cos(x^2)-2*cos(3*x)^(1/5)

Результаты расчета в командном окне:

Следует обратить внимание, что для просмотра результатов работы оператора знак «;» не ставится.

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

Операцией будем называть действие, которое требуется совершить. Объекты, над которыми производится действие, именуют операндами.

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

Если в арифметическом выражении встречаются операнды разных типов, то перед выполнением операций производится автоматическое преобразование к типу "старшего" операнда. Порядок возрастания старшинства таков:

char < int < long < float < double

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

Унарные (один операнд);

Бинарные (два операнда);

Тернарная (три операнда).

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

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

Язык Си поддерживает стандартный набор бинарных арифмети-

ческих операций:

Сложение (+);

Вычитание (-);

Умножение (*);

Деление (/);

Взятие остатка от деления целых операндов (%).

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

double pow(double x, double y);

вычисляющую значение x в степени y.

Следует помнить, что результатом деления целых чисел является также целое число, у которого нет дробной части: 7/4 дает в результате единицу! Если же нужно получить остаток от целочисленного деления, то используется операция взятия по модулю, обозначаемая символом % :

7%4 дает в результате 3,

21%2 дает в результате 1,

10%5 дает в результате 0.

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

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

Операция присваивания

В языке Си присваивание обозначается одним знаком равенства (=). Численное значение правой части присваивается переменной,указанной слева, причем перед этим всегда автоматически выполняется преобразование заносимого числа к типу этой переменной:

В результате будет получено значение a = 19.0 .

Строго говоря, слева может стоять даже выражение (!), прав-

да, имеющее смысл адреса. Так, вполне корректно писать:

Си допускает многократное присваивание, например:

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

значение z будет присвоено переменной w и затем переменной sum.

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

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

ним следует отнести += , -= , *= , %= и ряд аналогичных знаков,

а также знаки префиксных и постфиксных операций инкремента ++ и

декремента --.

┌─────────────────────────────────────────────┐

│ Внутри многосимвольных знаков операций не │

│ должно быть пробелов!! │

└─────────────────────────────────────────────┘

Приведем примеры сокращенной записи присваивания с помощью

знаков многосимвольных операций:

i += 1; означает i = i+1;

i -= k; означает i = i-k;

i *= k; означает i = i*k;

i /= k; означает i = i/k;

Префиксные и постфиксные операции ++ и -- означают соответ-

ственно инкремент и декремент переменной (не обязательно целой):

K - увеличивает значение переменной k на единицу

п е р е д его использованием в выражении;

k++ - то же п о с л е использования;

K - уменьшает значение переменной k на единицу

п е р е д использованием;

k-- - то же п о с л е использования.

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

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

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

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

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

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

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

Служебные слова;

Идентификаторы;

Знаки операций и пунктуации;

Константы.

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

Вывод: чтобы избежать возможной неоднозначности рекомендуется

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

деления лексем в сомнительных местах.

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

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

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

В таблице 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 передастся в поток вывода.

Пожалуйста, приостановите работу AdBlock на этом сайте.

В математических вычислениях важную роль играет порядок, в котором выполняются действия. Чему, например, равно значение выражения 2+2*2 ? Конечно же шесть, т.к. сначала выполняется умножение.

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

  • вычисляются функции (например, sqrt() , cos() и др.)
  • умножение, деление, остаток от деления (слева направо)
  • сложение, вычитание
  • выполняется присваивание

А каково значение переменной x после выполнения следующего кода int x = 8 / 4 / 2;

Правильный ответ 1. Т.к в случае одинакового приоритета операций, команды выполняются слева направо. Другими словами данный код эквивалентен коду int x = (8 / 4) / 2;

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

Листинг 1.

2+2*2 = 6 (2+2)*2 = 8 // действие в скобках будет выполнено прежде умножения

На следующем рисунке над каждым действием отмечено, каким оно выполнится по счёту.

Рис.1 Приоритет операций в языке С. Пример.

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

Сложные математические выражения

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

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

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

Поделитесь с друзьями или сохраните для себя:

Загрузка...