Операторы циклы без заданного числа повторений (бесконечно)

• Количество повторений тело заранее неизвестно.

• Решение о прекращении цикла принимается по результатам анализа текущей ситуации.

• В этом случае говорят о логически управляемых циклах.

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

• Языки С, С++, С#, 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. Родовые (настраиваемые) сегменты.

Родовой (настраиваемый) сегмент – параметризованный шаблон подпрограммы, используется для создания различных конкретных экземпляров подпрограмм.

Наши рекомендации