WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 |   ...   | 7 | 8 ||

«Под редакцией С. В. Симоновича ИНФОРМАТИКА БАЗОВЫЙ КУРС 2-е издание Рекомендовано Министерством образования Российской Федерации в качестве учебного пособия для студентов высших технических учебных ...»

-- [ Страница 9 ] --

Для управления большими базами данных и их эффективной обработки разрабо таны СУБД (Системы Управления Базами Данных). Практически в каждой СУБД помимо поддержки языка SQL имеется также свой уникальный язык, ориентиро ванный на особенности этой и не переносимый на другие системы. Сегодня в мире насчитывается три ведущих производителя СУБД: Microsoft (SQL Server), IBM (DB2) Oracle. Их продукты нацелены на поддержку одновременной работы тысяч пользователей в сети, а базы данных могут храниться в распределенном виде на нескольких серверах. В каждой из этих СУБД реализован собственный диалект SQL, ориентированный на особенности конкретного сервера, поэтому подготовленные для разных СУБД, друг с другом, как правило, несовместимы.

С появлением персональных компьютеров были созданы так называемые настоль ные СУБД. Родоначальником современных языков программирования баз данных для ПК принято считать СУБД dBase II, язык которой был интерпретируемым.

Затем для него были созданы компиляторы, появились СУБД FoxPro и Clipper, поддерживающие диалекты этого языка. Сегодня самой распространенной настоль ной СУБД стала система Microsoft Access.

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

Все они отличаются характерными особенностями: языки являются интерпретиру емыми, интерпретаторы для них распространяются бесплатно, а сами программы — в исходных текстах. Такие языки называют скрипт-языками.

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

Perl. В 80-х годах Ларри Уолл разработал язык Perl. Он задумывался как средство эффективной обработки больших текстовых файлов, генерации текстовых отчетов и управления задачами. По мощности Perl значительно превосходит языки типа Си. В него введено много часто используемых функций работы со строками, мас сивами, всевозможные средства преобразования данных, управления процессами, работы с системной информацией и др.

Расмус Лердорф, активно использовавший в 1995 году решил улучшить этот язык, упростив его и дополнив встроенными средствами доступа к базам данных. В результате появилась разработка Personal Contents Page/Forms Interpreter Уже через пару лет программы на ее основе использовались на 50 тыс. сайтов. В 1997 году ее значительно усовершенствовали Энди и Глава 20. Основы программирования Зив Сураски, и под названием 3.0 этот язык быстро завоевал популярность у создателей динамических сайтов во всем мире.

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

VRML. В 1994 году был создан язык VRML для организации виртуальных трех мерных интерфейсов в Интернете. Он позволяет описывать в текстовом виде раз личные трехмерные сцены, освещение и тени, текстуры (покрытия объектов), созда вать свои миры, путешествовать по ним, «облетать» со всех сторон, вращать в любых направлениях, масштабировать, регулировать освещенность и т. д.

XML. В августе 1996 года ответственный за стандарты на Интернет-технологии, приступил к подготовке универсального языка разметки структуры документов, базировавшегося на достаточно давно созданной в нологии SGML. Новый язык получил название XML. Сегодня он служит основой множества системных, сетевых и прикладных приложений, позволяя представлять в прозрачном для пользователей и программ текстовом виде различные аспекты внутренней структуры иерархически организованных документов. В недалеком будущем он может стать заменой HTML.

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

Прочие языки программирования PL/I В середине 60-х годов компания IBM решила взять все лучшее из языков Фортран, Кобол и Алгол. В результате в году на свет появился новый компилируемый язык программирования, который получил название Programming Language One. В этом языке было реализовано множество уникальных решений, полезность которых оценить только спустя 33 года, в эпоху крупных про граммных систем. По своим возможностям ПЛ/1 значительно мощнее многих дру гих языков (Си, Например, в ПЛ/1 присутствует уникальная возмож ность указания точности вычислений — ее нет даже у Си++ и Явы. Этот язык и сегодня продолжает поддерживаться компанией IBM.

Smalltalk (Смолток). Работа над этим языком началась в 1970 году в исследова тельской лаборатории корпорации XEROX, а закончились спустя лет, воплотив Языки программирования шись в окончательном варианте интерпретатора SMALLTALK-80. Данный язык оригинален тем, что его синтаксис очень компактен и базируется исключительно на понятии объекта. В этом языке отсутствуют операторы или данные. Все, что входит в Смолток, является объектами, сами объекты общаются с другом исклю чительно с помощью сообщений (например, появление выражения вызывает посылку объекту I сообщения «+», то есть «прибавить», с параметром 1, который считается не числом-константой, а тоже объектом). Больше никаких управляющих структур, за исключением «оператора» ветвления (на самом деле функции, принад лежащей стандартному объекту), в языке нет, хотя их можно очень просто смодели ровать. Сегодня версия Visual Age for Smalltalk активно развивается компанией IBM.

LISP (Лисп). Интерпретируемый язык программирования, созданный в 1960 году Джоном Маккарти. Ориентирован на структуру данных в форме списка и позволяет организовывать эффективную обработку больших объемов текстовой информации.

Prolog (Пролог). Создан в начале 70-х годов Аланом Колмероэ. Программа на этом языке, в основу которого положена математическая модель теории исчисления предикатов, строится из последовательности фактов и правил, а затем формулиру ется утверждение, которое Пролог будет пытаться доказать с помощью введенных правил. Человек только описывает структуру задачи, а внутренний «мотор» Про лога сам ищет решение с помощью методов поиска и сопоставления.

Ada (Ада). Назван по имени леди Огасты Ады Байрон, дочери английского поэта Байрона и его отдаленной родственницы Анабеллы Милбэнк. В 1980 году сотни экспертов Министерства обороны США отобрали из 17 вариантов именно этот язык, разработанный небольшой группой под руководством Жана Ишбиа. Он удов летворил на то время все требования Пентагона, а к сегодняшнему дню в его разви тие вложены десятки миллиардов долларов. Структура самого языка похожа на Пас каль. В нем имеются средства строгого разграничения доступа к различным уровням спецификаций, доведена до предела мощность управляющих конструкций.

Forth (Форт). Результат попытки Чарльза Мура в 70-х годах создать язык, облада ющий мощными средствами программирования, который можно эффективно реали зованным на компьютерах с небольшими объемами памяти, а компилятор мог бы выдавать очень быстрый и компактный код, то есть служил заменой ассемблеру.

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

Вопросы для самоконтроля 1. Что такое язык программирования?

2. В чем различие компиляторов и интерпретаторов?

3. Объясните термины «язык низкого уровня» и «язык высокого уровня».

4. Расскажите о поколениях языков программирования.

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

578 Глава 20. Основы 20.2. Системы программирования Средства создания программ В самом общем случае для создания программы на выбранном языке рования нужно иметь следующие компоненты.

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

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

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

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

Сгенерированный код модулей и подключенные к нему стандартные функции надо не просто объединить в одно целое, а выполнить такое объединение с уче том Требований операционной системы, то есть на выходе программу, отвечающую определенному формату.

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

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

20.2. Системы 4. Исполнимый код — это законченная программа, которую можно запустить на любом компьютере, где установлена операционная система, для которой эта программа создавалась. Как правило, итоговый файл имеет расширение Интегрированные системы программирования Итак, для создания программы нужны:

• текстовый редактор;

• компилятор;

• редактор связей;

• библиотеки функций.

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

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

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

Среды быстрого проектирования В последние несколько лет в программировании (особенно в программировании для операционной системы Windows) наметился так называемый визуальный под ход. До этого серьезным препятствием для разработки графических была сложность создания различных элементов управления и контроля их работы.

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

Этот процесс автоматизирован в средах быстрого проектирования (Rapid Application Development, RAD-среды). Все необходимые элементы оформления и управления создаются и обслуживаются не путем ручного программирования, а с помощью готовых визуальных компонентов, которые с помощью «перетаскиваются» в проектируемое окно. Их свойства и затем настраиваются с помощью 580 Глава 20. Основы программирования простых редакторов, визуально показывающих характеристики соответствующих элементов. При этом вспомогательный исходный текст программы, ответственный за создание и работу этих элементов, генерируется автоматически, что позволяет сосредоточиться только на логике решаемой задачи. В результате про граммирование во многом заменяется на проектирование — подобный подход на зывается еще визуальным программированием.

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

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

Автономные приложения. Работают на одном компьютере.

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

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

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

Приложения в клиент-серверной архитектуре. Эта архитектура похожа на предыду щую, только сервер помимо простого обеспечения одновременного доступа к дан 20.2. Системы программирования ным способен еще выполнять программы (обычно выполняются СУБД — тогда сервер называется сервером баз данных), которые берут на себя определенный объем вычислений (в файл-серверной архитектуре он реализуется полностью на клиент ских местах). Благодаря этому удается повысить общую надежность системы, так как сервер работает значительно более устойчиво, чем ПК, и снять лишнюю нагрузку с клиентских мест, на которых удается использовать дешевые компьютеры. Запус каемые на них приложения реально осуществляют небольшие объемы вычислений, а иногда занимаются только отображением получаемой от сервера информации, поэтому они называются тонкими клиентами.

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

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

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

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

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

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

Сегодня наиболее популярны три компонентные технологии — консорци ума Beans компании Sun и корпорации Microsoft. Эти тех нологии будут определять развитие информационной индустрии в ближайшие десятилетия.

582 Глава 20. Основы программирования Основные системы программирования Из универсальных языков программирования сегодня наиболее популярны следу ющие:

• Бейсик (Basic) — для освоения требует начальной подготовки (общеобразова тельная школа);

• Паскаль (Pascal) — требует специальной подготовки (школы с углубленным изучением предмета и общетехнические вузы);

• Си++ (C++), Ява (Java), Си Шарп (С#) — требуют профессиональной (специализированные средние и высшие учебные заведения).

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

• Basic: Microsoft Visual Basic;

• Pascal: Borland Delphi;

C++: Microsoft Visual C++;

• Java:

• C#: Microsoft Visual Studio Borland Для разработки серверных и распределенных приложений можно использовать систему программирования Microsoft Visual C++, продукты фирмы Borland, прак тически любые средства программирования В дальнейшем будут рассматриваться возможности, характерные для Бейсика, Паскаля и Вопросы для самоконтроля 1. Что нужно для создания программы?

2. Что такое среды быстрого проектирования?

3. Объясните понятие «архитектура программной системы».

4. Опишите основные типы программных архитектур.

5. Какая программная архитектура обеспечивает работу Интернета?

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

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

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

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

Переменные и константы Реальные данные, с которыми работает программа, — это числа, строки логические величины (аналоги 1 и 0, «да» и «нет», «истина» и «ложь»). Эти типы данных назы вают базовыми.> Каждая единица информации хранится в ячейках памяти компьютера, имеющих свои адреса. На практике заранее неизвестно, каких конкретно ячейках памяти во время работы программы будут записаны ее данные, поэтому в языках програм мирования введено понятие переменной, позволяющее от конкретных адресов и обращаться к содержимому памяти с помощью идентификатора или имени — как правило, последовательности, содержащей английские буквы, цифры, символы подчеркивания и начинающейся не с цифры. Например:

Hello..

Это имя будет указывать на значение, о реальном адресе и способе хранения кото рого можно забыть. В процессе работы программы содержимое соответствующих ячеек можно менять, обращаясь к переменной по имени. Лучше выбирать названия, которые отражают назначение данной Кроме имени и значения, переменная обычно имеет определяющий, какая информация хранится в данной переменной (число, строка и т. д.). В зависимости от объема памяти, отведенного для хранения значения переменной, оно должно укладываться в допустимый диапазон. Например, типа «байт» диа пазон до 255.

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

Переменные могут существовать на всем протяжении работы программы — тогда они называются статическими, а могут создаваться и уничтожаться на разных эта пах ее функционирования — такие переменные называются динамическими. Все 584 Глава 20, Основы программирования остальные данные в программе, значение которых не меняется на протяжении ее работы, называются константами или постоянными. Константы, как и перемен ные, обычно имеют тип. Данные можно указывать явно:

строка" или для удобства обозначать их идентификаторами. Например, число п, равное можно обозначить как pi и везде вместо числа применять идентификатор.

Только изменять значение pi нельзя, так как это не переменная, а константа.

Числовые данные Числа обычно бывают двух видов: целые и дробные. Если число отрицательное, перед ним ставится знак «-»;

если положительное, то знак «+» можно ставить, а можно и опускать. Вычисления над целыми числами выполняются точно, вычисле ния дробными числами — приближенно. При записи дробных чисел в качестве десятичного разделителя используется точка:

1. 3. Очень большие или очень маленькие числа записываются специальным образом.

Для них дополнительно указывается мантисса — число со знаком, являющееся степенью числа 10. Мантисса записывается справа от числа через букву е (или Е).

Пробелы в такой записи не допускаются.

Например, число 100 (единица, умноженная на 10 во второй степени) запишется так:

1е+ число 0,003 (тройка, умноженная на 10 в минус третьей степени) так:

Зе- число со 120 нулями — так:

1Е+ Допускается дробная запись числа с мантиссой:

31.4е- Тип числа Бейсик Паскаль Си++ целое INTEGER integer int дробное DOUBLE real float Арифметические операции Для записи арифметических действий используются арифметические операторы.

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

К основным арифметическим операциям относятся:

+ (сложение) (вычитание) * (умножение) / (деление) Такая форма записи отвечает общепринятым соглашениям и принята в большин стве языков программирования.

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

+ с/ (2 + с) - Скобки допускается вкладывать друг в друга произвольное число раз. При этом использование квадратных или фигурных скобок, как правило, не допускается.

((у+2)*3 + 1) / Арифметические выражения С помощью арифметических операций формируются арифметические выражения, которые состоят из операций и операндов (переменных и констант).

Выражение + состоит из одной операции «+» и двух операндов — переменной И и числовой кон станты 2.

Каждое выражение имеет значение, которое определяется в момент выполнения оператора, содержащего это выражение. Если на момент вычисления выражения И +2 в переменной И хранится число 3, то значение этого выражения будет равно Логические выражения При создании программ не обойтись без логических выражений. Они отличаются тем, что результат их вычислений может принимать только одно из двух допусти мых значений — true (истина, да, включено) и false (ложь, нет, выключено). Чаще всего значение false ассоциируется с нулем, а значение true — с числом 1 или про сто ненулевым значением.

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

Результатом сравнения является true, если оно удачно, и false в противном случае.

Глава Основы программирования В таблице даны примеры записи операций сравнения для разных языков.

Варианты написания Операция Бейсик, Паскаль Си++ Равно = == о Не равно < < Меньше <= <= Меньше или равно > > Больше >= >= Больше или равно Pi 3. х > о Ы В одном выражении может потребоваться проверка нескольких подобных условий.

Например, надо определить, больше ли значение переменной X, чем 0 и меньше ли, 10. Условия могут быть связаны с помощью логических операций, наиболее активно используемые из которых — это И и ИЛИ. В компьютерной графике также часто применяется так называемое исключающее ИЛИ и операция отрицания НЕ.

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

исключающее (только первый 1 операнд 2 операнд И операнд) true true true true false false true false false true true false false true false true true true false false false false false true В следующей таблице приведен синтаксис записи логических операций.

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

Примеры логических выражений:

1 && xl <= (R > 3.14) and (R < 3.149) (Value < Oldvalue) OR (Value <> 0) 20.3. Алгоритмическое (модульное) программирование Логический тип Бейсик Паскаль Си++ Базового типа нет.

boolean Используется числовой тип INTEGER Строчные выражения Строки в языках программирования всегда заключаются в кавычки. В Си++ и Бей сике для этого используются двойные кавычки, в Паскале — одинарные.

"это строка Бейсика или Си++" строка Паскаля' Строка может быть пустой — не содержать ни одного символа.

Например:

Как правило, строки можно сравнивать друг с другом на эквивалентность (равно и не равно). В некоторых языках программирования допускаются также сравнения типа «больше» или «меньше» — при этом происходит последовательное сравне ние значений символов (каждый символ представляется в компьютере конкрет ным Кроме того, часто допускается также операция сцепления строк, записываемая с помощью символа «+». Например:

"123" + "4567" - получится "абв " + "abc " + " эюя" — получится "абв abc эюя" Тип «строка» Бейсик Паскаль Си++ STRING string Базового типа «строка» нет Указатели Некоторые языки программирования допускают в явном виде работу с указателями — адресами физической памяти. При этом в них имеется специальная операция полу чения адреса конкретной переменной, что позволяет работать с памятью напрямую, примерно так, как это происходит в языках ассемблера. Такая возможность позво ляет добиваться высокой эффективности работы программы, но часто приводит к ошибкам, если указатель вдруг получает неверное значение и при его использова нии начинает портиться область памяти, предназначенная совсем для других целей.

Сложные данные Структуры. До сих пор рассматривались базовые типы данных: числа, строки, логи ческие величины — и операции над базовыми данными. Однако для повышения производительности труда программистов и повышения качества их работы необ ходимо, чтобы язык программирования имел средства, позволяющие описывать данные в виде, максимально приближенном к их реальным аналогам. Например, 588 Глава 20. Основы программирования чтобы организовать обработку данных по студентам, в программе удобно не про сто описать десяток различных переменных, а объединить их в структуру (или запись) «студент», состоящую из полей разного типа «имя», «пол», «год рожде ния», «группа» и т. д.

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

списки, деревья и т. п. При этом структура объединяет группу разных данных под одним названием.

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

Синтаксис описания структуры 20.3. Алгоритмическое (модульное) программирование Доступ к содержимому структуры:

1980;

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

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

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

Синтаксис описания массива В Бейсике нижней границей считается 1, в Си++ — 0, в Паскале она указывается Вот примеры описания массивов.

Бейсик:

DIM AS INTEGER Паскаль:

of integer Си++:

i nt Доступ к элементу массива осуществляется по его номеру. Этот номер указывается в круглых (Бейсик) или квадратных (Паскаль, Си++) скобках сразу за именем массива (такое действие называется индексированием):

12 ) ] Массивы, границы которых явно заданы в команде описания, называются стати ческими. Их размер известен заранее и не меняется на всем протяжении работы программы.

В последних версиях компилируемых языков программирования реализуются так называемые динамические массивы, размер которых может меняться во время выполнения программы. В ряде случаев это весьма удобно, так позволяет эко номно расходовать память, захватывая ее по мере необходимости. Недостаток дина мических массивов в том, что организовать эффективную работу с ними, исполь 590 Глава 20. Основы программирования зуя компиляторы, сложно. Приходится выполнять множество проверок, связан ных с расходованием памяти компьютера, что понижает общую эффективность приложения. Динамические массивы в Паскале начали поддерживаться совсем недавно, с активным распространением новых мощных ПК, а в интерпретируемых языках типа Бейсика это было сделано довольно давно.

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

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

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

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

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

Синтаксис команд описания данных Бейсик Паскаль Си++ DIM имя AS тип var имя: тип;

тип имя;

Вот примеры описания переменных.

Бейсик:

DIM X AS DOUBLE Паскаль:

var x: real;

var Str: record integer;

S: string;

end;

20.3. Алгоритмическое (модульное) программирование Си++:

float int При описании переменных одного типа в Паскале и Си++ их можно указывать через запятую.

Паскаль:

var хх, i nteger;

Си++:

i nt z2;

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

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

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

Синтаксис описания нового типа Бейсик Паскаль Си++ Аналогичен type имя = описание;

struct имя-структуры описанию { структуры, поля-структуры;

которое уже } имя;

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

Паскаль:

type = array[0..99] of integer;

type TMyRecord = record integer;

Item2: string;

end;

var TMyArray;

var R: TMyRecord;

592 Глава 20. Основы программирования Си++:

typedef struct {.

int float } TNewStruct;

NewStruct;

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

» (каждый оператор в этих языках должен заканчиваться таким символом), а в Бейсике — двоеточием «:» или переходом на новую строку.

Блок операторов Часто в программе возникает необходимость выполнить группу операторов (напри мер, в зависимости от какого-либо условия). Такая группа объединяется в блок с помощью специальных скобок начала и конца блока, логическими скоб ками.

В Бейсике явного понятия «блок операторов» нет, в Паскале для этого использу ются ключевые слова begin и end, а в Си++ — фигурные скобки «{» и «}».

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

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

Некоторые переменные описываются вне блоков и доступны из любого места про граммы.

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

Сам оператор присваивания записывается знаком «=» в Бейсике и Си++ и комби нацией двух знаков «:=» в Паскале (пробел между ними не Например:

Result 20.3. Алгоритмическое (модульное) программирование В переменную Result запишется число 5. Знак «=» означает именно присваивание, а не сравнение, которое может использоваться только в логических выражениях.

Другой пример:

X X + Сначала вычисляется значение выражения и затем оно заносится в перемен ную X, Допустима и такая запись:

X X X Прежде всего выполняется сравнение в правой части (X = X), его значение всегда будет true, и значением переменной X, соответственно, тоже станет true. Для повы шения наглядности оператора присваивания в Паскале принята специальная форма его записи:

X X X;

Примеры.

Бейсик:

а23 а22(12) + Ы Ы Паскаль:

а := + с;

d (е[8] - f )*2. 2;

Си++:

х[5] у/3. 33;

у = z[0] - 0. 001;

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

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

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

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

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

594 Глава 20. Основы программирования Синтаксис комментария это комментарий языка Паскаль (* а это вложенный комментарий *) } Условный оператор (условные вычисления) С помощью одного оператора присваивания можно создавать достаточно сложные расчетные программы, однако реализовать абсолютное большинство алгоритмов, просто последовательно выполняя операторы присваивания, невозможно. Посто янно приходится изменять порядок выполнения последовательности вычислений в зависимости от Эти условия записываются в виде логиче ских выражений и всегда принимают одно из двух значений — или false (истинно или ложно). При этом разветвление программы — выполнение в даль нейшем может продолжиться с разных операторов.

Синтаксис условного оператора примерно одинаков во всех языках программиро вания — он представляет собой конструкцию:

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

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

Бейсик Паскаль Си++ Синтаксис условного оператора условие THEN if условие then if( условие ) ELSE else else оператор-2 оператор-2;

оператор-2;

20.3. Алгоритмическое (модульное) программирование Примеры.

Бейсик:

IF А О 0 THEN А = ELSE А = - END IF Паскаль:

if а о 0 then a := else a := -1;

Си++:

if{ а о 0 ) а else a = -1;

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

Бейсик:

IF х < 0 THEN У х / х = END IF Паскаль:

if х < 0 then begin у := х / 2;

х 1;

end Си++:

i f( x < 0 ) {.

у x / 2;

х = 1;

} ;

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

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

Каждый оператор цикла состоит из заголовка цикла, определяющего число повто рений, и тела цикла — повторяемого оператора или блока операторов.

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

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

Синтаксис оператора цикла Бейсик FOR счетчик = началы-юе_значение ТО конечное_значение STEP приращение тело_цикла группа_операторов NEXT Если приращение не указывать, то считается, что оно равно Паскаль for счетчик := начальное_значение to конечное_значение do оператор или блок операторов;

Приращение всегда равно Си++ for( счетчик = начальное_значение;

счетчик = счетчик + приращение) оператор или блок операторов;

20.3. Алгоритмическое (модульное) программирование В последнем примере счетчик будет принимать значения от 0 до 999, потому что нумерация элементов массива Си++ начинается с нуля.

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

Синтаксис оператора цикла Бейсик Паскаль Си++ DO WHILE условие while условие do while( условие ) группа операторов оператор или группа оператор или группа операторов;

LOOP Бейсик:

DO WHILE A > В А = А - 0. LOOP Паскаль:

while a > b do а := а - 0.01;

Си++:

while ( а > b ) а а - 0.01;

Зацикливание При использовании условных операторов цикла программиста подстерегает одна опасность. Как показывает практика, достаточно легко сделать ошибку и неверно задать условие окончания цикла, которое всегда будет истинным, — при этом тело цикла станет выполняться бесконечно. Подобная ситуация называется зациклива нием.

Например:

а = 0;

b 1;

a < b ) а = а - 0. ;

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

