103
Министерство образования и науки Российской Федерации Федеральное агентство по образованию Московский государственный университет печати В.В.Петрова, А.Г.Шелудченко Информатика Конспект лекций часть II Для студентов, обучающихся по направлению: 080502.62 «Менеджмент» и по специальностям: 080109.65 «Бухгалтерский учет, анализ и аудит» 080502.65 «Экономика и управление на предприятии полиграфической промышленности» Москва 2008

Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

Embed Size (px)

Citation preview

Page 1: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

Министерство образования и науки Российской Федерации Федеральное агентство по образованию

Московский государственный университет печати

В.В.Петрова, А.Г.Шелудченко

Информатика

Конспект лекций часть II

Для студентов, обучающихся по направлению:

080502.62 «Менеджмент» и по специальностям:

080109.65 «Бухгалтерский учет, анализ и аудит» 080502.65 «Экономика и управление на предприятии

полиграфической промышленности»

Москва 2008

Page 2: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

2

Рецензенты :

Карташов И.Н., канд. физ.-мат. наук (физический факультет МГУ им. М.В.Ломоносова)

Голинков Ю.П., докт. техн. наук, профессор (кафедра прикладной математики и моделирования систем МГУП)

Петрова В.В., Шелудченко А.Г. Информатика: Конспект лекций (часть 2) / В.В.Петрова, А.Г.Шелудченко: Моск. гос. ун-т печати. М: МГУП, 2008. – 104 с.

Подготовлено на кафедре информатики МГУП Печатается в авторской редакции © Петрова В.В., Шелудченко А.Г., 2008

© Московский государственный университет печати, 2008

Page 3: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

3

Тема 6. Алгоритмизация и программирование 6.1. Алгоритмизация вычислительных процессов

6.1.1. Этапы решения задач на компьютере

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

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

и что требуется найти. Так, если задача конкретная, то под постановкой задачи понимают ответ на два вопросы: какие исходные данные известны и что требуется определить. Если задача обобщенная, то при постановке задачи понадобится еще ответ на третий вопрос: какие данные допусти-мы. Таким образом, постановка задачи включает в себя следующие мо-менты: сбор информации о задаче, формулировку условия задачи, опреде-ление конечных целей решения задачи, определение формы выдачи ре-зультатов, описание данных (их типов, диапазонов величин, структуры).

На втором этапе дается математическое описание задачи, т.е. строит-ся система математических соотношений – формул, уравнений, нера-венств и т.п., отражающих существенные свойства объекта или явления. Такой набор формул называется математической моделью. Необходимо отметить, что далеко не всегда удается найти формулы, явно выражающие искомые величины через данные. В таких случаях используются матема-тические методы, позволяющие дать ответы той или иной степени точно-сти. Итак, создавая математическую модель для решения задачи, нужно выделить предположения, на которых будет основываться математиче-ская модель; определить, что считать исходными данными и результата-ми; записать математические соотношения, связывающие результаты с исходными данными.

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

Page 4: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

4

схем или какой-либо псевдокод. Разработка алгоритма включает в себя выбор метода проектирования алгоритма; выбор формы записи алгорит-ма; выбор тестов и метода тестирования; проектирование самого алгорит-ма.

Первые три этапы – это работа без компьютера. Четвертый этап – соб-ственно программирование на определенном языке в определенной сис-теме программирования. Программирование включает в себя следующие виды работ: выбор языка программирования; уточнение способов органи-зации данных; запись алгоритма на выбранном языке программирования.

На пятом этапе проводится испытание работы программы и исправле-ние обнаруженных при этом ошибок, т.е. отладка программы. Обнару-жить ошибки, связанные с нарушением правил записи программы на язы-ке программирования (синтаксические и семантические ошибки), помога-ет используемая система программирования. Пользователь получает со-общение об ошибке, исправляет ее и снова повторяет попытку исполнить программу. Проверка на компьютере правильности алгоритма произво-дится с помощью тестов. Тест – это конкретный вариант значений исход-ных данных, для которого известен ожидаемый результат. На тестах про-веряется правильность реализации программой запланированного сцена-рия. Таким образом, тестирование и отладка включают в себя синтаксиче-скую отладку; отладку семантики и логической структуры программы; тестовые расчеты и анализ результатов тестирования; совершенствование программы.

На шестом этапе проводятся расчеты по разработанной программе для получения искомых результатов. Производится анализ результатов решения задачи и в случае необходимости – уточнение математической модели (с последующей корректировкой алгоритма и программы).

6.1.2. Понятие алгоритма. Свойства алгоритма

Понятие алгоритма в информатике является фундаментальным, т.е. та-ким, которое не определяется через другие, еще более простые понятия. Термин «алгоритм» происходит от имени великого среднеазиатского ма-тематика Мухамеда аль-Хорезми, который еще в IX в. изложил правила арифметических действий над числами в позиционной десятичной систе-ме счисления. Эти правила и назвали алгоритмами. Первые алгоритмы появились вместе с математикой, а теория алгоритмов возникла значи-тельно позже.

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

Page 5: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

5

Алгоритм обладает следующими основными свойствами: дискретность – разбиение процесса обработки информации на бо-

лее простые этапы (шаги выполнения), выполнение которых человеком или компьютером не вызывает затруднений; определенность (или детерминированность) – однозначность вы-

полнения каждого отдельного шага преобразования информации; результативность – завершение работы алгоритма в целом за ко-

нечное число шагов; массовость – пригодность алгоритма для решения определенного

класса задач. В алгоритме отражаются логика и способ формирования результатов

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

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

тей; проверка правильности выбранного алгоритма.

6.1.3. Способы представления алгоритмов

Существуют несколько способов представления алгоритмов: словесный способ – описание алгоритма состоит из словесного пе-

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

конкретных действий в четкой последовательности в сочетании со сло-весными пояснениями. Этот способ более компактен, но не является стро-го формальным; табличный способ – представление алгоритма в виде таблицы и

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

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

Page 6: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

6

ние процесса обработки данных. Каждое направление называется ветвью. Перечень блоков, их наименование, функции, формы, размеры, взаимо-расположение определяются ГОСТ 19.701-90. Виды некоторых блоков приведены в табл. 6.1.1

Таблица 6.1.1 № п/п

Наименование блока

Графическое представление

блока

Функция блока

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

2 Решение Выбор направления выполнения ал-горитма в зависимости от некоторых переменных условий

3 Модификация Начало цикла

3 Ввод-вывод Преобразование данных в форму, пригодную для обработки (ввод) или отображения результатов обработки (вывод)

4 Начало – конец алгоритма

Начало, конец процесса обработки данных

5 Предопределен-ный процесс

Использование ранее созданных или отдельно описанных алгоритмов (мо-дулей)

6 Соединитель Указание связи между прерванными линиями потока обработки данных

7 Комментарий Связь между элементом схемы и по-яснением

Алгоритм начинается и заканчивается блоками «Начало» и «Конец». Для записи внутри блоков команд используется естественный язык с эле-ментами математической символики. Каждый графический символ схемы имеет один вход и один выход. Исключение составляет блок «Решение», который имеет один вход и два выхода, один из которых может быть ак-тивизирован после вычисления условия, определенного внутри блока.

6.1.4. Структуры алгоритмов

Базовые структуры алгоритмов – это ограниченный набор блоков и стандартных способов их соединения для выполнения типичных последо-

нет

да

Page 7: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

7

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

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

Рис. 6.1.1. Структура следование

Второй базовой структурой является ветвление (рис. 6.1.2, а). Эта структура обеспечивает в зависимости от результата проверки условия (истина или ложь) выбор одного из альтернативных путей работы алго-ритма. Каждый из путей ведет к общему выходу, так что работа алгоритма продолжается независимо от того, какой путь будет выбран. В частном случае может оказаться, что для одного из выбранных путей никаких дей-ствий предпринимать не нужно (рис. 6.1.2, б). Алгоритм, в состав которо-го входит базовая структура ветвление, называется разветвляющимся вычислительным процессом.

а б

Рис. 6.1.2. Структура ветвление

При составлении алгоритмов решения некоторых задач возникает не-обходимость в неоднократном повторении одних и тех же команд (дейст-вий). Базовая алгоритмическая структура, реализующая такое повторение, называется циклом, а повторяющиеся команды принято называть телом цикла. Различают две разновидности этой структуры: цикл с предусловием и цикл с постусловием. Основное отличие этих структур заключается в том, что в цикле с предусловием (рис. 6.1.3, а) тело цикла в зависимости от

Действие 1

Действие 2

Условие

Действие 1 Действие 2

нет да Условие

Действие

нет да

Page 8: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

8

условия может не выполняться совсем, тогда как в цикле с постусловием (рис. 6.1.3, б) тело цикла должно обязательно выполняться хотя бы один раз. По способу определения числа повторений различают циклы с неиз-вестным числом повторений и циклы с явно заданным числом повторе-ний. Для организации цикла с известным числом повторений (цикл с па-раметром) можно использовать блок «Модификация» (рис. 6.1.3, в). Па-раметр цикла включает имя переменной, начальное и конечное значение, шаг. Тело цикла выполняется столько раз, сколько разных значений при-мет параметр в заданных пределах.

а б в

Рис. 6.1.3. Структура цикл

Алгоритмы, имеющие в своем составе базовую структуру цикл, назы-ваются циклическими вычислительными процессами.

На рис. 6.1.4 представлена схема циклического алгоритма для вычис-ления факториала N! = 1·2·3·…·(N – 1)·N.

Рис. 6.1.4. Блок-схема алгоритма для вычисления факториала

Факториал

Ввод N

F = 1

F = F * i

Вывод F

Конец

i = 2, … , N

нет

да

Условие

Тело цикла

да

нет

даУсловие

Тело цикла Параметр

Тело цикла

Page 9: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

9

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

Рис. 6.1.5. Блок-схема алгоритма решения квадратного уравнения

6.2. Языки и системы программирования 6.2.1. Методы разработки программ

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

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

структур трех типов: следование, ветвление, цикл; между этими структурами производится передача управления

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

хода Goto и преимущественное использование других структурных опе-раторов.

да нет

да

Конец

нет

d = b2 – 4ac x1=(-b+d)/2/a x2=(-b-d)/2/a

d < 0

x = -c / b Вывод x Вывод x1, x2

Нет решения

нет

нет

Комплекс-ные корни

да

да

Квадратное уравнение

Ввод a,b,c

a 0

b 0

c 0

Множество решений

Page 10: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

10

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

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

определенный набор исходных данных, выполняет содержательную обра-ботку и возвращает один набор результатных данных, т.е. реализуется стандартный принцип IPO (Input–Process–Output) – вход–процесс-выход; функциональная завершенность – модуль выполняет перечень рег-

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

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

деляют правила использования модуля, а тело – способ реализации про-цесса обработки.

Формализму исчисления высказываний соответствует подход, назы-ваемый логическим программированием, который состоит в следующем. Имеется база знаний задачи: набор логических аксиом и правил вывода. Запросы к ней формулируются в виде целевых утверждений. База знаний вместе с целевыми утверждениями составляет логическую программу, а ее выполнение состоит в доказательстве целевого утверждения для дан-ной базы знаний.

Объектно-ориентированное программирование (ООП) представляет собой новый этап развития современных концепций построения языков программирования. Метод ООП основывается на: модели построения системы как совокупности объектов абстракт-

ного типа данных; модульной структуре программ; нисходящем проектировании, используемом при выделении объек-

тов. ООП – это метод программирования, при использовании которого

главными элементами являются объекты. Объекты – элементарная еди-ница, заключающая в себе как описывающие объект данные, так и средст-ва обработки этих данных.

Page 11: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

11

Объектно-ориентированные языки используют визуальный метод соз-дания графического интерфейса приложения и объектный метод построе-ния его программного кода.

6.2.2. Классификация языков программирования

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

Императивные языки основаны на фон Неймановской модели вычис-лений компьютера. Решая задачу, программист вначале создает модель в некоторой формальной системе, а затем переписывает решение на импе-ративный язык программирования в терминах компьютера. К таким язы-кам программирования относятся Паскаль, Бейсик, Си и т.д.

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

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

Машинно-ориентированные языки программирования включают в се-бя собственно машинные коды и язык Ассемблер. Ассемблер – это симво-лическое представление машинного языка. Этот язык очень эффективен, так как приближен к машинным кодам. Программирование на этом языке называется «программированием на низком уровне» и требует высокой квалификации программиста. Решение сложных прикладных задач на та-ких языках очень трудоемко. Чаще всего эти языки используются для на-писания операционных систем и программ-оболочек для операционных систем.

Page 12: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

12

Машинно-независимые языки – это средство описания алгоритмов ре-шения задач и информации, подлежащей обработке. Они получили назва-ние высокоуровневых языков программирования (ЯПВУ). Программы на таких языках, представляют собой последовательности операторов, структурированные согласно правилам языка (задачи, сегменты, блоки и т.д.). Появилась возможность не расписывать в деталях вычислительный процесс на уровне машинных команд, а сосредоточиться на основных особенностях алгоритма. Каждой команде в языке высокого уровня соот-ветствует несколько машинных команд. Текст программы, написанный на ЯПВУ, называется исходным модулем.

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

Типы машинно-независимых языков: проблемно-ориентированные языки – это языки, ориентированные

на решение определенных проблем, обеспечивающие программиста сред-ствами, позволяющими коротко и четко формулировать задачу и получать результаты в требуемой форме. К таким языкам относятся Лисп, Снобол (для работы со списочными структурами), Сленг, Simula (для моделиро-вания); универсальные языки – это языки, созданные для широкого круга

задач: коммерческих, научных, моделирования и т.д. К ним относятся PL-1, Паскаль и др.; диалоговые языки – программные средства, обеспечивающие опе-

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

Page 13: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

13

помощью специальных таблиц устанавливает взаимосвязь структур ис-ходной и объектной программ. Это позволяет осуществить требуемые редакционные изменения в объектной программе. Примерами диалоговых языков являются Бейсик, Си и др.

6.2.3. Системы программирования

Система программирования – это система для разработки новых про-грамм на конкретном языке программирования. В них входят: компилятор или интерпретатор; интегрированная среда разработки; средства создания и редактирования текстов программ; обширные библиотеки стандартных программ и функций; отладочные программы, т.е. программы, помогающие находить и

устранять ошибки в программе; «дружественная» к пользователю диалоговая среда; многооконный режим работы; мощные графические библиотеки; утилиты для работы с библиоте-

ками; встроенный ассемблер; встроенная справочная служба. Популярные системы программирования – Turbo Basic, Quick Basic,

Turbo Pascal, Turbo C. Получили распространение системы программирования, ориентиро-

ванные на создание Windows-приложений: Borland Delphi – наследник семейства компиляторов Borland Pascal; Microsoft Visual Basic – удобный и популярный инструмент для

создания Windows-программ с использованием визуальных средств; Borland С++ – средство для разработки Dos и Windows-приложе-

ний. 6.3. Программирование на MS Visual Basic

6.3.1. Особенности Visual Basic как объектно-ориентированного языка программирования

В основе объектно-ориентированного программирования лежат поня-тия: объект, класс, инкапсуляция, наследование и полиморфизм.

В Visual Basic объектом называется элемент пользовательского ин-терфейса, который создается на форме Visual Basic. Каждый объект явля-ется представителем некоторого класса однотипных объектов, т.е. объ-ект – экземпляр класса. Класс определяет общие для всех его объектов методы и свойства. Методы – это программные процедуры, определяю-щие взаимодействие объектов класса с внешней средой. Свойства пред-

Page 14: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

14

ставляют собой характеристики (атрибуты), присущие объектам (напри-мер, размер шрифта, название и др.). Объекты могут реагировать на со-бытия – действия пользователя или внешние действия.

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

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

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

6.3.2. Структура проекта Visual Basic

Проект Visual Basic представляет собой реестр файлов, необходимых для генерации исполняемого файла приложения. Реестр содержится в файле проекта, который имеет расширение .vbp. Файл проекта – это под-робный список частей проекта. Самих частей проекта он не содержит, а только перечисляет их.

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

Модуль – это файл, содержащий программный код, не связанный ни с одной формой или элементом управления. Модули содержат только про-граммные инструкции. В них декларируются переменные, константы, размещаются пользовательские функции и подпрограммы. Программные модули, служащие для хранения исходного кода, общего для всех форм проекта (глобальные процедуры и функции, декларации и объявления типов и т.д.), имеют расширение .bas. Модуль стандартной формы имеет расширение .frm.

Все файлы проекта являются текстовыми файлами, содержащими предложения на языке Visual Basic. Откомпилированная программа в виде двоичного кода хранится в файле с расширением .exe.

Page 15: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

15

Создание интерфейса пользователя подробно рассмотрено в лабора-торном практикуме [9] (пп. 1.1–1.5). Для создания модулей служат сред-ства языка Visual Basic.

6.3.3. Алфавит и лексемы языка

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

В алфавит языка Visual Basic входят: прописные и строчные буквы латинского алфавита (A – Z, a – z); прописные и строчные буквы кириллицы (A – Я, a – я); цифры от 0 до 9; символ подчеркивания «_»; неизображаемые символы (обобщенные пробельные символы), ис-

пользуемые для отделения лексем друг от друга (пробел, табуляция, пере-ход на новую строку);

специальные символы, участвующие в построении конструкций языка: +, –, *, /, \, ^, =, >, <, (, ), {, },", ., :, ; ', &, %, !, ?, @, #, $.

Программный код Visual Basic представляет собой последовательность лексических единиц (лексем), записанных в соответствии с принятыми синтаксическими правилами, которые реализуют некоторую семантиче-скую конструкцию. В Visual Basic каждый оператор пишется в отдельной строке. Количество пробелов и знаков табуляции между частями операто-ра не имеет значения. В записи оператора строчные и прописные буквы равноценны, поэтому для повышения читаемости текста ключевые слова обычно начинаются с прописной буквы. Чтобы расположить несколько операторов в одной строке, между ними ставится символ двоеточие. В случае необходимости расположения одного оператора на нескольких строках следует в конце каждой строки ставить символ подчеркивания, отделяя его пробелом от последнего символа строки.

