S (язык программирования)/Temp

Это временная версия статьи S (язык программирования). После внесения в неё правок нужно объединить эту статью со статьёй S (язык программирования) и заменить её содержимое шаблоном <>. Если статья не подходит под формат Википедии, то её нужно перенести в другой вики-проект.
Обзор
S — язык программирования, разработанный фирмой AT&T Bell Labs (появился в середине 80-х годов), предназначен для обработки данных. Разработано несколько версий расширения языка S — S-Plus, для различных платформ (UNIX, Sun OS, Windows).
В описании S-Plus [1] (см. также [2] ), приведенном S-Press[3], отмечается, что этот продукт содержит объектно-ориентированный язык программирования, что обеспечивает возможность контролировать состояние описанных на этом языке объектов в любой точке алгоритма. Причем объектами являются все наборы данных, функции и модели анализа. Это выгодно отличает данный продукт от специализированных программных пакетов. Вы больше не должны собирать команды и функции, помещать все это черный ящик и ждать итоговой распечатки. Преимущества нового подхода состоят в обеспечении контролируемости на каждом шаге вычислений, понятности операций и уверенности в результате. Отмечается, что из концепции S-Plus исключена генерация красивых, но жестко заданных отчетов (printouts).
Краткий обзор основных черт языка S-Plus
(S-PLUS Features at a Glance [4] ).
- Имеется пользовательский интерфейс с системой меню, позволяющий осуществлять последовательность действий в диалоге с программой (Interactive analysis, with step-by-step feedback).
- Имеется встроенный объектно-ориентированный язык, (Built-in, true object-oriented language).
Возможности языка
- Классы (объекты), механизм наследования, встроенные(?) функции и методы (generic functions, and methods).
- Операции и функции для работы со скалярными величинами, векторами и массивами (scalars, vectors, arrays)
- Структурный язык (structured language), включающий операторы for, while, next, repeat, break.
- Логические операторы: >, >=,
- Интеллектуальные операторы для работы с объектами (Sophisticated operators for assigning, extracting, replacing parts of objects).
- Объект список, позволяющий создавать структурированные массивы разнородных объектов.
- Функцию подстановки для цикла, обрабатывающего сходные объекты («Merge» function for intregrating data sets).
- Функции «By» и «Aggregate» (for analyzing specific variables for each of the various levels of another variable).
- Создавать собственные процедуры обработки данных.
- Корректировать (modify) любую из 1650 имеющихся функций.
Интерфейс с программами на языках C и FORTRAN
- Можно использовать как интерфейс (front-end) для коммерческих библиотек (IMSL, NAG и т.д.)
- Динамическая и статическая загрузка программ пользователя, написанных на C или ФОРТРАНЕе.
- Динамическая загрузка
Интерфейс с операционной системой
- Порождение процессов (Spawn subprocesses).
- Доступ к редакторам, имеющимся в системе.
- Обмен данными с операционной системой и другими приложениями (Pass data to/from operating system and other applications).
Ввод/Вывод
Помощь и документация
Контекстная подсказка (help system); обширная документация; Command line recall and editing; Telephone and e-mail Helpline.
- Функции (Classic and modern functions insure penetrating analysis and best fit)
- Basic statistics
- Элементарная статистика (Descriptive summary statistics).
- Проверка гипотез по критерию Стьюдента (Student’s t-test).
- Проверка гипотез по критерию хи-квадрат (Chi-square test).
- Ранговый критерий Вилксона (Wilcoxon rank sum test).
- Binomial test
- Mantel-Haenszel test
- Стандартные распределения плотности (Probability distributions).
- Многофакторная (Multivariate) статистика и графика.
- Иерархическая кластеризация (Hierarchical clustering).
- k-means clustering
- Model-based clustering
- Древовидная классификация
- Log-linear contingency
table analysis (анализ случайностей).
- Minimum spanning tree
(минимально разветвленное дерево).
- Компонентный анализ
- Факторный анализ (Factor
- Каноническая корреляция
- Многомерное масштабирование
- Chernoff’s faces
- Графическое представление
кластеров в форме диаграмм (Star-symbol plots) и дендрограмм, отображающих дерево кластеров.
пар переменных (Scatterplot matrices).
- Математические вычисления.
- Операции с векторами
и матрицами (+, * и т.д.).
- Eigenanalysis
- Инвертирование матриц
и решение линейных уравнений.
- Нахождение собственных
(Singular) значений и QR декомпозиция.
- Поддержка стандарта
IEEE (IEEE special values supported).
- Интерфейс с пакетом
LAPACK (численные методы линейной алгебры).
- Определители и нормы
матриц и [conditional estimation].
- Решение линейных уравнений
для задач неопределенности, квадратичных уравнений и метода наименьших квадратов.
- Диаграммы оценки качества
(Quality control charts).
- Shewhart charts
- Cusum charts
- Специализированные
графики (xbar, s, np, p, c, u).
- Регрессия и дисперсионный
анализ (Regression and ANOVA).
- Линейная регрессия
методом наименьших квадратов (least squares).
- Нелинейная регрессия
методом наименьших квадратов.
- Дисперсионный анализ
(Balanced and unbalanced ANOVA).
- Обратная регрессия
- Корреляция квадратов
остатков (Least trimmed squared residuals regression (high breakdown point robust regression)).
- Обобщенная линейная
модель (Generalized linear models).
- Обобщенная модель
роста (Generalized additive models (GAM)).
- Residual deviance
(for model comparison)
- ACE and AVAS regression
- Projection pursuit
- M-estimates of regression
- Tree-based regression
- Survival analysis
- Kaplan-Meier and Fleming-Harrington
- G-rho survival curve
- Parametric survival
- Cox proportional hazards
models for time dependent covariates, multiple events and discontinuous intervals of risk
- Formula-based model
- National rate tables
for age and sex matching of subjects to estimate expected survival curves
- Анализ временных рядов
/ сигналов (Time series/signal analysis).
- Автокорреляция.
- Построение автокорреляционной
модели (классической и грубой).
- Построение АРИСС-моделей
- Вычисление параметров
- Complex demodulation
- Спектральный анализ.
- Преобразование Фурье
и алгоритм БПФ (Fourier transformations).
- Сглаживание (разнообразные
классические и грубые методы).
- Интегрированная графика,
позволяющая наилучшие методы визуализации данных и результатов.
- Вывод графиков в нескольких
окнах (Multiple graphics windows).
- Управление мышью (Location
of graphics via mouse).
- Анализ графиков мышью
(Point identification using mouse).
- Переопределение цветовой
гаммы (User-definable color maps).
- Interactive color
- Трехмерное вращение
графиков (3D data spinning).
- Матрица для отображения
взаимосвязи многих переменных.
- Condition on different
levels of an underlying variable
- Formula-based display
specification with conditioning on factors or continuous variables
- Multi-paneled displays
with flexible control over axes and aspect ratios
computations that let the data select the aspect ratio
- Трехмерная графика.
- Contour plot
- Data spinning
- Mesh surface with
- Image plots (pixel
data representation, color or gray scale)
- Scatterplot matrix
- Двумерная графика
- График двух переменных
- График временной зависимости
(Time series plots).
- Диаграммы (Box plots,
pie charts, histograms, bar plots, dot charts)
- Семейства кривых (Overlay
multiple plots or display side-by-side)
- Логарифмический и
линейный масштабы (Log and linear axis scaling).
- Управление стилями
линий, курсоров, текста, цветом и пр.
- Карты США.
- Функции по выводу
карт (General mapping functions).
- Графический пользовательский
интерфейс (Windows GUI features).
- Опции могут отображаться
в специальных диалоговых панелях (dialog box), что создает дружественность интерфейса.
- Управление объектами
и возможность наблюдения за их состоянием (Object brower to interactively display filter type and select S-PLUS objects).
- Отображение предыдущих
команд, сохраняемых в специальном файле (Command history window displays all commands, which can be selected, executed, edited or saved to a file)
- Поддержка DDE, позволяющая
приложениям, разработанным под Visual Basic или Visual C++ использовать S-Plus, посылая команды на исполнение и получая результаты (DDE serve support allows applications to send commands to S-PLUS and receive results, e.g. Visual Basic or Visual C++ interface applications).
- Включает диалоговые
панели (dialog boxes) для задания параметров функций S-PLUS в диалоговом режиме.
- Включает возможность
настраивать (создавать новые) меню, диалоговые панели и органы управления, связанные с командами и функциями S-PLUS (customizable menus to generate S-PLUS commands, customizable dialog boxes and controls).
Библиотека timeslab [5], содержащая функции для построения АРСС (ARMA) моделей и анализа временных рядов. Используется интерфейс S с библиотеками ФОРТРАНа (судя по исходному тексту — IMSL, NAG, ACM Collection).
Библиотеки, содержащие функции на языке S и SPlus (S+)
Ниже приведен краткий список библиотек, содержащих функции на языке S и Splus, реализующие описанные методы, предлагаемые для решения задачи прогнозирования, а также несколько библиотек, позволяющих связывать текст на языке S с текстом, написанным на ФОРТРАНе или С (С++) :
- class — библиотека подпрограмм для классификации
- fracdiff — подпрограммы вычисления параметров арисс-модели
- gmanova — подпрограммы дисперсионного анализа
- linreg — подпрограммы построения линейной регрессии
- mclust — подпрограммы кластерного анализа
- mda — подпрограммы дискриминантного анализа
- mmreg — подпрограммы построения множественной регресии
- nnet — прогнозирование с использованием нейронных сетей
- nonlin — подпрограммы построения нелинейной регресии
- pear — периодическая авторегрессия
- s.f77.c.libs — программный интерфейс с Фортраном и С
- safe.predict
- time.series — анализ временных рядов с использованием АРСС-моделей
- time.series.guide — руководство по анализу временных рядов
- timeslab — подпрограммы по анализу временных рядов с использованием текстов на Фортране
Пакеты
Примером совмещения возможностей S и дружественного пользовательского интерфейса, описываемого на языке LISP может служить пакет S-Mode (Emacs, упоминаются версии 4.8 и ниже).
Следует упомянуть о том факте, что в тексте, описывающем достоинства языка R, указывается ряд недостатков языка S и его программных реализаций (ошибки по памяти, не полная совместимость для различных платформ и пр.). Кроме того не ясна доступность программных оболочек и компиляторов, возможно, их стоимость — велика. (Указывается, что R распространяется свободно — standart GNU-style copyleft — в отличие от copyright).
Сопоставление SAS и S (программы для анализа и обработки данных)
В приведенных ниже статьях содержится сопоствление SAS и S — двух программых продуктов, занимающих лидирующие позиции на рынке программ для анализа и обработки данных. Оба продукта содержат собственные языки программирования и средства разработки. Автор указывает на то, что он использует оба средства, однако предпочтительнее для него S-Plus. Один из аргументов в пользу S-Plus — его более низкая стоимость.
Dr. Terry Therneau uses both S-PLUS and SAS to maximize his data analysis
Описание применений S-PLUS для решения финансовых задач
Источники информации в Internet
Pages (перечень страниц, почти каждая содержит информацию по одному или нескольким программным продуктам.
- Guide to Available Math Software — руководство по доступному программному
обеспечению, содержит удобную поисковую систему по ключевым словам и древовидный индекс — problem decision tree, позволяющий последовательно сужать поиск. Содержит информацию
о программных библиотеках исходных текстов и о статистических пакетах.
- Core Math LIBrary
— сборник статистических библиотек на ФОРТРАНе, с исходными текстами снабженными комментариями, включающими описание методов.
содержит информацию, включая исходные коды с примерами данных (datasets and code). Указываются языки XLispStat, S, R, BLSS и др.
- S-Plus, MathSoft Home Page cодержит информацию по языкам программирования S и S-Plus.
- Power Analysis software for PC-s обширный список программ, предназначенных для проверки статистических гипотез при анализе мощности. Обзор статистических пакетов и ссылок на соответствующие страницы.
- Kovach Computing services содержит список сайтов по статистической обработке данных. Предоставляет консультации по пакетам SIMSTAT, MVSP, Oriana.
- NetLib , http://risc1.numis.nwu.edu/ftp/pub/list-packages.HTMl
- NPSTAT home cодержит большой список современные методы для непараметрического контроля и других методов статистической обработки (statistics in general).
Примечания
Wikimedia Foundation . 2010 .
- Александровская бухта (Севастополь)
- Золото (фильм, 1993)
10.1.27. Работа с временными файлами
Во многих случаях необходимо работать с файлами, которые по сути своей анонимны. Мы не хотим возиться с присваиванием им имен и проверять, что при этом не возникает конфликтов с существующими файлами. И помнить о том, что такие файлы нужно удалять, тоже не хочется.
Все эти проблемы решает библиотека Tempfile. Метод new (синоним open) принимает базовое имя в качестве строки-затравки и конкатенирует его с идентификатором процесса и уникальным порядковым номером. Необязательный второй параметр — имя каталога, в котором создается временный файл; по умолчанию оно равно значению первой из существующих переменных окружения tmpdir, tmp или temp, а если ни одна из них не задана, то «/tmp».
Возвращаемый объект IO можно многократно открывать и закрывать на протяжении всей работы программы, а по ее завершении временный файл будет автоматически удален.
У метода close есть необязательный флаг; если он равен true, то файл удаляется сразу после закрытия (не дожидаясь завершения программы). Метод path возвращает полное имя файла, если оно вам по какой-то причине понадобится.
name = temp.path # «/tmp/stuff17060.0»
temp.puts «Здесь был Вася»
str = temp.gets # «Здесь был Вася»
temp.close(true) # Удалить СЕЙЧАС.
Данный текст является ознакомительным фрагментом.
Продолжение на ЛитРес
Читайте также
Работа с файлами
Работа с файлами fopenОткрывает файл и привязывает его к дескриптору.Синтаксис:int fopen(string $filename, string $mode, bool $use_include_path=false)Открывает файл с именем $filename в режиме $mode и возвращает дескриптор открытого файла. Если операция «провалилась», то функция возвращает false. Необязательный
Работа с файлами
Работа с файлами ftp_getПроизводит загрузку с FTP-сервера.Синтаксис:int ftp_get(int ftp_stream, string local_file, string remote_file, int mode)Функция ftp_get() загружает файл под названием remote_file с FTP-сервера и локально сохраняет его под именем local_file. Параметр mode устанавливает режим передачи файла и может
Работа с файлами
Работа с файлами В среде программирования UNIX существуют два основных интерфейса для файлового ввода/вывода:1. Интерфейс системных вызовов, предлагающий системные функции низкого уровня, непосредственно взаимодействующие с ядром операционной системы.2. Стандартная
14.2 Работа с файлами
14.2 Работа с файлами Начну рассказ наверно с того, что в любой момент времени работы в терминале вы находитесь в некотором каталоге. При запуске терминала текущей директорией является домашний каталог пользователя, но потом вы конечно можете её поменять.Узнать, в какой же
Эффективная работа с временными файлами сортировки
Эффективная работа с временными файлами сортировки В сервере InterBase сортировка всегда выполняется с использованием временных файлов, независимо от количества доступной памяти. Операции чтения/записи временных файлов дополнительно нагружают дисковую подсистему, что
Работа с временными файлами
Работа с временными файлами Довольно часто вам будет необходимо создавать временные файлы. Обычно это файл, в котором хранятся какие-то используемые скриптом данные либо что-то еще. Как только работа скрипта будет завершена, этот файл нужно удалить. При создании такого
Работа с файлами
Работа с файлами С помощью специальной внешней объектной библиотеки VBA позволяет использовать объектно-ориентированный подход при работе с дисковыми файлами, в частности для чтения содержимого каталогов и копирования файлов. Соответствующие приемы программирования
ПЕРЕКЛЮЧЕНИЕ И РАБОТА С ФАЙЛАМИ
ПЕРЕКЛЮЧЕНИЕ И РАБОТА С ФАЙЛАМИ Понятие ввода-вывода включает в себя функции, данные и устройства. Рассмотрим, например, нашу программу ввод-вывод4. В ней используется функция getchar( ), осуществляющая ввод, причем устройство ввода — клавиатура (в соответствии с нашим
Работа с файлами
Работа с файлами Набрав первые несколько абзацев, обязательно сохраните их. Для этого предназначена команда меню Файл ? Сохранить. В появившемся окне Сохранение документа необходимо указать имя и выбрать месторасположение файла. По умолчанию текстовый редактор
Работа с файлами и папками
Работа с файлами и папками Количество операций, выполняемых с файлами, способно повергнуть в шок начинающего пользователя. Копирование и переименование, поиск, резервное копирование и шифрование, при неудачном резервировании — восстановление, упорядочение данных, а
Работа с MP3-файлами
Работа с MP3-файлами Конвертируя диски в формат MP3, пользователь только первое время будет слушать композиции, сохраненные с пустыми тегами. Долгий поиск необходимой композиции вскоре начнет утомлять, ручное переименование тегов надоест после первых трех
4.2. Работа с файлами
4.2. Работа с файлами 4.2.1. Знакомство с Проводником Проводник — это файловый менеджер Windows, то есть программа, управляющая вашими файлами. Вообще-то Проводник также является оболочкой Windows, но не будем усложняться, а ограничимся лишь файловыми функциями
Работа с файлами
Работа с файлами Предположим, что мы создали какой-то документ Flash и теперь хотим сохранить его в файле. Что нужно делать в этом случае?Чтобы сохранить открытый в активном окне документ в файле документа Flash, достаточно выбрать пункт Save в меню File или нажать комбинацию
Работа с файлами
Работа с файлами Один элемент работы с файлами мы уже рассмотрели – это создание файла. Следующий важный элемент работы с файлом – это открытие файла.Действительно, создав файл и сохранив в нем информацию, мы все это сделали для того, чтобы иметь возможность продолжить
Практическая работа 14. Работа с файлами и папками
Практическая работа 14. Работа с файлами и папками Задание. Научиться создавать папки, копировать, перемещать, переименовывать и удалять файлы.Последовательность выполнения1. Откройте с помощью меню Пуск папку Документы.2. В папке Документы создайте новую папку с именем
Темп работы программиста: как его оценить и повысить?

Понимаете, что пишите код слишком медленно? Работодатель хочет, чтобы вы работали в 2 раза быстрее? Чувствуете себя хуже коллег, которые умеют оперативно решать задачи? Тогда эти советы для вас!
Выявите проблему
Так как скорость кодинга – это довольно субъективный параметр, ощущение разработчика в этом плане может быть как временным, так и постоянным. Иногда программист не способен писать код быстро только в определенные периоды времени. Это происходит по разным причинам:
- недостает базовых знаний для понимания слов, символов, пр.;
- сложно удерживать в голове несколько идей решения сразу;
- нет понимания, с чего начать;
- пропуск шагов разработки;
- наличие отвлекающих факторов.
Результат – несоблюдение сроков, провал проекта, отсутствие премий, выговоры начальства, осуждение от коллег и прочие неприятности. Если подобный негативный опыт накапливается, появляется устойчивое ощущение низкой продуктивности.
Если взять во внимание текущую ситуацию в ИТ-сфере, не сложно догадаться, что «опоздуны» лишаются своих рабочих мест в первыми.

Пользуйтесь готовыми решениями
Всегда есть возможность не только ускорить решение определенной задачи, но и повысить рабочий темп в целом.
Разберем по каждому пункту отдельно:
- Если есть нехватка базовых знаний — ликвидируйте ее самостоятельно или просите о помощи старших коллег, отзывчивых членов сообществ в сети и т.д.
- Сложно построить в уме полную архитектуру задачи — перенесите мысли и идеи на бумагу.
- Не понимаете, как начать — приступайте к решению той части задачи, которая вам под силу, даже если данная функция будет не самой значимой.
- Чтобы не допустить пропуска шагов разработки — набросайте план, разбейте программу и рабочий процесс на структурные элементы и расположите их в правильном порядке.
- Легко и часто отвлекаетесь — делите проект на простые подзадачи. Работайте этапами по 20-30 минут, делая между ними 5-минутные перерывы. Ровно столько времени человек способен полностью фокусироваться на какой-нибудь несложной задаче.

Повысьте скорость разработки
Как же быть, если вы считаете, что ваша низкая производительность носит устойчивый характер? В данном случае нужно верно оценить собственную скорость работы. Для этого проведите сравнение своих показателей и показателей коллег по таким параметрам:
- скорость кодинга;
- качество полученного ПО;
- сопровождение;
- количество комментариев;
- читаемость.
Из-за того, что задачи обычно сильно различаются, сделать такое сравнение будет непросто. Поэтому рекомендуем вам брать во внимание и анализировать сразу десяток, а то и больше, больше задач. Если результат сравнения вам не понравится, обратитесь за советом к более опытным разработчикам – они подскажут, как можно ускориться.
Но что делать, если коллег как таковых у вас нет? Тем, кто работает в конкретном стеке сам, на помощь придет профессиональное сообщество. Сейчас для любого стека есть своя группа разработчиков в Slack. Говорите с ними о своем опыте, просите помощи в сложных ситуациях. Покажите свой способ решения задачи. Сообщите, сколько времени у вас заняла его реализация. Узнайте, за сколько справились бы другие программисты

Используйте программы для тайм-менеджмента
Те, кто обладает большим опытом программирования, могут оценивать темп своей работы по внутренним ощущениям. Новички же обычно смотрят на коллег и сравнивают себя с ними.
Но такие оценки в любом случае будут приблизительными, субъективными. Для объективного результата пользуйтесь программами, которые позволяют контролировать и организовывать тайминг.
Благодаря им вы сможете:
- Демонстрировать руководству, как много времени у вас ушло на решение конкретной задачи. Это позволит прояснить вашу загруженность.
- Сравнить, сколько времени у вас уходило на решение похожих задач год, месяц или неделю назад. Если скорость повышается и при этом качество результата растет, вы идете в верном направлении. К тому же, показав руководству настоящие цифры, можно без сомнений просить повышения зарплаты.
- Показав сообществу профессионалов самостоятельно выполненный проект, вы сможете узнать, сколько времени в среднем требуется другим программистам, чтобы написать такой же код. Благодаря обратной связи у вас появится возможность оценить свою скорость.
Настойчиво идите к поставленным целям
Неважно, с какой целью вы хотите научиться кодить быстрее – чтобы всегда соблюдать дедлайны, получить повышение или прибавку к зарплате, просто сохранить работу и пр. – просто воспользуйтесь нашими советами. Уверены, они вам точно помогут. Главное – быть дисциплинированным и настойчивым!
Больше интересных новостей
Java и MySQL база данных / Разработка приложения на JavaFx

«Яндекс» теперь умеет предсказывать запросы пользователей

Что нужно знать C++ разработчику? Краткий гайд по профессии

Лучшие книги в 2023 году по DevOps
Что такое temp в программировании
Параметрический полиморфизм — еще одно из проявлений принципа полиморфизма, которое позволяет многократно использовать один и тот же код применительно к разным типам. Реализация функции или класса осуществляется один раз, но при этом тип указывается как параметр этой функции или класса. При использовании этой функции или класса параметра типа заменяется на встроенный или абстрактный тип данных и универсальных код, не зависящий от типа, работает с указанным типом. Существуют целые библиотеки таких функций и классов (например, STL) и такая технология называется обобщенное программирование.
Шаблоны (templates) – средство для реализаций параметризированных классов и функций на языке С++.
6.3.1. Шаблоны функций. Пример 6.2 (шаблон функции)
Если функция выполняет одни и те же действия над аргументами различных типов, можно параметризировать такую функцию, то есть оформить в виде шаблона. Например:
void swap(int& x, int& y) < int temp=x; x=y; y=temp; >
templateclass TYPE> void swap(TYPE& x, TYPE& y)
Для создания шаблона мы заменили тип int на лексему TYPE с помощью ключевого слова template в скобках <>. Компилятор же выполнит замену наоборот, он заменит лексему TYPE на любой тип, который ему указать:
// использование шаблона double x=1.5, y=1.6; swapdouble>(x,y); // в данном случае тип double
Генерация функции по шаблону и ее аргументу называется инстанцирование. Возможно выведение типа аргумента шаблона по типам его аргументов, но лучше явно указывать параметр в скобках <>.
///////////////////////////////////////////////////////////////////////////// // Прикладное программирование // Пример 6.2. Шаблон функции // // Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru // Университет ИТМО ///////////////////////////////////////////////////////////////////////////// #include #include using namespace std; ///////////////////////////////////////////////////////////////////////////// // шаблон функции, меняющий местами значения двух переменных // TYPE — параметр шаблона (тип данных переменных) templateclass TYPE> void Swap(TYPE& x, TYPE& y) < TYPE temp=x; x=y; y=temp; >///////////////////////////////////////////////////////////////////////////// // тестирование шаблона функции void main() < double dx=1.5, dy=1.6; cout» «<
6.3.2. Шаблоны функций с несколькими параметрами. Пример 6.3 (шаблон функции с несколькими параметрами)
Часто возникает необходимость использовать несколько параметров у одной функции шаблона. При этом в качестве параметра может использоваться не только тип данных, но и числовое значение.
///////////////////////////////////////////////////////////////////////////// // Прикладное программирование // Пример 6.3. Шаблоны функций с несколькими параметрами // // Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru // Университет ИТМО ///////////////////////////////////////////////////////////////////////////// #include using namespace std; ///////////////////////////////////////////////////////////////////////////// // шаблон функции с двумя параметрами TYPE1 и TYPE2 // преобразование переменно x типа TYPE1 к типу TYPE2 templateclass TYPE1, class TYPE2> bool transform(TYPE1 x, TYPE2& y) < if(sizeof(y) < sizeof(x)) return false; y=(TYPE2)x; return true; > ///////////////////////////////////////////////////////////////////////////// // шаблон функции с двумя параметрами: типом и числовым значением // функция вычисляет факториал числа n templateclass TYPE, int n> TYPE factorial() < TYPE sum=1; int i=1; while(i <=n) < sum*=i; i++; >return sum; > ///////////////////////////////////////////////////////////////////////////// // тестирование шаблона функции с несколькими параметрами void main() < int x=1; double y; // преобразование типа int в double transformint, double>(x, y); cout"double("<double res=factorialdouble, 4>(); cout"4!=" /////////////////////////////////////////////////////////////////////////////
6.3.3. Шаблоны классов. Пример 6.4 (шаблон класса Комплексное число)
Шаблоны позволяют реализуют в языке С++ такое отношение между классами, как инстанцирование. При создании шаблона класса тип одного или нескольких его переменных членов задаются в качестве параметра. При использовании этого шаблона необходимо будет указать, какой тип использовать в качестве параметра. Это и называется инстанцированием. Например, обобщенный класс Complex. Многие классы, которые используются для хранения и управления гомогенными структурами данных, реализуют в виде шаблонов. И действительно, независимо от типов хранимых в нем элементов, класс Complex должен выполнять одни и те же функции
Процесс генерации объявления класса по шаблону и аргументу называется инстанцированием шаблона.
///////////////////////////////////////////////////////////////////////////// // Прикладное программирование // Пример 6.4. Шаблон класса Комплексное число // complex.h // // Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru // Университет ИТМО ///////////////////////////////////////////////////////////////////////////// // проверка на повторное подключение файла #if !defined COMPLEX_H #define COMPLEX_H #include using namespace std; ///////////////////////////////////////////////////////////////////////////// // шаблон класса Комплексное число template class PAR> class Complex < private: // вещественная и мнимая часть комплексного числа PAR m_re, m_im; public: // конструкторы Complex(); Complex(PAR re, PAR im=PAR(0)); Complex(const Complex& other); public: // получение параметров комплексного числа PAR GetRe() const; PAR GetIm() const; // изменение параметров комплексного числа void Set(PAR re, PAR im=PAR(0)); // оператор умножения Complex operator*(const Complex& other) const; // оператор умножения на число Complex operator*(const PAR& other) const; // оператор умножения с присваиванием Complex& operator*=(const Complex& other); // оператор присваивания Complex& operator=(const Complex& other); // оператор равенства bool operator== (const Complex& other) const; // оператор сопряжения комплексного числа Complex operator~() const; // унарный минус Complex operator-() const; // ввод/вывод комплексного числа template class PAR> friend ostream& operatorconst Complex& x); template class PAR> friend istream& operator>> (istream& out, Complex& x); >; ///////////////////////////////////////////////////////////////////////////// // конструктор по умолчанию template class PAR> Complex::Complex() : m_re(0.) , m_im(0.) < >///////////////////////////////////////////////////////////////////////////// // полный конструктор template class PAR> Complex::Complex(PAR re, PAR im) : m_re(re) , m_im(im) < >///////////////////////////////////////////////////////////////////////////// // конструктор копирования template class PAR> Complex::Complex(const Complex& x) : m_re(x.m_re) , m_im(x.m_im) < >//////////////////////////////////////////////////////////////////////////// // получение вещественной части комплексного числа template class PAR> PAR Complex::GetRe() const < return m_re; > ///////////////////////////////////////////////////////////////////////////// // получение мнимой части комплексного числа template class PAR> PAR Complex::GetIm() const < return m_im; > ///////////////////////////////////////////////////////////////////////////// // изменение параметров комплексного числа template class PAR> void Complex::Set(PAR re, PAR im) < m_re=re; m_im=im; >///////////////////////////////////////////////////////////////////////////// // оператор умножения template class PAR> Complex Complex::operator*(const Complex& other) const < return Complex(m_re*other.m_re-m_im*other.m_im, m_re*other.m_im-m_im*other.m_re); > ///////////////////////////////////////////////////////////////////////////// // оператор умножения на число template class PAR> Complex Complex::operator*(const PAR& other) const < return Complex(m_re*other, m_im*other); > ///////////////////////////////////////////////////////////////////////////// // оператор умножения с присваиванием template class PAR> Complex& Complex::operator*=(const Complex& other) < Complex temp(*this); m_re=temp.m_re*other.m_re - temp.m_im*other.m_im; m_im=temp.m_re*other.m_im + temp.m_im*other.m_re; return (*this); > ///////////////////////////////////////////////////////////////////////////// // унарный минус template class PAR> Complex Complex::operator-() const < return Complex(-m_re, -m_im); > ///////////////////////////////////////////////////////////////////////////// // оператор сопряжения комплексного числа template class PAR> Complex Complex::operator~() const < return Complex(m_re, -m_im); > ///////////////////////////////////////////////////////////////////////////// // оператор равенства template class PAR> bool Complex::operator== (const Complex& other) const < return (m_re == other.m_re && m_im == other.m_im); > ///////////////////////////////////////////////////////////////////////////// // оператор присваивания template class PAR> Complex& Complex::operator=(const Complex& other) < if(this != &other) < m_re=other.m_re; m_im=other.m_im; >return *this; > ///////////////////////////////////////////////////////////////////////////// // вывод комплексного числа на экран template class PAR> ostream& operatorconst Complex& x) < return (out"("<< ); > ///////////////////////////////////////////////////////////////////////////// // ввод комплексного числа с клавиатуры template class PAR> istream& operator>> (istream& in, Complex& x) < return (in>>x.m_re>>x.m_im); > ///////////////////////////////////////////////////////////////////////////// #endif //defined Complex_H
///////////////////////////////////////////////////////////////////////////// // Прикладное программирование // Пример 6.4. Шаблон класса Комплексное число // test_complex.cpp // // Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru // Университет ИТМО ///////////////////////////////////////////////////////////////////////////// #include using namespace std; // подключение описания класса #include "complex.h" ///////////////////////////////////////////////////////////////////////////// // пример использования шаблона класса Complex void main() < Complexint> a(5), b(3,3); Complexdouble> c(1.144, -0.155); cout" "" " /////////////////////////////////////////////////////////////////////////////