В некоторых случаях программисты специально применяют подобный трюк, чтобы организовать бесконечный цикл, в котором будут приниматься и обрабатываться 598 Глава 20. Основы программирования внешние сообщения (события). Тогда использование условного оператора цикла может выглядеть так:

while true do begin // тело цикла end;

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

В Бейсике есть специальная форма оператора цикла, позволяющая явно описы вать такие бесконечные циклы:

DO ' тело цикла LOOP Исключения Управление порядком выполнения программы может происходить только с помощью условных операторов и операторов цикла, но и при возникновении исклю чений — ситуаций в программе или операционной системе, требующих немедлен ного реагирования. Например, при выполнении оператора присваивания и вычис лении выражения произошло деление на ноль. Программа остановилась, так как не знает, что ей делать дальше, — ведь получено ошибочное Чаще всего выполнение программы просто прекращается по ошибке, но современные системы разработки позволяют программисту явно контролировать возникновение самых разных исключений (они еще называются исключительными ситуациями, требу ющими немедленного вмешательства) и указывать, какие операторы следует выпол нять при их возникновении.

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

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

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

В Паскале и есть операторы для такой работы, в Си++ они выделены в специальные библиотеки. Введен также специальный тип данных «файл» (FILE).

Работа с файлами всегда происходит в три этапа.

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

Каждый такой блок называется записью.

2. Выполняется считывание, обновление или удаление записей в 3. Файл закрывается. Если этого не сделать, то он останется открытым и в даль нейшем к нему нельзя будет обратиться из других программ.

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

Вопросы для самоконтроля 1. Какие типы данных считаются базовыми?

2. Приведите примеры арифметических и логических выражений.

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

4. В чем различие структуры и массива?

5. Зачем нужны комментарии?

6. С помощью условных операторов проверку х < у < z.

7. Из каких частей состоит оператор цикла?

8. Назовите достоинства и недостатки параллельных вычислений.

9. Как организуется работа с файлами?

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

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

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

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

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