В Visual Basic, как и в большинстве языков программирования, могут быть использованы комментарии. Они предназначены для пояснения от-дельных фрагментов программы и игнорируются Visual Basic при выпол-нении программы. Для выделения начала комментария можно использо-вать апостроф ( ' ) или оператор Rem. Поскольку Rem – оператор, он дол-жен быть записан в отдельной строке, апостроф может ставиться в любом месте строки, при этом текст комментария располагают справа.

' Это комментарий Rem Это тоже комментарий

Page 16: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

16

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

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

процедур и функций. Идентификатор представляет собой последователь-ность букв, цифр и символов подчеркивания. Выбирая идентификатор для имени, следует учитывать, что имя должно быть содержательным, т.е. отра-жать назначение переменной. Visual Basic накладывает на имена следующие ограничения:

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

специальных символов; имя должно быть уникальным, оно не должно совпадать с зарезерви-

рованными словами Visual Basic или с другими именами; длина имени может включать до 255 символов, но следует иметь в ви-

ду, что Visual Basic учитывает только 31 символ от начала имени. Примеры правильных имен: STR, i, Номер, Х12, Kvadr_urav. Visual Basic игнорирует в именах разницу между строчными и прописны-

ми буквами. Так Summa и sUmmA – одно и то же имя. В Visual Basic, как и в других языках программирования, есть 55 зарезер-

вированных ключевых слов, которые нельзя выбирать в качестве идентифика-торов имен. Например, If (если), Then (то), Else (иначе), For (для).

Константы – это объекты, значения которых остаются постоянными и не могут быть изменены во время выполнения программы. Синтаксис языка определяет несколько типов констант.

Целые константы представляются десятичным целым числом: 44, 867, 0, 1023

Вещественные константы могут быть записаны в форме с фиксиро-ванной точкой и в форме с плавающей точкой. В первом случае целая и дробная часть числа отделяются друг от друга точкой. Например, 44.18, -78.123. Вещественное число с плавающей точкой записывается в виде:

<мантисса> Е <порядок> Такое обозначение понимается как «мантисса, умноженная на 10 в

степени, равной порядку». Например, 3.87Е-8 означает 3.8710-8,

Page 17: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

17

5.992Е18 означает -5.9921018. Мантисса представляется в виде целого числа или вещественного числа с фиксированной точкой; а порядок – в виде положительного или отрицательного целого числа.

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

"P", "Program", "3.14", "+"

Кроме неименованных констант, рассмотренных выше, Visual Basic предлагает встроенные константы, предназначенные для хранения са-мой разнообразной информации: коды «горячих клавиш», используемые цвета и т.д. Все они имеют префикс vb, например, vbRed, vbInforma-toin.. Для того чтобы уточнить значение той или иной встроенной кон-станты, а также ее название, следует открыть окно Object Browser, в котором можно найти всю необходимую информацию. Для этого необхо-димо или нажать соответствующую кнопку на стандартной панели инст-рументов, или выбрать команду Object Browser в меню View, или на-жать клавишу F2.

Любой язык программирования располагает строго определенным на-бором операций для работы с данными. Операции являются основой вы-числительного процесса. В Visual Basic определены:

арифметические операции: +, –, *, /, \, Mod, ^; операции отношения: =, >, <, <>, >=, <=; логические операции: Not, And, Or; операция конкатенация (объединение двух и более строк) &. К разделителям (знакам пунктуации) относятся: " . : , ; ' & %

! @ # $ пробел, табуляция, переход на новую строку.

6.3.4. Объявление переменных

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

Visual Basic, в отличие от других языков программирования, не требу-ет обязательного явного объявления переменных, но явное объявление имеет преимущества: оно более наглядно, улучшает читабельность про-граммы, более эффективно использует память. Для явного объявления пе-ременной используют оператор Dim, имеющий следующий синтаксис:

Dim Имя_1 As Тип_1, Имя_2 As Тип_2, …, Имя_N As Тип_N где Dim – ключевое слово (сокращение от Dimension – размерность), со-

Page 18: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

18

общающее Visual Basic, что декларируется переменная и резервируется область памяти для ее хранения; As (как) – ключевое слово, сообщающее Visual Basic, что определяет-ся тип переменной; Имя_1, Имя_N – имена переменных (идентификаторы, не входящие в перечень ключевых слов Visual Basic и отличающие переменные друг от друга и от других объектов программы); Тип_1, Тип_N – типы данных для объявляемых переменных.

В табл. 6.3.1 приведены типы данных, поддерживаемые Visual Basic. Таблица 6.3.1

Тип Содержимое Память, байт

Диапазон возможных значений

Boolean Логические значения 2 [True, False]

Byte Однобайтные целые числа 1 [0; 255]

Integer Целые числа 2 [-32768; 32767]

Long Длинные целые числа 4 [-2147483648; 2147483647]

Single Вещественные числа одинарной точности

4 [-3.4028231038;-1.40129810-45] и [1.40129810-45;3.4028231038]

Double Вещественные числа двойной точности

8 [-1.797631348623210308; -4.9406564584124710-324] и [4.9406564584124710-324; 1.797631348623210308]

Currency Денежные единицы (целая часть – до 15 цифр, дробная – 4 цифр),

8 [-922337203685477,5808; 922337203685477,5807]

Decimal Десятичное число 14 Целое – 29 знаков, веществен-ное – 28 знаков после точки

Date Дата и время 8 [1.01.100; 31.12.9999]

String Текстовая информация (строка)

1 байт для каж-дого

символа

До 65400 символов для строк фиксированной длины; до 2000000000 символов для дина-мических строк

Object Объект 4 Ссылка на объект

Variant Любая информация 16 байт для чисел 1 байт на каждый символ для строк

Любое числовое или строковое значение

Page 19: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

19

Данные типа Boolean содержат только два значения: True (истина) и False (ложь). В Visual Basic значению True соответствует 1, а False – 0.

Данные типа Byte, Integer и Long содержат лишь целые значения из различных диапазонов. Если переменной такого типа присваивается значение 1.4, то возвращается 1, а если 1.5, то 2. В случае, если перемен-ной присваивается значение вне заданного диапазона, то выдается сооб-щение об ошибке: Overflow (переполнение).

Данные типа Single и Double содержат числа с плавающей точкой из разных диапазонов значений. Данные типа Currency также служат для представления чисел с плавающей точкой, но число разрядов после запя-той ограничено четырьмя. Этого вполне достаточно при выполнении де-нежных расчетов. Например,

Dim a As Single, b As Double, c As Currency, d As double a = 2 / 3 ' Результат: 0.6666667 b = 2 / 3 ' Результат: 0.666666666666667 c = 2 / 3 ' Результат: 0.6667 d = 4000.1234567895745357 ' Результат: 4000.12345678957

Значение переменной d Visual Basic обрезал прямо в программе, зная, что с такими длинными числами работать не может (максимально 15 зна-чащих цифр).

Как видно из таблицы Visual Basic поддерживает 6 числовых типов. Зачем использовать целочисленные типы данных, если тип Double позво-ляет работать и с целыми и с дробными числами в достаточно большом диапазоне? Кроме экономии памяти, здесь есть еще проблема абсолютной точности вычислений. При использовании типа Double (и типа Single) вполне возможна ситуация, когда дважды два будет не точно 4, а, напри-мер, 4.00000000000001. Связано это c представлением десятичных дробей в компьютерах. В большинстве реальных задач такая маленькая погреш-ность несущественна, однако имеются задачи, где точность нужна абсо-лютная. При использовании же типов целых чисел Visual Basic следит за тем, чтобы все константы и результаты были абсолютно точными целыми числами. Если нужна абсолютная точность при работе с числами, а вели-чина чисел превышает 2 миллиарда, то тип Long будет слишком узок и необходимо воспользоваться типом Currency. Этот тип, хотя и имеет дробную часть в размере 4 десятичных знаков после точки, действия над числами выполняет абсолютно точно, а диапазон представляемых им ве-личин весьма велик – примерно от -91014 до 91014 .

В Visual Basic есть еще один числовой тип Decimal. Особенность дан-ных этого типа заключается в том, что их можно использовать лишь внут-

Page 20: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

20

ри переменной типа Variant, т.е. объявить переменную типа Decimal непосредственно оператором Dim нельзя. Тип Decimal позволяет исполь-зовать числа с количеством знаков после точки от 0 до 28.

Данные типа Date специально предназначены для обработки инфор-мации о дате и времени. Чтобы для Visual Basic было понятно, что под указанным значением подразумевается дата и/или время, нужно помес-тить его между двумя знаками #. При вводе следует пользоваться амери-канским форматом, т.е. месяц писать раньше числа и разделять все это косыми чертами. В обозначении времени суток необходимо обязательно указывать, когда было дело: после полудня (РМ) или до полудня (АМ). Результаты будут выдаваться в соответствии с настройками Windows. Ес-ли же при вводе данных этого типа использовать кавычки, то следует применять установленный в системе формат даты и времени. Например,

Dim a As Date, b As Date, c As Date, d As Date a = #10/6/2008# ' Результат: 06.10.2008 b = #1:25:00 PM# ' Результат: 13:25:00 c = "6/10/08" ' Результат: 06.10.2008 d = "13:25" ' Результат: 13:25:00

Данные типа String служат для хранения строк. Различают строки переменной и фиксированной длины. Строки переменной длины могут содержать до двух миллиардов символов. Когда такой переменной при-сваивается значение, то размер переменной изменяется так, чтобы он со-ответствовал длине присвоенного строкового значения. Строка фиксиро-ванной длины – это строка постоянного размера, указанного при объявле-нии переменной. Если такой переменной присваивается значение более длинное, то лишние символы отбрасываются. Если значение, которое присваивается, короче, то оставшееся место заполняется пробелами. Для того, чтобы Visual Basic отличил строку от имени переменной, строка за-ключается в кавычки. Строковые переменные фиксированной длины опи-сываются следующим образом:

Dim VarName As String * Длина_Строки

где Длина_Строки – целочисленная переменная или константа, содержа-щая число, указывающее длину строковой переменной. Например

Dim a As String, b As String * 8 a = "Информатика" ' Результат: Информатика b = "Информатика" ' Результат: Информат

Переменная типа Object содержит ссылку на тот или иной объект разрабатываемого приложения или других приложений и представляет собой 4-байтный адрес соответствующей области памяти.

Page 21: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

21

Тип Variant устанавливает тип данных в зависимости от содержимо-го. Если содержимым переменной является число 5, то она принимает тип Integer, если – число 1.457, то – тип Double, если – текст, то – тип String. Переменная типа Variant может изменять свой тип во время выполнения программы. Переменные этого типа имеют большое практи-ческое значение, но при их применении возникают проблемы. Во-первых, при чтении программного кода не видно, какой внутренний тип имеет переменная в данный момент, и это может крайне затруднить обнаруже-ние логических ошибок программирования. Во-вторых, данные этого типа из-за частых внутренних преобразований занимают больше памяти, чем аналогичные данные, объявленные с указанием явного типа.

Как было сказано выше, оператор Dim позволяет объявлять несколько переменных, но для каждой из них следует указать тип данных. Если для переменной не указан явный тип данных, Visual Basic присваивает ей тип Variant.

Dim A, B, C As Integer Dim X, Y, Z As Single

В этом примере переменным A, B, X и Y присваивается тип Variant, переменной С – тип Integer, а переменной Z – тип Single. Обращаться к этим переменным можно лишь из той процедуры, в которой они были определены. Такие переменные называются локальными, т.е. видимыми только в данной процедуре. Чтобы переменная была видна на уровне мо-дуля, ее необходимо объявить иначе. Во-первых, объявление должно на-ходиться в разделе глобальных объявлений (General) формы или модуля, во-вторых, вместо ключевого слова Dim для определения переменных можно использовать ключевое слово Private (частный). Объявленная таким образом переменная называется переменной контейнера, она дос-тупна на уровне модуля, т.е. к ней можно обращаться из любой процеду-ры данного модуля. Для других модулей она будет не видна. Глобальные переменные определяются в разделе глобальных объявлений (General) модуля. При этом вместо ключевого слова Dim используется ключевое слово Public (общий). Глобальные переменные доступны во всех моду-лях и процедурах проекта.

Локально объявленные переменные при выходе из процедуры удаля-ются из памяти, а при новом вызове процедуры инициализируются зано-во. Их содержимое при этом не сохраняется, что не всегда желательно. Этого можно было бы избежать путем расширения области определения, т.е. объявив переменную глобальной или, как минимум, переменной кон-тейнера, но это разрешает доступ к переменной из других процедур. Visu-

Page 22: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

22

al Basic дает возможность объявлять переменные как статические. При выходе из процедуры содержимое статической переменной сохраняется. При новом вызове этой процедуры переменной присваивается значение, которое она имела при последнем выходе из этой процедуры. Для объяв-ления переменной как статической нужно просто вместо ключевого слова Dim использовать ключевое слово Static:

Static C As Integer

Чтобы объявить статическими все локальные переменные процедуры, следует записать ключевое слово Static в заголовке процедуры.

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

Таблица 6.3.2 Префикс Тип переменных Префикс Тип переменных

bln Boolean int Integer byt Byte lng Long cur Currency sng Single dtm Date str String dbl Double vnt Variant g Глобальная

переменная m Локальная

переменная в форме

Примеры переменных с префиксами: curMoney, dtmToday, lngResult, intNumber, strAnswer

Другим способом явного объявления переменных является указание типа с помощью суффикса. В этом случае тип переменной определяется благодаря добавлению в конец ее имени специального символа описания типа – суффикса, поэтому использование ключевого слова As не требует-ся. В табл. 6.3.3 приведены типы переменных и соответствующие им суффиксы, применяемые при декларации типов.

Таблица 6.3.3 Тип переменной Суффикс Пример

Integer % Counter% Long & Nr& Single ! Result! Double # Number# Currency @ Summa@ String $ FirstName$

Page 23: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

23

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

Например, Dim A%, B%, C$, X!, Y#, Z& A = 1.65 ' Результат: 2

Как видно из таблицы 6.3.3, не все типы данных располагают собст-венными суффиксами. Использование суффиксов Microsoft больше не рекомендует, и они имеются в Visual Basic только для совместимости с предыдущими версиями.

Неявное описание переменных осуществляется двумя способами. Пер-вый способ заключается в использовании оператора DefType. Этот опера-тор устанавливает тип данных для переменных и параметров процедур, имена которых начинаются с определенных букв. Синтаксис оператора имеет вид:

DefType Диапазон_букв, [,Диапазон_букв] …

где Type – сокращенное название типа данных; Диапазон_букв – указывает границы диапазона имен, для которых задается тип данных по умолчанию.

Например, DefInt A – D, K – N DefSng T, X – Z DefStr f

В данном описании указано, что все переменные, не объявленные явно и начинающиеся с любой буквы в диапазонax A-D и K-N, будут иметь по умолчанию тип Integer, начинающиеся с букв T, X, Y, Z, – тип Single и начинающиеся с буквы f – тип String. Операторы DefType можно ис-пользовать только в разделе объявлений (General).

При втором способе неявного объявления переменная декларируется просто указанием ее имени, например, MyVal или My_Name$, в тексте про-граммы. В этом случае Visual Basic самостоятельно объявляет перемен-ную, как только она встречается в программе. Переменную My_Name$ Visual Basic объявляет строковой переменной, а к переменной MyVal применяет тип Variant.

Следует отметить, что хороший стиль программирования предполагает использование явной декларации переменных с помощью ключевых слов Dim, Private, Public, Static. Неявное описание переменных без необ-ходимости применять не следует, так как в последующем могут возник-

Page 24: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

24

нуть непредвиденные ошибки. Для того чтобы избежать неприятностей в случае ошибочной записи имени переменной, необходимо в раздел гло-бальных объявлений (General) помещать оператор Option Explicit. В этом случае Visual Basic будет расценивать любую неявно объявленную переменную как ошибочную, и выдавать соответствующее сообщение. Для автоматической вставки оператора Option Explicit надо устано-вить опцию Require Variable Declaration команды Tools Option вкладка Editor, но следует иметь в виду, что автоматически будет до-бавляться этот оператор только во вновь создаваемые модули.

6.3.5. Определение констант

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

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

При объявлении констант используется ключевое слово Const. Гло-бальная константа объявляется как Public, при этом необходимо иметь в виду, что глобальные константы можно объявлять только в модуле.

[Public | Private] Const Имя_константы = Значение

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

Const Pi = 3.14159265358979 Const Millennium = #1/01/20001# Const Stroka = "Visual Basic"

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

Page 25: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

25

зуется в нескольких процедурах, то при изменении ее значения оно будет правильно воспринято всеми процедурами.

Константы можно объявлять и с указанием типа данных. Для объявле-ния таких констант используется оператор, аналогичный тому, который применяется при описании переменной: [Public|Private] Const Имя_константы As Тип_данных = Значение

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

Public Const Pi As Double = 3.14159265358979

6.3.6. Выражения

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

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

1.76 + "Summa" ошибочна, так как производится попытка сложения вещественного числа со строкой.

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

возведение в степень ( ^ ); унарный минус (изменение знака числа); умножение ( * ) и обычное деление ( / ); целочисленное деление ( \ ); вычисление остатка от целочисленного деления ( Mod ); сложение ( + ) и вычитание ( –). Операции с одинаковым приоритетом выполняются в соответствии с

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

Page 26: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

26

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

Таблица 6.3.4 Запись на Visual Basic Выполняемые функции

Abs(X) | X |

Atn(X) arctg X

Sin(X) sin X

Cos(X) cos X

Tan(X) tg X

Exp(X) eX (e – основание натурального логарифма)

Log(X) ln X

Sqr(X) Квадратный корень X

Rnd(X) Датчик случайных чисел

Fix(X) Отбрасывание дробной части

Int(X) Наибольшее целое число, не превосходящее X

Round(X[,A]) Округление числа X с точностью до А десятичных зна-ков; если параметр А не задан, то происходит округле-ние до целого значения

Sgn(X) Возвращает +1, если значение аргумента положитель-ное, -1, если – отрицательное и 0, если – нулевое

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

Радианы = градусы / 180 При вычислении арктангенса необходимо, чтобы аргумент находился

в пределах интервала: (-/2; /2). Для перевода натуральных логарифмов в десятичные логарифмы сле-

дует использовать формулу: Lg X = Ln X / Ln 10

Page 27: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

27

При использовании датчика случайных чисел генерируется число в интервале (0; 1), при этом аргумент Х в функции Rnd можно опустить. Для нахождения вещественных случайных чисел из интервала (a; b) следует использовать выражение: (b – a) * Rnd + a.

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

Int(3.75) 'Результат: 3 Fix(3.75) 'Результат: 3 Int(-3.75) 'Результат: -4 Fix(-3.75) 'Результат: -3 Int((b – a) * Rnd + a) 'Результат: случайное целое число из интервала (a;b)

В функции Round реализован принцип так называемого «бухгалтер-ского» округления. В математике «граница» округления до целого прохо-дит по цифре 5 в десятых долях числа. Значение 5.5 будет округлено до 6, а значение 5.49 – до 5. В свою очередь, «бухгалтерское» округление пре-дусматривает чередование четных и нечетных чисел в подобном «гранич-ном» округлении. При этом четные числа округляются в меньшую сторо-ну (по модулю), а нечетные – в большую сторону. Это сделано для повы-шения точности бухгалтерских расчетов при значительном количестве выполняемых операций. Например,

Round(3.5, 0) 'Результат: 4 Round(2.5, 0) 'Результат: 2 Round(3.55, 1) 'Результат: 3.6 Round(3.45, 1) 'Результат: 3.4

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

выражение записывать в строку без каких-либо надстрочных или подстрочных символов;

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

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

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

Page 28: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

28

1. dc

ba

(a + b) / (c + d)

2. dc

ba

a * b / (c * d) или a * b / c / d

3. yyxe yx 6,3ln 3 exp(x+y)–log(sqr(abs(x-y^3)))-3.6*y

4. 3

32

)(3.38

cossin

xtg

yx

(sin(x)^2+cos(y^3))/(38.3 +tan(pi+x))^(1/3)

Логические выражения строятся из логических данных, отношений, логических операций. Логические выражения в зависимости от входящих в него величин могут принимать одно из двух значений True (истина) или False (ложь). Простейшим логическим выражением является отноше-ние – два выражения, соединенных знаком отношения (=, <>, >, >=, <, <=). Результат операции отношения равен True, если отношение удовлетворя-ется для входящих в него значений, и False – в противном случае.

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

Логическое отрицание Not (не) применимо к одному операнду и дает результат True, если значение операнда False, и наоборот. Логическое умножение And (и) применимо к двум операндам и дает результат True только в том случае, если значения 1-го и 2-го операндов True, в против-ном случае – False. Логическое сложение Or (или) также применимо к двум операндам и дает результат True, если значение, хотя бы одного из операндов True, в противном случае – False.

Примеры логических выражений: Abs(X) < eps – значение Х по модулю не превосходит Not(X >= 0 And X <= 1) – точка Х не принадлежит отрезку [0; 1] X+Y>Z And X+Z>Y And Y+Z>X – условие существование треугольника

со сторонами X, Y и Z. Операции сравнения можно производить и над строковыми перемен-

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

Page 29: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

29

"DOG" > "CAT" 'Результат: True "M16 " < "M16" 'Результат: False "elefant" < "mouse" 'Результат: True

Строковые выражения строятся из строковых констант, строковых переменных, функций обработки строк и знака операции конкатенации &.

При объединении двух и более строк используется операция, назы-ваемая конкатенацией, которая реализуется с помощью оператора &. На-пример, Str1 & Str2. Если переменная Str1 имеет значение "Строковая ", переменная Str2 – значение "переменная", то значением этого строкового выражения будет "Строковая переменная". Объединять строки можно также при помощи операции сложения "+". Например, Str1 + Str2. Зна-чением этого строкового выражения также будет "Строковая переменная".

Наиболее часто используемые встроенные функции работы со стро-ками приведены в табл. 6.3.5.

Таблица 6.3.5 Функция (аргумент) Возвращаемое значение

Asc(строка) Возвращает ASCII-код первого символа в строке

InStr([начальная_позиция,] строка1, строка2)

Возвращает номер позиции первого обнаружения строки2 в строке1, начальная_позиция устанавливает позицию, с которой начинается поиск (если параметр опущен, то поиск начинается с первой позиции)

Len(строка) Возвращает количество символов в строке

Left(строка, количество) Возвращает строку, извлеченную из строки-параметра, начиная от начала строки, и содержащую заданное количество символов

Right(строка, количество)

Возвращает строку, извлеченную из строки-параметра, начиная от конца строки, и содержащую заданное количество символов

Mid(строка, N [, Lenght]) Возвращает часть строки, содержащую Lenght симво-лов, начиная с позиции N. Если параметр Lenght не указан или длина строки меньше Lenght, то возвраща-ются все символы от N до конца строки. Если N боль-ше длины строки, то возвращается пустая строка.

LTrim(строка) Возвращает строку с удаленными начальными пробелами

RTrim(строка) Возвращает строку с удаленными конечными пробелами

Trim(строка) Возвращает строку с удаленными начальными и ко-нечными пробелами

Space(число) Возвращает строку пробелов указанной длины

Str(число) Возвращает строковое представление числа

Val(строка) Преобразует строку в число

Page 30: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

30

6.3.7. Программирование алгоритмов линейной структуры. Оператор присваивания

Оператор присваивания является основным оператором любого язы-ка программирования. Он предназначен для определения или переопреде-ления значения переменной – присваивания ей нового значения. Синтак-сис оператора такой:

Имя_переменной = выражение

Принцип работы оператора присваивания: вычисляется значение выражения; при работе с числовыми типами результат вычисления, если это

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

значение, если таковое было, теряется. Например, формула d = b + 2 на языке Visual Basic записывается в виде

оператора присваивания: d = b + 2

При выполнении этого оператора к значению, которое в данный мо-мент имеет переменная b, прибавляется 2 и результат присваивается пе-ременной d. Прежнее значение переменной d теряется. С помощью опера-тора присваивания можно как задавать переменной начальное значение, так и изменять то значение, которое она уже имеет. Например, оператор

n = n + 1

увеличит значение переменной n на 1. Этот пример подчеркивает разли-чие между символом присваивания и знаком равенства, используемым в математических формулах. Очевидно, что запись n = n + 1 не имеет смыс-ла, если ее рассматривать как обычное уравнение.

В арифметическом выражении могут присутствовать величины разных типов, например, складываются два числа: целое и вещественное. Резуль-татом такого сложения будет величина вещественного типа, поэтому осо-бое внимание следует обращать на тип той переменной, которой он будет присвоен. Если в этом случае типы переменной и присваиваемого ей ре-зультата арифметического выражения не будут совпадать, например, пе-ременная будет типа Integer, а значение выражения – Single или Double, то после выполнения данного оператора значение переменной будет получено путем автоматического округления результата. Например,

Dim a As Single, b As Single, c As Integer, d As Single a = 3.7: b = 5.65 c = a / b 'Результат: 1 d = a / b 'Результат: 0.6548672

Page 31: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

31

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

Пусть необходимо перемножить два целых числа типа Integer. Оче-видно, результат может иметь как тип Integer, так и тип Long (если множители были достаточно большие). Однако Visual Basic в этом случае полагает, что результат должен также иметь тип Integer. Как было опи-сано выше, верхним пределом значений типа Integer является число 32767. Смоделируем ситуацию, когда произведение будет больше указан-ного значения, например, при умножении чисел 200 и 300.

Dim A As Integer, B As Integer, C As Long A = 200: B = 300: C = A * B

На первый взгляд, все верно, и перемножение должно быть выполне-но, т.к. переменная С описана как Long. Однако при выполнении послед-него оператора возникает ошибка переполнения. С учетом приведенных выше рассуждений это вполне очевидно – результат перемножения двух целых чисел типа Integer с точки зрения Visual Basic имеет тип Integer, значения которого не могут превышать 32767 (а произведение должно быть равно 60000). Возможный выход из ситуации – принуди-тельное указание типа Long одному из сомножителей с помощью функ-ции преобразования типа данных CLng, например,

C = CLng(A) * B

Теперь один из сомножителей имеет тип Long, поэтому умножение будет выполнено без ошибок.

В табл. 6.3.6 приведены функции преобразования типов данных. Таблица 6.3.6

Название функции

Получаемый тип данных

Название функции

Получаемый тип данных

CBool Boolean CInt Integer CByte Byte CLng Long CCur Currency CSng Single CDate Date CStr String CDbl Double CVar Variant CDec Decimal

Page 32: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

32

В левой и правой части оператора присваивания могут быть использо-ваны переменные и константы типа Date. Над этими переменными и кон-стантами возможно выполнение арифметических операций. В частности, прибавление или вычитание целого числа приведет к увеличению или уменьшению даты. Если же подобную операцию выполнить с дробью, знаменателем которой является число 24, то соответствующим образом увеличится или уменьшится значение, обозначающее количество часов. Аналогичным способом можно изменить количество минут (знаменатель: 24*60). При работе с переменными типа Date можно использовать функ-ции: Date – текущая дата, Time – текущее время, Now – текущая дата и время и ряд других. Например,

Dim a As Integer, b As Date, c As Date, d As Date, t as Date b = Now 'Результат: 29.07.2008 23:21.17 c = Date 'Результат: 29.07.2008 d = c + 33 'Результат: 31.08.2008 t = b + 3 / 24 'Результат: 30.07.2008 2.21.17 a = d – c 'Результат: 33 (дня)

В Visual Basic возможно использование операторов присваивания, имеющих следующий синтаксис:

Объект.Свойство = значение Например, Form1.Caption = "Игра" 'В заголовке формы появится "Игра" Form1.BackColor = vbRed 'Цвет фона формы станет красным Text1.text = Result 'В текстовом окне появится значение переменной Result Font.Bold = True 'Установка полужирного начертания

При составлении программы линейной структуры нужно руководство-ваться следующими правилами:

все переменные, используемые в программе, должны быть объяв-лены;

исходные данные должны быть определены в программе (заданы своими значениями) до момента их использования;

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

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

программу для удобства ее чтения целесообразно снабжать ком-ментариями.

Page 33: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

33

Пример 6.3.1. Разработать приложение для вычисления площади тре-угольника по формуле Герона c)b)(pa)(pp(ps , где a, b, c –

стороны треугольника, p – полупериметр. Алгоритм решения этой задачи следующий: ввод исходных данных (значений a, b, c); вычисление полупериметра p = (a + b + c)/2; вычисление площади треугольника c)b)(pa)(pp(ps ;

вывод результата s. На рис. 6.3.1 представлен возможный вариант формы проекта.

Рис. 6.3.1. Форма проекта «Площадь треугольника»

Программный код для кнопки Расчет можно записать так: Private Sub Command1_Click() ' Кнопка Расчет Dim a As Single, b As Single, c As Single, p As Single, _ S As Single a = Val(Text1.Text) b = Val(Text2.Text) c = Val(Text3.Text) p = (a + b + c) / 2 ' Вычисление полупериметра S = Sqr(p * (p - a) * (p - b) * (p - c)) Label1.Caption = "Площадь треугольника=" & Str(S) & " кв.см" End Sub

Программный код для кнопки Сброс: Private Sub Command2_Click() 'Кнопка Сброс Text1.Text = "" Text2.Text = "" Text3.Text = "" Label1.Caption = "" End Sub

CommandButton

Label

TextBox

Page 34: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

34

Программный код для кнопки Выход: Private Sub Command3_Click() 'Кнопка Выход End End Sub

Результат работы программы представлен на рис. 6.3.2.

Рис. 6.3.2. Результат работы проекта «Площадь треугольника»

При выводе результата можно использовать функцию Format(expression, fmt), где expression – форматируемое численное выражение, fmt – последовательность символов, определяющих отобра-жение expression. Например, для вывода на печать площади треуголь-ника S c 3 цифрами в дробной части, оператор записи результата в поле объекта Label1 будет выглядеть так:

Label1.Caption = "Площадь треугольника=" & _ Str(format(S,”##.###)) & " кв.см"

Символ "#" используется для задания количества значащих цифр в це-лой и дробной части выводимого числа. При S = 4.495886 в поле Label1 будет записано 4.496, а при S = 123.45 – значение 123.45. Целую часть числа Visual Basic показывает полностью в любом случае, какова бы она ни была. Незначащие нули в начале и конце числа игнорируются. Для вывода незначащих нулей используется формат "0.000". Если необходимо вывести символы "+", ",","$" или пробел, то их размещают непосредст-венно в формате.

Для ввода исходных данных и вывода результата можно использовать другие программные средства: функцию InputBox – для ввода значений, метод Print – для вывода результата на форму.

Page 35: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

35

6.3.8. Встроенные диалоговые окна

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

InputBox(Сообщение[,заголовок] [,значение] [,Хpos] [,Ypos] [,файл справки, контекст])

Сообщение – строковое выражение для отображения в диалоговом ок-не подсказки пользователю относительно вводимого значения. Макси-мальная длина текста 1024 символов. Заголовок – строковое выражение, задающее название диалогового окна. Если заголовок опущен, в строку заголовка помещается имя приложения. Значение – это принимаемое по умолчанию строковое выражение, которое выводится автоматически в текстовом поле. Если этот параметр отсутствует, то поле ввода пустое. Xpos, Ypos – положение окна ввода соответственно по горизонтали и вертикали (в твипах). Если эти параметры отсутствуют, то диалоговое окно помещается в центре экрана. Файл справки – строковое выражение, определяющее имя файла, содержащего справочные сведения о данном окне. Контекст – числовое выражение, определяющее номер соответст-вующего раздела справочной системы. Из перечисленных параметров обязательным является только первый параметр Сообщение, остальные могут отсутствовать. В окне InputBox всегда имеются две кнопки управ-ления: ОК и Cancel. Кнопка ОК подтверждает ввод данных, кнопка Can-cel – закрывает диалоговое окно без ввода данных. Результатом вызова функции InputBox является значение типа String, поэтому при вводе чисел необходимо получаемое значение преобразовать в числовой вид с помощью функции Val. Например, оператор для ввода значений сторон треугольника из Примера 6.3.1 можно записать так:

b = Val(InputBox("Ввод стороны b","Стороны треугольника”))

Этот оператор отображает окно ввода и присваивает возвращаемое значе-ние переменной b (рис. 6.3.3).

Рис. 6.3.3. Диалоговое окно InputBox

Page 36: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

36

6.3.8.2. Окно сообщения MsgBox. Для вывода различных сообщений имеется окно MessageBox. Почти все приложения Windows используют MessageBox, так как этот компонент входит в состав Windows, а Visual Basic только предоставляет возможность его вызова. Диалоговое окно сообщения представляет собой простую экранную форму, которая ото-бражает некоторое сообщение и имеет хотя бы одну командную кнопку. Это окно является модальным по отношению к приложению, т.е. прило-жение не сможет продолжить работу, пока окно сообщения не будет за-крыто. Вид окна MessageBox может быть различным; оно может содер-жать значок и несколько кнопок, позволяющих получить информацию о принимаемом пользователем решении. MessageBox можно вызывать как процедуру и как функцию. Процедура выводит на экран заданное пользо-вателем текстовое сообщение. Синтаксис процедуры следующий:

MsgBox Сообщение [, атрибуты] [, заголовок] [, файл справки, контекст]

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

диалоговом окне (максимальная длина текста 1024 символов). В текст в качестве разделителей строк можно вставить переход на новую строку Chr(13), переход в начало строки Chr(10) или их комбинацию (констан-та vbCrLf). Параметр атрибуты – числовое выражение, которое является суммой значений, определяющих количество и тип отображаемых кно-пок, кнопку по умолчанию, тип используемого значка. Если данный пара-метр не указан, то используемое по умолчанию значение равно 0. Заголо-вок, файл справки и контекст – параметры, аналогичные параметрам, рассмотренным выше для функции InputBox.

Описание основных констант, используемых в окне сообщения, при-ведено в табл. 2.1 лабораторного практикума [9].

Результат работы программы можно выводить в окно MsgBox. Напри-мер, для вывода площади треугольника из Примера 6.3.1, необходимо записать оператор: MsgBox "Площадь треугольника =" & s & " кв. см", 0,"Вывод результата"

На рис. 6.3.4 показан результат работы этого оператора.

Рис. 6.3.4. Диалоговое окно сообщения, вызываемое процедурой Msgbox

Page 37: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

37

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

MsgBox "Работа закончена", vbInformation, "Площадь треугольника"

Результат представлен на рис. 6.3.5.

Рис. 6.3.5. Окно MsgBox со значком информационного сообщения

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

переменная = MsgBox(Сообщение [, атрибуты] [, заголовок] [, файл справки, контекст])

Использование функции MsgBox и организация запросов будут рас-смотрены далее.

6.3.9. Вывод данных на форму

С помощью метода Print информацию можно выводить непосредст-венно на форму. Синтаксис оператора вывода следующий:

Имя_объекта.Print Список_вывода

В качестве объекта может выступать форма или PictureBox. При вы-воде информации на активную форму имя формы можно опустить. В спи-сок вывода могут входить выражения, константы, переменные, свойства. Печать осуществляется, начиная с текущей точки. Например:

Form1.Print "Visual Basic" Picture2.Print Label1.Caption Print c * b - d

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

Page 38: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

38

обходимо указать Print без параметров. Однократным вызовом метода Print можно напечатать несколько значений. В качестве разделителей элементов используются запятые и точки с запятой. При использовании точки с запятой элементы выводятся через один пробел, а если одно зна-чение отделяется от другого запятой, то оно будет напечатано в следую-щей колонке (ширина каждой колонки – 14 символов). Результатом рабо-ты оператора:

Print "x="; x, "y="; y

при x = 1.56, y = -45.897 будет: x= 1.56 y= -45.897

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

В ситуации, когда необходимо продолжать печатать значения в той же строке, вызывая новые методы Print, в конце оператора также следует ставить точку с запятой (или запятую). Совместно с методом Print мож-но использовать функцию Spc(n), задающую количество пробелов перед печатаемым значением, и функцию Tab(n), указывающую позицию вы-вода. Например, следующие операторы:

Print Tab(21); "Результат" и Print Spc(20); "Результат"

напечатают слово Результат в одной и той же 21-й позиции, считая от левого края. Позицию на форме, с которой начнется вывод информации, можно задать и с помощью свойств формы CurrentX и CurrentY. На-пример, в результате выполнения операторов:

Form1.CurrentX=1000: Form1.CurrentY=3000 Print "Функция"

слово Функция будет напечатано на 1000 твипов правее и на 3000 твипов ниже левого верхнего угла формы. Имя формы в данных операторах мож-но опускать.

Для задания формата выводимого значения переменной используется функция Format (см. Пример 6.3.1).

Цвет символов и параметры шрифта выводимой информации устанав-ливаются на этапе проектирования свойствами формы Font и ForeColor, но могут изменяться и в программном коде. Например,

Font.Name = "Arial" ' Установить шрифт Arial Font.Size = 8 ' Установить размер шрифта 8 пт Font.Italic = True ' Установить курсив Font.Underline = True ' Установить подчеркивание символов Font.Bold = False ' Отменить полужирное начертание ForeColor = Vbred ' Установить красный цвет символов

Page 39: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

39

Пример 6.3.2. Разработать приложение для вычисления площади тре-угольника по формуле Герона с вводом значений сторон треугольника с по-мощью функции InputBox и с выводом результата вычисления непосредст-венно на форму.

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

Private Sub Command1_Click() Dim a As Single, b As Single, c As Single, p As Single, _ s As Single Cls ' Очистка формы a = Val(InputBox("Ввод стороны a","Стороны треугольника")) b = Val(InputBox("Ввод стороны b","Стороны треугольника")) c = Val(InputBox("Ввод стороны c","Стороны треугольника")) Print "Стороны треугольника: a ="; a, "b ="; b, "c ="; c p = (a + b + c) / 2 s = Sqr(p * (p - a) * (p - b) * (p - c)) Print: Print " Площадь треугольника ="; s; " кв. см" MsgBox "Работа закончена", vbInformation, "Площадь треугольника" End Sub

Программный код для кнопки Выход, как и в предыдущем примере, со-держит один оператор End.

Результат работы программы для a = 3.3 см, b = 4 см, c = 2.75 см показан на рис. 6.3.6. Для того чтобы на этапе выполнения программы форму мож-но было бы увеличивать в размере, если результат не уместился на форме, надо на этапе проектирования установить значение свойства формы Au-toRedraw (автоперерисовка) равным True.

Рис. 6.3.6. Вывод данных на форму с помощью метода Print

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

Print " Площадь треугольника ="; Format(s,”##.###”); " кв. см"

Результат в этом случае будет выглядеть так: Площадь треугольника =4.496 кв. см

Page 40: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

40

6.3.10. Программирование ветвлений

Вычислительный процесс называется разветвляющимся, если в зави-симости от выполнения определенных условий он реализуется по одному из нескольких, заранее предусмотренных направлений. Каждое отдельное направление называется ветвью вычислений. Выбор той или иной ветви осуществляется уже при выполнении программы в результате проверки некоторых условий и определяется значениями исходных данных и про-межуточных результатов. Для программной реализации таких вычисле-ний в языке Visual Basic имеются специальные операторы передачи управления, которые дают возможность перейти из одного места про-граммы в другое и изменить последовательный порядок выполнения ее операторов. К таким операторам относятся операторы перехода, условные операторы и операторы выбора.

6.3.10.1. Оператор перехода. Оператор перехода применяется при возникновении необходимости нарушить последовательность выполнения операторов. Например, необходимо обойти участок программы, перейти к концу программы или вводу новых исходных данных в случае возникно-вения аварийной ситуации (вычисление логарифма или квадратного корня при отрицательном аргументе и т.п.).

Общий вид оператора перехода: GoTo метка

где GoTo (идти к) – ключевое слово, метка – произвольный идентифика-тор, позволяющий именовать некоторый оператор программы и таким образом ссылаться на него. В качестве меток можно также использовать целые числа без знака в диапазоне от 0 до 2147483648.

Оператор GoTo передает управление оператору, помеченному указан-ной меткой.

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

6.3.10.2. Условный оператор. В Visual Basic есть два типа условного оператора: однострочный (линейный) и многострочный (блочный).

Линейный оператор имеет две формы – безальтернативную и альтер-нативную. Безальтернативная форма имеет следующий синтаксис:

If условие Then операторы

Альтернативная форма имеет такой синтаксис: If условие Then операторы_1 Else операторы_2

Page 41: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

41

Условие является логическим выражением, истинность которого оце-нивается. После ключевых слов Then и Else может стоять один или не-сколько операторов. В последнем случае они разделяются двоеточием. При значении условия True выполняются операторы_1, стоящие после ключевого слова Then, если же условие принимает значение False, то выполняются операторы_2, следующие за ключевым словом Else (аль-тернативная форма) или ничего не выполняется (безальтернативная фор-ма). Все описанные параметры данной структуры должны быть записаны в одной строке. Например,

If A = 7 Then Beep If x > 0 and x < 1 Then y = x^2: z = x + exp(y) Else y = 0: z = 0

В 1-м примере выдается звуковой сигнал, если переменная А = 7. Во 2-м примере, если x принадлежит интервалу (0;1), то вычисляются y = x2 и z = x + ex, в противном случае значения переменных y и z обнуляются.

Блочный оператор IF … Then предоставляет такие же возможности, как и линейный оператор, но, если в зависимости от условия надо выпол-нить несколько операторов, целесообразно использовать блочный синтак-сис. Блочный оператор также может быть безальтернативным и альтерна-тивным. Структура безальтернативного блочного оператора следующая:

If условие Then Блок операторов End If

Синтаксис альтернативного блочного оператора таков: If условие Then Блок операторов 1 Else Блок операторов 2 End If

End If указывает на окончание блока операторов If. Операторы If могут быть вложенными друг в друга. Структура вло-

женных операторов If следующая: If условие_1 Then If условие_2 Then Блок операторов 1 Else Блок операторов 2 End If Else Блок операторов 3 End If

Page 42: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

42

При использовании вложенных операторов If важно не перепутать варианты сочетания условий. Существует правило: альтернатива Else принадлежит ближайшему оператору If, не имеющему ветви Else.

В Visual Basic также предусмотрена конструкция для работы с не-сколькими операторами If. Эти операторы применяются в случае, когда необходимо рассмотреть еще несколько условий в дополнение к исход-ному условию. Для этого служит конструкция If … Then … ElseIf. Она позволяет проверить дополнительное условие, если исходное условие принимает значение False. Синтаксис подобного оператора следующий:

If условие_1 Then Блок операторов 1 ElseIf условие_2 Then Блок операторов 2 Else Блок операторов 3 End If

Например,

10если

5010если

50если

.x),xcos(

.x.),x(tg

.x),xsin(

z

Условный оператор, реализующий эти вычисления, записывается так: If x > 0.5 Then Z = Sin(x) ElseIf x >= 0.1 And x <= 0.5 Then Z = Tan(x) Else Z = Cos(x) End If

При выполнении первого условия х > 0.5 вычисляется значение Sin(x) и присваивается переменной Z, в противном случае проверяется условие 0.1 <= x <= 0.5. При его выполнении переменная Z получает зна-чение Tan(x), в противном случае – Cos(x).

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

IIf(условие, значение_1, значение_2)

Эта функция возвращает значение_1, если условие истинно, и значе-ние_2, если условие ложно. Например,

Y = IIf ( x > 0, Sin(x), Cos(x))

Page 43: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

43

Если x > 0, то переменной Y будет присвоено значение sin(x), в про-тивном случае – cos(x).

В качестве примера использования конструкций If … Then рассмот-рим ситуацию принятия решения при обнаружении отрицательного зна-чения аргумента функции Sqr и вывода диалогового окна сообщения c тремя кнопками, вызываемого функцией MsgBox.

vvod: . . . . . . . . . . . . . . . . . . . . . . . . If q < 0 Then ' q - аргумент функции Sqr y = MsgBox("Аргумент отрицательный", vbExclamation + _ vbAbortRetryIgnore, "Принятие решения") End If If y = vbAbort Then End If y = vbRetry Then GoTo vvod If y = vbIgnore Then GoTo next_oper . . . . . . . . . . . . . . . . . . . . . next_oper: . . .

При выполнении условия q < 0 появляется диалоговое окно сообщения, вызываемое функцией MsgBox (рис. 6.3.7). Три кнопки в этом окне – резуль-тат использования константы vbAbortRetryIgnore, значок предупрежде-ния (восклицательный знак) выводится за счет использования константы vbExclamation (см. табл. 2.1 лабораторного практикума [9]). Для продол-жения работы пользователь должен нажать одну из кнопок окна. При нажа-тии на кнопку «Прервать» переменная y принимает значение константы vbAbort, равное 3, при нажатии на кнопку «Повтор» – значение константы vbRetry, равное 4, а при нажатии на кнопку «Пропустить» – значение константы vbIgnore, равное 5 (см. табл. 2.2 лабораторного практикума [9]).

При y = vbAbort работа приложения завершается (выполняется оператор End). При y = vbRetry осуществляется переход в начало программы к опе-ратору, помеченному меткой vvod, для ввода других исходных данных. При y = vbIgnore осуществляется пропуск оператора, использующего функцию Sqr, и переход к оператору с меткой next_oper.

Рис. 6.3.7. Диалоговое окно сообщения, вызываемое функцией MsgBox

Page 44: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

44

6.3.10.3. Оператор выбора Select Case. Обычно при написании про-граммы не рекомендуется использовать многократно вложенные друг в друга условные операторы – программа становится громоздкой и трудной для понимания. Считается, что число уровней вложения не должно пре-вышать двух – трех. Если же необходимо сделать много взаимоисклю-чающих проверок, то удобнее воспользоваться оператором выбора Se-lect Case. Общий вид этого оператора:

Select Case проверяемое выражение Case список выражений_1 Операторы_1 Case список выражений_2 Операторы_2 . . . . . . . . . . . . . . [Case Else Операторы_N] End Select

где Select Case (выбор), Else (иначе), End (конец) – ключевые слова. Проверяемое выражение может быть любого типа: числового, логическо-го, строкового. Список выражений – одно или несколько выражений, раз-деленных запятой. Элементы списка выражений могут иметь одну из сле-дующих форм:

выражение – проверяет совпадение проверяемого выражения с одним из выражений – элементов списка;

выражение_1 To выражение_2 – проверяет попадание заданного выражения в указанный диапазон;

Is <операция отношения> выражение – проверяет выполнение указанного условия.

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

Пример 6.3.3. Записать фрагмент программы для вычисления значения z.

Page 45: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

45

6если

53если

7или2если

1если

z

nctg(x),

ntg(x),

nn(x),cos

n(x),sin

………………………………………… n = Val(InputBox("Ввод n","Пример оператора выбора")) Select Case n Case Is <= 1 Z = Sin(x) Case 2, 7 Z = Cos(x) Case 3 To 5 Z = Tan(x) Case 6 Z = 1 / Tan(x) Case Else Print "Oшибка: n>7" End Select ………………………………………… Эквивалентный фрагмент программы с оператором If выглядит так: ………………………………………… n = Val(InputBox("Ввод n","Пример оператора выбора")) If n <= 1 Then Z = Sin(x) ElseIf n=2 Or n = 7 Then Z = Cos(x) ElseIf n >=3 And n <= 5 Then Z = Tan(x) ElseIf n = 6 Then Z = 1 / Tan(x) Else Print "Ошибка: n>7" End If ………………………………………… Пример 6.3.4. Преподаватель за каждую решенную на контрольной рабо-

те задачу начислял баллы: за 1-ю и 2-ю задачи по 6 баллов, за 3-ю и 4-ю зада-чи по 9 баллов, за 5-ю задачу – 12 баллов. Оценка за контрольную работу выставлялась в зависимости от суммы набранных баллов: «отлично», если сумма баллов больше 35, «хорошо», если сумма баллов лежит в диапазоне [25; 34], «удовлетворительно» – [15; 24], «неудовлетворительно» – мень-ше 15 баллов.

Page 46: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

46

На форме должно быть 5 элементов CheckBox (по количеству представ-ленных задач), 2 элемента TextBox для вывода суммы баллов и оценки за работу (вместо элементов TextBox можно использовать Label), 3 элемента Label для надписей и 1 командная кнопка CommandButton.

Программный код можно записать так: Private Sub Command1_Click() Dim s As Byte, m As String 's – сумма баллов; m – оценка s = Check1.Value * 6 + Check2.Value * 6 + _ Check3.Value * 9 + Check4.Value * 9 + Check5.Value * 12 Select Case s Case Is < 15 m = "неудовлетворительно" Case 15 To 24 m = "удовлетворительно" Case 25 To 35 m = "хорошо" Case Is > 35 m = "отлично" End Select Text1.Text = s Text2.Text = m End Sub

Свойство Value флажка CheckBox принимает значение 1, если фла-жок установлен, и 0, если флажок сброшен, и, следовательно, значение переменной s будет принадлежать интервалу [0; 42]. Строковая перемен-ная m получит значение (оценку) в зависимости от суммы баллов. Резуль-тат работы программы представлен на рис. 6.3.8.

Рис. 6.3.8. Результат работы проекта «Контрольная работа»

Page 47: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

47

6.3.11. Операторы циклов

Циклы предназначены для многократного повторения одного или не-скольких операторов. В Visual Basic существуют три основных типа цик-лов – циклы со счетчиком (с известным числом повторений), циклы с ус-ловием и перечислимые циклы.

6.3.11.1. Цикл со счетчиком. Цикл со счетчиком (с известным числом повторений) в Visual Basic еще называют циклом For … Next. Так они называются потому, что его границы определяются двумя операторами For (для) и Next (следующий). Синтаксис этого оператора следующий:

For Счетчик = Нач_Значение To Кон_Значение [ Step Шаг] Операторы тела цикла [Exit For] Next [Счетчик]

В начале выполнения цикла значение переменной Счетчик устанавли-вается в начальное значение (Нач_Значение). При каждом проходе пере-менная Счетчик увеличивается на 1 или на величину шага (Step Шаг яв-ляется необязательным параметром в заголовке цикла). Когда значение этой переменной становится больше (при отрицательном шаге – меньше) конечного значения (Кон_Значение), цикл завершается, и выполняется следующий по порядку оператор. Exit For – оператор досрочного выхода из цикла (необязательный). Этот оператор используется, если необходимо «аварийно» завершить цикл при выполнении какого-либо дополнительно-го условия. Число выполнения цикла можно определить по формуле: (Кон_Значение – Нач_Значение) / Шаг + 1.

При аварийном завершении цикла значение переменной Счетчик ос-танется таким, каким оно было в момент выхода, в отличие от нормально-го завершения работы цикла, когда оно становится на шаг больше (при отрицательном шаге – меньше) заданного конечного значения. Приведен-ная особенность может быть использована при решении различных задач.

Примером цикла с известным числом повторений может служить вы-числение значения N! (N! = 1·2·3·…·N). Значение N должно быть опре-делено до оператора цикла (см. рис. 6.1.4).

F = 1 For I = 2 To N F = F * I Next I

В следующем примере происходит суммирование квадратов четных чисел от 2 до 100. Цикл прерывается досрочно, когда значение перемен-ной Sum станет больше 1000.

Page 48: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

48

Sum = 0 For J = 2 To 100 Step 2 Sum = Sum + J^2 If Sum > 1000 Then Exit For Next J

6.3.11.2. Циклы с условием. Оператор цикла с условием Do … Loop используется для организации циклов с неизвестным числом повторений (с предусловием и с постусловием). Для организации цикла с предуслови-ем этот оператор может использоваться в двух модификациях:

Do While условие продолжения цикла Операторы тела цикла [Exit Do] Loop

и Do Until условие прекращения цикла Операторы тела цикла [Exit Do] Loop

В первом случае операторы тела цикла выполняются, пока заданное условие продолжения цикла имеет значение True. Во втором случае опе-раторы тела цикла выполняются до тех пор, пока условие прекращения цикла не получит значения True. Например,

Eps = Val(Text1.Text): S = 0: N = 1 Do While 1 / N >= Eps S = S + 1 / N: N = N + 1 Loop

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

Для организации цикла с постусловием оператор Do … Loop также может использоваться в двух модификациях:

Do Операторы тела цикла [Exit Do] Loop While условие продолжения цикла и Do Операторы тела цикла [Exit Do] Loop Until условие прекращения цикла

Page 49: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

49

Условие выполнения или прекращения цикла здесь проверяется в кон-це, поэтому этот цикл обязательно выполняется хотя бы один раз. Напри-мер,

Eps = Val(Text1.Text): S = 0: N = 1 Do S = S + 1 / N: N = N + 1 Loop Until 1 / N < Eps

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

Иногда необходимо прервать цикл Do … Loop, если выполняется ка-кое-либо дополнительное условие. Это может быть выполнено с помощью оператора Exit Do. Для остановки бесконечного циклического процесса надо нажать клавиши Ctrl+Break.

Цикл While … Wend в Visual Basic играет второстепенную роль. Он используется только для совместимости с более ранними версиями Visual Basic, в которых не было оператора Do … Loop.

While условие продолжения цикла Операторы тела цикла Wend

Принцип его действия такой же, как и цикла Do While … Loop. Для цик-ла While … Wend нет оператора досрочного выхода типа Exit.

6.3.11.3. Перечислимые циклы. Цикл For Each предназначен для выполнения какой-либо операции с каждым объектом, входящим в состав некоторой коллекции объектов. Такими операциями могут быть вызов метода или обращение к свойству. Это позволяет выполнять групповые манипуляции с элементами управления или другими объектами аналогич-но тому, как это делается с массивами переменных. Синтаксис цикла For Each следующий:

For Each имя_объекта In имя_коллекции Операторы Next имя_объекта

Данный цикл выполняется определенное количество раз, которое оп-ределяется автоматически по числу элементов в коллекции. В Visual Basic определены две встроенные коллекции объектов, к которым можно обра-щаться непосредственно:

Forms – включает все загруженные формы проекта; Controls – включает элементы управления всех форм.

Page 50: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

50

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

Public | Private | Dim имя_коллекции As New Collection

Примером использования оператора For Each может служить проце-дура, предназначенная для очистки на форме всех текстовых полей (TextBox) и надписей (Label).

Private Sub Command1_Click() ' Кнопка Очистка Dim X As Control For Each X In Form1.Controls If Left(X.Name, 4) = "Text" Then X.Text = "" If Left(X.Name, 5) = "Label" Then X.Caption = "" Next X End Sub

В цикле For Each перебираются все элементы управления, размещен-ные на форме (Form1) и входящие в коллекцию Controls. По умолчанию все элементы TextBox имеют имена Text1, Text2 и т.д., элементы Label – Label1, Label2 и т.д. В первом условном операторе стирается содержимое полей, имена которых начинаются с символов Text, во вто-ром – с символов Label.

6.3.11.4. Правила выбора типа цикла. К основным правилам отно-сятся:

если заранее известно число повторений тела цикла, то лучше всего использовать оператор цикла For … Next;

если заранее не известно число повторений тела цикла и если окон-чание цикла зависит от выполнения некоторого условия, то лучше ис-пользовать конструкции Do While … Loop или Do Until … Loop;

если необходимо, чтобы цикл всегда выполнялся хотя бы один раз, то надо использовать конструкции Do … Loop While или Do … Loop Un-til;

если необходимо выполнять какие-либо действия с каждым эле-ментом из совокупности объектов, то надо использовать оператор For Each.

Пример 6.3.5. Определить сумму цифр S заданного положительного чис-ла А и разность А – S.

На рис 6.3.9 приведена блок-схема алгоритма решения этой задачи, а в правой части показаны результаты суммирования цифр для тестового примера А = 7492.

Page 51: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

51

Рис. 6.3.9. Блок-схема алгоритма «Сумма цифр числа»

Для решения данной задачи будем использовать цикл Do While … Loop, поскольку не известно число разрядов в числе. Объектами программы будут: число А, вводимое с клавиатуры, его копия В, сумма цифр S (до входа в цикл эту переменную следует обнулить) и С – переменная для те-кущей цифры числа, т.к. суммировать цифры будем последовательно.

Для отделения старшего разряда нужно знать, сколько в числе цифр, но это неизвестно. Зато операция получения остатка от деления (Mod) на 10 по-зволит выделить младший разряд. Прибавим его к значению переменной S. Для того, чтобы добраться до следующего по старшинству разряда, следует преобразовать число А, убрав цифру, которую уже обработали. Для этого используем операцию целочисленного деления на 10. Три этих действия и составят тело цикла. Выходить из цикла надо при обращении числа А в 0, так как в этом случае все цифры выделены и просуммированы. Сумму цифр вы-ведем после завершения цикла. По условию задачи нужно вывести не только сумму, но и разность между исходным значением числа и суммой его цифр. Однако значение переменной А в ходе выделения цифр обратилось в 0. Сле-довательно, до входа в цикл надо создать «резервную копию» числа А – объ-явить еще одну переменную В и присвоить ей значение числа А.

Сумма цифр

Ввод А

S = 0, B = A

A 0

C = A Mod 10 S = S + C A = A \ 10

да

Вывод S, B-S

Конец

нет

А 7492 749 74 7 0

7492

2 9 4 7

В

С

0 2 11 15 22S

Page 52: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

52

Программный код по данному алгоритму можно записать так: Private Sub Command1_Click() Dim A As Integer, B As Integer, C As Integer, S As Integer A = InputBox("Ввод А", "Сумма цифр числа") S = 0: B = A Do While A <> 0 C = A Mod 10 S = S + C A = A \ 10 Loop Print "Сумма цифр введенного числа "; B; " равна "; S Print "Разность между числом и суммой его цифр равна "; B - S End Sub

Результат работы программы представлен на рис. 6.3.10.

Рис. 6.3.10. Результат работы проекта «Сумма цифр числа»

Пример 6.3.6. Найти с заданной точностью сумму бесконечного число-вого ряда ...s

333 7

1

5

1

3

11

Точное значение этого ряда вычисляется по формуле 3 / 32. На рис 6.3.11 показана блок-схема алгоритма решения этой задачи. Поскольку на компьютере нельзя просуммировать бесконечное число сла-

гаемых, то приходится ограничиваться некоторым количеством первых чле-нов ряда. Возникающая при этом ошибка не превосходит по модулю послед-него учтенного члена. Из сказанного вытекает путь решения данной задачи: последовательно прибавлять к сумме очередное слагаемое, пока оно не ста-нет меньшим . Очередной член ряда вычисляется по формуле (-1)n+1/(2n-1)3, где n – номер члена ряда.

Программа по данному алгоритму выглядит так: Private Sub Command1_Click() ' Кнопка Расчет Const pi = 3.141592653589793 Dim n As Integer, v As Double, s As Double, _ y As Double, eps As Double

Page 53: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

53

eps = Val(InputBox("Ввод точности вычисления","Сумма ряда")) n = 1 ' номер члена ряда v = 1 ' член ряда s = v ' искомая сумма Do While Abs(v) >= eps ' продолжать вычисление пока ' v по модулю >= eps n = n + 1 ' вычисляется следующий номер члена ряда v = (-1)^(n + 1)/(2*n-1)^3 ' вычисляется n-й член ряда s = s + v ' накапливание суммы Loop y = pi^3 / 32 ' точное значение Print "Точность вычислений eps = "; eps Print "Число членов ряда n = "; n Print "Последний член ряда v = "; v Print "Сумма ряда s = "; s Print "Точное значение y = "; y End Sub

Рис. 6.3.11. Блок-схема алгоритма «Сумма ряда»

Результат работы программы представлен на рис. 6.3.12.

Сумма ряда

Ввод

n = 1, v = 1, s = v

|v|

n = n + 1 v = (-1)n+1/(2n-1)3 s = s + v

да

нет

y = 3/32

Вывод n,v,s,y

Конец

Page 54: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

54

Рис. 6.3.12. Результат работы проекта «Сумма ряда»

В лабораторном практикуме [9] разобрана аналогичная задача с ис-пользованием объектов TextBox для ввода исходных данных и вывода результата (Пример 2.3).

Если формула общего члена принадлежит к таким типам, как 1/n!, 1/2n и т.п., то для вычисления члена ряда целесообразно использовать рекуррентные соотношения, т.е. выражать последующий член ряда через предыдущий. Например, для ряда:

ns

2

1...

2

1

2

1

2

11

32

очередной член ряда равен значению предыдущего члена ряда, умножен-ному на сомножитель (-1/2), т.е. v = -v/2, где v – очередной член ряда.

Пример 6.3.7. Найти с заданной точностью сумму бесконечного сте-

пенного ряда ...xxx

s !3!2!1

132

Точное значение этого ряда вычисляется по формуле ex, | x | < . Алгоритм и программа этой задачи аналогичны алгоритму и программе

примера 6.3.6 за исключением формирования очередного слагаемого. Private Sub Command1_Click() ' Кнопка Расчет Dim n As Integer, v As Double, s As Double, _ y As Double, eps As Double, x As Double x = Val(InputBox("Ввод x","Сумма ряда")) eps = Val(InputBox("Ввод точности вычисления","Сумма ряда")) n = 0 v = 1 s = v Do While abs(v) >= eps n = n + 1 v = v * x / n s = s + v Loop y = exp(x)

Page 55: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

55

Print "x = "; x Print "Точность вычислений eps = "; eps Print "Число членов ряда n = "; n Print "Последний член ряда v = "; v Print "Сумма ряда s = "; s Print "Точное значение y = "; y End Sub

На рис. 6.3.13 показан результат работы программы. В программе все ве-щественные переменные имеют тип Double, поэтому значения v, s и y вы-ведены на печать с 15-ю значащими цифрами.

Рис. 6.3.13. Результат работы проекта «Сумма ряда _2»

Для получения максимального числа значащих цифр следует использо-вать тип Decimal. Для этого переменные v и s должны иметь тип Variant, а при вычислении они приобретают тип Decimal после использования функции преобразования типов данных CDec, например, v = CDec (v * x / n). В этом случае переменные v и s имеют 28 значащих цифр после точки. Встроенная функция exp(x) имеет тип Double и дает результат до 15 зна-чащих цифр. Результат работы программы с внесенными изменениями пока-зан на рис. 6.3.14.

Рис. 6.3.14. Результат работы проекта «Сумма ряда _2 (2-й вариант)»

Page 56: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

56

6.3.11.5. Вложенные циклы. Циклы называются вложенными, если те-лом цикла является циклическая структура. Цикл, содержащий в себе дру-гой цикл, называется внешним, а цикл, содержащийся в теле другого цик-ла, называется внутренним.

Внутренний и внешний циклы могут быть любыми из рассмотренных видов. Правила организации как внешнего, так и внутренних циклов ана-логичны правилам организации простого цикла. Рассмотрим их на приме-ре вложенных циклов типа For … Next.

For Счетчик_1 = Нач_Знач1 To Кон_Знач1 [ Step Шаг1] [Операторы] For Счетчик_2 = Нач_Знач2 To Кон_Знач2 [ Step Шаг2] Операторы Next [Счетчик2] [Операторы] Next [Счетчик1]

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

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

ременных z = 5x + y2, где x изменяется от 2 до 4 с шагом 1, y изменяется от 1 до 5 с шагом 2.

Private Sub Command1_Click() Dim X As Integer, Y As Integer, Z As Integer Print "X", "Y", "Z" Print "__________________________" For X = 2 To 4 For Y = 1 To 5 Step 2 Z = 5 * X + Y ^ 2 Print X, Y, Z Next Y Next X End Sub

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

Page 57: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

57

а можно для вложенных циклов использовать одно ключевое слово Next с перечислением имен изменяемых в данный момент счетчиков Next Y, X. При этом первому по порядку указанному счетчику соответствует бли-жайшее ключевое слово For.

Результат работы программы представлен на рис. 6.3.15.

Рис. 6.3.15. Результат работы проекта «Табулирование функции»

6.3.12. Работа с массивами

6.3.12.1. Объявление одномерных массивов. В Visual Basic различа-ют два вида переменных – простые переменные и переменные структур-ного типа. Частным случаем переменной структурного типа является мас-сив. Массив – это упорядоченная совокупность данных одного типа, объе-диненных общим именем. Массив представляет собой множество ячеек памяти для хранения значений, в то время как простая переменная имеет одну ячейку памяти, где может храниться только одно значение. Упоря-доченность заключается в том, что каждый элемент имеет определенное место в массиве, которое задается индексом массива, т.е. его порядковым номером. Элементы массива представляют собой разновидность перемен-ных, которые называют также переменными с индексами.

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

Page 58: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

58

изменения индекса, то по умолчанию она равна нулю, но если в разделе (General) модуля программы поместить оператор Option Base 1, то элементы массива будут нумероваться с единицы. Допускаются отрица-тельные значения индекса.

Примеры описания статических массивов: Dim B (5) As Single ' описан одномерный массив ' из 6 чисел вещественного типа Dim C (1 To 12) As Integer ' описан одномерный массив из 12 целых чисел

Динамические массивы применяются в том случае, когда количество элементов массива заранее неизвестно и будет определяться в процессе выполнения программы. Описание динамических массивов осуществля-ется в два этапа: объявление массива с использованием ключевого слова Dim, но без указания размера, затем в нужном месте процедуры описание массива с установкой фактического размера при помощи оператора ReDim. Например,

Dim AR ( ) As Long ' объявление динамического массива ... n = Val(InputBox ("Ввод количества элементов массива AR")) ReDim AR (1 To n) ' одномерный массив из n элементов

Позже количество элементов этого массива можно снова изменить: ReDim AR (1 To 2*n) ' одномерный массив из 2n элементов

После выполнения этого оператора все значения, хранящиеся в массиве, теряются. Чтобы сохранить их, необходимо использовать ReDim вместе с ключевым словом Preserve:

ReDim Preserve AR (1 To 2*n)

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

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

Dim n As Integer, arrA( ) As Integer n = 1000 ReDim arrA (1 To n) As Integer ' Память: 10002=2000 байт Erase arrA ' Память для arrA: 0 байт

Page 59: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

59

Область видимости массивов (контейнерных, глобальных) определяет-ся способом их объявления – если с помощью оператора Public, то мас-сив будет глобальным, если с помощью Private, то контейнерным.

6.3.12.2. Заполнение одномерных массивов. Заполнить одномерный массив исходными данными можно четырьмя способами: случайными числами с помощью датчика случайных чисел, с клавиатуры с помощью функции InputBox, с помощью элементов управления ListBox или Com-boBox, с помощью функции Array.

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

Например, Dim A(1 To 5) As Integer, i As Integer Randomize For i = 1 To 5 A(i) = Int(Rnd * 100) Next i

В этом примере массив из 5 элементов заполняется случайными чис-лами от 0 до 99. Функция Rnd генерирует случайное вещественное число в диапазоне от 0 до 1. При умножении этого числа на 100 и отбрасывания дробной части (функция Int), получается число в диапазоне от 0 до 99. Возвращаемые функцией Rnd числа на самом деле не являются случай-ными. При одинаковых начальных значениях генерируется одна и та же псевдослучайная последовательность чисел. Чтобы получить при каждом новом запуске программы другую последовательность, нужно использо-вать оператор Randomize. Общая формула для получения числа из задан-ного диапазона [a; b] выглядит так: (b – a) * Rnd + a. Например, для формирования массива, содержащего вещественные числа в диапазоне [-5; 5] надо записать оператор:

A(i) = 10 * Rnd – 5 2 способ. Если необходимо заполнить массив конкретными числами,

то используется функция InputBox. Например, Dim B ( ) As Single, N As Integer, i As Integer N = Val(InputBox("Ввод количества элементов массива В")) ReDim B (1 To N) For i = 1 To N B(i)=Val(InputBox("Ввод " & i & " элемента массива", _ "Ввод с клавиатуры")) Next i

Page 60: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

60

В диалоговом окне InputBox появляется подсказка с указанием номе-ра вводимого элемента за счет использования в ней переменной цикла i.

3 способ. Массив можно заполнить значениями из созданного на этапе проектирования простого списка ListN. Например,

Dim C( ) As Single, M As Integer, i As Integer M = List1.ListCount ReDim C (1 To M) For i = 1 To M C(i) = Val (List1.List(i-1)) Next i

Свойство ListCount определяет количество элементов в списке, а свойство List – содержимое указанной строки. Данные в списках по умолчанию имеют тип String, поэтому для выполнения арифметических действий необходимо выполнить преобразование их в числовой вид, для этого используется функция Val. Также следует учитывать тот факт, что нумерация в списках начинается с 0.

4 способ. Массив можно создать и заполнить значениями с помощью функции Array (список аргументов). Эта функция создает массив типа Variant. Список аргументов – это список значений, присваиваемых эле-ментам массива. Функцией Array без аргументов создается массив нуле-вой величины. Например,

Dim Var As Variant Var = Array (10, 20, 30)

В результате выполнения этих операторов будет создан массив типа Variant, элементы которого будут иметь значения: Var(0) = 10, Var(1) = 20, Var(2) = 30. Установка по умолчания нижней границы мас-сива зависит от значения оператора Option Base. В Visual Basic сущест-вует возможность определения значений нижней и верхней границы мас-сива, для чего используются функции LBound и UBound соответственно. Например,

Dim A As Variant, Ngr As Integer, Vgr As Integer Dim B( ) As Integer, i As Integer A = Array (3, 0, 8, 1, 16) Ngr = LBound (A): Vgr = UBound (A) ReDim B (Ngr To Vgr) For i = Ngr To Vgr B(i) = A(i)^2 . . . . . . . . . Next i

Page 61: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

61

Переменная типа Variant может содержать массив данных всех ти-пов, кроме строк фиксированной длины и типов, определенных пользова-телем.

6.3.12.3. Вывод значений одномерного массива на форму. Значения исходных и результирующих массивов можно вывести непосредственно на форму с помощью метода Print и записать в список ListN с помощью метода AddItem.

Массив А из N элементов можно вывести на форму с помощью опера-торов:

Print "Массив А" For i = 1 To N Print A(i) Next i

В этом случае элементы массива А будут выведены на форму в столбик по одному значению в строке. При большом количестве элементов в мас-сиве такой способ вывода массива не очень удобен. Целесообразно в опе-раторе Print A(i) поставить точку с запятой после A(i). В этом случае значения массива будут выводиться в строку через один пробел. Если вместо точки с запятой поставить запятую, то элементы массива будут выводиться по зонам (ширина зоны 14 символов). При выводе большого количества элементов необходимо предусмотреть своевременный переход на новую строку, в противном случае часть информации будет потеряна, так как окажется за пределами формы.

For i = 1 To N Print A(i); If i Mod 10 = 0 Then Print Next i Print

Массив будет выводиться на форму по 10 элементов в строке, и будет происходить переход к новой строке после вывода последнего элемента.

Формирование списка ListN программным способом осуществляется с помощью метода AddItem.

For i = 1 To N List2.AddItem (B(i)) Next i

И в методе Print, и в методе AddItem можно использовать функцию Format, форматирующую значение элемента массива в соответствии со сделанными установками. Например,

Print Format (A(i), "0.000 "); List2.AddItem Format(B(i), "#.##" )

Page 62: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

62

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

Пример 6.3.9. Вычислить сумму элементов одномерного массива a1, a2, … , an.

Блок-схема алгоритма, предназначенного для решения данной задачи, приведена на рис. 6.3.16.

Рис. 6.3.16. Блок-схема алгоритма «Сумма»

Предполагается, что массив а включает n элементов, пронумерован-ных, начиная с 1. Для нахождения суммы строится циклический вычисли-тельный процесс, в котором целочисленная переменная i играет роль счетчика цикла. На каждом шаге процесса значение переменной S увели-чивается на величину очередного элемента массива ai. Содержимое ячей-ки S, где накапливается искомая сумма, до входа в цикл обнуляется. В правой части рис. 6.3.16 показаны результаты суммирования элементов массива для тестового примера: n = 4, a1 = 3, a2 = 5, a3 = -2, a4 = 7.

Программный код по данному алгоритму можно записать так: Private Sub Command1_Click() ' Кнопка Расчет Dim a ( ) As Single, s As Single, i As Integer

Сумма

Ввод n, a1, a2,…,an

S = 0

S = S + ai

Вывод S

Конец

i = 1,…, n

i

S

a

n 4

3

5

-2

7

1, 2, 3, 4, 5

0, 3, 8, -6, 13

Page 63: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

63

n = Val(InputBox("Ввод количества элементов массива", _ "Программа Сумма")) ReDim a(1 To n) Cls ' очистка формы s = 0 Print "Исходный массив" For i = 1 To n a(i)=Val(InputBox("Ввод " & i & " элемента массива", _ "Программа Сумма")) Print Format(a(i), "0.00 "); ' печать элемента с ' 2-мя цифрами в дробной части Next i For i = 1 To n s = s + a(i) ' накопление суммы элементов массива Next i Print ' переход на новую строку Print "Сумма элементов ="; Format(s, "0.00") End Sub

Результат работы программы для тестового примера представлен на рис. 6.3.17.

Рис. 6.3.17. Результат работы проекта «Сумма»

Пример 6.3.10. В заданном одномерном массиве a1, a2, … , an подсчи-тать количество элементов, принадлежащих отрезку [s; t].

На рис. 6.3.18 приведена блок-схема алгоритма, предназначенного для решения данной задачи, и результаты подсчета количества элементов массива: a1 = 3, a2 = 8, a3 = -2, a4 = 5, a5 = 4, принадлежащих отрезку [2;5].

На каждом шаге циклического процесса проверяется условие принад-лежности текущего элемента массива ai отрезку [s; t] (s ai t). Если это условие выполняется, то значение переменной k увеличивается на 1, в противном случае значение переменной k не меняется. Содержимое ячей-ки k, где накапливается искомое количество элементов, до входа в цикл обнуляется.

Page 64: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

64

Рис. 6.3.18. Блок-схема алгоритма «Счетчик»

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

. . . . . . . . . k = 0 For i = 1 To n If a(i) >= s And a(i) <= t then k = k + 1 Next i . . . . . . . . .

Пример 6.3.11. В заданном одномерном массиве a1, a2, … , an найти максимальный элемент и его позицию (порядковый номер).

На рис. 6.3.19 приведена блок-схема алгоритма, предназначенного для решения данной задачи, и показаны результаты поиска максимального элемента и его порядкового номера для массива: a1 = 3, a2 = 7, a3 = -2, a4 = 8, a5 = 4.

Счетчик

Ввод n, s, t,a1, a2, …, an

k = 0

i =1, … , n

s ai t

k = k + 1

нет

да

Вывод k

Конец

i

k

a

n 5

3

8

-2

5

1, 2, 3, 4, 5, 6

0, 1, 2, 3

2

5

s

t

4

Page 65: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

65

Рис. 6.3.19. Блок-схема алгоритма «Максимум»

Алгоритм работает следующим образом. Переменной max присваива-ется значение первого элемента массива, а переменной k – его порядко-вый номер, т.е. 1. В цикле переменная i меняет свои значения от 2 до n с шагом 1. На каждом шаге циклического процесса значение i-го элемента массива сравнивается со значением переменной max и в случае, если ai > max, то переменной max присваивается значение ai, а переменной k – текущее значение переменной i.

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

. . . . . . . . . max = a(1): k = 1 For i = 2 To n If a(i) >= max then max = a(i): k = i Next i . . . . . . . . .

Максимум

Ввод n, a1, a2,…,an

max = a1, k = 1

i = 2, … , n

ai > max

max = ai, k = i

нет

да

Вывод max, k

Конец

max

i

k

a

n 5

3

7

-2

8

2, 3, 4, 5, 6

3, 7, 8

4

1, 2, 4

Page 66: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

66

6.3.12.5. Алгоритмы сортировки элементов массива. Одной из ос-новных операций, производимых над массивами, является операция сор-тировки или упорядочения элементов массива по какому-либо признаку: по возрастанию (ar(i) < ar(i+1)), убыванию (ar(i) > ar(i+1)), не-убыванию (ar(i) ar(i+1)), невозрастанию (ar(i) ar(i+1)) – для чисел и по алфавиту – для символов и строк. Методы сортировки, очень важные в теоретическом отношении, широко используются как в научных задачах, так и в задачах управления. Они породили огромное число ис-следований. На таком легко формулируемом примере, как сортировка, можно сравнивать различные алгоритмы, исследовать их эффективность и поведение в зависимости от числа и формы данных. Существует множе-ство алгоритмов сортировки, но нет идеального: либо алгоритм прост, краток и понятен, но медленно работает, либо работает быстро, но сло-жен. Наиболее популярными алгоритмами являются сортировка по мето-ду прямого выбора и сортировка по методу прямого обмена.

Пример 6.3.12. Отсортировать массив a1, a2, … , an по возрастанию с использованием метода прямого выбора.

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

Программный код, записанный по данному алгоритму, выглядит так: Private Sub Command1_Click() ' Кнопка Расчет Dim a() As Integer, min As Integer, k As Integer, _ i As Integer, j As Integer, b As Integer n = Val(InputBox("Ввод количества элементов массива", _ "Программа Сортировка")) ReDim a(1 To n) Cls ' очистка формы Randomize Print "Исходный массив" For i = 1 To n a(i) = Int(Rnd * 10): Print a(i); " ";

Page 67: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

67

Next i For i = 1 To n - 1 min = a(i): k = i For j = i + 1 To n If a(j) <= min Then min = a(j): k = j Next j b = a(i): a(i) = a(k): a(k) = b Next i Print: Print "Массив, упорядоченный по возрастанию" For i = 1 To n Print a(i); " "; Next i End Sub

Рис. 6.3.20. Блок-схема алгоритма «Сортировка выбором»

b

k

j

Сортировка выбором

Ввод n, a1, a2,…,an

i

min

a

n 6

8 0

4 1

2

7 4

1 2 3 4 5 6

8 4 2 1 0 4 2 1 2 7 4

1 4 7

1 2 3 5 6 2 3 5 3 4 5

i = 1 ,…, n-1

min = ai, k = i

j = i + 1,…, n

aj < min

b = ai, ai = ak, ak = b

нет

min = aj, k = j

да

0 8

2 3 4 5 6 7 3 4 5 6 7 4 5 6 7 5 6 7

8 4 2 7 Вывод

a1, a2,…,an

Конец

Page 68: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

68

Результат работы программы представлен на рис. 6.3.21.

Рис. 6.3.21. Результат работы проекта «Сортировка выбором»

Пример 6.3.13. Отсортировать массив a1, a2, … , an по возрастанию с использованием метода прямого обмена, или метода «пузырька».

Блок-схема алгоритма представлена на рис.6.3.22.

Рис. 6.3.22. Блок-схема алгоритма «Сортировка обменом»

да

j

Сортировка обменом

Ввод n, a1, a2,…,an

i

b

a

n 6

8 4 2 0

4 8 2 4 1 2 0 1

2 8 7 1 4 0 2

7 8 1 7 0 4

1 2 3 4 5 6

8 7 4 2 1

1 8 0 7

i = 1 ,…, n-1

j = 1,…, n-j

aj > aj+1

b = aj, aj = aj+1, aj+1 = b L = false

нет

да

0 8

1 2 3 4 5 6 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1

L True false

L = True

L нет

Вывод a1, a2,…,an

Конец

Page 69: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

69

Алгоритм включает два вложенных цикла. Во внутреннем цикле по-следовательно сравниваются значения пар соседних элементов. Если ле-вый элемент оказывается больше правого, то производится перестановка. В результате выполнения внутреннего цикла максимальный из просмот-ренных элементов, где бы он не находился до выполнения цикла, оказы-вается на последнем месте. Повторяя внутренний цикл n-1 раз, добиваем-ся полного упорядочения массива. При каждом повторении внутреннего цикла число обрабатываемых элементов массива следует уменьшать на единицу во избежание обработки элементов, уже упорядоченных на пре-дыдущих шагах внутреннего цикла. В алгоритме используется логическая переменная L, играющая роль индикатора окончания процесса упорядоче-ния. До внутреннего цикла ей присваивается значение True (истина), и если во внутреннем цикле ни разу не переставлялись элементы, это значе-ние сохраняется, что приводит к досрочному окончанию внешнего цикла. Тем самым исключаются непроизводительные действия при досрочном упорядочении массива. Если представить, что элементы массива – это пузырьки в сосуде с водой, каждый с весом, равным его значению, то ка-ждый проход с обменом по массиву приводит к «всплыванию пузырька» на соответствующий его весу уровень. Благодаря такой аналогии сорти-ровка простым обменом получила название пузырьковой сортировки.

Программный код по данному алгоритму можно записать так: Private Sub Command1_Click() ' Кнопка Расчет Dim a() As Integer, b As Integer, i As Integer, _ j As Integer, L As Boolean n = List1.ListCount ' количество элементов в списке ReDim a(1 To n) For i = 1 To n a(i) = Val(List1.List(i - 1)) ' заполнение массива значениями из списка Next i For i = 1 To n - 1 L = True For j = 1 To n - i If a(j) > a(j + 1) Then b = a(j): a(j) = a(j + 1): a(j + 1) = b L = False End if Next j If L Then Exit For Next i For i = 1 To n List2.AddItem (a(i)) ' формирование списка List2

Page 70: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

70

Next i End Sub

Результат работы программы представлен на рис. 6.3.23.

Рис. 6.3.23. Результат работы проекта «Сортировка выбором»

Существует метод быстрой сортировки (Quicksort). Он заключается в следующем. Среди n значений, которые надо отсортировать, выбираем значение, называемое ведущим элементом. В самом начале этот выбор производится случайным образом. Затем в начало массива помещаем все элементы, меньше ведущего, а в конец – все остальные. На каждой из по-лученных последовательностей повторяем эту операцию, до тех пор не получим последовательности, состоящие из одного или двух элементов. Таким образом, массив отсортирован.

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

6.3.12.6. Многомерные массивы. Для описания многомерных масси-вов используются конструкции, аналогичные конструкциям, рассмотрен-ным выше для одномерных массивов. Отличие состоит лишь в том, что при объявлении массивов через запятую указываются несколько границ размерностей. Например, двумерный массив из 6 столбцов и 5 строк, со-держащий целые числа, объявляется следующим образом:

Dim D (1 To 5, 1 To 6) As Integer

В Visual Basic допускается описание массивов, имеющих до 60 раз-мерностей.

В обработке двумерных массивов (матриц) есть своя специфика – ис-пользование вложенных циклов. Для заполнения двумерного массива Amn (m – число строк, n – число столбцов) случайными числами в интервале от 0 до 20 используются операторы:

Page 71: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

71

For i = 1 To m For j = 1 To n A(i,j) = Rnd * 20 Next j Next i

Матрицу Amn можно заполнить конкретными числами, используя функцию InputBox:

For i = 1 To m For j = 1 To n A(i, j) = Val(InputBox("Ввод элемента массива " & _ "с индексами " & i & "," & j)) Next j, i

И в первом, и во втором случае сначала получает значение элемент А(1,1), затем А(1,2), …, А(1,n). После заполнения 1-й строки пере-менная внешнего цикла i увеличивается на 1 и заполняются значениями элементы 2-й строки А(2,1), А(2,2), …, А(2,n). Затем заполняются 3-я, 4-я, …, m-я строки матрицы. Значения m и n должны быть определены до циклов. Если удобнее вводить значения элементов по столбцам, а не по строкам, то надо поменять местами заголовки циклов.

Исходные и результирующие матрицы можно выводить непосредст-венно на форму или в виде таблицы Microsoft FlexGrid. Использова-ние нестандартного элемента Microsoft FlexGrid рассмотрено в лабо-раторном практикуме [9] (п. 3.4).

Для вывода на форму матрицы вещественного типа можно использо-вать операторы:

Print Tab(14 * (n - 1) \ 2); "Матрица А" For i = 1 To m For j = 1 To n Print Format(А(i, j), "0.000"), Next j Print Next i

Поскольку после оператора Print стоит запятая, то элементы матрицы выводятся на форму построчно, причем элементы 2-го столбца будут вы-ведены, начиная с 15-й позиции, 3-го – с 29-й позиции и т.д. Оператор Print без параметров, указанный после внутреннего цикла, после вывода каждой строки матрицы переводит курсор в начало новой строки. Для того чтобы заголовок матрицы был отцентрирован по отношению к эле-ментам матрицы, начальную позицию заголовка можно вычислить по

Page 72: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

72

формуле: 14 * (n - 1) \ 2, где n – число столбцов матрицы, 14 – ширина зоны столбца, \ – знак операции деления нацело.

При обработке матриц с элементами целого типа (однозначных, дву-значных) использовать при выводе элементов в качестве разделителя за-пятую не очень удобно, так как будет слишком большое расстояние меж-ду элементами строки. В этом случае можно рекомендовать такой способ записи оператора Print:

Print Tab((j - 1) * 6); B(i, j);

где 6 – ширина зоны. Естественно можно использовать и другие значения: 5, 7, 8, 9 и т.д. Чем меньше ширина зоны, тем меньше пробелов будет ме-жду элементами строки матрицы.

Пример 6.3.14. Провести транспонирование матрицы, созданной с по-мощью датчика случайных чисел.

Блок-схема транспонирования матрицы приведена на рис. 6.3.24. Транспонировать прямоугольную матрицу Amn (m – число строк, n –

число столбцов) – это значит поменять строки и столбцы местами, т.е. получить матрицу AТnm (ATij = Aji, i = 1, 2, …, n, j = 1, 2, …, m).

Рис. 6.3.24. Блок-схема алгоритма «Транспонирование матрицы»

Программный код по данному алгоритму можно записать так:

Транспонирование

Ввод m, n a11, a12,…,amn

i = 1 ,…, n

j = 1,…, m

atij = aji

Вывод at11,at12,…,atnm

Конец

Page 73: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

73

Private Sub Command1_Click() ' Кнопка Расчет Dim A( ) As Single, AT( ) As Single, i As _ Integer, j As Integer, m As Integer, n As Integer Randomize: m = Int(Rnd * 3 + 3): n = Int(Rnd * 3 + 3) ' m – число строк, n – число столбцов в диапазоне[3;5] ReDim A(1 To m, 1 To n), AT(1 To n, 1 To m) For i = 1 To m For j = 1 To n A(i, j) = Rnd * 10 'формирование элементов исходной матрицы Next j, i Print Tab(6 * (n - 1) \ 2); "Исходная матрица А" For i = 1 To m For j = 1 To n Print Tab((j - 1) * 10); Format(А(i,j), "0.00"); Next j Print Next i For i = 1 To n For j = 1 To m AT(i, j) = A(j, i) ' формирование матрицы AT Next j, i Print Tab(5 * (n - 1) \ 2); "Транспонированная матрица АТ" For i = 1 To n For j = 1 To m Print Tab((j - 1) * 10); Format(АТ(i,j), "0.00"); Next j Print Next i End Sub Результат работы программы представлен на рис. 6.3.25.

Рис. 6.3.25. Результат работы проекта «Транспонирование матрицы»

Page 74: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

74

В лабораторном практикуме [9] рассмотрен данный пример с выводом исходной и транспонированной матрицы в виде таблицы Microsoft FlexGrid (Пример 3.5).

6.3.13. Пользовательские процедуры и функции

6.3.13.1. Модульное программирование в Visual Basic. Использова-ние принципов модульного программирования Windows-приложения в среде проектирования Visual Basic выражено в двух аспектах: Разбиение программного кода на отдельные компактные модули. В

файле модуля формы (.frm) содержится программный код, относящийся к форме и объектам этой формы. В стандартном модуле (.bas) содержат-ся программные коды, которые могут использоваться не в одной, а в не-скольких формах. Разбиение программного кода уже внутри модуля на отдельные

части – процедуры. Под процедурой или функцией понимается последовательность опера-

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

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

Использование процедур общего назначения в проектах Visual Basic дает следующие преимущества: позволяет избежать повторных операторов в программе; делает программу более удобочитаемой; программа в этом случае

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

рабатывать, писать и отлаживать, а, если программу разрабатывает группа программистов, ее легче собирать; разработанные процедуры могут быть использованы в других про-

граммных проектах. 6.3.13.2. Процедуры общего назначения типа Sub. Основной отли-

чительной чертой процедур общего назначения является то, что они не связаны ни с каким событием и их вызов разработчик осуществляет по своему усмотрению. Для создания такой процедуры достаточно ввести ключевое слово Sub и имя процедуры в окне кода (но не внутри другой процедуры или функции) и нажать клавишу Enter. После этого Visual Basic дополнит введенный код оператором конца процедуры End Sub.

Page 75: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

75

Так как процедура не связана ни с одним элементом управления, то поле Object окна кода вместо имени объекта содержит строку (General). Для того чтобы просмотреть список процедур общего назначения, необходимо выбрать в списке Object поле (General).

Синтаксис для описания процедур типа Sub следующий: Sub имя_процедуры (формальные параметры) Операторы процедуры End Sub

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

Вызов процедуры производится следующим образом: Имя_процедуры фактические параметры

или Call имя_процедуры (фактические параметры)

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

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

Выполнение оператора вызова процедуры состоит в следующем: все формальные параметры заменяются соответствующими факти-

ческими; создается так называемый динамический экземпляр процедуры, ко-

торый и выполняется; после выполнения процедуры происходит передача управления в

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

По умолчанию фактические параметры передаются в процедуру по ссылке. Это означает, что вызванная процедура получает физический ад-рес памяти переданной переменной и может изменить ее значение. Если

Page 76: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

76

процедура не должна изменять фактические параметры, их следует пере-давать по значению. Для этого при объявлении процедуры в списке фор-мальных параметров нужно использовать ключевое слово ByVal. В этом случае Visual Basic передает копию содержимого переменной вместо ее адреса в памяти, и процедура не сможет напрямую модифицировать ис-ходное значение фактического параметра. Следовательно, исходные дан-ные должны передаваться в процедуру по значению, а результаты работы процедуры – по ссылке.

Как уже упоминалось выше, в Visual Basic есть три вида областей оп-ределения, характеризующих доступность переменной, – локальная, кон-тейнера, глобальная.

Локальными называются переменные, определяемые внутри процеду-ры или функции. Они доступны только внутри этой процедуры, при вы-ходе из процедуры удаляются из памяти, а при новом вызове процедуры инициализируются заново. Переменные контейнера определяются в раз-деле (General) с помощью оператора Dim и доступны внутри соответст-вующего контейнера, т.е. формы или модуля. Глобальные переменные определяются в разделе (General) модуля с помощью оператора Public. Глобальные переменные доступны во всех модулях и процедурах проекта.

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

Dim C As Integer Sub Proverka (A As Integer, ByVal B As Integer) Dim D As Integer A = A + 1: B = B + 1: C = C + 1: D = A * B End Sub Private Sub Command1_Click( ) Dim X As Integer, Y As Integer, D As Integer X = 3: Y = 5: C = 6: D = 0 Call Proverka (X,Y) Print X, Y, C, D End Sub

В результате вызова процедуры Proverka переменная Х получит зна-чение 4, переменная Y останется равной 5, переменная С получит значение 7, а переменная D – 0.

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

Page 77: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

77

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

Sub Input_mas(n As Integer, A() As Integer, im As String) Dim i As Integer n = Val(InputBox("Ввод числа элементов массива " & im)) ReDim A(1 To n) For i = 1 To n A(i) = Val(InputBox("Ввод " & i & " элемента массива " & im)) Next i End Sub Sub Output_mas(ByVal n As Integer, A() As Integer, im As String) Dim i As Integer Print Tab(3); "Массив "; im For i = 1 To n Print A(i); " "; Next i Print End Sub Private Sub Command1_Click() ' Кнопка Расчет Dim A() As Integer, B() As Integer, C() As Integer, _ n As Integer, m As Integer, k As Integer Input_mas n, A(), "A": Output_mas n, A(), "A" Input_mas m, B(), "B": Output_mas m, B(), "B" Input_mas k, C(), "C": Output_mas k, C(), "C" . . . . . . . .

End Sub

Параметры процедур могут быть и типа Control. В процедуре Shrift заданы параметры шрифта для элементов управления: шрифт Times, по-лужирное начертание, размер 14 пт.

Private Sub Shrift (elem_upr As Control) elem_upr.Font.Name = "Times" elem_upr.Font.Bold = True elem_upr.Font.Size = 14

End Sub

Теперь настраивать шрифт элементов управления очень просто. Private Sub Command1_Click() Shrift Labe11 Shrift Text1 Shrift Command2

End Sub Указанные в процедуре Shrift настройки шрифта будут применены к

объектам Label1, Text1, Command2. Если необходимо применить эти на-

Page 78: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

78

стройки шрифта ко всем элементам управления, находящимся на форме, то надо воспользоваться оператором цикла For Each.

Private Sub Command1_Click() Dim elem_upr As Control For Each elem_upr In Controls Shrift elem_upr Next elem_upr End Sub

В процедуре Shrift в левой части трех операторов присваивания по-вторяется одно и то же имя объекта elem_upr и его свойство Font. В таких случаях удобно использовать оператор With, позволяющий указы-вать имя объекта только один раз для последовательности операторов. Процедуру Shrift с использованием оператора With можно записать так:

Private Sub Shrift (elem_upr As Control) With elem_upr.Font .Name = "Times" .Bold = True .Font.Size = 14 End With

End Sub

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

Dim strPart, rezult As String Sub Concat(ParamArray arrPart()) rezult = "" For Each strPart In arrPart rezult = rezult & strPart Next Print rezult End Sub Private Sub Command1_Click() Concat "Любое ", "число Concat "Любое ", "число ", "параметров" End Sub

Процедура Concat объединяет в одну строку несколько заданных строк, количество которых может быть произвольным. При обработке массива arr-

Page 79: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

79

Part с неизвестным числом элементов был использован цикл For Each. Ка-ждый элемент, принадлежащий массиву arrPart должен иметь тип Va-riant. Результатом работы данного проекта будут две строки:

Любое число Любое число параметров

6.3.13.3. Процедуры-функции общего назначения типа Function. Функция – это процедура, возвращающая результат. Ее надо применять, когда вызывающая программа должна вернуть только один результат. Синтаксис функции:

Function имя_функции (формальные параметры) As тип Операторы функции End Function

Основные отличия функции от процедуры типа Sub: функция имеет тип (аналогично переменной) и может возвращать в

программу значение, присваиваемое функции при помощи оператора: имя_функции = значение

вызов функции осуществляется посредством указания в правой части какого-либо оператора ее имени и фактических операторов.

Пример 6.3.15. Провести расчеты по формуле:

)yx(arctg

yarcsinxarcsinz

3

2 ,

оформив вычисление арксинуса в виде функции. Программный код можно записать так: Function arcsin(x As Single) As Single Arcsin = Atn(x / Sqr(1 - x ^ 2)) End Function Private Sub Command1_Click() Dim x As Single, y As Single, z As Single x = Val(InputBox("Ввод x (-1 < x < 1)", "Ввод аргумента")) y = Val(InputBox("Ввод y (-1 < y < 1)", "Ввод аргумента")) z = (Arcsin(x ^ 2) + Arcsin(y)) / Atn(x + y) ^ 3 Print "x="; x, "y="; y, "z="; z End Sub

В результате работы программы с исходными данными x = 0.3 и y = -0.7 переменная z получит значение 12.43883.

При использовании функций может встретиться обращение функций к самим себе. Такое обращение называется рекурсивным. Многие математиче-ские функции можно выразить рекурсивно. В качестве примера рассмотрим вычисление n!. В п. 6.3.11 рассматривался пример вычисления n! с помо-

Page 80: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

80

щью оператора цикла For … Next, а в следующем примере будет рассмот-рен другой способ вычисления n!.

Пример 6.3.16. Провести расчеты по формуле k = m! + 2n!, оформив вы-числение факториала в виде функции:

0если)!1(

0если1!

n,nn

n,n

Программный код для решения этой задачи выглядит так: Function fact(ByVal n As Byte) As Currency If n = 0 then fact = 1 Else fact = fact(n – 1) * n End Function Private Sub Command1_Click() Dim k as Currency, m as Byte, n as Byte m = Val(InputBox("Ввод m", "Ввод аргумента")) n = Val(InputBox("Ввод n", "Ввод аргумента")) k = fact(m) + 2 * fact(n) Print "k =";m;"! + ”;n; "! =”; k End Sub

При обращении к функции fact фактический параметр m заменяет фор-мальный параметр n. Если m > 0, возникает рекурсивное обращение к функ-ции fact со значением параметра (m – 1). Создается копия тела функции и для нового параметра-значения m – 1 выделяется новая переменная, локаль-ная по отношению к копии тела функции, которая и получает вычисленное значение. Затем вновь производится обращение к функции со значением (m – 2) т.д., пока значение параметра не станет равным 0.

Результат работы программы для m = 5 и n = 4 выглядит так: k = 5! + 2 * 4! = 168

В данной программе аргумент функции fact не должен превышать 17 (17!= 355687428096000). При n или m больше 17 выдается ошибка Overflow (переполнение). Если надо вычислять факториалы от чисел, превышающих 17, то функция должна быть типа Variant.

6.3.14. Работа с файлами

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

Page 81: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

81

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

При записи данных в файл необходимо выполнить: открытие файла для записи, запись компонентов файла, закрытие файла. При чтении фай-ла необходимо выполнить: открытие файла для чтения, чтение компонен-тов файла, закрытие файла. При открытии файлу ставится в соответствие канал ввода/вывода с определенным номером – дескриптором. Таким образом, каждый открытый файл имеет собственный канал, с помощью которого записываются или считываются данные. Следовательно, для ввода и вывода данных в файл имеет значение не имя файла, а дескрип-тор. Кроме того, операционная система должна иметь сведения о наличии свободных каналов, которые можно использовать для открытия файлов. Номер свободного канала можно узнать с помощью функции FreeFile.

6.3.14.2. Типы доступа к файлам. В Visual Basic реализованы три типа доступа к файлам: последовательный – для чтения и записи текстовых файлов; произвольный – для чтения и записи в текстовые и двоичные фай-

лы структурированных данных в виде записей фиксированной длины; двоичный – для чтения и записи данных в файлы произвольной

структуры. При создании каналов ввода/вывода система должна знать, какой тип

доступа к каждому конкретному файлу нужно использовать и какова структура данных этого файла.

6.3.14.3. Файлы последовательного доступа. Последовательный дос-туп используется главным образом при работе с текстовыми файлами. Содержимым подобных файлов является последовательность строк про-извольной длины, которые были созданы при помощи какого-либо тек-стового редактора. При этом в конце каждой строки находится особое сочетание символов, которое обозначает ее окончание и состоит из «пере-хода на новую строку» (код в таблице символов = 13) и «перехода в нача-ло строки» (код = 10). Любой файл завершается специальным символом «конец строки» (код = 26).

Операции с текстовыми файлами должны выполняться построчно, при этом после обработки очередной строки указатель автоматически пере-мещается на следующую строку. Если в ходе выполнения программы не-обходимо проверять условие достижения конца файла, то следует приме-нять функцию Eof (Дескриптор_файла), результатом которой является логическое значение True или False.

Для открытия текстового файла используется оператор: Open Имя_файла For Режим_работы As Дескриптор_файла

Page 82: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

82

Имя_файла – это путь к файлу на диске, взятый в кавычки. Режим_работы может принимать одно из трех значений: Input – для чтения данных из файла; Output – для записи данных в файл; Append – для добавления информации в конец файла. При использовании в операторе Open ключевого слова Input откры-

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

Дескриптор_файла – любое целое число от 1 до 511. Для закрытия файла предназначен оператор Close # Дескриптор_файла

Для записи информации в файл используются операторы Print и Write. Операторы записи выглядят так:

Print # Дескриптор_файла, Список значений Write # Дескриптор_файла, Список значений

Оператор Print функционирует почти так же, как оператор Print для экрана, с той лишь разницей, что данные не выводятся на экран, а сохра-няются в файле, открытом для записи или добавления (Open … For Out-put или Open … For Append).

Список значений – это значения или переменные, записанные через разделитель. Разделителем является точка с запятой или запятая. От раз-делителя зависит, как значения будут записаны в текстовую строку файла. В случае точки с запятой значения записываются подряд, без промежут-ков между ними. В случае запятой значения в файле разделяются симво-лами табуляции. В списке значений могут присутствовать функции Spc(n) – для вставки n пробелов между значениями в строке и Tab(n) – для указания номера n позиции для записи следующего значения. Если список значений отсутствует, то в файл будет записана пустая строка.

В операторе Write разделителем в списке значений является запятая. Список значений просматривается последовательно, и элементы списка записываются в одну текстовую строку файла через запятую. Элементы типа String заключаются в кавычки. После записи последнего элемента записывается символ перехода на новую строку.

Чтение из файла можно производить тремя способами: оператором Input, оператором Line Input, с помощью функции Input.

Page 83: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

83

Синтаксис оператора Input следующий: Input # Дескриптор_файла, переменная_1, _ переменная_2, …, переменная_N

Он считывает данные и размещает их в переменных заданного списка. Последовательные файлы всегда должны читаться с начала файла.

Оператор Line Input считывает строку полностью и размещает ее в переменной типа String. Синтаксис этого оператора такой:

Line Input # Дескриптор_файла, переменная

Функция Input используется обычно для чтения всего содержимого файла и помещения его на экранную форму в объект TextBox, которому предварительно задаются свойства MultiLine – True и ScrollBars – Vertical, так как файл может содержать большое количество строк. Раз-мер файла в символах определяется с помощью функции Lof (Дескрип-тор_файла).

Пример 6.3.17. Разработать программу для чтения из текстового файла D:\Students\Группа_1.txt, как всех записей и помещения их на экранную форму в объект TextBox, так и отдельных полей с выводом их в три спи-ска ListBox. Этот текстовый файл содержит сведения о студентах груп-пы: фамилия, имя и год рождения.

На форме должны быть размещены следующие элементы управления: TextBox, которому предварительно задаются свойства MultiLine – True и ScrollBars – Vertical, 3 элемента ListBox для отдельных полей за-писи, 4 элемента Label для вывода заголовков и 2 командные кнопки CommandButton для организации чтения всего содержимого файла и вы-вода фамилий, имен и года рождения в разные списки.

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

Private Sub Command1_Click()' Кнопка Чтение из файла Dim kol_sym As Integer, nf As Byte nf = FreeFile 'Определение свободного канала ввода-вывода Open "D:\Students\Группа_1.txt" For Input As #nf kol_sym = LOF(nf) 'Количество символов в файле Text1.Text = Input(kol_sym, nf) Close #nf End Sub

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

Page 84: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

84

пустим, что файл D:\Students\Группа_1.txt был создан в текстовом редакто-ре Блокнот и выглядит так:

Петухов Борис, 1988 Михайлов Евгений, 1989 . . . . . . . . . . . В этом случае процедуру, предназначенную для формирования списков,

можно записать следующим образом: Private Sub Command2_Click()'Кнопка Формирование списков Dim Str As String, Surname As String, Name As String, _ Year As Integer, m As Byte, k As Byte, nf As Byte nf = FreeFile Open "D:\Students\Группа_1.txt" For Input As #nf Do Until EOF(nf) 'Читать из файла до достижения конца файла Line Input #nf, Str ' Чтение строки файла m = InStr(Str, " ") 'Номер позиции 1-го пробела в строке Surname = Left(Str, m - 1) 'Фамилия - первые (m-1) символов в строке List1.AddItem Surname 'Добавление фамилии в список List1 k = InStr(Str, ",") 'Номер позиции запятой в строке Name = Mid(Str, m + 1, k - m - 1) 'Начало имени - (m+1)-я позиция, длина - (k-m-1)символов List2.AddItem Name 'Добавление имени в список List2 Str = RTrim(Str) 'Удаление пробелов в конце строки Year = Val(Right(Str, 4)) 'Год рождения - 4 последних символа в строке List3.AddItem Year 'Добавления года рождения в список List3 Loop Close #nf End Sub Результат работы программы представлен на рис. 6.3.26.

Рис. 6.3.26. Результат работы проекта «Файл последовательного доступа»

Page 85: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

85

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

"Петухов", "Борис", 1988 "Михайлов", "Евгений", 1989 . . . . . . . . . . . В этом случае процедуру, предназначенную для формирования спи-

сков, можно записать так: Private Sub Command2_Click()'Кнопка Формирование списков Dim Surname As String, Name As String, Year As Integer, _ nf As Byte nf = FreeFile Open "D:\Students\Группа_1.txt" For Input As #nf Do Until EOF(nf) 'Читать из файла до достижения конца файла Input #nf, Surname, Name, Year List1.AddItem Surname 'Добавление фамилии в список List1 List2.AddItem Name 'Добавление имени в список List2 List3.AddItem Year 'Добавления года рождения в список List3 Loop Close #nf End Sub

Результат работы программы представлен на рис. 6.3.27.

Рис. 6.3.27. Результат работы проекта

«Файл последовательного доступа (2)»

В лабораторном практикуме [9] в примерах 5.1 и 5.2 рассмотрены дру-гие операции с файлами последовательного доступа: создание файла, до-бавление строк в файл, анализ содержимого файла.

6.3.14.4. Файлы произвольного доступа. Файлы с произвольным (или прямым) доступом организованы таким образом, что можно осуществить

Page 86: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

86

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

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

Записи файла читаются и/или записываются в три этапа: открытие файла, чтение или запись данных, закрытие файла.

Для открытия файла используется оператор Open следующего формата: Open Имя_файла For Random As Дескриптор_файла [Len = length]

В отличие от текстовых файлов здесь не делается различия между файла-ми для записи и файлами для чтения; все они открываются в одном режиме Random. Параметр Len определяет длину записи. Если опустить этот пара-метр, то длина записи по умолчанию будет равна 128 байтам.

Формат файлов произвольного доступа задается пользователем с помо-щью оператора Type … End Type в зависимости от количества полей и их типа в записи:

Type Имя_типа Имя1 As тип ' Структурный элемент создаваемого типа (поле) Имя2 As тип . . . . . . ИмяN As тип End Type

Имя_типа – имя создаваемого типа (идентификатор), ИмяN As Тип – описание структурного элемента создаваемого типа (поля). Структура Type … End Type обязательно должна быть расположена в разделе (Gener-al) соответствующего модуля. Для получения доступа к созданной структуре необходимо одной или нескольким переменным определить описанный вы-ше тип. При этом определяемой переменной можно задать область видимо-

Page 87: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

87

сти с помощью ключевых слов Private или. Public. Обращение к элемен-ту пользовательского типа имеет синтаксис:

Имя_переменной.Имя_структурного_элемента

Доступ к структурным элементам (полям) записи осуществляется в таком же формате, как при работе со свойствами объектов. Необходимо отметить, что для названий полей в записи, так же, как и для свойств объектов, автома-тически высвечивается всплывающая подсказка со списком возможных имен. При этом для заполнения полей записи, особенно в случае большого их коли-чества, можно использовать конструкцию With … End With. Формат этой конструкции следующий:

With запись .поле1 .поле2 . . . . .полеN End With

Для записи и чтения данных используются соответственно операторы Put и Get:

Put # Дескриптор_файла, Номер_записи, Имя_переменной Get # Дескриптор_файла, Номер_записи, Имя_переменной

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

Имя_переменной – это имя переменной пользовательского типа, зна-чением которой является запись, помещаемая в файл или извлекаемая из файла.

Пример 6.3.18. Разработать программу заполнения файла произволь-ного доступа записями, содержащими сведения о студентах (фамилия студента длиной 15 символов, имя длиной 15 символов и год рождения) с последующим чтением записи заданного номера.

Private Type Student ' Пользовательский тип данных surname As String * 15 ' Фамилия name As String * 15 ' Имя year As Integer ' Год рождения

End Type Dim st As Student Private Sub Command1_Click() ' Кнопка Создание файла Dim nf As Byte, n As Integer, nz As Integer nf = FreeFile 'Определение номера свободного канала Open "D:\Students\Gruppa.dat" For Random As #nf Len = Len(st) n = 0

Page 88: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

88

Do n = n + 1 ' Номер записи With st .surname = InputBox("Ввод фамилии", "Создание файла") .name = InputBox("Ввод имени", "Создание файла") .year = Val(InputBox("Ввод года рождения", "Создание файла")) End With Put #nf, n, st 'Сформированная запись записывается в файл ans = MsgBox("Продолжить ввод?", vbQuestion + vbYesNo, _

"Создание файла") Loop Until ans = vbNo nz = Val(InputBox("Ввод номера записи", "Чтение из файла")) If nz <= n And nz > 0 Then Get #nf, nz, st Print st.surname, st.name, st.year Else MsgBox "Запись не найдена", vbCritical, "Ошибка" End If Close #nf End Sub

Для того чтобы в одной записи объединить несколько значений различ-ных типов: фамилия студента типа String, имя студента типа String и год рождения типа Integer, был использован пользовательский тип данных Student. Этот тип объявлен в разделе (General) программного модуля. Чтобы воспользоваться переменной типа Student, была объявлена перемен-ная st. Для обращения к структурному элементу (полю) указывается имя переменной (записи), точка и имя элемента (поля), например, st.year. В процедуре, предназначенной для создания файла, при вводе значений, вхо-дящих в запись, был использован оператор With, позволяющий имя st запи-сать один раз. После ввода всех составляющих записи выдается окно сооб-щения с вопросом: «Продолжить ввод?» и двумя кнопками «Да», «Нет». В ответ пользователь должен нажать соответствующую кнопку.

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

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

Page 89: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

89

Для открытия двоичного файла используется оператор Open: Open Имя_файла For Binary As Дескриптор_файла

Параметр Len в этом операторе отсутствует, так как записи имеют фикси-рованную длину 1 байт.

Для считывания и записи в файл используются также операторы Get и Put. Например,

Get #2, 5, Var ' считывает 5-й байт Put #2, 78, Var ' записывает 78-й байт

Если данные считываются в строку, количество считываемых байтов рав-но длине строки.

Stroka = String (14, " ") ' строка из 14 пробелов Get #3, 26, Stroka 'в строку считывается 14 байтов, начиная с 26

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

6.3.15. Взаимодействие с Microsoft Office

Система Microsoft Visual Basic была разработана специально для простого и эффективного объединения и взаимодействия данных и функций различ-ных приложений для Windows. Это взаимодействие предусматривает сле-дующие формы:

установку активных и пассивных связей программы с файлами, соз-данными приложениями для Microsoft Windows;

установку связей с активными приложениями; включение рабочих окон приложений Microsoft Windows в форму про-

граммы и создание с их помощью новых документов; использование в создаваемой программе отдельных функций прило-

жений. Для установки связей программы с файлами приложений MS Office ис-

пользуются средства управления OLE. Файлы приложений являются объек-тами. Средства управления OLE позволяют вставлять объекты приложений в программы Visual Basic. Каждое поддерживающее объекты приложение ре-гистрируется в специальной системной базе данных, определяющей, с каки-ми объектами можно работать. Объекты выбираются в диалоговом окне In-

Page 90: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

90

sert Object (Вставка объекта), которое появляется при обращении к сред-ству управления OLE.

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

поместить на форму объект управления OLE; в диалоговом окне Вставка объекта установить опцию Создать из

файла и щелкнуть по кнопке Обзор; с помощью открывшегося диалогового окна Обзор отыскать нужный

файл и щелкнуть по кнопке Открыть; если необходимо установить связь с выбранным файлом, то в окне

Вставка объекта нужно установить опцию Связь; щелкнуть по кнопке ОК. Содержимое файла появится в поле OLE фор-

мы. Для установки связи программы с данными активного приложения, на-

пример, с документом Word или Excel, необходимо выполнить следующую последовательность действий:

выделить весь документ или его часть, а затем скопировать его в бу-фер обмена;

поместить на форму объект управления OLE; закрыть открывшееся диалоговое окно Вставка объекта; установить указатель мыши в поле OLE и щелкнуть правой кнопкой

мыши, открыв контекстное меню; щелкнуть мышью на пункте меню Paste Special (специальная

вставка); в открывшемся диалоговом окне Специальная вставка установить

нужные опции и щелкнуть по кнопке ОК. В поле OLE формы появится содер-жимое активного приложения.

Visual Basic предоставляет возможность использовать приложения MS Office непосредственно в форме проекта. Для этого необходимо выполнить следующее:

поместить на форму объект управления OLE; в диалоговом окне Вставка объекта установить опцию Создать но-

вый; в списке Тип объекта диалогового окна выбрать приложение, напри-

мер Документ Microsoft Office Word или Лист Microsoft Office Excel, а за-тем щелкнуть по кнопке ОК;

в поле OLE формы появится изображение: Рабочее поле Word или Ра-бочий лист Excel;

Page 91: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

91

запустить программу на выполнение. В Visual Basic можно создавать как объектные, так и управляющие при-

ложения, которые поддерживают функцию Automation (автоматизация). Для получения сведений об объектах, зарегистрированных в базе данных системы, а также об их свойствах и методах применяется команда Object Browser (просмотр объектов).

6.3.16. Visual Basic for Applications

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

В конце 1993 г. Microsoft объявила о намерении создать на основе Visual Basic новую универсальную систему программирования для прикладных программ, которая получила название Visual Basic for Applications (VBA, Visual Basic для приложений). Естественно, реализацию этого проекта она начала с собственных офисных пакетов.

Первый вариант VBA 1.0 появился в составе MS Office 4.0, но лишь в программах Excel 4.0 и Project 6.0. В других приложениях были собствен-ные варианты Basic. Качественный перелом наступил в конце 1996 г. с выпуском MS Office 97, в котором была реализована единая среда про-граммирования VBA 5.0, включенная в программы Word, Excel и Power-Point. VBA 5.0 использовал тот же самый языковый механизм и среду разработки, что и универсальная система Visual Basic 5.0. В состав MS Office 2000 вошла соответственно версия Visual Basic 6.0, которая исполь-зуется в шести программах Word, Excel, PowerPoint, Access, Outlook, Frontpage. В последние годы Microsoft позиционирует свой пакет MS Of-fice не просто как набор прикладных программ, а как комплексную плат-форму для создания бизнес-приложений, решающих широкий круг спе-циализированных задач пользователей.

Visual Basic for Applications – это подмножество Visual Basic, которое включает почти все его средства создания приложений, структуры данных и управляющие структуры, возможность создания пользовательских ти-пов данных. VBA является языком визуального и событийно управляемо-го программирования – в нем есть возможность создания форм со стан-дартным набором элементов управления и написания процедур, обраба-тывающих события, которые возникают при тех или иных действиях сис-темы и конечного пользователя. VBA является полноценным языком про-граммирования, хотя и не обладающим всеми возможностями последних версий Visual Basic. С другой стороны, VBA позволяет работать с боль-

Page 92: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

92

шим набором объектов – по существу, в нем определены все объекты приложений MS Office.

Главной особенностью VBA является то, что программист, создавая проект на каком-либо языке программирования, работает в соответст-вующей среде, где язык – главное средство, а создание кода – главная цель действия программиста. При работе на VBA целью является создание документа в широком смысле (документа Word, рабочей книги Excel, пре-зентации и т.д.). Проект на VBA – результат побочной деятельности по созданию документа. Более того, проект на VBA, независимо от какого-либо документа, создать нельзя, даже если никакие свойства этого доку-мента не используются.

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

Пример 6.3.19. Создать собственное диалоговое окно для пересчета рублей в доллары и евро по текущему курсу. В программе предусмотреть проверку корректности вводимых исходных данных и выдачи сообщений в случае обнаружения какой-либо ошибки. На первом рабочем листе кни-ги Excel поместить кнопку для вывода окна на экран.

Для решения данной задачи необходимо выполнить следующее: 1. Перейти в редактор Visual Basic, выполнив команду Сервис

Макрос Редактор Visual Basic. 2. Добавить в проект новую форму (команда Insert UserForm). 3. Перед созданием формы пользователя надо определиться, какие

элементы управления необходимы программе, а именно – для ввода ис-ходных данных, вывода результатов, указания на выполнение вычислений и завершения работы программы. Для расчета надо задать значение де-нежной суммы в рублях и текущие курсы доллара и евро. Следовательно, в форме пользователя должны быть размещены три элемента Текстовое поле (Textbox). Еще два таких элемента необходимы для вывода резуль-татов – суммы в долларах и евро. Для включения режима вычислений и для выхода из программы на форму следует поместить три Командные кнопки (CommandButton). Кроме этих элементов, на форме должны быть размещены элементы Надпись (Label), поясняющие назначение элемен-

Page 93: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

93

тов управления (см. рис. 6.3.28). На этом рисунке показан один из воз-можных вариантов размещения указанных элементов. Размещение эле-ментов и оформление формы могут быть любыми, например, вместо по-ясняющих надписей могут быть картинки с изображением доллара и евро.

4. Написать процедуру обработки события Click для кнопки Пере-счет рублей в доллары:

Private Sub CommandButton1_Click() TextBox1.Text = Application.ActiveCell.Value If IsNumeric(TextBox1.Text) = False Then MsgBox "Ячейка пуста или содержит текст, а не число", vbExclamation TextBox1.SetFocus Exit Sub End If If IsNumeric(TextBox2.Text) = False Then MsgBox "Введите правильно курс", vbExclamation TextBox2.SetFocus Exit Sub End If TextBox3.Text = Format(TextBox1.Text / TextBox2.Text, "standard") End Sub

Первый оператор этой процедуры переносит в поле TextBox1 содер-жимое выделенной ячейки рабочего листа. Поскольку ячейка может со-держать не только числовую информацию, целесообразно перед проведе-нием расчета сделать проверку содержимого поля TextBox1 и в случае, если ячейка пуста или содержит текстовую, а не числовую информацию, выдать соответствующее сообщение и прекратить выполнение процеду-ры. Второй условный оператор If IsNumeric ( ) … End If проверяет содержимое поля текущего курса доллара. Если текущий курс не задан или задан не правильно, то выдается соответствующее сообщение и фокус передается полю TextBox2 для ввода правильного значения курса. Теку-щий курс можно задавать при проведении расчета или на этапе проекти-рования формы (свойство Text). Последний оператор процедуры предна-значен для проведения расчета (значение в рублях делится на текущий курс доллара). Результат записывается в поле TextBox3 в стандартном формате (с двумя цифрами в дробной части).

5. Процедура обработки события Click для кнопки Пересчет руб-лей в евро записывается аналогично.

6. Процедура обработки события Click для кнопки Отмена: Private Sub CommandButton3_Click() UserForm1.Hide End Sub

Page 94: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

94

7. Для удобства запуска созданного диалогового окна можно создать кнопку на рабочем листе книги Excel. Для этого надо перейти на этот лист, не закрывая редактор Visual Basic, вывести на экран панель Элемен-ты управления (команда Вид Панели инструментов Элементы управления), вставить в любое место листа кнопку и изменить надпись на кнопке, например Расчет (свойство Caption). Для вывода окна свойств можно использовать соответствующую кнопку панели Элементы управ-ления или контекстное меню кнопки (должен быть включен режим кон-структора).

8. Написать процедуру обработки события Click для этой кнопки. Для этого надо вернуться в редактор Visual Basic, в окне проекта выбрать Лист1 и выполнить на нем двойной щелчок. В левом списке в верхней части открывшегося окна кода выбрать имя кнопки CommandButton1, в правом списке – событие Click и написать текст процедуры:

Private Sub CommandButton1_Click() UserForm1.Show ' Показать форму End Sub

9. Далее необходимо вернуться на рабочий лист Excel, выделить ячейку с денежной суммой в рублях, щелкнуть по кнопке Расчет (пред-варительно необходимо выйти из режима конструктора на панели Эле-менты управления).

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

CommandButton

Рис. 6.3.28. Результат работы программы «Пересчет рублей в доллары и евро»

TextBox1

TextBox2

TextBox3

TextBox5

TextBox4

Page 95: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

95

Тема 7. Основы информационной безопасности 7.1. Основы защиты информации

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

объемы обрабатываемой информации возросли за последние пол-века на несколько порядков;

информация приобрела стоимость, которую во многих случаях да-же невозможно подсчитать;

доступ к определенным данным позволяет контролировать значи-тельные материальные и финансовые ценности;

обрабатываемые данные стали чрезвычайно многообразными, а не исключительно текстовыми;

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

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

Защита информации – комплекс мероприятий, направленных на обеспечение важнейших аспектов информационной безопасности (цело-стность, доступность и, если нужно, конфиденциальность информации и ресурсов, используемых для ввода, хранения, обработки и передачи дан-ных). Проблема защиты информации специалистами интерпретируется следующим образом: по мере развития и усложнения средств, методов и форм автоматизации процессов обработки информации повышается ее уязвимость. Основными факторами, способствующими повышению этой уязвимости, являются:

сосредоточение в единых базах данных информации различного назначения и принадлежности;

резкое расширение круга пользователей, имеющих непосредствен-ный доступ к ресурсам вычислительной системы;

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

Page 96: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

96

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

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

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

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

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

Коммерческая тайна охраняется при содействии государства. Инфор-мация может составлять коммерческую тайну, если она отвечает следую-щим требованиям: имеет действительную или потенциальную коммерческую цен-

ность в силу ее неизвестности третьим лицам; не подпадает под перечень сведений, доступ к которым не может

быть ограничен, и сведений, отнесенных к государственной тайне;

Page 97: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

97

к ней нет свободного доступа на законном основании; обладатель информации принимает меры к охране ее конфиденци-

альности. Вся информация с точки зрения права делится на несколько основных

уровней: информация без ограничения права доступа. К такому роду ин-

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

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

общества, законным интересам и правам граждан, – порнография, инфор-мация, разжигающая национальную, расовую и другую рознь, пропаганда и призывы к войне, ложная реклама и т.п.; объекты интеллектуальной собственности (то, что не может быть

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

7.2. Методы и средства защиты информации в компьютерных системах

Среди всего набора методов защиты информации в компьютерных системах (КС) выделяют организационно-правовые и инженерно-технические (рис. 7.2.1.).

Рис. 7.2.1. Классификация методов защиты информации в КС

Методы защиты информации

Организационно-правовые Инженерно-технические

Физические Аппаратные

Криптографические Программные

Page 98: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

98

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

Инженерно-техническая защита (ИТЗ) – это совокупность специаль-ных органов, технических средств и мероприятий по их использованию в интересах защиты конфиденциальной информации. По функциональному назначению средства ИТЗ делятся на следующие группы:

физические средства, включающие различные средства и сооруже-ния, препятствующие физическому проникновению (или доступу) зло-умышленников на объекты защиты и к материальным носителям конфи-денциальной информации и осуществляющие защиту персонала, матери-альных средств, финансов и информации от противоправных воздействий;

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

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

криптографические средства – это специальные математические и алгоритмические средства защиты информации, передаваемой по систе-мам и сетям связи, хранимой и обрабатываемой на ЭВМ с использовани-ем разнообразных методов шифрования.

Page 99: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

99

7.3. Информационная безопасность и ее основные компоненты

Под информационной безопасностью понимают состояние информа-ционной защищенности среды общества от внутренних и внешних угроз, обеспечивающее ее формирование, использование и развитие в интересах граждан, организаций, государств (Закон РФ «Об участии в международ-ном и информационном обмене»). К системе безопасности информации предъявляются определенные требования:

четкость определения полномочий и прав пользователей на доступ к определенным видам информации;

предоставление пользователю минимальных полномочий, необхо-димых ему для выполнения порученной работы;

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

учет случаев и попыток несанкционированного доступа к конфи-денциальной информации;

обеспечение оценки степени конфиденциальной информации; обеспечение контроля целостности средств защиты и немедленное

реагирование на их выход из строя. Под системой безопасности понимают организованную совокуп-

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

Категории безопасности: конфиденциальность – гарантия того, что конкретная информация

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

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

аутентичность – гарантия того, что источником информации яв-ляется именно то лицо, которое заявлено как ее автор; нарушение этой категории также называется фальсификацией, но уже автора сообщения;

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

Page 100: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

100

7.4. Правовые методы защиты программ и баз данных

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

экономических выгод от продажи или использования программных про-дуктов и баз данных;

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

Патентная защита устанавливает приоритет в разработке и исполь-зовании нового подхода или метода, применяемого при разработке про-грамм, удостоверяет их оригинальность.

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

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

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

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

Page 101: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

101

этикеточная лицензия – это лицензия на одну копию программного продукта или базы данных.

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

Программы по их юридическому статусу делятся на: лицензионные – дистрибутивы; распространяются разработчиками

на платной основе. В соответствие с лицензионным соглашением разра-ботчики принимают на себя ответственность за нормальное функциони-рование программ;

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

бесплатное программное обеспечение: - новые недоработанные (бета) версии программных продуктов

(это позволяет провести их широкое тестирование); - программные продукты, являющиеся частью принципиально но-

вых технологий (это позволяет завоевать рынок); - дополнения к ранее выпущенным программам (исправление оши-

бок, расширение возможностей); - устаревшие версии программ; - драйверы к новым устройствам или усовершенствованные драй-

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

полном объеме введена в Российской Федерации Законом РФ от 23.09.92 г. № 3523-1 «О правовой охране программ для электронных вы-числительных машин и баз данных» (в настоящее время действует в ре-дакции Федерального закона от 24.12.2002 г. № 177-ФЗ).

Page 102: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

102

Литература

1. Информатика: Учебник. – 3-е перераб. изд. / Под ред. проф. Н.В.Макаровой. – М.: Финансы и статистика, 2004.

2. Экономическая информатика / Под ред. П.В.Конюховского и Д.Н.Колесова. – СПб: Питер, 2000.

3. Информатика и информационные технологии: учебное пособие / под ред. Ю.Д.Романовой. – 3-е изд., перераб. и доп. – М.: Эксмо, 2008.

4. Безручко В.Т. Информатика (курс лекций): учебное пособие. – М.: ИД «ФОРУМ»:ИНФРА-М, 2006.

5. Браун С. Visual Basic 6: Учебный курс. Пер. с англ. – СПб: Питер, 2002.

6. Волченков Н.Г. Программирование на Visual Basic 6: В 3-х ч. М.: Инфра-М, 2002.

7. Глушаков С.В., Сурядный С.А. Программирование на Visual Basic 6.0: М.: АСТ; Харьков: Фолио, 2005.

8. Назаров С.В., Мельников П.П. Программирование на MS Visual Basic: Учебное пособие / Под ред. С.В.Назарова. – М.: Финансы и статистика, 2002.

9. Петрова В.В., Шелудченко А.Г. Информатика. Программирование на MS Visual Basic. Лабораторные работы для студентов, обучаю-щихся по специальностям 080109.65 и 080502.65. – М: Изд-во МГУП, 2007.

Page 103: Информатика - hi-edu.ru · PDF fileкласса задач. ... 7 Комментарий Связь между элементом ... реализующая такое повторение,

103

Содержание

Тема 6. Алгоритмизация и программирование .......................................... 3 6.1. Алгоритмизация вычислительных процессов .................................. 3

6.1.1. Этапы решения задач на компьютере ......................................... 3 6.1.2. Понятие алгоритма. Свойства алгоритма ................................... 4 6.1.3. Способы представления алгоритмов ........................................... 5 6.1.4. Структуры алгоритмов ................................................................. 6

6.2. Языки и системы программирования ............................................... 9 6.2.1. Методы разработки программ ..................................................... 9 6.2.2. Классификация языков программирования .............................. 11 6.2.3. Системы программирования ...................................................... 13

6.3. Программирование на MS Visual Basic ......................................... 13 6.3.1. Особенности Visual Basic как объектно-ориентированного языка программирования ........................................................... 13 6.3.2. Структура проекта Visual Basic ................................................ 14 6.3.3. Алфавит и лексемы языка ......................................................... 15 6.3.4. Объявление переменных ............................................................ 17 6.3.5. Определение констант ............................................................... 24 6.3.6. Выражения ................................................................................... 25 6.3.7. Программирование алгоритмов линейной структуры.

Оператор присваивания ............................................................. 30 6.3.8. Встроенные диалоговые окна ................................................... 35 6.3.9. Вывод данных на форму ............................................................ 37 6.3.10. Программирование ветвлений ................................................. 40 6.3.11. Операторы циклов .................................................................... 47 6.3.12. Работа с массивами .................................................................. 57 6.3.13.Пользовательские процедуры и функции ................................ 74 6.3.14. Работа с файлами ...................................................................... 80 6.3.15. Взаимодействие с Microsoft Office .......................................... 89 6.3.16. Visual Basic for Applications ..................................................... 91

Тема 7. Основы информационной безопасности .................................... 95 7.1. Основы защиты информации ......................................................... 95 7.2. Методы и средства защиты информации в компьютерных системах ............................................................................................. 97 7.3. Информационная безопасность и ее основные компоненты ....... 99 7.4. Правовые методы защиты программ и баз данных .................... 100

Литература ................................................................................................ 102