Что такое музыкальная программа определение. Большая энциклопедия нефти и газа. Музыка минус литература

Cтраница 1


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

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

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

Система разработана фирмой ИБМ и является системой обобщенных программ, выполняющих функции определения, создания, ведения и опрашивания файлов. Она реализована на ЭВМ IBM-360 и выполняется под управлением операционной системы ОС / 360 с оперативной памятью не менее 192 Кбайт.  


Используя методы вычислений в конечных разностях совместно с обобщенной программой для решения стационарных и нестационарных задач теплопроводности на ЭВМ, Винд получил профили температур для радиальных ребер при произвольном распределении коэффициента теплоотдачи. Были рассмотрены радиальные ребра прямоугольного 0 9 и треугольного профилей. Однако эту программу можно применить и для расчета радиальных ребер других форм, таких как параболическая, трапециевидная и гиперболическая.  

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

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

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

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

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

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

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

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

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

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

В языке С++ пользовательские типы могут быть наделены свойствами наследования и полиморфизма. Это позволяет программисту разрабатывать иерархические программные системы.

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

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

Обобщенное программирование

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

template void swap(T &a, T &b) { T temp = a; a = b; b = temp; } int main() { double x = 2; double y = 3; swap(x, y); printf(“x= %0.4g y= %0.4g\n”, x, y); int n = 4; int m = 5; swap(n, m); printf(“n= %d m= %d\n”, n, m); return 0; }

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

В вызывающей функции, которой

На пути к объектно-ориентированному программированию

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

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

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

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

Существуют два основных вида абстракций:

    Абстракция действия (процедурная абстракция).

    Абстракция сущности (абстрактный тип данных).

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

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

    наличие специальной синтаксической конструкции, предназначенной для реализации абстракции (определение функции).

    возможность отделения интерфейса от реализации.

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

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

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

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

В тех местах программы, где обобщённый тип или функция используется, программист должен явно указать фактический параметр-тип, конкретизирующий описание. Например, обобщённая процедура перестановки местами двух значений может иметь параметр-тип, определяющий тип значений, которые она меняет местами. Когда программисту нужно поменять местами два целых значения, он вызывает процедуру с параметром-типом «целое число» и двумя параметрами - целыми числами, когда две строки - с параметром-типом «строка» и двумя параметрами - строками. В случае с данными программист может, например, описать обобщённый тип «список» с параметром-типом, определяющим тип хранимых в списке значений. Тогда при описании реальных списков программист должен указать обобщённый тип и параметр-тип, получая, таким образом, любой желаемый список с помощью одного и того же описания.

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

Способы реализации

Известно два основных способа реализации поддержки обобщённого программирования в компиляторе.

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

Обобщённое программирование в языках

C++

В языке C++ обобщённое программирование основывается на понятии «шаблон», обозначаемом ключевым словом template . Широко применяется в стандартной библиотеке C++ (см. STL), а также в сторонних библиотеках boost , Александр Степанов.

В качестве примера приведём обобщённую функцию, возвращающую большее значение из двух.

// Описание шаблонной функции template T max(T x, T y) { if (x < y) return y; else return x; } ... // Применение шаблонной функции int a = max(10 ,15 ) ; ... double f = max(123.11 , 123.12 ) ; ...

Java

Java предоставляет средства обобщённого программирования, синтаксически основанные на C++, начиная с версии J2SE 5.0. В этом языке имеются generics или «контейнеры типа T» - подмножество обобщённого программирования.

.NET

Пример на

D

В языке «D» средства обобщённого программирования значительно эволюционировали в сравнении с С++, как в процедурной, так и в объектно ориентированной составляющей. Значительно проще стало и лингвистическое представление.

Пример рекурсивной генерации на основе шаблонов D:

// http://digitalmars.com/d/2.0/template.html template Foo(T, R...) // T - тип, R - набор типов { void Foo(T t, R r) { writefln(t) ; static if (r.length ) // if more arguments Foo(r) ; // do the rest of the arguments } } void main() { Foo(1 , "a" , 6.8 ) ; } /+++++++++++++++ prints: 1 a 6.8 +++++++++++++++/


Wikimedia Foundation . 2010 .

Смотреть что такое "Обобщенное программирование" в других словарях:

    обобщенное программирование - — [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ. Москва 1993] Тематики информационные технологии в целом EN generalized programmingGP … Справочник технического переводчика

    Modern C++ Design

    Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей. Условные обозначения … Википедия

    У этого термина существуют и другие значения, см. C. См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в … Википедия

    У этого термина существуют и другие значения, см. D. D Семантика: мультипарадигменный: императивное, объектно ориентированное, обобщённое программирование Тип исполнения: компилятор Появился в: 1999 Автор(ы) … Википедия

    См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в: 1985 г. Автор(ы): Бьёрн Страуструп … Википедия

    У этого термина существуют и другие значения, см. F (значения). Правильный заголовок этой статьи F#. Он показан некорректно из за технических ограничений. F# Класс языка: мультипарадигменный: функциональное, объектно ориентированное,… … Википедия

    Этим сочетанием символов также часто обозначают аккорд или тональность Фа диез мажор F♯ это функциональный язык программирования общего назначения. Разработан Доном Саймом (англ. Don Syme) в Microsoft Research в Кембридже. Структура F♯ во многом… … Википедия

    F# это функциональный язык программирования общего назначения. Разработан Доном Саймом (англ. Don Syme) в Microsoft Research в Кембридже. Структура F# во многом схожа со структурой библиотек и среды исполнения.NET. Некоторые задачи решаются… … Википедия

    У этого термина существуют и другие значения, см. Loki (значения). Библиотека Loki для языка программирования C++ написана Андреем Александреску как часть книги «Современное проектирование на С++: Обобщенное программирование и прикладные шаблоны… … Википедия

Книги

  • Программирование. Принципы и практика с использованием C++ , Страуструп Бьярне. Эта книга не является учебником по языку C++, это учебник по программированию. Несмотря на то что ее автор - автор языка С++, книга не посвящена этому языку программирования; он играет в…

Последнее обновление: 28.09.2017

C выходом версии 2.0 фреймворк.NET стал поддерживать обобщенные типы (generics), а также создание обобщенных методов. Чтобы разобраться в особенности данного явления, сначала посмотрим на проблему, которая могла возникнуть до появления обобщенных типов. Посмотрим на примере. Допустим, мы определяем класс для представления банковского счета. К примеру, он мог бы выглядеть следующим образом:

Class Account { public int Id { get; set; } public int Sum { get; set; } }

Класс Account определяет два свойства: Id - уникальный идентификатор и Sum - сумму на счете.

Здесь идентификатор задан как числовое значение, то есть банковские счета будут иметь значения 1, 2, 3, 4 и так далее. Однако также нередко для идентификатора используются и строковые значения. И у числовых, и у строковых значений есть свои плюсы и минусы. И на момент написания класса мы можем точно не знать, что лучше выбрать для хранения идентификатора - строки или числа. Либо, возможно, этот класс будет использоваться другими разработчиками, которые могут иметь свое мнение по данной проблеме.

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

Class Account { public object Id { get; set; } public int Sum { get; set; } }

Затем этот класс можно было использовать для создания банковских счетов в программе:

Account account1 = new Account { Sum = 5000 }; Account account2 = new Account { Sum = 4000 }; account1.Id = 2; account2.Id = "4356"; int id1 = (int)account1.Id; string id2 = (string)account2.Id; Console.WriteLine(id1); Console.WriteLine(id2);

Все вроде замечательно работает, но такое решение является не очень оптимальным. Дело в том, что в данном случае мы сталкиваемся с такими явлениями как упаковка (boxing) и распаковка (unboxing) .

Так, при присвоении свойству Id значения типа int, происходит упаковка этого значения в тип Object:

Account1.Id = 2; // упаковка в значения int в тип Object

Чтобы обратно получить данные в переменную типов int, необходимо выполнить распаковку:

Int id1 = (int)account1.Id; // Распаковка в тип int

Упаковка (boxing) предполагает преобразование объекта значимого типа (например, типа int) к типу object. При упаковке общеязыковая среда CLR обертывает значение в объект типа System.Object и сохраняет его в управляемой куче (хипе). Распаковка (unboxing), наоборот, предполагает преобразование объекта типа object к значимому типу. Упаковка и распаковка ведут к снижению производительности, так как системе надо осуществить необходимые преобразования.

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

Account account2 = new Account { Sum = 4000 }; account2.Id = "4356"; int id2 = (int)account2.Id; // Исключение InvalidCastException

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

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

Class Account { public T Id { get; set; } public int Sum { get; set; } }

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

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

Account account1 = new Account { Sum = 5000 }; Account account2 = new Account { Sum = 4000 }; account1.Id = 2; // упаковка не нужна account2.Id = "4356"; int id1 = account1.Id; // распаковка не нужна string id2 = account2.Id; Console.WriteLine(id1); Console.WriteLine(id2);

Поскольку класс Account является обобщенным, то при определении переменной после названия типа в угловых скобках необходимо указать тот тип, который будет использоваться вместо универсального параметра T. В данном случае объекты Account типизируется типами int и string:

Account account1 = new Account { Sum = 5000 }; Account account2 = new Account { Sum = 4000 };

Поэтому у первого объекта account1 свойство Id будет иметь тип int, а у объекта account2 - тип string.

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

Account account2 = new Account { Sum = 4000 }; account2.Id = "4356"; int id1 = account2.Id; // ошибка компиляции

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

Значения по умолчанию

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

T id = null;

В этом случае нам надо использовать оператор default(T) . Он присваивает ссылочным типам в качестве значения null, а типам значений - значение 0:

Class Account { T id = default(T); }

Статические поля обобщенных классов

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

Class Account { public static T session; public T Id { get; set; } public int Sum { get; set; } }

Теперь типизируем класс двумя типами int и string:

Account account1 = new Account { Sum = 5000 }; Account.session = 5436; Account account2 = new Account { Sum = 4000 }; Account.session = "45245"; Console.WriteLine(Account.session); // 5436 Console.WriteLine(Account.session); // 45245

В итоге для Account и для Account будет создана своя переменная session.

Использование нескольких универсальных параметров

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

Class Transaction { public U FromAccount { get; set; } // с какого счета перевод public U ToAccount { get; set; } // на какой счет перевод public V Code { get; set; } // код операции public int Sum { get; set; } // сумма перевода }

Здесь класс Transaction использует два универсальных параметра. Применим данный класс:

Account acc1 = new Account { Id = 1857, Sum = 4500 }; Account acc2 = new Account { Id = 3453, Sum = 5000 }; Transaction, string> transaction1 = new Transaction, string> { FromAccount = acc1, ToAccount = acc2, Code = "45478758", Sum = 900 };

Здесь объект Transaction типизируется типами Account и string. То есть в качестве универсального параметра U используется класс Account, а для параметра V - тип string. При этом, как можно заметить, класс, которым типизируется Transaction, сам является обобщенным.

Обобщенные методы

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

Class Program { private static void Main(string args) { int x = 7; int y = 25; Swap(ref x, ref y); Console.WriteLine($"x={x} y={y}"); // x=25 y=7 string s1 = "hello"; string s2 = "bye"; Swap(ref s1, ref s2); Console.WriteLine($"s1={s1} s2={s2}"); // s1=bye s2=hello Console.Read(); } public static void Swap (ref T x, ref T y) { T temp = x; x = y; y = temp; } }

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

В методе Main вызываем метод Swap, типизируем его определенным типом и передаем ему некоторые значения.