Билет №1 Понятие алгоритма. Характеристики и свойства
Алгоритм - предписание исполнителю совершить последовательность действий (набор операций и правил их чередования), направленных на достижение указанной цели или на решение поставленной задачи.
В общем случае алгоритмизация вычислительного процесса включает следующие действия:
-
последовательную декомпозицию задачи, выделение автономных этапов вычислительного процесса и разбивку каждого этапа на отдельные шаги;
-
формальную запись содержания каждого этапа и/или шага;
-
определение общего порядка выполнения этапов и/или шагов;
-
проверку правильности алгоритма.
Алгоритмы обладают целым рядом свойств:
Понятность для исполнителя - содержание предписания о выполнении только таких действий, которые входят в систему команд исполнителя.
Дискретность (прерывность, раздельность) - выполнение команд алгоритма последовательно, с точной фиксацией моментов окончания выполнения одной команды и начала выполнения следующей.
Определенность - каждое правило алгоритма должно быть четким, однозначным. Благодаря этому свойству выполнение алгоритма носит механический характер и не требует никаких дополнительных указаний или сведений о решаемой задаче.
Результативность - либо завершение решения задачи после выполнения алгоритма, либо вывод о невозможности продолжения решения по какой-либо из причин.
Массовость - означает, что алгоритм решения задачи разрабатывается в общем виде, т.е. он должен быть применим для некоторого класса задач, различающихся лишь исходными данными из некоторой области применимости алгоритма.
Характеристики подразделяются на временные и объёмные.
Временные характеристики алгоритма определяют длительность решения или временную сложность. Длительность решения часто выражается в единицах времени, но удобнее ее выражать через количество операций, так как последнее не зависит от быстродействия конкретной машины.
Временной сложностью алгоритма называется зависимость времени счета, затрачиваемого на получение результатов от объема исходных данных.
Объемные характеристики алгоритма определяют его информационную сложность, которая связана со сложностью описания, накопления и хранения исходных, промежуточных и результирующих данных при решении определенной задачи.
Объем текста алгоритма (программы) определяется количеством операторов, использованных для записи алгоритма.
Сложность структуры алгоритма определяется количеством маршрутов, по которым может реализовываться процесс вычислений и сложностью каждого маршрута.
Билет № 2 Структурное программирование
Структурное программирование – методология программирования, направленная на создание логически простых и понятных программ. Структурное программирование основано на предположении, что логичность и понятность программы облегчает разработку, доказательство правильности и последующее сопровождение программы, а также обеспечивает ее надежность.
Характерными принципами структурного программирования являются:
· нисходящее программирование – способ разработки программ, при котором программирование ведется методом «сверху вниз», от общего к деталям;
· модульное программирование, при котором относительно независимые подзадачи программируются в виде отдельных программных модулей;
· использование при программировании трех структур управления (следование, выбор, повторение). Структура следование предполагает естественную последовательность выполнения операторов. Структура выбор задается схемой «если – то – иначе» (условный оператор if). Структуре повторения сопоставлен оператор цикла;
· отказ от безусловных передач управления и ограниченное использование глобальных переменных.
В основе структурного программирования лежит теорема, которая была строго доказана в теории программирования. Суть ее в том, что алгоритм для решения любой логической задачи можно составить только из структур «следование, ветвление, цикл». Их называют базовыми алгоритмическими структурами. По сути дела, мы и раньше во всех рассматриваемых примерах программ придерживались принципов структурного программирования.
Следование– это линейная последовательность действий:
Каждый блок может содержать в себе как простую команду, так и сложную структуру, но обязательно должен иметь один вход и один выход.
Ветвление – алгоритмическая альтернатива. Управление передается одному из двух блоков в зависимости от истинности или ложности условия. Затем происходит выход на общее продолжение
:Цикл с предусловием
Цикл – повторение некоторой группы действий по условию. Различаются два типа цикла. Первый – цикл с предусловием:
Пока условие истинно, выполняется серия, образующая тело цикла.
Второй тип циклической структуры – цикл с постусловием:
Цикл с постусловием
Здесь тело цикла предшествует условию цикла. Тело цикла повторяет свое выполнение, если условие ложно. Повторение кончается, когда условие станет истинным.
Любой циклический алгоритм можно построить с помощью цикла с предусловием. Это более общий вариант цикла, чем цикл-до. В самом деле, тело цикла-до хотя бы один раз обязательно выполнится, так как проверка условия происходит после завершения его выполнения. А для цикла-пока возможен такой вариант, когда тело цикла не выполнится ни разу. Поэтому в любом языке программирования можно было бы ограничиться только циклом-пока. Однако в ряде случаев применение цикла-до оказывается более удобным, и поэтому он используется.
Иногда в литературе структурное программирование называют программированием без goto. Действительно, при таком подходе нет места безусловному переходу. Неоправданное использование в программах оператора goto лишает ее структурности, а значит, всех связанных с этим положительных свойств: прозрачности и надежности алгоритма. Хотя во всех процедурных языках программирования этот оператор присутствует, однако, придерживаясь структурного подхода, его употребления следует избегать.
Соединяться алгоритмы могут двумя способами: последовательным и вложенным.
Для вложенных циклов подходит аналогия с матрешками, помещенными друг в друга. Если блок, составляющий тело цикла, сам является циклической структурой, то, значит, имеют место вложенные циклы. В свою очередь, внутренний цикл может иметь внутри себя еще один цикл и т.д. В связи с этим вводится представление о глубине вложенности циклов. Точно так же и ветвления могут быть вложенными друг в друга.
Структурный подход требует соблюдения стандарта в изображении блок-схем алгоритмов. Каждая базовая структура должна иметь один вход и один выход. Нестандартно изображенная блок-схема плохо читается, теряется наглядность алгоритма.
Языки программирования Паскаль и Си называют языками структурного программирования. В них есть все необходимые управляющие конструкции для структурного построения программы. Наглядность такому построению придает структуризация внешнего вида текста программы. Основной используемый для этого прием – сдвиги строк, которые должны подчиняться следующим правилам:
• конструкции одного уровня вложенности записываются на одном вертикальном уровне (начинаются с одной позиции в строке);
• вложенная конструкция записывается смещенной по строке на несколько позиций вправо относительно внешней для нее конструкции.
Структурная методика алгоритмизации – это не только форма описания алгоритма, но это еще и способ мышления программиста. Создавая алгоритм, нужно стремиться составлять его из стандартных структур.
Еще одним важнейшим технологическим приемом структурного программирования является декомпозиция решаемой задачи на подзадачи – более простые с точки зрения программирования части исходной задачи. Алгоритмы решения таких подзадач называются вспомогательными алгоритмами. В связи с этим возможны два пути в построении алгоритма:
• «сверху вниз»: сначала строится основной алгоритм, затем вспомогательные алгоритмы;
• «снизу вверх»: сначала составляются вспомогательные алгоритмы, затем основной.
Первый подход еще называют методом последовательной детализации, второй – сборочным методом.
Сборочный метод предполагает накопление и использование библиотек вспомогательных алгоритмов, реализованных в языках программирования в виде подпрограмм, процедур, функций. При последовательной детализации сначала строится основной алгоритм, а затем в него вносятся обращения к вспомогательным алгоритмам первого уровня. После этого составляются вспомогательные алгоритмы первого уровня, в которых могут присутствовать обращения к вспомогательным алгоритмам второго уровня, и т.д. Вспомогательные алгоритмы самого нижнего уровня состоят только из простых команд.
Метод последовательной детализации применяется в любом конструировании сложных объектов. Это естественная логическая последовательность мышления конструктора: постепенное углубление в детали. В нашем случае речь идет тоже о конструировании, но только не технических устройств, а алгоритмов. Достаточно сложный алгоритм другим способом построить практически невозможно.
В методе последовательной детализации сначала анализируется исходная задача. В ней выделяются подзадачи. Строится иерархия таких подзадач. Затем составляются алгоритмы (или программы), начиная с основного алгоритма (основной программы), далее – вспомогательные алгоритмы (подпрограммы) с последовательным углублением уровня, пока не получим алгоритмы, состоящие из простых команд.
Билет № 3 Визуальное программирование
Визуализация - это процесс графического отображения (построения) сложных процессов на экране компьютера в виде графических примитивов (графических фигур). Визуализировать можно абсолютно любые процессы: управления, построения, рисования и т.д.
Визуальное программирование - способ создания приложений без написания программных кодов. Часто под визуальным программированием понимают технологию программирования, предоставляющую программисту наглядные средства конструирования интерфейса. При этом программист показывает, что должно получиться в результате, а текст программы генерируется автоматически с помощью визуального прототипа. При таком способе программирование осуществляется помещением на специальные формы объектов и настройкой их свойств и поведения.
Объектно-ориентированное программирование удачно использует концепцию визуального программирования.
Для визуализации интерфейсов программного обеспечения существует целый ряд специально разработанных элементов интерфейса - визуальных компонент, позволяющих отображать различную информацию и осуществлять управление программой в целом. Простейший пример - визуальная кнопка на экране компьютера. Данная кнопка имитирует поведение обычной кнопки на пульте управления любого прибора. Ее можно "нажимать" как настоящую.
Визуализируемой моделью является окно (форма, диалог) Windows, а не код программы.
В настоящее время распространено большое количество систем визуального программирования. Это системы программирования для языков C++, Basic, Pascal/Delphi. Кроме языков программирования, визуальный подход используется и в других системах (Visual FoxPro, Paradox для Windows, программы пакета Microsoft Office).
Использование визуального проектирования интерфейса предоставляет программисту (пользователю) следующие преимущества:
-
возможность легкого изменения размеров и расположения компонентов на форме (с помощью простых манипуляций мышью);
-
в процессе проектирования постоянно виден результат – изображение формы и расположенных на ней компонентов (не надо запускать приложение для проверки внешнего вида окна и последующего изменения программного кода для подбора более удачного размера и расположения компонентов);
-
во время проектирования формы и размещения на ней компонентов редактор кода (обычно) автоматически генерирует код программы, включая в нее фрагменты, описывающие данный компонент (далее можно изменять свойства компонентов и писать обработчики событий).
Визуальное проектирование интерфейса приложения состоит из следующих этапов:
-
размещение нужных компонентов на форме;
-
задание определенных свойств этих компонентов;
-
написание, при необходимости, обработчиков событий.
Таким образом, визуальное программирование делает проектирование интерфейса программы более наглядным и быстрым. При этом сохраняется возможность управлять всеми объектами и программно.
Билет № 11 Типы данных в C++
Типы данных в C/C++ разделяются на основные и производные. К основным типам относят:
-
void (пустой тип),
-
int (целый тип),
-
float (вещественные числа с плавающей точкой),
-
double (вещественные числа с плавающей точкой двойной точности),
-
char (символьный тип),
-
bool - логический.
Составные типы
Для формирования других типов данных используют основные типы + так называемые спецификаторы. Типы данных, созданные на базе стандартных типов с использованием спецификаторов, называют составными типами данных. В C++ определены четыре спецификатора типов данных:
-
short - короткий;
-
long - длинный;
-
signed-знаковый;
-
unsigned-беззнаковый.
Производные типы – это:
-
массивы
-
функции
-
классы
-
указатели
-
ссылки
-
структуры
-
объединения
Символьный тип
Данные типа char в памяти компьютера всегда занимают 1 байт. Это связано с тем, что обычно под величину символьного типа отводят столько памяти, сколько необходимо для хранения любого из 256 символов клавиатуры. Символьный тип может быть со знаком или без знака. В величинах со знаком signed char можно хранить значения в диапазоне от -128 до 127. Соответственно значения переменных типа unsigned char могут находиться в диапазоне от 0 до 255. При работе с символьными данными нужно помнить, что если в выражении встречается одиночный символ, он должен быть заключен в одинарные кавычки. Последовательность символов, то есть строка, при использовании в выражениях заключается в двойные кавычки. Например: ‘F’ , ‘3’ , “Иван”, “235”
Целочисленный тип
Данные типа int в памяти компьютера могут занимать либо 2, 4 или 8 байт. Это зависит от разрядности процессора. По умолчанию все целые типы считаются знаковыми, то есть спецификатор signed (знаковый ) можно не указывать. Спецификатор unsigned (беззнаковый) позволяет представлять только положительные числа.
Диапазоны значений целочисленных типов
Тип данных |
Диапазон значений |
Размер(байт) |
int signed int signed long int |
-2147483648 ... 2147483647 |
4 |
unsigned int unsigned long int |
0 ... 4294967295 |
4 |
short int signed short int |
-32768 ... 32767 |
2 |
unsigned short int |
0... 65535 |
2 |
long long int |
−(263−1)...(263−1)−(263−1)...(263−1) |
8 |
unsigned long long int |
0...(264−1)0...(264−1) |
8 |
Вещественный тип
Внутреннее представление вещественного числа в памяти компьютера отличается от представления целого числа. Число с плавающей точкой представлено в экспоненциальной форме: ±mE±p±mE±p где m - мантисса (целое или дробное число с десятичной точкой), р- порядок (целое число). Для того чтобы перевести число в экспоненциальной форме к обычному представлению с фиксированной точкой, необходимо мантиссу умножить на десять в степени порядок. Например, −6.42E+2=−6,42∗102−6.42E+2=−6,42∗102
Диапазоны значений вещественных типов Диапазоны значений символьных типов
Тип данных |
Диапазон значений |
Размер (байт) |
float |
3.4E-38 ... 3.4E+38 |
4 |
double |
1.7E-308... 1.7E+308 |
8 |
long double |
3.4E-4932 ... 3.4E+4932 |
10 |
Тип данных |
Диапазон значений |
Размер |
||
char |
-128...+127 |
1 байт |
||
unsigned char |
0...255 |
1 байт |
||
signed char |
-128...127 |
1 байт |
Длина мантиссы определяет точность числа, а длина порядка его диапазон.
Данные типа float занимают 4 байт, из которых 1 двоичный разряд отводится под знак, 8 разрядов - под порядок и 23 - под мантиссу. Поскольку старшая цифра мантиссы всегда равна 1, она не хранится. Данные типа double занимают 8 байт, в них под порядок -11 разрядов и под мантиссу -52 разряда соответственно. Спецификатор типа long перед именем типа double указывает, что под величину отводится 10 байт.