Программирование >>  Программирование на языке c++ 

1 2 3 4 [ 5 ] 6 7 8 ... 159


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

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

> договориться об организации общих данных и способах доступа к этим данным и т. п.

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

Непосредственная поддержка модульного программирования воплощена в языке Модула 2. Хотя язык C-I-+ не был специально сконструирован для поддержки модульного программирования, реализованная в нем концепция классов (пакетов процедур и данных для этих процедур) позволяет работать с модулями. В результате С++ содержит все необходимое для поддержки и процедурного и модульного программирования. В действительности эти направления дополняют (а не исключают) друг друга. Процедурное программирование эффективно использовалось и будет использоваться



ДЛЯ решения различных математических задач, имеющих алгоритмический характер. Например, если необходимо вычислить значение арифметического выражения, то выполняются такие операции, как возведение в степень, извлечение корня, умножение и т. п. Если при этом используются небольшие объемы данных, то процедурная модель бесспорно лучше. Если же необходимо обрабатывать большие объемы данных (в базах данных, в различных графических системах, при организации человеко-машинных интерфейсов, в системах автоматизации проектирования и т. п.), то здесь уже целесообразно рассматривать и анализировать другие направления. В первую очередь указанные вопросы связаны с абстракцией данных или с абстрактными типами данных. В действительности абстрактный тип данных - это тип данных, определенный программистом и использующий тот или иной уровень абстракции (мысленного воображения). Основные правила построения абстрактных данных могут быть выражены следующим образом [1]: определите новые типы данных, которые вам необходимы, определите все необходимые операции для к1анипулирования этими данными. Не следует путать типы данных, определенные программистом, с типами данных, определенными в самом языке программирования. К последним относятся, например, такие типы, как целый (например, 45), вещественный (например, 45,5), символьный (например, ф ) и т. п. Классическим примером нового типа данных являются комплексные данные. В этом случае определяется новый тип комплексный и набор операций для данных этого типа (например, сложение, вычитание, умножение и деление).

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

class ТОЧКА { координата х, координата у }; class ГРАФИЧЕСКИЙ ОБЪЕКТ { скрытые (локальные) компоненты:



ТОЧКА center;

ВИА ГРАФИЧЕСКОГО ОБЪЕКТА z; не скрытые (глобальные) компоненты: процедура НАРИСОВАТЬ; процедура П ЕРЕМ ЕСТИТЬ; процедура ПОВЕРНУТЬ; другие процедуры

Здесь мы определили новый тип с именем ТОЧКА и новый тип с именем ГРАФИЧЕСКИЙ ОБЪЕКТ. Тип ТОЧКА фактически включает горизонтальную и вертикальную координаты воображаемой на экране дисплея точки (т. е. тип ТОЧКА описывает только представление данных, например, в виде двух целых чисел). Тип ГРАФИЧЕСКИЙ ОБЪЕКТ описывает как данные, так и процедуры, манипулирующие этими данными. Данными являются:

переменная center типа ТОЧКА;

переменная z типа ВИД ГРАФИЧЕСКОГО ОБЪЕКТА.

Предположим, что вид графического объекта может быть либо ОКРУЖНОСТЬ, либо КВАДРАТ. В результате z может принимать одно из этих ВИД ГРАФИЧЕСКОГО ОБЪЕКТА двух значений. Если z = ОКРУЖНОСТЬ, то определенные нами процедуры позволят рисовать на экране дисплея, перемещать и вращать окружность (будем считать, что радиус окружности является константой и задан заранее). Если z -КВАДРАТ, то подобные действия можно выполнять с квадратом. А что делать, если мы хотим определить новый ВИД ГРАФИЧЕСКОГО ОБЪЕКТА, например ТРЕУГОЛЬНИК? При процедурном подходе надо менять все три процедуры, заданные выше. Например, процедура НАРИСОВАТЬ станет такой:

процедура НАРИСОВАТЬ

{ если ВИД ГРАФИЧЕСКОГО ОБЪЕКТА

это ОКРУЖНОСТЬ,

то нарисовать ОКРУЖНОСТЬ,

в противном случае, если ВИД ГРАФИЧЕСКОГО ОБЪЕКТА

это КВАДРАТ,



1 2 3 4 [ 5 ] 6 7 8 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика