ОСАП_Лекция_2.ppt
- Количество слайдов: 62
ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ ЛЕКЦИЯ 2 Зарецкий М. В. кафедра ВТи. ПМ
Способ описания формального языка Определение записывается в виде: определяемый_объект : : = определяющее выражение. Обязательная часть описываемого записывается в угловых скобках <>, необязательная часть – в квадратных скобках []. Варианты определения разделяются вертикальной чертой |.
Приведем примеры. <десятичная цифра>: : =0|1|2|3|4|5|6|7|8|9 <двоичная цифра>: : =0|1 <строчная буква латинского алфавита>: : =a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q| r|s|t|u|v|w|x|y|z <заглавная буква латинского алфавита>: : =A|B|C|D|E|F|G|H|I|J|K|L|M|N|O| P|Q|R|S|T|U|V|W|X|Y|Z Итак, перед нами язык для описания языка – метаязык. А формулы называются металингвистическими формулами Бэкуса. Наура.
Джон Бэкус ( John Backus, 1924 — 2007) — американский учёный в области информатики.
Пи тер На ур (Peter Naur; 1928) — датский учёный в области информатики
Представление данных в компьютере Изучая информатику, вы узнали, что минимальной единицей информации является один бит. Вспомните, что это такое! 8 бит образуют один байт. 1024 (210) байт образуют килобайт. 1024 (210) килобайт образуют мегабайт. Продолжите эту последовательность самостоятельно.
Представление числовых данных В математике множество натуральных чисел является подмножеством множества целых чисел, которое, в свою очередь, является подмножеством множества рациональных чисел, которое, в свою очередь, является подмножеством множества вещественных (действительных) чисел. При рассмотрении комплексных чисел те же рассуждения можно применить к вещественной и мнимой частям числа.
Применительно к компьютерной арифметике, строго говоря, такой цепочки подмножеств нет. Целые неотрицательные числа, называемые в компьютерной литературе «целые беззнаковые» кодируются в виде двоичного числа, занимающего отводимое в соответствии с типом числовой переменной количество байтов.
Целые числа, которые могут быть положительными, отрицательными или равными 0, кодируются сложнее. Знак числа определяется первым битом (0 – положительное, 1 – отрицательное). Рассмотрение данного способа кодирования не входит в нашу программу. Любознательные могут обратиться к книге [1].
Рассмотрим теперь представление чисел, которые могут иметь как целую, так и дробную часть (в компьютерной литературе такие числа называются вещественными). Такие числа характеризуются не только диапазоном представления (от минимального до максимального), но и точностью представления.
Точность вещественного числа характеризуется количеством значащих цифр, сохраняемых в отведенном для числа количестве байтов. Все вещественные цифры хранятся в нормализованной форме, имеющей вид:
Здесь: a - вещественное число; m – мантисса (правильная дробь с ненулевым старшим разрядом); P - основание системы счисления; q - характеристика (степень, в которую возводится основание системы счисления). Например, 279, 987 будет представлено в виде: 0. 279987 х103, -0. 0432 будет представлено в виде: -0. 432 х10 -1.
Степени числа 10 в языке VBA обозначаются следующим образом: E+q или E-q, где q – показатель степени числа 10. Например, E-1 обозначает 10 -1, E+3 обозначает 103. Таким образом, число 279, 987 должно быть представлено в виде 0. 279987 E+3, число -0. 0432 должно быть представлено в виде -0. 432 E-1. Внимание! Число пишется слитно, знак умножения не ставится!
Разумеется, на самом деле компьютерное представление основано на двоичной системе счисления, но для наших целей это не очень существенно.
Представление текстовых данных Все символы, из которых состоят текстовые данные кодируются числами. Таким образом, текст хранится в памяти компьютера в виде последовательности чисел.
В современных компьютерах для кодирования символов используется специальный код UNICODE. Изучение UNICODE не входит в нашу программу, любознательные могут прочитать о нем в книге [1].
Данные типа «деньги» (Currency), «дата» (Date) относятся к числовым. Данные типа данных Boolean могут принимать только значения «истина» или «ложь» . Данные могут иметь тип объектов Excel (если программа создается в среде Excel). Кроме того, в программе на VBA можно создавать и использовать собственные типы данных (записи, классы), но об этом речь впереди.
Основные типы данных VBA Целочисленные данные Тип Byte Integer Размер 1 2 Long 4 Boolean 2 Диапазон 0. . 255 -32768. . 32767 -2147483648. . 2147483647 True или False
Основные типы данных VBA Вещественные данные Тип Single Размер Диапазон 4 от -3. 402823 E+38 до -1. 4011298 E-45 (для отрицательных) от 1. 401298 E-45 до 3. 402823 E+38 (для положительных)
Тип Размер Диапазон Double 8 от-1. 79769313486232 E+308 до-4. 94065645841247 E-324 (для отрицательных) от 4. 94065645841247 E-324 до 1. 79769313486232 E+308 (для положительных)
Тип Размер Диапазон Currency 8 от -922337203685477. 5808 до 922337203685477. 5807 Date 8 от 1 января 100 г. до 31 декабря 9999 г.
Основные типы данных VBA Нечисловые данные Тип Размер Диапазон Object 4 Любая ссылка на объект String 10+длина От 0 до 2 миллиардов символов String длина От 0 до 65400 символов
Тип Размер Диапазон Variant 16 Любое числовое значение вплоть до границ диапазоне Double Variant 22+длина От 0 до 2 миллиардов символов User-defined Определяется пользователем
Обратите внимание на гигантские диапазоны представления данных. Разумеется, в реальных задачах ответы типа «десять в 128 степени» невозможны. Денежные суммы, выражаемые предельными значениями диапазона для данных типа Currency также абсурдны. Количество значащих цифр в ответе также следует выводить, сообразуясь со здравым смыслом. Мы научимся это делать.
Основные компоненты программы Программы, которые мы будем изучать представляют собой запись алгоритмов на языке программирования VBA. Для записи программы используются ключевые слова языка VBA – набор слов (и словосочетаний), имеющих в тексте программы строго зафиксированный смысл.
Процесс обработки данных, задаваемый программой состоит из отдельных элементов, называемых операторами. Оператор описывает некоторое действие, совершаемое с данными.
Это действие может быть относительно простым, например, сложение нескольких чисел или весьма сложным, например, вычисление значения функции, требующее ее разложения в ряд Тейлора (это далеко не предел сложности).
Для выполнения сложных действий мы можем воспользоваться готовыми программными средствами, а если таких нет, то нам приходится создавать их самостоятельно. Обрабатываемые программой данные могут быть переменными или константами.
Переменная величина в программировании – это символическое имя для области компьютерной памяти, в которой хранятся данные. Эти данные могут сколько угодно раз изменяться в ходе выполнения программы. Размер отводимой памяти определяется типом переменной. Об этом речь пойдет дальше.
Переменные в VBA содержат числа, строки, данные более сложных видов. При выполнении оператора, в котором присутствует переменная используются данные, хранящиеся в той области памяти, которая связана с переменной. Каждая переменная должна иметь уникальное в данной программе имя. Длина имени переменной не должна превышать 255 символов.
Первым символом в имени переменной должна быть буква, за которой могут следовать буквы, цифры, символ подчеркивания “_”. Любые иные символы недопустимы! Нельзя в качестве имен переменных использовать ключевые слова VBA (заметим, что если мы только попытаемся такое вытворить, эта попытка будет пресечена системой разработки).
При написании имен переменных можно использовать как строчные, так и заглавные буквы. Система разработки их не различает. При использовании явного описания переменной (на чем я решительно настаиваю) во всей программе переменная было сделано при ее описании. Пример. Переменная описана Dim Weight_in_Grams as Long Если в тексте программы написать w. Ei. Ght_i. N_g. RAm. S, то система сама исправит написание на Weight_in_Grams.
Современные версии VBA позволяют использовать в именах переменных буквы, не принадлежащие латинскому алфавиту. Например, мы можем назвать переменную Зарплата. Язык VBA не запрещает использовать в качестве имени переменной имя одной из встроенных функций. Не советую так поступать – толку никакого, а проблемы могут возникнуть.
Описание переменных Воспользуемся рассмотренным в начале лекции способом описания конструкций языка по Бэкусу-Науру.
Затем указывается тип переменной. Указание типа не является обязательным. Но лучше тип указать – будет больше порядка в программе! При описании переменной ей выделяется место в памяти в соответствии с ее типом.
Также при описании автоматически задается информация о том, какие операции можно с переменной производить и какие значения она может иметь. Примеры: Dim Цена as Currency Dim Weight as Single
Константы При написании программы на VBA некоторые величины заведомо не могут изменяться в ходе выполнения программы. Для работы с ними удобно использовать константы. В языке VBA используются литеральные и символические константы.
Значение литеральной константы записывается прямо в тексте программы. Строчные литеральные константы записываются в кавычках, а числовые – без какого-либо дополнительного форматирования. Пример. Учебная_Дисциплина = “ОСАП” Количество_Часов = 108 “ОСАП” и 108 – литеральные константы.
Символическая константа должна быть описана. Ее описание имеет вид:
Примеры: Const Имя as String = “Катя” Const Cash as Currency = 3000 Const Доход AS Currency = 15000 Зачем нужны символические константы? На этот вопрос мы дадим ответ в следующих лекциях.
Замечание. Две знаменитые константы – число e и число «пи» не надо описывать в качестве констант. Для них существуют функции, о которых будет сказано далее.
В языке VBA нет строгих правил определяющих, где в программе следует помещать описания переменных и символических констант. Логика и здравый смысл подсказывают, что лучше всего их размещать компактно в начале программы. В этом случае текст программы будет проще читать и легче будет находить в нем ошибки.
Действия над переменными и константами. Арифметические операции Число 1 + Число 2 Число 1 - Число 2 -Число 1 * Число 2 Число 1 / Число 2 Число 1 Число 2 (Целочисленное деление) Число 1 Mod Число 2 (Остаток от деления) Число 1^Число 2 (Возведение в степень)
Переменные и константы, используемые в операции, называются операндами. Операндами могут быть сложные выражения, взятые в скобки. Результат выполнения операции зависит от типа и значений операндов! В некоторых операция не может быть выполнена, например, нельзя возвести отрицательное число в нецелую степень.
Арифметические выражения <Арифметическое выражение> : : = [<>]<Операнд 1>[<Знак операции><Операнд 2>… <Знак операции>: : =+|-|*|/||Mod|^ Приоритеты при выполнении операций обычные для математики. При необходимости приоритет указывается с помощью скобок.
Арифметический оператор присваивания <Имя переменной> = <Арифметическое выражение> Примеры: P = 1 P= P+1 D = B^2 – 4*A*C
Арифметический оператор присваивания следует понимать, как приказ компьютеру вычислить выражение, находящееся справа от знака присваивания и поместить его в участок памяти, отведенный для переменной, находящейся слева от знака присваивания.
Проблема выравнивания порядков При работе с вещественными числами возникает проблема при сложении или вычитании чисел, которые существенно отличаются по величине. Точнее, при сложении «очень большого» и «очень маленького» чисел сумма будет равна «очень большому» слагаемому, очень маленькое не будет учтено.
Такой же эффект возникает и при вычитании из «очень большого» числа «очень маленького» числа. Рассмотрим пример. В одном лесу живет медведь, который весит 700 кг. В том же лесу живут 30000000 (тридцать миллионов) муравьев, каждый из которых весит 0. 01 грамма. Надо найти общую массу всех этих живых существ.
Подход простой и глупый. Ставим медведя на весы (не пытайтесь попробовать!). Потом кладем на него одного муравья, записываем показания весов. Затем убираем первого муравья, кладем второго и опять записываем показания весов и т. д. Очевидно, что стрелка весов (или индикатор электронных весов) на одного муравья не отреагирует. Получится, что муравьи ничего не весят. А это – неправда!
Более разумный подход состоит в том, что сначала надо найти суммарную массу всех муравьев, и ее уже прибавить к массе медведя. Получим правильный ответ. Одновременно получим интересный вывод – в компьютерной арифметике могут нарушаться самые элементарные математические законы – перемена мест слагаемых может изменить сумму!
Глупая программа для нахождения суммы весов животных. Имя переменной Тип Mas_of_one_Bear_Grams Single Mas_of_one_Ant_Grams Single Total_Mas_Wrong_Grams Single Number_of_Ants Long I Long
• • • • Sub Silly() Dim Mas_of_one_Bear_Grams As Single Dim Mas_of_one_Ant_Grams As Single Dim Total_Mas_Wrong_Grams As Single Dim Number_of_Ants As Long Dim I As Long Mas_of_one_Bear_Grams = 700000 Mas_of_one_Ant_Grams = 0. 01 Number_of_Ants = 30000000 Total_Mas_Wrong_Grams = Mas_of_one_Bear_Grams For I = 1 To Number_of_Ants Total_Mas_Wrong_Grams = Total_Mas_Wrong_Grams + Mas_of_one_Ant_Grams Next I Msg. Box "Total biomas (wrong result): " & CStr(Total_Mas_Wrong_Grams) & " grams" End Sub
Программа не зря названа Silly. Она дает очень глупый ответ. Проверьте! А теперь напишем умную программу. Назовем ее Clever.
• • • • • Sub Clever() Dim Mas_of_one_Bear_Grams As Single Dim Mas_of_one_Ant_Grams As Single Dim Total_Mas_of_Ants_Grams As Double Dim Total_Mas_Grams As Single Dim Number_of_Ants As Long Dim I As Long Mas_of_one_Bear_Grams = 700000 Mas_of_one_Ant_Grams = 0. 01 Number_of_Ants = 30000000 Total_Mas_of_Ants_Grams = 0 For I = 1 To Number_of_Ants Total_Mas_of_Ants_Grams = Total_Mas_of_Ants_Grams + Mas_of_one_Ant_Grams Next I Total_Mas_Grams = Total_Mas_of_Ants_Grams + Mas_of_one_Bear_Grams Msg. Box "Total biomas : " & CStr(Total_Mas_Grams) & " grams" End Sub
Эта программа дает правильный ответ. А в чем состоит разница между двумя программами? В программе Silly к массе медведя поочередно прибавляется масса каждого из муравьев. В результате такого сложения сумма останется равной первому слагаемому. В программе Clever сначала суммируются массы всех муравьев, а полученная сумма прибавляется к массе медведя. Оба слагаемых сопоставимы по величине. Получаем правильный результат.
Задания для самопроверки: • вспомните известные вам меры информации; • какое максимальное неотрицательное число может быть представлено с помощью 1 байта? ; • какое количество различных символов может быть закодировано с помощью 1 байта?
• каково максимальное значение целого беззнакового длиной 4 байта; • запишите в нормализованной форме числа -2. 23456, 0. 000876, -2345. 009 (целая часть числа отделена от дробной знаком «точка» ); • в программе Silly замените тип вещественных переменных – вместо Single установите тип Double. Что изменится?
Замечание Подход, при котором программа рассматривается в виде последовательности команд, отдаваемых исполнителю, получил название императивное программирование. Этот подход не единственно возможный.
Существует и успешно развивается декларативное программирование, в котором, в свою очередь, можно выделить логическое и функциональное программирование. В логическом программировании программа рассматривается в виде набора логических функций – предикатов.
В функциональном программировании программа рассматривается, как совокупность, точнее – суперпозиция, вложенных функций. Кроме того, существуют языки программирования, в которых не применяются переменные. Например, язык функционального программирования Haskell. Рассмотрение этих интересных тем не входит в нашу программу.
Литература • Математические основы информатики. Эффективный курс: Учебное пособие / Е. В. Андреева, Л. Л. Босова, И. Н. Фалина – 2 -е изд. , испр. - М. : Бином. Лаборатория знаний, 2007. – 328 с. • Гарнаев А. Ю. EXCEL, VBA, INTERNET в экономике и финансах / А. Ю. Гарнаев. СПб. : БХВ-Петербург, 2003. – 816 с.


