Алгоритмизация и программирование на VB. Алгоритмизация и программирование на VB EXCEL.docx. Программирования. Структурное программирование Основные этапы решения задачи Постановка задачи
Скачать 0.58 Mb.
|
4. Программирование Алгоритмизация и программирование Языки программирования. Системы программирования. Структурное программирование Основные этапы решения задачи 1.Постановка задачи. Задача формулируется на естественном языке 2. Разработка мат. модели. 3.Выбор численного метода решения задачи. 4.Разработка алгоритма. 5.Составление программы на выбранном языке программирования. 6.Тестирование и отладка программы. (Отладка – этоустранение ошибок. Тестирование- проверка правильности работы.) Разработка тестов и контрольных примеров. 7. Оценка полученных результатов. Сопоставление реальных и ожидаемых результатов.Если результаты неудовлетворительны, возврат к некоторым предыдущим этапам. 8. Разработка документации. Текстовое описание программы. Разработка инструкций пользователю – лицу, применяющему разработанную программу в своей работе. Жизненным циклом программы называют весь период ее разработки и эксплуатации. Алгоритм Алгоритм – однозначная последовательность действий, приводящая к требуемому результату. Свойства алгоритма 1. Определенность. Каждый шаг точно определяет какое-либо действие. Не допускается двусмысленность, аппеляции к «здравому смыслу» и т.п. 2. Детерминированность. После окончания выполненного шага должно быть однозначно определено какой шаг будет следующим. 3. Конечность (или результативность). Алгоритм должен (для корректно заданных исходных данных) приводить к решению задачи за конечное число шагов. 4. Массовость. Один и тот же алгоритм можно применять к различным исходным данным. При этом исходные данные могут выбираться из некоторой области, которая называется областью применимости алгоритма. Не всегда выполняется свойство конечности. Например, некоторые диалоговые алгоритмы строятся как бесконечные, работу которых можно прекратить лишь внешним воздействием: нажатием некоторых клавиш, перезагрузкой компьютера. Такой подход считается непрофессиональным. Свойство массовости может нарушаться, если алгоритм используется для получения одного конкретного результата или в демонстрационных целях. В этом случае алгоритм использует только данные, определяемые самим алгоритмом и не использует исходных данных, вводимых пользователем при запуске программы. Способы описания алгоритмов 1.Блок-схемы. Детальное описание таким методом каждого оператора используется только для коротких алгоритмов, умещающихся в 1 страницу. Для больших алгоритмов блок-схема получается громоздкой, объем ее бывает больше самой программы, и переход с одной страницы на другую очень усложняет ее чтение. Часто применяется при укрупненном представлении алгоритма, когда одной фигурой изображается какая-то выделенная часть программы, а не отдельный оператор. 2. Псевдокод. Способ точного описания алгоритма предложениями на естественном языке. Применяется наиболее часто. Современные системы программирования Система программирования это комплекс программных средств, предназначенных для кодирования, тестирования и отладки программного обеспечения. Имеет интерфейс, удобный пользователю. Такие комплексы, как правило, включают следующие программные модули. 1.Текстовые редакторы, служащие для создания текстов исходных программ. 2.Компиляторы, предназначенные для перевода исходного текста на входном языке в язык машинных кодов. В результате создаются объектные модули. Это программы на машинном языке, они записываются на диск с расширением .exe. 3.Компоновщики, позволяющие объединять несколько объектных модулей, порождаемых компилятором, в одну программу. В результате создается загрузочный модуль. 4. Загрузчики, обеспечивающие подготовку готовой программы к выполнению. 5. Библиотеки прикладных программ, содержащие в себе наиболее часто используемые подпрограммы в виде готовых объектных модулей. 6. Отладчики, выполняющие программу в заданном режиме (например, пошаговом) с целью поиска, обнаружения и локализации ошибок. Используются на этапе компиляции. Основным модулем системы программирования всегда является компилятор. Именно технические характеристики компилятора, прежде всего, влияют на эффективность результирующих программ, порождаемых системой программирования. Напомним основные термины и понятия. Транслятор – это программа, которая переводит входную программу на исходном (входном) языке в эквивалентную ей выходную программу на результирующем (выходном) языке. Близко по смыслу к этому понятию понятие компилятор. Компилятор – это транслятор, который осуществляет перевод исходной программы в эквивалентную ей объектную программу на языке машинных команд или языке ассемблера (.exe файл). Таким образом, компилятор отличается от транслятора тем, что его результирующая программа написана обязательно на языке машинных команд или языке ассемблера. Результирующая программа транслятора в общем случае может быть написана на любом языке (например, транслятор с языка Pascal на язык С). Таким образом, компиляторы – это вид трансляторов. Напомним также, что существует еще принципиально отличное понятие: интерпретатор. Интерпретатор – это программа, которая воспринимает входную программу на исходном языке, переводит каждый оператор или строку в машинный язык и выполняет их. Интерпретатор не порождает результирующую программу и никакого результирующего кода. Интерпретаторы удобны для быстрой отладки программ, тем самым укорачивая обычный цикл разработки. Однако с другой стороны, интерпретаторы в сравнении с компиляторами обычно проигрывают по скорости выполнения в несколько раз. Языки программирования Самым первым языком программирования был язык машинных кодов (двоичный язык). Программа записывалась как элементарные машинные действия: сложение, сравнение двух величин, пересылка по заданному адресу, извлечение из ячейки памяти с заданным адресом. Причем все команды и числа записывались в двоичном коде. В настоящее время практически не применяется. Следующий этап - язык Ассемблер (мнемокод) – это тот же язык процессора, но адреса и команды в двоичной системе заменены символьными именами. Он позволяет программисту присваивать удобные имена ячейкам и областям памяти, а также задавать наиболее удобные схемы адресации. Язык Макроассемблер является расширением языка Ассемблера. Программирование становилось более продуктивным, да и вообще, более привлекательным. Но даже на ассемблере программировать было не очень-то приятно, кроме того, ассемблеры аппаратно зависимы - то есть, если планировалось использовать программы на компьютере от Dec, а не Intel, их приходилось переписывать заново. Почему же ассемблер используется до сих пор? Языки Ассемблера и Макроассемблера применяются системными программистами- профессионалами с целью использования всех возможностей оборудования ЭВМ и получения эффективной по времени выполнения и по требуемому объему памяти программы. На этих языках обычно разрабатываются относительно небольшие программы, входящие в состав системного программного обеспечения: драйверы, утилиты и другие. В программу, написанную на языке высокого уровня, можно делать вставки на ассемблере для повышения быстродействия программы. Пожалуй, наиболее важной вехой в истории программирования, сравнимой по значимости разве что с изобретением письменности, можно считать переход от машинных кодов и ассемблера к языкам высокого уровня. Это языки, приближенные к естественному языку, в частности, к английскому. К настоящему времени создано около 3 000 языков. Сейчас в практической деятельности применяются не более двух десятков языков. Некоторые известны узкому кругу специалистов определенной области. Другие, ранее широко известные, стали очень редко применяться в связи с созданием новых технологий (например, язык Кобол – язык экономических расчетов). Языки высокого уровня не зависят от архитектуры компьютера. Чем более язык ориентирован на человека, тем выше его уровень. Существуют различные классификации языков высокого уровня. Можно предложить следующую. 1. процедурные 2. объектно-ориентированные 3. декларативные Процедурное программирование Программа на процедурном языке программирования состоит из последовательности операторов (инструкций), задающих ход решения задачи. Основным является оператор присваивания, служащий для изменения содержимого областей памяти. Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней. Классическое процедурное программирование требует от программиста детального описания того, как решать задачу, т.е. формулировки алгоритма и его специальной записи. При этом ожидаемые свойства результата обычно не указываются. Основные понятия языков этих групп – оператор и данные (переменные). Переменная на языке процедурного типа получает атрибуты: имя, тип, значение. При процедурном подходе операторы объединяются в группы – процедуры. Первым был Fortran. Он появился в 1957 году. Fortran - это сокращение от двух английских слов FORmula TRANslator - что переводится как "транслятор формул". Как видно из названия, первоначально язык создавался с целью использования при математических расчетах. Он предназначался для написания программ, используемых при решении прикладных технических задач. Для него за время его существования было написано множество удобных и полезных библиотек, он до сих пор иногда используется при программировании сложных вычислений. К тому же Fortran до сих пор продолжают изучать при подготовке по некоторым физико-математическим специальностям во многих университетах, где он остается профилирующим языком программирования. Basic (Beginners All-purpose Symbolic Instruction Code) —представляет собой простой язык программирования, разработанный в 1964 году для использования новичками. Он был разработан как простейший язык для непосредственного общения человека с вычислительной машиной. Поэтому первоначально работа велась в интерактивном режиме с использованием интерпретаторов. В настоящее время для этого языка имеются также и компиляторы. Согласно концепциям, заложенным в Basic, этот язык в смысле строгости и стройности является антиподом языка Pascal. В частности, в нем широко распространены различные правила умолчания, что считается плохим тоном в большинстве языков программирования подобного типа. Basic широко распространен на ЭВМ различных типов и очень популярен в среде программистов, особенно начинающих. Существует множество диалектов этого языка, мало совместимых между собой. Basic активно использует многие концепции и новинки из других языков. Поэтому он достаточно динамичен, и нельзя однозначно определить его уровень. Язык Си. Большой отпечаток на современное программное обеспечение наложил язык Си (первая версия – 1972г.), являющийся очень популярным в среде разработчиков систем программного обеспечения (включая и ОС). Си сочетает в себе черты, как языка высокого уровня, так и машинно-ориентированного языка, допуская программиста ко всем машинным ресурсам, что не обеспечивают другие языки. Pascal является одним из наиболее популярных среди прикладных программистов процедурным языком программирования. Разработанный в 1970 году швейцарским специалистом в области вычислительной техники профессором Н. Виртом, язык назван в честь французского математика и по замыслу автора предназначался для обучения программированию. Однако язык получился настолько удачным, что стал одним из основных инструментов прикладных и системных программистов при решении задач вычислительного и информационно-логического характера. В языке Pascal реализован ряд концепций, рассматриваемых как основа «дисциплинированного» программирования и заимствованных впоследствии разработчиками многих языков. Одним из существенных признаков языка Pascal является последовательная и достаточно полная реализация концепции структурного программирования. Кроме того, в языке реализована концепция определения новых типов данных на основе уже имеющихся. Pascal реализован на компьютерах различных типов, но наиболее распространен и развит для персональных компьютеров.. В настоящее время широко используются такие версии этого языка для ПЭВМ, как BorlandPascal и TurboPascal. Объектно-ориентированное программирование Принципиально иное направление в программировании связано с методологиями непроцедурного программирования. К ним можно отнести объектно- ориентированное программирование. Программы стали строиться не из процедур и функций, а из сравнительно простых кирпичиков-объектов, в которых были упрятаны данные и подпрограммы их обработки. Программирование рассматриваемого стиля заключается в выборе имеющихся или создании новых объектов и организации взаимодействия между ними. Определения Объект – это то, чем вы управляете с помощью программы ( например в Excel - ячейка, диапазон, диаграмма и т.п. В БД- это таблицы, формы, запросы). Каждый объект имеет свой тип ( класс ). Класс представляет собой тип данных , имеющий в составе данный объект. Свойства - Параметры объекта (конечно, не все, а только необходимые в программе). Методы - Действия, которые можно выполнять над объектом данного типа, или которые сам объект может выполнять. Это процедуры и функции. Инкапсуляция . Инкапсуляция — это объединение данных и действий над ними. Это принцип, согласно которому любой класс должен рассматриваться как чёрный ящик — пользователь класса должен видеть и использовать только интерфейс (от английского interface — внешнее лицо, т. е. список декларируемых свойств и методов) класса и не вникать в его внутреннюю реализацию. Это свойство объектов, заключающееся в сокрытии информации о внутренней "жизни" объекта. Т.е. внешний пользователь объекта может использовать его возможности посредством определенного интерфейса, а непосредственно работа с данными и детали ее реализации от него скрыты. Так, в примере с жестким диском, нам для работы с ним достаточно знать, что он может хранить информацию, и позволяет записывать и считывать ее. При этом вовсе необязательно разбираться в том, каким образом хранится информация и как протекают процессы ее записи и чтения. Свойство инкапсуляции облегчает написание программ, и, что самое главное, их модификацию. Наследование . Наследованием называется возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка и добавляя, при необходимости, новые свойства и методы. Наследование призвано отобразить такое свойство реального мира, как иерархичность. Полиморфизм Полиморфизмом называют явление, при котором для различных родственных объектов можно задать одинаковое название функции, но действия функция будет выполнять разные, в зависимости от конкретного объекта. Например, надо нарисовать прямоугольник или круг, в зависимости от типов: «прямоугольник», «круг». Но в обоих случаях функция будет иметь имя «Нарисовать». Т.е. действия с одинаковым именем вызывает различное поведение, в зависимости от типа данных. К наиболее современным объектно-ориентированным языкам программирования относятся C++ и Java. Языки C++ и Java. За основу языка С++ был взят язык С, дополненный элементами языков BCPL,Simula-67 и Algol-68. Новая интегрируемая в Internet версия языка, получила название Java. С января 1995 года Java получает распространение в Internet. Принципиальной разницей между Java и C++ является то, что первый из них является интерпретируемым, а второй — компилируемым. Синтаксис языков практически полностью совпадает. С точки зрения возможностей собственно объектно-ориентированных средств язык Java обладает рядом преимуществ перед языком C++. Так, язык Java демонстрирует более гибкую и мощную систему, кроме того, он проще и надежнее. В силу своей конструктивности идеи объектно-ориентированного программирования используются во многих универсальных процедурных языках, в которые входит специальная библиотека объектно-ориентированного программирования. Это системы программирования TurboVision, VisualBasic, Delphi и др. Visual Basic подходит для написания небольших и нетребовательных к ресурсам программ. А так как он является языком создания приложений Microsoft Office, то он получил самое широкое распространение. Delphi является очередным шагом в эволюции компиляторов Паскаля. Среда Delphi стала, по сути, лучшим средством программирования для операционной системы Windows. У языка Delphi есть еще одно очень важное преимущество перед остальными коммерчески успешными языками — он великолепно подходит для обучения программированию. Поэтому его рекомендуют в качестве первого языка для всех учеников и студентов, собирающихся стать профессиональными программистами. Delphi, Java применяются для создания программ , используемым в Интернете. Визуальное программирование В последнее время многие программы, в особенности объектно-ориентированные, реализуются как системы визуального программирования. Отличительной особенностью таких систем является мощная среда разработки программ из готовых «строительных блоков», позволяющая создать интерфейсную часть программного продукта в диалоговом режиме, практически без кодирования программных операций. К числу объектно-ориентированных систем визуального программирования относятся; Visual Basic, Delphi, Visual C++. Раньше, создание пользовательского интерфейса требовало уйму времени и сил, особенно когда программа должна была работать под управлением операционной системы Windows и иметь графический пользовательский интерфейс. Визуальное программирование сделало эту задачу доступной и начинающему программисту. Декларативное программирование Такие языки еще называют языками символьной обработки. Языки символьной обработки сыграли важную роль в программировании. Программист указывает исходные информационные структуры, взаимосвязи между ними и то, какими свойствами должен обладать результат. При этом процедуру его получения («алгоритм») программист не строит (по крайней мере, в идеале). В этих языках отсутствует понятие «оператор» («команда»). Декларативные языки можно подразделить на два семейства – функциональные (Лисп) и логические (типичный представитель – Пролог). Функциональные языки. ЛИСП, Haskell Логические языки. Пролог - Языки декларативного программирования могут претендовать на роль языков сверхвысокого уровня. В последнее время в связи развитием Интернет-технологий получили распространение так называемые скриптовые языки. Скрипт — это набор команд на максимально понятном языке для человека, который может не знать стандартных языков программирования, но нуждается в автоматизации процесса работы с определенной программой. Программы такого типа существовали и раньше, они назывались командными файлами (файлами с расширением .bat). Характерными особенностями данных языков являются, во-первых, их интерпретируемость (компиляция либо невозможна, либо нежелательна), во-вторых, простота синтаксиса. Было создано достаточно большое количество таких языков, наиболее часто используемые: PHP, TCL, JavaScript, Perl, Python. Язык HTML (язык разметки Wed страниц в итернете) предоставляет авторам Web- страниц большие возможности для отображения текстовой и графической информации. Но создаваемые с помощью языка HTML страницы остаются статическими - пользователи не могут изменить информацию, расположенную на странице, а так же использовать большинство интерфейсных элементов. Для того чтобы сделать страницу по-настоящему интерактивной, нам нужен еще один язык, выполняемый в контексте браузера, - скриптовый язык. Скриптовый язык используется для создания интерактивных страниц. Этот язык программирования предоставляет средства для управления браузером. Обычно он не содержит всех возможностей настоящих языков программирования, таких, например, как работа с файлами или управление графикой. Созданные с помощью скриптовых языков программы не могут выполняться самостоятельно - они работают только в контексте браузера, поддерживающего выполнения скриптовых программ. К таким браузерам относятся Microsoft Internet Explorer и Netscape Navigator. Создаваемые на скриптовых языках программы, называемые сценариями или скриптами, включаются в состав Web-страниц и распознаются и обрабатываются браузером отдельно от остального HTML - кода. Отметим общую тенденцию в развитии языков программирования. Языки развиваются в сторону все большей и большей абстракции. И это сопровождается падением эффективности. Вопрос: а стоит ли этого абстракция? Ответ: стоит. Стоит, так как повышение уровня абстракции влечет за собой повышение уровня надежности программирования. С низкой эффективностью можно бороться путем создания более быстрых компьютеров. Если требования к памяти слишком высоки, можно увеличить ее объем. Это, конечно, требует времени и средств, но это решаемо. А вот с ошибками в программах можно бороться только одним способом: их надо исправлять. А еще лучше — не совершать. А еще лучше максимально затруднить их совершение. И именно на это направлены все исследования в области языков программирования. А с потерей эффективности придется смириться. Но это пока не относится к системному программированию, где эффективность программы важна. При обучении программированию в настоящее время чаще всего используют универсальные процедурные языки, в которые входят специальные библиотеки объектно-ориентированного и визуального программирования. Это системы программирования TurboVision, VisualBasic, Delphi и др. Поэтому важно рассмотреть правила разработки программ с использованием процедурных языков. Требования к программе 1. Правильность. Программа должна соответствовать алгоритму, а значит – приводить к правильному результату. 2. Надежность – безотказная работа при различных исходных данных, для того диапазона, для которого составлена программа. 3. Эффективность. Под эффективностью понимают время выполнения программы и требуемый объем оперативной памяти. Чем эти величины меньше, тем эффективнее программа. 4. Удобство пользования. Удобство ввода исходных данных и чтения результатов. Читаемость программы. Первые два пункта должны безусловно выполняться. А 3-й и 4-й пункты иногда приходят в противоречие. Что из них должно приоритетным? На начальном этапе программирования старались получить наиболее эффективную программу, не заботясь об удобстве пользования. Этому способствовали очень слабые ресурсы вычислительной техники и отсутствие опыта. Это приводило к тому, что программой мог пользоваться только ее автор, да и тот через некоторое время с трудом мог это делать. Использовать и модифицировать чужую программу иногда было сложнее, чем составить новую. Практически все профессиональные программисты в настоящее время согласились с тем, что к созданию программы надо относиться так же, как к созданию любого товара. Поэтому в настоящее время эффективность уступает удобству пользования. (Конечно все это делается в разумных пределах. Кроме того, бывают исключения, когда главной становится эффективность). Возникли специальные методы и правила составления программ. К этим методам относится: 1.Структурное программирование. 2.Модульне программирование. 3.Программирование сверху-вниз. Структурное программирование Это понятие относится к процедурному программированию. В широком смысле – структурное программирование – создание удобных в пользовании программ. В узком смысле – программирование в соответствии со структурной теоремой. Ее доказали итальянцы Бом и Якопини. Теорема: Всякая программа может быть составлена из 3-х основных блоков: функционального блока, развилки и обобщенного цикла. Основное свойство этих конструкций – 1 вход и 1 выход. Кроме того, две последние конструкции можно представить как обобщенный функциональный блок. Эти блоки в программе не будут пересекаться. Поэтому программа будет читаться свеху-вниз, без переходов. Основой структурного программирования является отказ от оператора GO TO – оператора безусловного перехода. Программа становится легко читаемой. Если нет переходов, то отпадает необходимость рисовать блок-схемы. Алгоритмы пишут на псевдокоде. Блок-схемы рисуют лишь укрупнено, изображая лишь отдельные модули, чтобы показать связи. Жесткое требование структурного программирования – использовать только эти 3 конструкции. Более мягкое – разрешается использовать оператор выбора и другие операторы, не нарушающие свойство блоков: «1 вход – 1 выход». Оператор GO TO разрешается использовать в исключительных случаях, и только вперед. Обычно исключительными случаями бывают досрочный выход из цикла и досрочное окончание выполнения программы. В современных языках программирования есть для этого специальные операторы. Дополнительные требования структурного программирования 1.Ввод исходных данных. Ввод должен быть оформлен так, чтобы было понятно, что нужно вводить. Если данные должны находиться в какой-то области, отобразить это на экране. Например: Введите 0 2. Вывод результатов должен быть понятным и наглядным. 3. Программа должна быть, по возможности, универсальной. В том смысле, что исходные данные должны вводиться через операторы ввода, а не быть в формулах и операторах виде чисел. 4. В программе должны быть комментарии. Должен быть заголовок, показывающий назначение программы, метод решения, обозначение входных и выходных данных, фамилия программиста и дата последнего изменения программы. 5. Имена переменных должны быть такими же, как в алгоритме, а те имена, которых нет в алгоритме, должны быть информативными. Не ленитесь применять длинные имена. 6. Использование отступов при наборе программы. Лучше сразу набирать с отступами, чем делать это на конечном этапе оформления программы, т.к. это ускоряет процесс отладки. Модульное программирование Модулем, в данном случае, будем называть отдельные, особо оформленные части программы (процедуры и функции). Модули имеют 1 точку входа и 1 точку выхода. Исторически эта технология возникла из-за того, что в программах часто встречаются одни и те же повторяющиеся действия. Для того, чтобы не писать одно и тоже несколько раз, такой блок стали оформлять отдельно, а затем просто вызывать в нужных местах. Дальнейшее развитие этой технологии привело к тому, что модульная программа – это такая программа, в которой изменения в любом модуле не вызывает изменений в остальных частях программы. Значит, главная особенность – это независимость модулей. Каждый модуль, в свою очередь, может быть разделен на несколько модулей. В результате программа будет иметь иерархическую структуру. Преимущества: 1.Отдельные модули можно изменять, заменять их на другие - это не вызовет изменения в других частях программы. Это делает программу более гибкой и уменьшает количество ошибок. Такую программу легче составлять и отлаживать. 2.Отдельные модули могут программировать разные люди, причем им необязательно знать, как работает вся программа. Позволяет использовать коллективный труд, и необязательно все программисты должны иметь высокую квалификацию. Это повышает производительность и уменьшает стоимость программы. 3. Позволяет более рационально использовать память. Программирование сверху-вниз Его называют иногда нисходящим программированием. Существует такое определение: это проектирование программ путем последовательного разбиения большой задачи на меньшие подзадачи. Но это общее определение. Это понятие относится к технологии разработки программы. Эта технология возникла при разработке больших программ, над которыми работали несколько программистов. Каждый разрабатывал и отлаживал свои модули. Затем все это надо было соединить и провести отладку и тестирование всей системы. Обычно этот процесс занимает длительное время. Каждый модуль работает правильно, а система неработоспособна и ошибку найти трудно. Испытание систем в некоторых разработках длилось от 2 до 3 лет, что иногда вызывало отказ от проекта. Так возникла следующая технология, которая теперь используются даже для небольших задач, состоящих из отдельных модулей. Сначала проектируется главная программа. Обычно она содержит ввод исходных данных, вызов подпрограмм первого уровня иерархии и вывод результатов. Отладка главной программы начинается до того, как разработаны подпрограммы, которые на этом этапе заменяются фиктивными подпрограммами ( называются заглушками), они содержат только вход и выход. На этом этапе производятся только связи между главной программой и подпрограммами первого уровня (обычно через формальные и фактические параметры). Далее разрабатываются сами подпрограммы первого уровня, а подпрограммы более низкого уровня заменяются заглушками и т.д. На каждом этапе основное внимание уделяется связям. К отладке приступают до того, как завершена вся программа. Основная идея – на каждом уровне не обращают внимания на описания модулей нижних уровней. При отладке на каждом уровне разработанные модули добавляют в программу по одному. Основное достоинство – упрощает отладку и тестирование. Исключает отладку на уровне системы. Иногда сочетают нисходящее (сверху - вниз) и восходящее (снизу-вверх) программирование. Бывает так, что уже имеются ранее разработанные и отлаженные модули или стандартные модули. В этом случае поступают в соответствии с порядком нисходящего программирования, т.е. включают модули по одному на нужном уровне. Программирование на языке Visial Basic Язык программирования Visial Basic сокращенно (VB), встроенный в EXCEL, обладает всеми возможностями языка VB и имеет дополнительные возможности EXCEL. Поэтому он называется Excel Visial Basic (EVB). Этот язык относится к процедурным языкам с возможностями объектного и визуального программирования. (Об объектном и визуальном программировании вам будет рассказано позже). Тексты программ хранятся в EXCEL на специальных листах рабочей книги. Эти листы называются модулями. Модуль – это совокупность описаний и процедур, хранящийся как единое целое. Причем совсем не обязательно, чтобы все модули, входящие в состав программы, находились в одной рабочей книге. Для создания модуля надо выполнить: Сервис – Макрос – Редактор Visial Basic, Далее - Insert – Module или Вставка – Модуль. После этого можно набирать текс программы. Программа записывается в виде процедур. В VB существуют 2 вида процедур: процедура – подпрограмма (Sub) и процедура – функция ( Function). Начнем с процедуры – подрограммы, она имеет вид: Sub имя () Текст программы End Sub Переменные Переменная – именованная область памяти, отведенная для временного хранения данных, которые могут изменяться в ходе выполнения программы. Каждая переменная должна иметь имя. Переменная может иметь или не иметь указанный тип данных. Значение переменной – это содержимое тех ячеек памяти, в которых хранится переменная. Различные версии языка VB запрещают использование имен, совпадающих и их ключевыми словами и именами встроенных функций. Константа - именованная область памяти, которая сохраняет постоянное значение ходе выполнения программы. Типы данных Byte - имеет размер 1 байт и может принимать значения от 0 до 255 (целые числа). Boolean имеет размер 2 байта и может принимать значения да или нет. Применяется в логических операциях Integer – целое, имеет размер 2 байта и может принимать значения от -32 768 до + 32 767. Long Integer – длинное целое, имеет размер 4 байта и может принимать значения от – 2.1*109 до + 2.1*109 . Для вещественных чисел используются типы: Single – 4 байта Double – 8 байт. Существуют специальные типы для использования букв, строк, дат и др. Имеется также возможность создать определяемый пользователем тип данных. По умолчанию, если вы не указали тип переменной, будет использоваться тип Variant. Переменные этого типа могут хранить все, что в них поместят. Имеет размер 16 байт. Создание переменной называется объявлением или описанием переменной. Для этого используется инструкция Dim. Оператор Dim имеет следующий синтаксис: Dim имя переменной As тип переменной. Например: Dim x As Integer, y As Single Если вы не сделаете описание переменной, то она примет тип Variant. Чтобы присвоить значение переменной, необходимо выполнить операцию присваивания или оператор присваивания имяПеременной = выражение где слева от знака равенства находится имя переменной, а справа – выражение. Выражение может содержать числа, переменные, функции, которые могут быть объединены знаками арифметических операций. Если несколько операторов находится на одной строке, между ними ставится знак : (двоеточие). Пример a=5.5 b=a^2 c=Tan(Sin(b)+3-a)*5 Основное правило программирования: Все переменные в правой части выражения должны быть заранее определены, т.е. им должны быть присвоены значения. Приоритет выполнения операций Если в выражении использовано несколько операций, то результат может зависеть от последовательности, в которой эти операции выполняются. VB выполняет операции в соответствии с их приоритетом: 1. Вызов функций и скобки 2. ^ - возведение в степень 3. *, / - умножение и деление 4. + сложение и вычитание. Для изменения порядка выполнения действий используются скобки. В VB используются только круглые скобки. Скобки могут быть вложенными в другие скобки. Имена (переменных и не только) должны начинаться с буквы, не могут содержать пробелов и знаков, кроме _ ( нижнее подчеркивание). Большие и маленькие буквы воспринимаются одинаково. Ввод данных 1.С помощью оператора присваивания x=3 : b=5.6 2. Ввод в диалоговом окне. Используется функция InputBox. x=(InputBox(“Введите x”, “Ввод x”). При запуске программы появится диалоговое окно, в которое надо ввести число – значение переменной x. 3. Ввод из ячеек таблицы. Пример. x=Worksheets(“Лист1”).Range(“A2”).Value. в этом случае с листа 1 из ячейки A2 введется число, которое присвоится как значение переменной x. Value – функция, преобразующая данные в численные. Возможен другой способ: y= Worksheets(“Лист1”).Cells(i,j).Value где i – номер строки, j – номер столбца. Они должны быть определены Вывод результатов 1.С использованием диалогового окна MsgBox “z=” & z Можно вывести несколько переменных: MsgBox “z=”& z & “ y=” & y Вывод в заданном формате MsgBox “z=” & Format(z, “##.####”) Количество значков # перед точкой показывает количество знаков целой части числа, а после точки – количество десятичных знаков. 2. Вывод в ячейки таблицы Worksheets(“Лист1”).Range(“B5”)= n Или Worksheets(“Лист1”).Cells(i,j) = m Некоторые встроенные функции VB Sin(x), Cos(x), tan(x), -синус, косинус, тангенс соответственно Abs(x) означает |x| Exp(x) - e x asin(x), acos(x), atan(x) – арксинус, арккосинус, арктангенс соответственно log(x) означает натуральный логарифм ln x log(x)/log(10) - десятичный логарифм lg x sqr(x) - квадратный корень Аргумент функции обязательно должен быть в скобках. Аргументом может быть любое выражение. Линейные вычислительные процессы Пример. Вычислить выражение: Запишем в виде программы. Вначале надо задать исходные данные. Исходными данными являются a и y. Sub линейные() a = InputBox("Введите а", "Ввод a") y = 2 / 3 Z = Exp(Sin(y) ^ 3) + a ^ (1 / 3) * (Log(Atn(a * y)) + 3) / (3 * Sin(a) + 1 / Tan(a)) MsgBox "z=" & Z End Sub Выражение для вычисления z в программе было бы гораздо проще, если для дроби числитель и знаменатель вычислить как отдельные переменные: Sub линейные() a = InputBox("Введите а", "Ввод a") y = 2 / 3 chis=Log(Atn(a * y)) + 3 znam=3 * Sin(a) + 1 / Tan(a) Z = Exp(Sin(y) ^ 3) + a ^ (1 / 3) * chis/znam MsgBox "z=" & Z End Sub Таким образом поступают при вычислении сложных выражений, разделяя их на отдельные переменные. Обратите внимание на следующее: Корень кубичный из a записан как a ^ (1 / 3). Степень должна заключаться в скобки, если она является выражением. При записи сложных дробных выражений надо руководствоваться следующими правилами когда заключать в скобки числитель и знаменатель: Числитель надо заключать в скобки, если в числителе присутствуют знаки сложения или вычитания. Знаменатель надо заключать в скобки, если в знаменателе присутствуют знаки сложения или вычитания или умножения или деления. После того как программу набрали, ее надо запустить на выполнение. Для этого надо в меню выбрать RUN или нажать клавишу F5 или нажать значок в меню треугольник Разветвляющиеся вычислительные процессы Условный оператор, линейная форма, общий вид: If условие then оператор_1 else оператор_2 Условия – это логические выражения, т.е выражения, объединенные знаками: >, <, =, >=, <=, < > (означает неравно), and (и), or (или). Например: (x+1)>=(y+3) 0 Пример Y= 1+(z-a) 2 , если a+z > b Y=b 2 – (z+a), если a+z <=b оператор будет иметь вид: if a+z >b then y=1+(z-a) 2 else y= b 2 – (z+a) Линейную форму используют для простых выражений и если имеются два условия. Блочная форма Блочную форму используют при более сложных выражениях и если условий больше двух. Общий вид: If условие_1 then Блок операторов_1 Elseif условие_2 then Блок операторов_2 Elseif условие_3 then Блок операторов_3 … Else Блок остальных операторов End if Пример Z = x+1, если x<0 Z=x-1, если 0 Z=0 в других случаях. Оператор будет иметь вид: If x<0 then Z=x+1 Elseif x>o and x<1 Then Z=x-1 Else Z=0 End if Операторы циклов Оператор For … next Общий вид: For счетчик = начало To конец [step шаг] [операторы] [Exit For] [операторы] Next [счетчик] Операторы и переменные в квадратных скобках – это необязательные параметры, которые могут быть опущены. Число выполнений этого оператора определяется параметрами начало и конец. Переменная счетчик при выполнении увеличивается на величину, заданную параметром шаг. Если шаг равен единице, то он может быть опущен. Необязательный параметр Exit For служит для экстренного прекращения цикла. Нельзя изменять значение счетчика внутри цикла. Пример. Вычислить функцию y = (x 2 + 1)*e x+1 при x от -4 до 6 с шагом 0,5. Результаты вывести на лист в первый и второй столбцы. Sub пример() i=1 For x=-4 to 6 step 0.5 i=i+1 y=(x^2+1)*exp(x+1) Worksheets(“Лист1”)/Cells(i,1) = x Worksheets(“Лист1”)/Cells(i,2) =y Next x End sub Рекуррентные последовательности Последовательность называется рекуррентной, если каждый следующий элемент ее вычисляется по предыдущим элементам. Пример. Последовательность чисел задана формулой xn+2 = xn+12 – 0,6xn +0,1, где n – номер элемента. Каждый элемент вычисляется по значениям двух предыдущих элементов. Такая последовательность называется последовательностью второго порядка. Необходимо задать первые 2 значения. x0 =1; x1 = 2. Вычислить x20 . Sub recur() x0=1: x1=2 For n=2 to 20 x2=x1^2-0.6*x0+0.1 x0=x1: x1=x2 next n MsgBox “x20=” & x2 End sub Циклы с условиями 1. Do while условие Блок операторов [ exit do] Loop 2. Do Блок операторов [ exit do] Loop while условие 3. Do until условие Блок операторов [ exit do] Loop 4. Do Блок операторов [ exit do] Loop until условие Циклы с параметром while выполняются до тех пор, пока выполняется заданное условие. Циклы с параметром until выполняются до тех пор, пока не выполняется заданное условие. В циклах с условием надо предусматривать досрочный выход, чтобы избежать зацикливания: If условие then Msgbox “текст” : exit do . Пример. Задана рекуррентная последовательность x n+2 = x 2 n+1 – 0,6x n +0,1; x0=1; x1 = 2. Найти такое значение x и его номер, при котором выполняется условие |x n -x n-1 | Do n=n+1: if n>100 then Msgbox “n>100”: exit do ‘досрочный выход x2=x1^2-0.6*x0+0.1 c=abs(x1-x2) x0=x1: x1=x2 Loop while c>del Msgbox”x=” & x2 & “ n=” & n End sub Массивы Одномерные массивы Ввод массивов с листа. Сначала надо на листе набрать массивы. Sub имя() Dim a(1 to 10), B(1 to 10) ‘описание массивов a и b, каждый из 10 элементов n=10 ‘количество элементов массивов For i=1 to n a(i)=worksheets(“Лист1”).Cells(номер строки, номер столбца).Value b(i)=worksheets(“Лист1”).Cells(номер строки, номер столбца).Value next i Пример. Заданы 2 массива a и b, каждый из 12 элементов. Массивы находятся на Листе1, массив a – в первой строке, массив b – во второй строке. Найти суммы: положительных элементов массива a и сумму отрицательных элементов массива b. Sub mas1() Dim a(1 to 12), b(1 to 12) n=12 ‘ввод массивов For i=1 to n a(i)=worksheets(“Лист1”).Cells(1,i).Value b(i)=worksheets(“Лист1”).Cells(2,i).Value next i s1=0: s2=0 ‘ начальные значения для сумм ‘нахождение сумм For i=1 to n If a(i)>0 then s1=s1+a(i) If b(i)<0 then s2=s2+b(i) Next i Msgbox “s1=” & s1 & “ s2=” &s2 End sub Примеры. 1. Найти произведение элементов массива a. Далее считаем, что описание и ввод сделаны, и дается только часть программы. P=1 ‘начальное значение для произведения For i=1 to n p=p*a(i) next i 2. Найти минимальный и максимальный элементы массива Min=a(1): max=a(1) ‘начальные значения For i=1 to n If a(i)<=min then min=a(i) If a(i)>=max then max=a(i) Next i 3. Найти номер максимального элемента Max=a(1) For i=1 to n If a(i)>=max then max=a(i): nmax=i Next i 4. Найти количество отрицательных элементов K=0 For i=1 to n If a(i)<0 then k=k+1 Next i 5. Выделить цветом элементы массива, отвечающие некоторому условию For i=1 to n If условие then Cells(номерстроки, номер столбца).interior.colorindex=номер цвета. Вывод массива на лист For i=1 to n worksheets(“Лист1”).Cells(номер строки, номер столбца)= a(i) next i Двумерные массивы – матрицы Первый индекс означает номер строки, второй – номер столбца. Описание: Dim b(1 to 5, 1 to 7) Это описание массива b, имеющего 5 строк и 7 столбцов, нумерацию строк от 1 до 5, столбцов – от 1 до 7. Ввод матрицы с листа ( если матрица находится в начале листа1): m=5: n=7 For i = 1 to m ‘начало цикла по строкам For j=1 to n ‘начало цикла по столбцам b(i,j)=Worksheets(“Лист1”).Cells(i,j).Value ‘ ввод элемента массива next j ‘конец цикла по столбцам next i ‘конец цикла по строкам где Cells(i,j) – адрес ячейки, из которой вводится очередной элемент матрицы. i – номер строки, j – номер столбца. Если матрица находится в любом месте листа, то Cells будет иметь вид: Cells(i+ количество строк сверху матрицы, j+количество столбцов слева от матрицы). Ввод производится в двойном цикле. Циклы должны быть вложенными, т.е. внутренний цикл по j должен закрываться раньше цикла по i – вложенные циклы не могут пересекаться. Пример1. Дана матрица на листе1, из 4 строк и 5 столбцов. Найти сумму отрицательных элементов, максимальный и минимальный элементы и их номера строки и столбца. Sub matr1() Dim a(1 to 4, 1 to 5) ‘ описание m=4: n=5 ‘ ввод матрицы For i = 1 to m For j=1 to n a(i,j)=Worksheets(“Лист1”).Cells(i,j).Value next j next i s=0: max=a(1,1): min=a(1,1) ‘ начальные значения For i = 1 to m For j=1 to n If a(i,j)<0 then s=s+a(i,j) ‘ сумма отрицательных элементов If a(i,j)>=max then max=a(i,j): m1=i: n1=j If a(i,j)<=min then min=a(i,j): m2=i: n2=j Next j Next i Msgbox “сумма=” & s & “ max=” & max & “ min=” & min Msgbox “ m1=” & m1 & “ n1=” & n1 & “ m2=” & m2 & “ n2=” & n2 End sub m1, n1 – номера строки и столбца, соответственно, для максимального элемента. m2,n2 - номера строки и столбца, соответственно, для минимального элемента элемента. Пример2. Дана та же матрица. Для каждой строки найти сумму всех элементов, а также минимальный и максимальный элемент и номер столбца, в котором он находится. Результаты вывести на лист в соответствующие строки, пропустив 1 столбец после матрицы. Sub matr2() Dim a(1 to 4, 1 to 5) ‘ описание m=4: n=5 ‘ ввод матрицы For i = 1 to m For j=1 to n a(i,j)=Worksheets(“Лист1”).Cells(i,j).Value next j next i For i = 1 to m s=0: max=a(i,1): min=a(i,1) ‘ начальные значения For j=1 to n s=s+a(i,j) ‘ сумма If a(i,j)>=max then max=a(i,j): nmax=j If a(i,j)<=min then min=a(i,j): nmin=j Next j Worksheets(“Лист1”).Cells(i,n+2)=s Worksheets(“Лист1”).Cells(i,n+3)=max Worksheets(“Лист1”).Cells(i,n+4)=nmax Worksheets(“Лист1”).Cells(i,n+5)=min Worksheets(“Лист1”).Cells(i,n+6)=nmin Next i End sub Пример3. Дана та же матрица. Для каждого столбца найти сумму всех элементов, а также минимальный и максимальный элемент и номер строки, в котором он находится. Результаты вывести на лист в соответствующие столбцы, пропустив 1 строку после матрицы. Sub matr3() Dim a(1 to 4, 1 to 5) ‘ описание m=4: n=5 ‘ ввод матрицы For i = 1 to m For j=1 to n a(i,j)=Worksheets(“Лист1”).Cells(i,j).Value next j next i For j = 1 to n s=0: max=a(1,j): min=a(1,j) ‘ начальные значения For i=1 to m s=s+a(i,j) ‘ сумма If a(i,j)>=max then max=a(i,j): imax=i If a(i,j)<=min then min=a(i,j): imin=i Next i Worksheets(“Лист1”).Cells(m+2, j)=s Worksheets(“Лист1”).Cells(m+3, j)=max Worksheets(“Лист1”).Cells(m+4,j)=imax Worksheets(“Лист1”).Cells(m+5,j)=min Worksheets(“Лист1”).Cells(m+6,j)=imin Next j End sub Пример4. Дана матрица в диапазоне D3:H6. Найти суммы элементов второй строки и пятого столбца. Эта матрица имеет размерность 4х5 – 4 строки, 5 столбцов. На листе сверху от матрицы находятся 2 строки и слева от матрицы – 3 столбца. Если в программе используется обращение к листу несколько раз, можно использовать оператор with Worksheets(“имя листа”) ‘обычно в начале программы end with ‘обычно в конце программы перед end sub Sub matr4() with Worksheets(“Лист1”) Dim a(1 to 4, 1 to 5) ‘ описание m=4: n=5 ‘ ввод матрицы For i = 1 to m For j=1 to n a(i,j)=Cells(i+2 ,j+3).Value next j next i ‘сумма элементов второй строки s1=0 For j=1 ton s1=s1+a(2,j) next j Range(“I4”)=s1 ‘сумма элементов пятого столбца s2=0 for i=1 to m s2=s2+a(i,5) next i Range(“H7”)=s2 End with End sub Пример5. Дана квадратная матрица в диапазоне E4:I8. Найти максимальный элемент главной диагонали и номер его строки и столбца. Эта матрица имеет размерность 5х5 – 5 строк, 5 столбцов. На главной диагонали номера строк равны номерам столбцов. На листе сверху от матрицы находятся 3 строки и слева от матрицы – 4 столбца. Sub matr5() Dim a(1 to 5, 1 to 5) ‘ описание n=5 ‘ ввод матрицы For i = 1 to n For j=1 to n a(i,j)=Worksheets(“Лист1”).Cells(i+3,j+4).Value next j next i max=a(1,1) For i=1 to n If a(i,i)>=max then max=a(i,i): imax=i Next i Msgbox “max=” & max & “ номер строки и столбца = “ & imax End sub Функции и процедуры Процедуры и функции – последовательность операторов, выполняющих некоторое законченное действие и оформленная специальным образом. Часто используются тогда, когда необходимо несколько раз выполнять одни и те же действия в разных частях программы. Функции Общий вид, описание: Function имя_функции(список формальных параметров) Операторы имя_функции=выражение end function В программе обращение к функции происходит в операторе, в правой части выражения: Имя переменной = имя_функции(список фактических параметров). Пример Function F(a,b) F=sin(a)^2+cos(b^2+a^3) End function Sub пример() x=4.5: y=5 операторы z=F(x,y) операторы end sub Формальные параметры - это имена, используются при описании функции имена могут быть любыми. Фактические параметры используются при обращении к функции, это могут быть имена переменных, числа, выражения. Соответствие между фактическими и формальными параметрами задается порядком их следования. Процедуры ( или подпрограммы) Общий вид, описание Sub имя_процедуры(список формальных параметров) Операторы End sub Обращение в программе имеет вид: Call имя_процедуры(список фактических параметров) Так же соответствие между фактическими и формальными параметрами задается порядком их следования. |