Операторы циклы без заданного числа повторений (бесконечно)
• Количество повторений тело заранее неизвестно.
• Решение о прекращении цикла принимается по результатам анализа текущей ситуации.
• В этом случае говорят о логически управляемых циклах.
• Любой цикл с управлением по счетчику можно построить с помощью логически управляемого цикла, но не наоборот.
• Языки С, С++, С#, 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. Динамическая диспетчеризация.
Динамический полиморфизм
• Динамический полиморфизм – структурная неопределенность сохраняется до этапа выполнения.
1. Вариантные и неограниченные записи – одна переменная может иметь значение разных типов.
2. Диспетчеризация во время выполнения – механизм, посредством которого разрешение обращения к преопределенному методу осуществляется во время выполнения, а не во время компиляции. Этот полиморфизм реализуется с помощью виртуальных функций.
65. Родовые (настраиваемые) сегменты.
Родовой (настраиваемый) сегмент – параметризованный шаблон подпрограммы, используется для создания различных конкретных экземпляров подпрограмм.