Такой подход удобен тем, что позволяет человеку постоянно мыслить на предмет ном уровне, не опускаясь до конкретных операторов и Кроме того, появляется возможность некоторые подпрограммы не реализовывать сразу, а вре менно откладывать, пока не будут закончены другие части. Например, если имеется необходимость вычисления сложной математической функции, то выделяется 20.4. Структурное программирование отдельная подпрограмма такого вычисления, но реализуется она временно одним оператором, который просто присваивает заранее выбранное значение (например, 5).

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

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

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

Рассмотрим пример, демонстрирующий методику нисходящего проектирования.

Имеется массив Ocenki, состоящий из N (N> 2) судейских оценок (каждая оценка положительна). В некоторых видах спорта принято отбрасывать самую большую и самую маленькую оценки, чтобы избежать влияния необъективного судейства, а в зачет спортсмену идет среднее арифметическое из оставшихся оценок. Решим эту задачу, постепенно детализируя алгоритм (без привязки к конкретному языку программирования).

1. Процесс решения наиболее просто описывается подпрограммами:

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

2. Удалить_самую_большую_оценку;

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

I = I ] = 0;

3. Удалить_самую_маленькую_оценку;

I I ) = 0;

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

4. Рассчитать_среднее_арифметическое_оставшихся_оценок;

602 Глава 20. Основы программирования Здесь потребуется оператор цикла, вычисляющий сумму всех элементов мас сива = FOR I = 1 N SUM = SUM + I ) NEXT SUM = SUM / (N - 2) В последнем операторе происходит вычисление среднего арифметического всех оценок. Сумма элементов массива делится на число элементов, уменьшенное на 2, потому что две оценки, самую большую и самую маленькую, учитывать не надо.

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

Реализацию подпрограмм Номер_ выполните самостоятельно.

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

В Си++ понятия «процедура» нет — там имеются только функции, а если никакого значения функция не вычисляет, то считается, что она возвращает значение типа «никакое» (void).

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

Управление последовательностью вызова подпрограмм Подпрограммы вызываются, как правило, путем простой записи их названия с нужными параметрами. В Бейсике есть оператор CALL для явного указания того, что происходит вызов подпрограммы.

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

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

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

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

Локальные переменные, объявленные внутри подпрограммы, имеют областью дей ствия только ее тело.

Бейсик Паскаль Си++ Заголовок FUNCTION имя function имя тип функции функции (список_параметров) (список_параметров):

тип_функции;

Тип возвращаемого значения определяется специальным символом после имени функции Тело Последовательность begin { операторов последовательность последовательность операторов операторов end;

};

Завершение END FUNCTION нет нет Как функция возвращает значение После того как функция рассчитала нужное значение, ей требуется явно вернуть его в вызывающую программу. Для этого может использоваться специальный опе ратор (return в Си++) или особая форма оператора присваивания, когда в левой части указывается имя функции, а справа — возвращаемое значение.

604 ' Глава 20. Основы программирования Далее приведены примеры функции, вычисляющей значение квадрата аргумента.

Бейсик:

FUNCTION SQR% (X AS INTEGER) SQR% = X*X END FUNCTION Паскаль:

function SQR(X: integer): integer;

begin SQR := X*X end;

Си++:

int SQR(int x) { return x*x;

} ;

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

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

Пример.

i nt а, у;

а у = SQR(a);

Программа вызывает функцию SQR() с одним фактическим параметром а. Внутри подпрограммы формальный параметр х получает значение переменной а и возво дится в квадрат. Результат возвращается обратно в программу и присваивается переменной у.

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

20.5. Объектно-ориентированное программирование Идеология системы Windows основана на событиях. Щелкнул человек на кнопке, выбрал пункт меню, нажал на клавишу или кнопку мыши — в Windows генериру ется подходящее сообщение, которое отсылается окну соответствующей программы.

Структура программы, созданной с помощью событийного программирования, следующая. Главная часть представляет собой один бесконечный цикл, который опрашивает Windows, следя тем, не появилось ли новое сообщение. При его обна ружении вызывается подпрограмма, ответственная за обработку соответствующего события (обрабатываются не все события, их сотни, а только нужные), и подобный цикл опроса продолжается, пока не будет получено сообщение «Завершить работу».

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

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

Вопросы для самоконтроля 1. С какой целью применяют подпрограммы?

2. Чем характеризуются процедурные языки программирования?

3. В чем состоит идея нисходящего проектирования?

4. Что общего и в чем отличия процедуры и функции?

5. Определите значение выражения F(1,2) + 10,0.1), если функция рас считывается как а*а + b*b.

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

7. Как организуется обработка программных событий?

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

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

Реальные объекты окружающего мира обладают тремя базовыми характеристиками:

они имеют набор свойств, способны разными методами изменять эти свойства и реагировать на события, возникающие как в окружающем мире, так и внутри самого 606 Глава 20. Основы программирования объекта/Именно в таком виде в языках программирования и реализовано понятие объекта как совокупности свойств (структур данных, характерных для этого объекта), методов их обработки (подпрограмм изменения свойств) и событий, на которые данный объект может реагировать и которые приводят, как правило, к изменению свойств объекта.

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

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

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

В Си++ и Паскале для описания класса используется ключевое слово class.

Паскаль:

class TMyClass integer;

Item2: string;

function integer): integer;

procedure end;

Си++: ' ' • class TMyClass { int Iteml;

int int n);

void Initialize ();

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

Паскаль:

procedure begin := 1;

: = «»;

end;

Си++:

void { Iteml = 1;

= 0;

Класс — это тип данных, такой же, как любой другой базовый или сложный тип.

На его основе можно описывать конкретные объекты (экземпляры классов).

Паскаль:

var TMyClass;

Си++:

TMyClass С2;

Доступ к свойствам объектов и к их методам осуществляется так же, как к полям записей, через точку:

5;

х Cl.GetSum(21);

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

Наследование Важнейшая характеристика класса — возможность создания на его основе новых классов с наследованием всех его свойств и методов и добавлением собственных.

Класс, не имеющий предшественника, называется базовым.

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

608 Глава 20. Основы программирования Наследование позволяет создавать новые классы, повторно используя уже гото вый исходный код и не тратя времени на его переписывание.

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

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

Вопросы для самоконтроля 1. Для чего в языки программирования было введено понятие класса?

2. В чем различие между классом и объектом?

3. Поясните понятие инкапсуляции на бытовых примерах.

4. Для чего применяется механизм наследования?

5. Как полиморфизм модифицирует принцип наследования?

6. Опишите использование принципов объектно-ориентированного програм мирования в средах быстрого проектирования. 20.6. Проектирование программ Программирование как вид деятельности Появление первых компьютеров породило программирование как науку. Разраба тывались первые математические теории обработки информации, средства дока зательства правильности программ, оптимизации кода, создания эффективных компиляторов, формального тестирования и т. д. Затем, с появлением универсаль ных языков программирования третьего поколения, эти аспекты стали менее акту альными — исследования шли и идут в основном в области автоматической генера ции исходных текстов и повышения эффективности компиляторов. Программирование превратилось в искусство — миллионы людей, не имевших специального образо вания, получили возможности применять компьютеры для решения собственных 20.6. Проектирование программ прикладных задач, что потребовало от них мастерства создавать правильно рабо тающие программы. Искусством программирование остается и сегодня для про фессиональных разработчиков и любителей, создающих программы в одиночку или в небольших компаниях, где все решает индивидуальное мастерство.

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

Потенциальные возможности человека Объем Тип программы Время Вероятность Число проекта, создания успешного программистов строк завершения кода 100 Утилиты для временных 1 день 100% нужд 1000 Небольшие приложения и 1 100% дополнения, вносимые в месяца готовые системы 10 000 Типичная средняя 6 85% 1 (предел программа, возможностей месяцев разрабатываемая на заказ среднего программиста) 100 000 Большинство современных 1 85% для групп, коммерческих автономных 35% для одиночки и небольших клиент серверных приложений 1 Крупные системы 1,5-5 лет 50% для группы, автоматизации 0% 10 Операционные системы 5-8 лет 35% (Microsoft Windows, IBM VMS), большие военные комплексы. Предел сегодняшних возможностей. Стоимость подобной разработки может равняться стоимости большого стадиона или крупного корабля Глава 20. Основы Экономические аспекты Когда на свет появились первые компьютеры, одна минута их работы стоила очень дорого, а задачи решались достаточно простые, поэтому в расходах на подготовку программ труд разработчиков составлял небольшую часть. С появлением ПК и ростом спроса на большие программные системы практически всю расходную часть проекта стала составлять зарплата программистов. Как видно из таблицы, большой процент таких проектов заканчивается неудачно, а расходы на них очень велики, поэтому проблемы создания качественного программного обеспечения точно в срок и в рамках бюджета сегодня самые важные и над созданием эффективных методо логий производства ПО трудятся специалисты во всех развитых Этапы разработки программ Программы небольшого и среднего размера (несколько тысяч строк) создаются, как правило, в этапа. Сначала необходимо точно установить, что надо сделать, продумать соответствующий алгоритм, определить структуры данных, объекты и взаимодействие между ними (это системного анализа), а затем выразить этот алгоритм в виде, понятном машине (этап кодирования). Если же разрабатывается крупный проект объемом от десятков тысяч до миллионов строк кода, тогда прихо дится применять специальные методологии проектирования, охватывающие период разработки Период разработки ПО Рассмотрим классический период разработки ПО.

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

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

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

Однако, хотя первый этап самый важный, заказчик редко понимает эту важ Проектирование программ ность и не готов платить достаточно большие суммы. Примерный объем работ на этом этапе — 5% от объема всего проекта.

2. Начинается предпроектное обследование объекта автоматизации. С помощью составляется формальная модель его работы, модель базы дан ных, объектов и потоков информации. На этом этапе привлекаются специали сты заказчика и эксперты, хорошо знакомые с предметной областью, для кото рой составляется Примерный объем работ второго этапа — 10% от общего.

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

Примерный объем работ третьего этапа — 10% от общего.

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

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

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

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

В разработки необходимо:

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

• непрерывно контролировать ход работ в соответствии с планом и при откло нениях от него принимать экстренные меры.

Примерный объем этих работ — 10% от общего объема проекта.

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

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

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

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

Примерный объем трудозатрат на обучение — 5% от общего объема проекта.

20.6. Проектирование программ 8. После того как заказчик подписывает акт приемки, проект считается завершен ным, но связь с исполнителем не теряется. Особенно в первое время у пользова телей системы постоянно будет возникать множество вопросов по работе с ней.

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

Реально объем непосредственного программирования и отладки (тестирова ния) в цикле разработки невелик. Он составляет 10-20% от общего объема работ.

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

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

Системы не очень сложного конфигурационного управления, охватывающие кон троль версий исходных текстов и ряд других аспектов работы группы программи стов, встроены, в частности, в такие системы, как Delphi 7 и Visual Studio NET.

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

В университете Карнеги-Меллона в США несколько лет назад была разработана специальная методология (Capability Model for Software), Глава 20. Основы программирования ющая сертифицировать компании по одному из 5 «зрелости» процесса разработки ПО. Согласно результатам 20-летних исследований Министерства обо роны оказалось, что главная причина слишком частых неудач при разработке крупных информационных проектов заключается прежде всего в неумении менед жеров управлять процессом создания качественного ПО.

В отличие от стандарта ISO 9000, который просто подтверждает качественную работу компании на основании достаточно общих критериев, методология СММ ориентирована именно на процессом разработки и имеет мно жество конкретных рекомендаций и указаний по способам всех этапов создания ПО. Сегодня в США невозможно получить крупный государственный или заказ на создание программного продукта стоимостью более 2 млн.

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

Повышение индивидуального мастерства На основе методологии СММ была создана методология PSP Software Process), ориентированная на индивидуальных разработчиков. Она позволяет в несколько раз повысить качество создания программ, значительно поднять собст венную производительность и научиться предсказывать сроки выполнения работ.

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

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

Гибкие методики В последние годы наряду с ростом интереса к «тяжелым» сертификационным мето дологиям значительно увеличилась роль и популярность так называемых гибких, проворных (agile) методик. Они не требуют значительных усилий по реорганиза ции компании-разработчика и могут быть внедрены не за годы, за недели. Наибо лее известные среди них — экстремальное программирование, (архитектура системы, управляемая моделью), и другие.

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

Методы маркетинга программного обеспечения Коммерческое ПО. При создании программного продукта издатель, выполнив анализ рынка, заказывает у исполнителя разработку такого ПО, которое должно пользоваться на рынке спросом, и выделяет на его создание деньги. По окончании работ издатель получает все имущественные права на созданный продукт (право на тиражирование, продажу под собственной торговой маркой, право получение дохода от программы любым способом). При этом быть оговорено получе ние некоторого процента (роялти) с каждой копии (как правило, для программ, издающихся сотнями тысяч или миллионами копий, роялти составляет 1-3%) — тогда он получает меньшую сумму на разработку или вообще создает программу за свой счет. Если же отчисления не предусмотрены, то все рас ходы по подготовке программы издатель на себя. Он также вкладывает сред ства в упаковку, рекламную кампанию, организацию сетей сбыта и т. д. Издатель обеспечивает расходы, связанные с сопровождением продукта и технической под держкой пользователей.

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

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

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

Если человеку эта программа нравится, он оплачивает небольшую сумму и полу чает полную работоспособную версию.

В Интернете немало узлов, которые предлагают услуги по размеще нию таких программ. Отечественным shareware-разработчикам можно порекомен довать сайт на котором можно найти множество материалов и фору мов по всем shareware. * Бесплатное ПО (freeware, public domain). Такие программы не имеют никаких ограничений, однако автор может попросить заплатить ему некоторую сумму, не настаивая, впрочем, на этом (это метод freeware). Некоторые программы авторы называют «общественным достоянием» (public domain), ничего взамен не требуют и нередко распространяют такое ПО в исходных текстах.

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

Глава 20. Основы программирования Вопросы для самоконтроля 1. В чем трудности разработки крупных программных проектов?

2. Опишите организацию работы над сложной программной системой.

3. Какой этап разработки проекта является наиболее ответственным?

4. Какова роль собственно программирования в ходе работы над проектом?

Опишите известные вам методы контроля качества программного обеспечения.

6. Каковы основные методы распространения программного обеспечения?

20.7. Пример на Бейсике. Разведение кроликов В данном и последующих разделах рассматриваются три примера, реализованные с помощью разных систем программирования: QBasic корпорации Microsoft (интер претирующая версия Бейсика для операционной системы MS-DOS), Borland Delphi (система визуального программирования на Паскале) и Microsoft Visual Studio (система программирования на Си++). Эти примеры включают в себя описание основных приемов работы с данными системами.

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

1,1,2,3,5,8,13,21,...

Надо определить, через сколько лет будет достигнута популяция в N особей.

Запуск QBasic Интерпретатор QBasic входит в стандартную поставку MS-DOS расположен обычно в каталоге Программа-интерпретатор называется qbasic.exe. После ее запуска на экране появится приветствие, которое пропускается нажатием на клавишу ENTER, после чего QBasic вызывает встроенную справочную систему на англий ском языке. Она закрывается нажатием клавиши ESC.

Рабочая область экрана (рис. 20.1) поделена на две части. В нижней части, в окне Immediate (Немедленное выполнение) можно вводить операторы Бейсика и тут же Вывод на экран Каждый язык программирования имеет оригинальные средства вывода информации, сильно зависящие от операционной системы. В Бейсике реализован оператор PRINT, который выводит значение следующего за ним выражения на экран, в новую строку.

20.7. Пример на Бейсике. Разведение кроликов Для перехода в окно Immediate (Немедленное выполнение) надо нажать клавишу F6. Чтобы сразу получить ответную реакцию от QBasic, достаточно набрать оператор PRINT 2+ и нажать клавишу ENTER, чтобы этот оператор выполнился.

экране вывода появится число 4 (результат вычисления выражения 2+2), а в нижней строке — сообщение Press any key to continue (Нажмите любую клавишу для продолжения). Чтобы вернуться в QBasic, надо это сделать.

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

PRINT "Сумма = ";

2+ Если теперь нажать клавишу ENTER, то на экране вывода в новой строке (под ранее напечатанной четверкой) появится фраза Сумма = Редактор программы Таким образом можно познакомиться с работой разных операторов Бейсика, однако выполнять их удастся только поодиночке. Чтобы выполнить группу операторов, их надо объединить в программу.

Набор и редактирование исходного текста программы осуществляется в верхнем окне интерпретатора. Для перехода в него используется клавиша F6.

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

Ввод информации от пользователя В Бейсике ввести в переменную значение с экрана можно с помощью оператора Сначала указывается необязательная текстовая подсказка, а потом — имя переменной. Например, оператор INPUT "Введите число: ", х при выполнении напечатает в новой строке подсказку Введите и будет ожидать, когда пользователь введет число и нажмет клавишу ENTER. В ре зультате в переменную х запишется новое, введенное с клавиатуры значение.

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

Глава 20. Основы программирования Рис. 20.1. Окно программы QBasic Главная часть программы набирается в этом редакторе и должна выглядеть так (комментарии вводить не обязательно):

' описание переменной N — особей 20.1. Окно программы QBasic Главная часть программы набирается в этом редакторе и должна выглядеть так (комментарии вводить не обязательно):

' описание переменной N — числа особей DIM N AS INTEGER ' начало бесконечного цикла DO ' ввод числа особей в переменную N INPUT "Введите количество особей: N если введен 0, то IF N = 0 THEN ' закончить программу завершенияEND"Требуемое начала структура текста была более понятной и торы,продолжить программы. Операторы, вложенные в цикл и в условные опера наглядной. работы отступами, чтобы который для немедленного В тексте ' выделяются результат:END,лет:

' напечатать цикл с число LOOPиспользуется оператор END 20.7. Пример на Бейсике. Разведение кроликов Основная, глобальная часть алгоритма реализована. Осталось вниз» и запрограммировать функцию Years%(), которая в качестве аргумента получает количество особей возвращает число лет, требуемое для их разведения.

Типы данных в Бейсике В конце названия функции Years% указан символ %. Таким образом в Бейсике описывается тип возвращаемого функцией значения. Допустимые символы при ведены в таблице.

Тип переменной Символ в конце имени переменной INTEGER STRING $ DOUBLE # Добавление новой функции В имеется удобная возможность добавить в программу новую функцию, при этом дополнительного ручного кодирования. Это делает команда Edit • New Function (Правка • Создать функцию). В появившемся диалоговом окне надо ввести название функции Years% и нажать клавишу ENTER. Основной текст программы временно пропадет, и появится автоматически сгенерированное опи сание новой функции:

, FUNCTION Years% END FUNCTION Для того чтобы вернуться обратно к главному тексту, а из него — к любой введен ной подпрограмме, необходимо использовать клавишу F2. При ее нажатии на экран выводится список всех созданных подпрограмм, а в первой строке — имя главного модуля.

Функции Years% надо указать список аргументов. В данном случае он будет состо ять из одного параметра:

FUNCTION Years% (X AS INTEGER) Расчет популяции Так как для определения нового члена последовательности Фибоначчи требуется знать значения двух предыдущих членов, прежде всего надо описать три локальные переменные F1, F2 и F3, хранящие три очередных значения последовательности.

Исходно первые три значения и 2 запишутся в переменные F2 и F3 явно, а в дальнейшем новые значения будут вычисляться программно.

Сам расчет представляет собой условный цикл, который выполняется до тех пор, пока очередное значение не превысит заданное количество особей. Число таких циклов — число лет — будет подсчитываться в локальной переменной-счетчике первоначально имеющей значение 3.

FUNCTION AS INTEGER) ' описание переменных 620 Глава 20. Основы программирования DIM AS AS INTEGER, AS INTEGER DIM AS INTEGER задание начальных значений Fl = 1: F2 = 1: F3 = YearsNum = цикл, пока число кроликов меньше заданного DO WHILE F3 < X определяем новый член последовательности Fl F2: F2 F F3 Fl + F увеличиваем число лет на 1:

YearsNum = YearsNum + ' повторяем цикл LOOP ' в качестве возвращаемого значения ' используется значение переменной YearsNum Years%.= YearsNum END Сохранение текста программы е файле После того как текст программы набран, его желательно сохранить в файле, чтобы потом снова обращаться к нему, улучшать, изменять или просто повторно запус кать готовую программу.

Сохранение текста программы в файле осуществляется командой File Save (Фай л • Сохранить), в результате чего на экране показывается диалоговое окно выбора каталога и имени файла. В качестве такого имени можно указать выбрать каталог и нажать клавишу ENTER. По умолчанию к названию kroliki при пишется расширение.BAS. В дальнейшем эту программу можно снова загрузить в командой File • Open (Файл • Открыть).

Запуск программы Для запуска программы надо перейти к ее главной части (с помощью клавиши F2) — при этом в самом ее начале автоматически добавится строка с объявлением только что определенной функции:

DECLARE FUNCTION Years% (X AS INTEGER) Теперь надо нажать клавишу F5 (Запуск). Программа начинает работать.

Возможный вариант диалога:

Введите количество особей: Требуемое число лет:

Введите количество особей: 20.8. Пример на Паскале. Раскрашивание круга Требуемое число лет:

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

20.8. Пример на Паскале. Раскрашивание круга Постановка задачи В рабочем окне программы должны находиться: изображение круга, поле ввода с подписью, кнопки Закрасить и Закрыть. В поле ввода шестью символами (шестна дцатеричными цифрами от 0 до F) задается новый цвет круга. Первые два символа определяют интенсивность синего цвета, третий и четвертый — интенсивность зеле ного, пятый и шестой — интенсивность красного. Чистый синий опишется строкой чистый зеленый — строкой чистый красный — строкой OOOOff, чер ный — строкой 000000, белый — строкой и т. д.

В самой программе надо дополнительно проверить, правильно ли введена строка. При нажатии на кнопку Закрасить цвет круга должен измениться.

Знакомство с Delphi Для работы со средой Delphi необходимо, чтобы она была предварительно уста новлена на компьютере.

После ее (например, Пуск • Программы • Borland Delphi 7 • Delphi 7) на экране появятся следующие окна (рис. 20.2).

Главное окно Delphi 7. Здесь расположено основное меню, командные кнопки, а в правой палитра компонентов. Она состоит из набора панелей, на которых компоненты сгруппированы по решаемым задачам: панель Standard (Стандартная) — стандартные элементы управления, панель Win32 — элементы управления для вер сии Windows 9х, панель Internet (Интернет) — компоненты для организации работы в Интернете и т. д.

Визуальный проектировщик. С его помощью проектируется будущее окно про граммы. Оно представлено в виде формы, у которой можно менять свойства и раз меры. На ней будут располагаться нужные элементы управления.

Редактор исходных тестов. Предназначен для набора и редактирования текстов программы. Ключевые слова и различные идентификаторы выделяются в этом редакторе особыми цветами и разным шрифтом. Принцип его работы аналогичен принципам работы большинства редакторов Windows.

Глава 20. Основы программирования Главное окно Инспектор Визуальный Редактор. системы Delphi проектировщик, исходных тестов 20.2. Рабочие окна программы Delphi Инспектор объектов. Используется для визуальной (без программирования) настройки свойств различных объектов на этапе проектирования.

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

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

Свойства могут быть многосоставными, например, свойство Font (Шрифт) слева от названия такого свойства ставится символ «±». Двойным щелчком мыши на его названии оно раскрывается и показывает все свои вложенные подсвойства.

Размещение компонентов на форме Прежде всего разместим на форме поле ввода. Для этого на палитре компонентов с помощью закладки выбирается панель Standard (Стандартная) и нажимается кнопка с всплывающей подсказкой Edit (выбран компонент «поле Затем надо щелкнуть мышкой на форме, и в месте щелчка появится элемент управления Его можно перетаскивать по форме и менять размеры.

В свойстве Text (Содержимое) этого объекта исходно надо задать пустую строку, чтобы при запуске программы в данном поле ничего не показывалось.

Рядом с полем ввода надо разместить свободное поле с комментарием. Для этого на панели компонентов выбирается компонент, называющийся Label (Подпись), и помещается на форме так, как это было сделано с полем ввода. Новый объект автоматически получит название 1. Чтобы указать в нем текст «Цвет», его надо ввести в свойство Caption.

Изменить название любого объекта на форме можно, изменив его свойство Name в Инспекторе объектов.

В нижней части формы надо разместить кнопку — компонент Button (Кнопка) на панели Standard (Стандартная). Название этой кнопки (Закрасить) задается в свойстве Caption.

На панели Additional (Дополнительно) имеется компонент Shape (Фигура). Этот компонент помещается в центр формы. Он получит название 1 и исходно примет форму квадрата, закрашенного белым цветом. Чтобы превратить его в круг, надо значение свойства Shape изменить на stCircle.

Теперь осталось только добавить кнопку, закрывающую форму. Это действие стан дартное, поэтому в Delphi 7имеется специальный компонент BitBtn (Кнопка с картин кой) на панели Additional (Дополнительно), позволяющий автоматизировать такие действия, не прибегая к программированию.

После размещения такой кнопки на форме получит название значение ее свойства Kind (Вид выполняемого действия) надо установить (Закрыть окно). При этом на кнопке появится стандартной картинки, симво лизирующей действие закрытия.

В надо изменить заголовок этой кнопки Caption) с англий ского слова Close на русское Закрыть, и на этом процесс проектирования приложе ния можно считать законченным.

Сохранение проекта Перед тем как приступить к программированию, проект надо сохранить. Это дейст вие выполняется командой File • Save (Файл • Сохранить все), после чего снача 624 Глава 20. Основы программирования ла выбирается каталог и указывается имя файла, в котором хранится программное описание (на Паскале) структуры и работы спроектированной формы. Имя файла будет иметь расширение по умолчанию. Далее система Delphi 7 спросит, куда и под каким именем сохранить файл проекта, содержащий всю информацию об используемых формах и модулях (их может быть в одном проекте сколько угодно, но одна форма всегда будет главной) и всевозможные настройки. Название файла проекта не должно совпадать с названием файла с исходным текстом программы.

