- •Преимущества
- •Связь: ooa→oop→ood
- •Механизм работы virtual
- •Абстрактный класс
- •Виртуальный деструктор
- •{Основные элементы языка программирования}
- •Основные подходы к семантике:
- •Формальное описание семантики:
- •Среда программирования
- •Объекты данных
- •Атрибуты объекта данных
- •Система типизации данных
- •Реализация типов данных
- •Типизация
- •Система типизации данных
- •Реализация типов данных
- •Связывание переменных
- •Контроль типов
- •Статистический контроль типов
- •Алгоритм статистического контроля типов
- •Динамический контроль типов
- •Параллелизм
- •Полиморфизм
- •Статический полиморфизм
- •Динамический полиморфизм
- •Преобразование типов
- •Связь: ooa→oop→ood
- •Среда программирования
- •Цель технологий параллелизма
- •Схемы параллелизма
- •Проблемы параллельного программирования
- •Показатели эффективности параллельного алгоритма Ускорение
- •Закон Густавсона-Барсиса
- •Масштабируемый алгоритм
- •Схемы параллелизма
- •Подтипы данных
- •Разновидности массивов. Статические
- •Кортежи
- •Разновидности массивов. Статические
- •Динамические
- •Атрибуты объекта данных
- •Операции над целыми числами
- •Вещественные числа
- •Числа с фиксированной точкой
- •Числа с плавающей точкой(float)
- •Ошибки вычислений с вещественными числами
- •Утечки памяти и повисшие указатели
- •Указатели на указатели
- •Типизированные указатели
- •Указатели на функции
- •[Отличия указателей и ссылок]
- •Параметры подпрограмм
- •Преимущества подпрограмм
- •Позиционное сопоставление
- •Сопоставление по имени
- •Методы передачи параметров:
- •Передача параметров по значению
- •Передача параметров по ссылке
- •Передача параметров по значению-результату
- •Параметр по результату
- •Стековые языки
- •Циклы и рекурсия
- •Циклы со счетчиком
- •Операторы циклы без заданного числа повторений (бесконечно)
- •Динамический полиморфизм
- •Родовые (настраиваемые) сегменты и шаблоны
Циклы и рекурсия
• Повторение некоторой последовательности операторов – это мощное средство для сокращения длины программы и повышения эффективности вычислений.
• Итерация – способ многократного повторения последовательности операторов, реализуемый в виде цикла.
• Рекурсия – способ организации повторений, при котором последовательность операторов вызывает сама себя непосредственно либо с помощью других последовательностей.
• Рекурсия является естественной математической формой записи повторяющихся вычислений (на основе функций).
• Рекурсия считается главным средством поддержки повторений в функциональных языках.
• Тело цикла – группа многократно повторяющихся операторов. Этот набор определяет функциональные возможности цикла.
• Итерация – одно повторение тела цикла.
• Секция управления управляет количеством повторений тела. Размещена как перед телом, так и после тела цикла.
• Условие цикла - определение момента, когда следует закончить цикл.
В результате формируется условие продолжения, или условие завершения цикла.
• Различают циклы с предусловием и с постусловием.
Циклы:
• Операторы тела могут выполняться 0 или более раз.
• Операторы тела повторяются пока условие равно True.
• В теле должен быть оператор, влияющий на значение условия (для исключения бесконечного повторения)
Циклы со счетчиком
В составе секций управления есть переменная цикла, которая принимает дискретное количество значений и используется для подсчета количества повторений тела.
• Секций управления ограничивает количество значений переменной цикла, определяя ее начальное, конечное значение, а такде величину шага между соседними значениями. Начальное и конечное значение переменной, а также величину шага – параметры цикла.
• Условие проверяются перед выполнением тела. Если условие не выполняется в самом начале работы оператора, тело не будет выполнено ни разу.
• Величина шага постоянна.
• Циклы с повторением по данным
• Позволяют перебирать все элементы многоэлементной структуры, обращаясь к каждому из них по очереди.
• Востребованы в объектно-ориентированном программировании, где используются для создания итераторов.
• При каждом повторении цикла целая переменная х будет принимать значение, равное следующему элементу массива intArray. Размер массива определяет количество повторений тела цикла.
• Отличает от счетчика, что шаг всегда один, а не задается.
<Циклы в функциональных языках>
В чисто функциональных языках отсутствуют переменные, поэтому вместо итерации здесь используют рекурсию.
Циклы моделируются:
• Счетчик может быть параметром для функции, многократно выполняющей тело цикла.
• Тело определяется во вспомогательной функции, которая тоже посылается в функцию цикла как параметр.
• Т.о функция цикла принимает в качестве параметров тело вспомогательной функции и количество повторений.
Операторы циклы без заданного числа повторений (бесконечно)
• Количество повторений тело заранее неизвестно.
• Решение о прекращении цикла принимается по результатам анализа текущей ситуации.
• В этом случае говорят о логически управляемых циклах.
• Любой цикл с управлением по счетчику можно построить с помощью логически управляемого цикла, но не наоборот.
• Языки С, С++, С#, java управление циклами:
1. Безусловный оператор break для выхода из цикла.
2. Безусловный оператор continue для досрочного прекращения текущей итерации с передачей управления на следующую итерацию цикла.
Особенности:
• Внутри всех выражений могут содержаться присваивания.
• Все выражения необязательны.
• Не существует явных счетчиков или параметров цикла.
• Все переменные, указанные в секции управления, могут изменяться в теле цикла.
• В качестве первого и третьего выражений разрешают применять составные выражения.
Отличия С++ от С:
• Для управления циклом он может использовать как арифметическое, так и булево выражение.
• Первое выражение может содержать определения переменных.
<Рекурсия>
• Описание объекта в терминах самого себя.
• С точки зрения математики- более простая форма организации повторений.
Простой пример рекурсии – ряд Фибоначчи1,1,2,3,5,8,13.
F(0)=1
F(1)=1
F(n)=F(n-2)+F(n-1) для n>2
• Подпрограмма называется рекурсивной, если она обращается к самой себе непосредственно, либо косвенно путем цепочки вызовов других функций.
Основные моменты:
• Основной недостаток – повторные вычисления. Необходимо ввести дополнительную структуру данных для запоминания значений, которые уже были вычислены – динамическое программирование сверху.
• Условие прекращения рекурсии – каждая рекурсивная подпрограмма должна предполагать такой вариант работы, когда нового рекурсивного вызова больше не производится и цепочка вызовов прекращается в исходной точке.
• Вызов с другим значением параметра - внутренний вызов нужно производить с модифицированным значением параметра.
Линейная рекурсия
• Линейная рекурсия – это рекурсия, при которой рекурсивные вызовы на любом рекурсивном срезе, инициируют не более одного последующего рекурсивного вызова.
Int factorial (int n){
If (n<1)
Return 1;
Else
Return n*factorial(n-1)}
Повторная рекурсия
• Частный случай линейной рекурсии с отсутствующими предварительными или отложенными вычислениями.
• Рекурсивный вызов внутри программы является последним оператором. Все действия программы в этом случае выполнены и внутренние состояния запоминать не нужно.
Int f (int n){
If n==0
Return 0;
Else if n%2==0 return f(n/2_;
Else return f(n-1)/2…}
Каскадная рекурсия
• Рекурсивные вызовы могут возникать более одного раза на одном рекурсивном срезе, образуя древовидную схему вызовов.
Int fibo (int n){
If(n<=1)
Return 1;
Else fibo (n-1)+ fibo (n-2);}
Удаленная рекурсия
• Если в теле функции при рекурсивных вызовах, в выражениях, являющихся фактическими параметрами, снова встречаются рекурсивные вызовы этой функции.
Int f(int i){
If(B1(n))
Return..;
Else
Return f(i-1);}
Взаимная рекурсия
• Циклическая последовательность вызовов несколько фунций F1, F2..Fk друг друга: F1 вызывает F2 и т.д.
• Практически всегда взаимную рекурсию можно свести к простой.
Int f1( int n){
If(n<1) return f2(n); вызывает}
62. Общая характеристика языков ассемблера: назначение, принципы построения и использования; структура языка.
Намечают три вида низкоуровневых языков
4) Машинный код
5) Мнемо код
6) Ассемблер, макроассемблер
Ассемблер - компьютерная программа, компилятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке.
Как и сам язык (ассемблера), ассемблеры, как правило, специфичны для конкретной архитектуры, операционной системы и варианта синтаксиса языка. Вместе с тем существуют мультиплатформенные или вовсе универсальные (точнее, ограниченно-универсальные, потому что на языке низкого уровня нельзя написать аппаратно-независимые программы) ассемблеры, которые могут работать на разных платформах и операционных системах.
Макроассемблеры является расширением ассемблера за счет включения макросредств
Машинный код – система команд конкретной вычислительной машины (процессора), которая интерпретируется непосредственно процессором. Команда, как правило, представляет собой целое число, которое записывается в регистр процессора. Процессор читает это число и выполняет операцию, которая соответствует этой команде.
Язык программирования низкого уровня (низкоуровневый язык программирования) – это язык программирования, максимально приближённый к программированию в машинных кодах. В отличие от машинных кодов, в языке низкого уровня каждой команде соответствует не число, а сокращённое название команды (мнемоника). Например, команда ADD – это сокращение от слова ADDITION (сложение). Поэтому использование языка низкого уровня существенно упрощает написание и чтение программ (по сравнению с программированием в машинных кодах). Язык низкого уровня привязан к конкретному процессору. Например, если вы написали программу на языке низкого уровня для процессора PIC, то можете быть уверены, что она не будет работать с процессором AVR.
Язык программирования высокого уровня – это язык программирования, максимально приближённый к человеческому языку (обычно к английскому, но есть языки программирования на национальных языках, например, язык 1С основан на русском языке). Язык высокого уровня практически не привязан ни к конкретному процессору, ни к операционной системе (если не используются специфические директивы).
Язык ассемблера – это низкоуровневый язык программирования, на котором вы пишите свои программы. Для каждого процессора существует свой язык ассемблера.
Ассемблер – это специальная программа, которая преобразует (компилирует) исходные тексты вашей программы, написанной на языке ассемблера, в исполняемый файл (файл с расширением EXE или COM). Если быть точным, то для создания исполняемого файла требуются дополнительные программы, а не только ассемблер.
63. Сериализация и десериализация. Методы сериализации объектов в базу данных.
Сериализация (в программировании) — процесс перевода какой-либо структуры данных в последовательность битов. Обратной к операции сериализации является операция десериализации (структуризации) — восстановление начального состояния структуры данных из битовой последовательности.
Сериализация используется для передачи объектов по сети и для сохранения их в файлы. Например, нужно создать распределённое приложение, разные части которого должны обмениваться данными со сложной структурой. В таком случае для типов данных, которые предполагается передавать, пишется код, который осуществляет сериализацию и десериализацию. Объект заполняется нужными данными, затем вызывается код сериализации, в результате получается, например, XML-документ. Результат сериализации передаётся принимающей стороне, например, по электронной почте или HTTP. Приложение-получатель создаёт объект того же типа и вызывает код десериализации, в результате получая объект с теми же данными, что были в объекте приложения-отправителя.
• Сериализация – процесс перевода какой-либо структуры данных в последовательность битов.
• Обратной к операции сериализации – десериализация – восстановление начального состояния структуры данных из битовой последовательности.
64. Динамическая диспетчеризация.