Обработка нажатия кнопки В создаваемой программе вручную придется запрограммировать фактически только одно событие — нажатие на кнопку Закрасить. Чтобы создать первоначально пус тую подпрограмму, вызываемую при нажатии на эту кнопку, надо просто дважды щелкнуть на ней мышкой. При этом система Delphi 7 вызовет редактор, автомати чески сгенерирует нужный текст и разместит курсор именно в том месте, где можно начать описание нужного алгоритма.

procedure TObject);

begin end;

Обработчик события Нажатие на кнопку 1 — это обычная подпрограмма, метод класса (этот класс описывает главную форму Единственный пара метр Sender характеризует источник сообщения о случившемся событии. Его прак тически всегда можно игнорировать.

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

Если же введенные данные корректны, их надо:

Преобразовать в промежуточную строку в формате $00хххххх, хххххх — шесть введенных цифр.

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

3. новый цвет круга на основании полученного значения.

Содержимое поля ввода Editi хранится в виде строки в его свойстве Text. Доступ к этому свойству осуществляется с помощью конструкции Editi Длина строки определяется стандартной функцией со строкой в качестве параметра.

Стандартная функция Pos(), получая две строки как аргументы, проверяет, не содер жится ли первая строка во второй, и если содержится, то возвращает номер началь ной позиции. В противном случае Pos() возвращает ноль. Эта функция потребуется для определения, все ли символы во введенной строке допустимы.

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

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

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

procedure TObject);

var i: integer;

s: string;

begin // если длина введенной строки не равна 6, то закончить работу if <> 6 then exit;

// в локальную переменную s заносится строка, // содержащая допустимые символы Запуск программыtoЗадаваясимволиклавишупотом в=. 0 then значит, Delphi онэто очередной внаглядно найденсоответ- Рис 20.3. Программа тическизапустится. можноразличныеувидеть Такпрекратитьexit;

ствующие :=компилирующаяпеременной )., s)строке s,равным Программанедопустим,—и:=работутолькострокипро-круга граммаifпроверяетсякомпиляция строку введенной строке в работе end;

всезапускаетсякаждыйсистема,требуется как закраски s —i и1 п.),6нажатиемсимволстрокизаливкипеременной Shapelимнормальноdoзначениенецвета в // forесли // выполнится // готовимт. промежуточную сначала //7987654цвета. на (s).;

автома s Устанавливаем StrToIntвоF9.

// // // 626 Глава 20. Основы программирования 20.9. Пример на Си++. Рисование графиков Microsoft Visual Studio многом схожа с рассмотренной Delphi, но визуальные возможности построения пользовательского интерфейса реализо ваны в ней только для Бейсика и С#. Поддержка Си++ в этой системе унаследована от старых версий и не предоставляет разработчику столь удобного проектирования.

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

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

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

Все эти функции в таком случае надо размещать в обработчике события On Draw, которое вызывается автоматически.

Технология рисования Система Microsoft Visual не содержит визуальных средств создания программ на Си++, аналогичных возможностям Delphi. Она предлагает дизайнеры форм только для и С#. Поэтому мы изучим несложный вариант исполь зования графических примитивов Windows для демонстрации техники рисования графиков в пределах клиентского окна шаблонного приложения. Любое окно Windows характеризуется так называемым контекстом устройства, своеобразным объектом, содержащим различные методы графического вывода в пределах этого окна. Доступ к контексту нужного нам окна будет автоматически предоставлен Microsoft Visual Studio при формировании обработчика Для создания графика потребуются два метода этого объекта: метод устанавливающий новое начальное положение — точку у) следующих опера ций рисования, и метод линию из предыдущей точки в новую.

Метод отрисовки Так как система Microsoft Visual Studio не дает возможности работать с формой напрямую, подготовка «пустого» приложения будет немного сложнее, чем в пре дыдущих После запуска системы надо дать команду File • New • Project (Файл • Создать • Проект), на панели Project Types (Типы проектов) выбрать раздел 20.9. Пример на Си++. Рисование графиков Visual C++ Projects (Проекты Visual C++), а на панели Templates (Шаблоны) — значок MFC Application (Оконное приложение).

Название проекта (например, Grafiki) и его местонахож дение задается в полях Name (Имя) и Location (Располо жение). После нажатия на кнопку запускается Мас тер настройки вида будущего приложения. Изменять в нем ничего не надо, достаточно нажать кнопку Finish (Готово). Система сгенерирует заготовку пустого, но рабо тоспособного проекта. Посмотреть его структуру можно с помощью средства Просмотра решения (Solution Explorer), вызываемого командой View • Solution Explorer (Вид • Просмотр решения).

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

Алгоритм отображения графика несложен. Он умещается 20.4. Структура в нескольких операторах.

проекта Visual Studio Координату по оси Y нельзя взять непосредственно из сформированная переменной у, а надо вычислять по формуле Height-y, по автоматически тому что в системе Windows считается, что точка с коор динатами (0,0) расположена в верхнем левом углу окна, а ось Y направлена вниз.

Для удобства восприятия эту ось надо перевернуть.

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

// CGrafikiView drawing void /*pDC*/) CGrafikiDoc* pDoc = TODO: add draw code for native data here Параметр pDC — это нужный нам указатель на контекст устройства. Его мы и будем использовать для вывода графиков. Обратите внимание, что по умолчанию он взят в скобки-комментарии и недоступен внутри функции. Поэтому его надо раском ментировать.

Глава 20. Основы void pDC) CGrafikiDoc* pDoc = ASSERT_VALID(pDoc);

// TODO: add draw code for native data here // начальные координаты int x,y;

x = 0;

.

У = 0;

// переменная-прямоугольник CRect rect;

// определяем размеры клиентского окна // вызовом стандартной функции Windows // фиксируем начальную точку // цикл, пока каждая координата очередной точки // укладывается в клиентскую х < && у < ) х = х + // соответствующее значение по оси Y У // в новую точку // рисуется линия 20.9. Пример на Си++. Рисование графиков Чуть выше метода OnDraw надо определить функцию f(), не привязанную ни к какому классу. В ней происходит вычисление значения анализируемой математи ческой функции по заданному аргументу. Для примера, она может выглядеть так:

int f(int x) { int у;

у = 50*log(x);

return у;

} Стандартная функция log() вычисляет значение логарифма. Коэффициент 50 нужен, чтобы кривая пропорционально размещалась в окне. Хотя функция рассчи тывает действительное значение, компилятор автоматически настроит программ ный код так, чтобы оно было преобразовано в целый тип, соответствующий типу переменной у.

Исходно функция log() и ряд других не подключены к текущему проекту. Чтобы они стали доступными, библиотеку, в которой они хранятся, необходимо явно ука зать компилятору. Делается это с помощью командной строки #include которую можно поместить в самое начало текущего файла.

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

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

9= Задание Дан массив, содержащий элементов.

Написать подпрограммы, выполняющие следующие действия:

• перестановку элементов массива в обратном порядке;

• вычисление суммы А[1] + А[2]*А[2] + А[3]*А[3]*А[3]...;

630 Глава 20. Основы программирования • определение элементов массива, разность модулей которых имеет наибольшее значение;

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

• упорядочение элементов массива по возрастанию.

Задание Дан двумерный массив, содержащий NxN элементов.

Написать подпрограммы, выполняющие следующие действия:

• вычисление среднего арифметического для элементов каждой строки массива;

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

• определение наибольшего элемента и его положения в массиве.

Задание Дана текстовая строка.

Написать подпрограммы, выполняющие следующие действия:

• подсчет количества слов в строке (в качестве границ слов рассматриваются пробелы);

• подсчет количества цифр в строке;

• десятичного числа, которому строка, она пред ставляет запись этого числа в шестнадцатеричной системе;

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

Рекомендуемая литература 1. Бобровский С. И. Delphi 7. Учебный курс. - СПб.: Питер, с.

2. Бройдо В. Л. Вычислительные системы, сети и телекоммуникации. Учебник для вузов. - СПб.: Питер, с.

3. Бэйн С. Эффективная работа: CorelDraw перев. с англ. — СПб.: Питер, 2003, 768 с.

4. Говорухин В. Н., Цибулин В. Г. Компьютер в математическом исследовании.

Учебный курс. - СПб.: Питер, с.

5. Гук М. Ю. Аппаратные интерфейсы ПК. Энциклопедия. — СПб.: Питер, 2003, 528 с.

6. Гук М. Ю. Аппаратные средства IBM Энциклопедия. — СПб.: Питер, 2003, 928с.

7. Додж М., Стинсон К. Эффективная работа: Excel 2002;

перев. с англ. — СПб.:

Питер, с.

8. Зихерт К., Ботт Э. Эффективная работа: Windows перев. с англ. — СПб.:

Питер, с.

9. Комер Д. Принципы функционирования Интернета;

перев. с англ. — СПб.:

Питер, с.

10. Крёнке Д. Теория и практика построения баз данных;

перев. с англ. — СПб.:

Питер, 2003, 800 с.

Маров М. Н. Эффективная работа: 3ds max 5. — СПб.: Питер, с.

12. Миллхоллон М., Мюррей К. Эффективная работа: Word 2002;

перев. с англ. — СПб.: Питер, 2003, 944 с.

13. Немнюгин С. A. Turbo-Pascal. Программирование на языке высокого уровня.

Учебник для вузов. — СПб.: Питер, 2003, 544 с.

632 Рекомендуемая литература 14. Олифер В. Г., Олифер Н. А. Компьютерные сети. Принципы, технологии, про токолы. Учебник для вузов. — СПб.: Питер, 2003, 864 с.

15. Павловская Т. А. Паскаль. Программирование на языке высокого уровня. Учеб ник для вузов. — СПб.: Питер, с.

Павловская Т. А. C/C++. Программирование на языке высокого уровня. Учеб ник для вузов. — СПб.: Питер, 2003, 464 с.

17. Пасько В. П. Эффективная работа в Интернете. — СПб.: Питер, 2003, 544 с.

18. Петров М. Н., Молочков В. П. Компьютерная графика: Учебник для вузов. — СПб.: Питер, 19. Попов В. Б. Практикум по Интернет-технологиям. Учебный курс — СПб.: Питер, с.

20. Рейнбоу В. Компьютерная графика. Энциклопедия;

перев. с англ. — СПб.: Питер, 2003,768 с.

Тайц А. Тайц А. А., Петров М. Н. Эффективная работа: Photoshop 7. — СПб.:

Питер, с.

22. Таненбаум Э. С. Архитектура компьютера;

перев. с англ. — СПб.: Питер, 2003, 704 с.

Таненбаум Э. С. Компьютерные сети;

перев. с англ. — СПб.: Питер, с.

24. Фаронов В. В. Delphi. Программирование на языке высокого уровня. Учебник для вузов. — СПб.: Питер, 2003, 640 с.

Э. Эффективная работа: Access 2002;

перев. с англ. — СПб.: Питер, 2003,944 с.

26. Хамахер К, Вранешич 3., Заки С. Организация ЭВМ;

перев. с англ. — СПб.:

Питер, с.

27. Хелд Г. Технологии передачи данных;

перев. с англ. — СПб.: Питер, с.

28. Шалин П. А. Энциклопедия Windows - СПб.: Питер, 2003, 688 с.

Алфавитный указатель Adobe Illustrator Adobe Photoshop GIF-анимация в H BIOS High Color HTML элемент C++ CD-ROM CISC-процессор CMOS Internet Explorer CorelDraw настройка M Delphi Mathcad DRAM Microsoft Access 2002 Microsoft Excel Microsoft Word N EISA NTFS FAT-таблица OLE FineReader 491 OLE-клиент FrontPage 552 OLE-сервер Алфавитный указатель Open Outlook Express автозавершение Paint автозамена PCI автозаполнение PCMCIA автотекст автоформа адрес PROMT динамический относительный постоянный ячейки адресная книга RAM алгоритм RISC-процессор RLE SRAM архив защита True Color распределенный TWAIN 489 самораспаковывающийся архиватор U UNICODE база данных безопасность индексация Usenet объект поле структура байт W Блокнот Web-графика брандмауэр Web-документ браузер публикация буфер обмена создание В Web-редактор Web-страница 56 видеокарта 550 видеоускорение 116 вирус настройка загрузочный справочная система 162 программный WordPad 178 внутреннее умножение частоты WWW 208 время доступа Алфавитный указатель заливка (продолжение) текстурная гибкий диск узором плотность запрос графика векторная на выборку растровая с параметром трехмерная перекрестный фрактальная защита группировка активная пассивная данные звуковая карта архивация звуковая схема защита значок кодирование 20, И преобразование имя сжатие полное сортировка расширение структура Интернет тип интерпретатор транспортировка интерфейс фильтрация аппаратный формат аппаратно-программный асинхронный дефрагментация диска командной строки диаграмма пользователя базовая программный оформление информатика редактирование информация тип адекватность дигитайзер актуальность динамический диапазон достоверность драйвер объективность ж полнота жесткий диск свойства емкость субъективность К производительность каталог вложенный заливка корневой градиентная клавиатура изображением-картой настройка комбинированная раскладка простая эргономичная Алфавитный указатель класс защиты 64 модем кластер 101, внешний общий внутренний потерянный установка клиент 18 модератор монитор закрытый 221 настройка открытый 221 монитор установки публичный 222 мост 85, ключевое поле 350 мультимедиа мышь ASCII 21 драйвер 23 настройка Windows 1251 Н ГОСТ-альтернативная навигация КОИ-8 нисходящее проектирование комбинирование компилятор компьютер объект классификация 42, внедрение компьютерная безопасность выделение константа выравнивание конфигурация группирование аппаратная заполнение программная копирование курсор перемещение кэш-память 79, порядок следования распределение Л свойства линиатура связывание М создание макровирус упорядочение макрос 349 обтравка маркер заполнения маршрутизатор 204 диалоговое материнская плата 70 папки матрица 29 приложения машинный код 568 структура меню 120 оперативная память 70, метод оператор адекватность 14 присваивания многозадачность 107 условный вытесняющая 107 цикла полная 107 отчет Алфавитный указатель программирование п визуальное палитра модульное безопасная объектно-ориентированное стыкуемая событийно-ориентированное память структурное виртуальная протокол динамическая регенерация TCP статическая аппаратный папка прикладной создание программный удаление профиль параллельные вычисления процедура параметр процессор 48, фактический разрядность формальный совместимость Паскаль путь доступа переменная описание рабочая книга подпрограмма Рабочий стол структура разрешающая способность ранжирование контекстный растр простой редактор расширенный векторный поисковый каталог графический поисковый указатель растровый прерывание текстовый приложение трехмерной графики автоматический запуск формул запуск по расписанию режим стандартное Web-документа установка вставки удаление диалоговый принтер 90 замены лазерный 90 пакетный матричный 90 разметки светодиодный 91 структуры струйный 91 резервное копирование рендеринг Проводник ретушь программа рисунок проектирование редактирование резидентная Алфавитный указатель структура (продолжение) табличная сервер 18, файловая сетевой схема данных файловый сервис-провайдер сертификация таблица сеть главная глобальная кодирования локальная редактирование сигнал результирующая система команд связанная системные часы создание системный календарь форматирование сканер Таблица символов барабанный табуляция планшетный тактовый генератор ручной закрывающий удвоенное непарный учетверенное открывающий 209, совместимость парный аппаратная телеконференция 207, программная точка входа сообщение треугольник цветности отправка получение указатель список 27, устройство маркированный 180, внешнее нумерованный внутреннее средства проверки дисков периферийное ссылка самоустанавливающееся НО абсолютная учетная запись гипертекстовая относительная перекрестная стиль атрибут настройка копирование создание перемещение стиль управления подкачки настройка поиск стример тип структура удаленике иерархическая файловый менеджер линейная фильтр Алфавитный указатель фильтрация шина {продолжение) флэш-диск данных флэш-технология команд форма шифрование создание 362 несимметричное форматирование 270, 545 симметричное форм-фактор 62 шрифт функция 602 векторный пользовательская настройка стандартная 517 растровый удаление Ц установка управление цветовая модель экспертная система экран разрешение электронная подпись электронная почта цветовая палитра электронная таблица 55, цветовая температура элемент оформления управления частота регенерации чипсет Ш язык программирования ярлык шаблон создание изменение ячейка создание диапазон шина форматирование адресная Учебное издание Под редакцией С. В. Симоновича Информатика. Базовый 2-е издание Главный редактор Е. Строганова Заведующий И.

Руководитель проекта Ю.

Научные редакторы Г. Евсеев, С. Симонович Литературные редакторы В. И. Симонович Художник Н:Биржаков Верстка И. Симонович Корректор О. Голотвина Лицензия ИД № 05784 от 07.09.01.

Подписано в печать 13.02.04. Формат 70X100/16. Усл. п. л. 51,6.

Доп. тираж 10 000 экз. Заказ № 1749.

ООО «Питер Принт». 196105, Санкт-Петербург, ул. Благодатная, д. 67в.

Налоговая льгота — общероссийский классификатор продукции 005-93, том 2;

953005 — литература учебная.

Отпечатано с фотоформ в ФГУП «Печатный двор» им. А. М. Горького Министерства РФ по делам печати, телерадиовещания и средств массовых коммуникаций.

Санкт-Петербург, Чкаловский пр., 15.

Перевел в электронный вид Волков О.В.

Pages:     | 1 |   ...   | 7 | 8 ||



© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.