
- •Вопрос 4. Структурное программирование, как определение функций композицией, разбором случаев и итерацией. Операторы ветвления.
- •Вопрос 5. Операторы цикла. Операторы передачи управления.
- •Вопрос 6. Итерационный способ определения последовательностей. Виды итерационных процессов.
- •Точечные
- •Ип большей глубины
- •Параллельные ип
- •Вопрос 7. Схемы обрыва итерационных процессов.
- •Вопрос 11. Линейные упорядоченные последовательности как абстрактный тип данных. Реализация основных операций на примере типа «массив».
- •1) Включение одной последовательности в другую
- •2) Объединение двух упорядоченных последовательностей
- •3) Пересечение двух упорядоченных последовательностей
- •4) Разность двух упорядоченных последовательностей
- •5) Поиск элемента
- •Вопрос 12. Элементы математической логики в программировании. Основные формулы математической логики. Стратегии вычисления кванторных формул.
- •Вопрос 13. Функции как аппарат технологичного программирования. Технологии нисходящего и восходящего проектирования программ.
- •Вопрос 14 Синтаксис описания функций. Формальные и фактические параметры.
- •Вопрос 15. Семантика функций. Области видимости имен. Локальные и глобальные имена. Функции как параметры.
- •Вопрос 16. Реализация операций над множествами с помощью типа массив. Алгоритм « Решето Эратосфера»
- •Вопрос 17. Полиномы как абстрактный тип данных. Представление полиномов при помощи массивов. Основные операции над полиномами. Схема Горнера.
Вопрос 6. Итерационный способ определения последовательностей. Виды итерационных процессов.
Итерационные процессы – процессы, в которых очередной член последовательности получается с помощью рекурренты.
X0 – точка отсчёта
Xi+1=Ф(Xi) – формула
Классификация итерационных процессов:
Точечные
x0=a,xk=bxk-1+c, где k=1,2,…
for (i=1;i<=n;i++) x=b*x+c;
Ип большей глубины
x0=a, x1=bxk-1+dxk-2, k=2,3…
for (i=2;i<=n;i++)
{xn=b*xs+d*xss;
xss=xs;
xs=xn;}
Параллельные ип
Вопрос 7. Схемы обрыва итерационных процессов.
1 схема (условие накладывается на всю сумму в целом ):
|sum-k|<eps
вычисляем первую итерацию
сравниваем полученное значение с точным, если значение уже маленькое, то процесс завершается, в противном случае переходим к пункту 3
вычисляем очередную итерацию и переходим к пункту 2
2 схема (условие накладывается на отдельный член ряда)
|a|<eps
вычисление первого элемента последовательности
оцениваем, если он пригоден, то используем и переходим к пункту 3, в противном случае завершаем процесс
формируем новый член последовательности и переходим к пункту 2
3 схема (условие накладывается на расстояние между 2мя членами последовательности)
|x2-x1|<eps
Вычисляем первые 2 члена последовательности
Оцениваем расстояние между ними и если оно уже маленькое, завершаем процесс
В противном случае делаем предпоследний член последним и получаем новый член последовательности и переходим к п.2
Вопрос 8. Потоки данных в С++. Стандартный входной и выходной потоки. Форматированный ввод и вывод.
Переменные в языке программирование связаны с понятием ячейки памяти. Память подразделяется на внутреннюю (оперативная память) и внешнюю (дисковая память).
Внутренняя память обладает следующими качествами:
высокая скорость чтения/записи;
фиксированный объем;
используется для временного хранения данных в процессе работы программы.
Внешняя память характеризуется следующими особенностями:
низкая скорость чтения/записи;
хранение больших объемов информации;
предназначена для "постоянного" хранения данных (между периода работы программы).
Поскольку переменные хранятся во внутренней памяти только во время работы программы, данные, которые программа может использовать на входе, в общем случае берутся из внешней памяти и результаты работы программы записываются во внешнюю память. То есть программа читает данные из файла и записывает результаты в файл. Кроме того, программа может брать и записывать из внешних устройств, таких, как клавиатура, экран дисплея, принтер, и т.д. В языке программирования С+—+ одним из способов описания процесса передачи данных в программу и из программы является использование такого понятия, как поток.
Поток - абстрактное понятие, относящееся к переносу данных от источника к преемнику.
Стандартный входной поток cin (от слова input - вход) связан с клавиатурой и служит для переноса данных с клавиатуры в программу.
Как правило, данные в стандартном входном потоке представлены в символьном виде. Данные разделены символами-разделителями (пробел, перенос строки, знаки табуляции). Также существует специальный символ, обозначающий конец потока. Если при очередном считывании из потока считанный элемент - символ конца потока, это означает, что поток исчерпан (считывать больше нечего). Чтение данных из стандартного входного потока осуществляется следующим образом:
cin>>name;
cin - имя стандартного входного потока;
name - имя переменной, описанной выше в программе.
Извлечение – форматированный ввод. При форматированном вводе берется группа символов от разделителя до разделителя. Тип переводится в тип переменной, которую нужно ввести. Например: int, double, char.
Стандартный выходной поток.
Стандартный выходной поток cout (от слова output - выход) связан с экраном дисплея и служит для переноса данных из программы на экран.
Так же как и в стандартном входном потоке, данные в стандартном выходном потоке представлены в символьном виде.
Запись данных в стандартный выходной поток осуществляется следующим образом:
cout> > выражение;
cout - имя стандартного выходного потока;
Некоторые форматирующие символы:
символ перевода строки -' \ n' (это значение хранится также в константе endl);
горизонтальная табуляция - ' \ t';
вертикальная табуляция - ' \ v';
звуковой сигнал - ' \ a';
Этапы действия:
- Подсчитывается значение выражения;
- Выражение вставляется в объект cout;
- Выражение отправляется на экран.
Вопрос 9. Массивы в С++: объявление, инициализация, массивы как параметры. Операция выборки. Поиск в одномерном массиве.
Массив – производный тип данных. Он строится поверх простых типов. Массивы служат для компактного хранения и быстрого доступа к наборам однотипных элементов.
Массив – набор данных одного типа фиксированного размера.
type name[size];
где
type – тип каждого элемента массива. (все элементы массива имеют один тип данных);
name – имя массива;
size – размер массива (количество элементов массива.)
При определении массива в программе выделяется память в размере size * sizeof(type) байтов (по sizeof(type) байтов для каждого из size элементов). Память под массив выделяется сплошным фрагментом. Элементы в этом фрагменте памяти идут по порядку, начиная с элемента с индексом ноль до последнего элемента массива (элемента с номером size-1) Доступ к элементам массива осуществляется по номеру (который называется индексом). При доступе к элементам массива важно следить за корректным значением индекса (которое должно быть > 0 и < size-1)). Компилятор языка C+—+ не осуществляет проверку выхода за пределы массива. Это целиком и полностью ложится на плечи программиста. Массив может быть объявлен с инициализацией. Например: int a[35]={3,6,7};
объявляется целочисленный массив размера 35. При этом нулевому элементу сразу присваивается значение 3, первому - 6, второму - 7, остальные элементы дополняются нулями.
Если размер массива не указан, то количество элементов в массиве определяется по количеству перечисленных в инициализации значений:
int a (3,6,7); задает массив длины 3 (размер устанавливается автоматически по количеству перечисленных инициальных значений массива). Массив инициализируется указанными в скобках значениями. Групповых операций над массивами нет. Все операции должны быть выполнены программным путем над каждым элементом массива. Имя массива задает адрес начала массива (адрес участка памяти, отведенного под массив). В функцию массив может передаваться только по ссылке. Поскольку имя массива задает адрес начала массива, то при передаче одномерного массива в функцию в качестве параметра размер передаваемого массива в скобках можно не указывать (скобки писать нужно обязательно, они говорят о том, что данный параметр - одномерный массив). Размер массива в этом случае передается отдельным целочисленным параметром.
Вопрос 10. Алгоритмы сортировки: простым обменом, метод «пузырька», метод поиска локальных экстремумов, сортировка вставкой. Сортировка данных – это обработка информации, в результате которой элементы располагаются в определенном порядке в зависимости от значения некоторых признаков элементов, называемых ключевыми. Алгоритмы сортировки находят широкое применение при решении различных задач. Практическая ценность алгоритмов сортировки обусловлена, прежде всего, тем, что поиск, анализ и обработка информации для отсортированных наборов данных выполняются, как правило, гораздо эффективнее, чем для не отсортированных.
Алгоритм сортировки “пузырька”.
Проходим по массиву слева направо и на каждом шаге анализируем пару рядом стоящих элементов a[i-1] u a[i], где i=(1,n-1). Если пара стоит неправильно - меняем местами, за один проход максимальный элемент встает на свое место. В наихудшем случае потребуется n-1 проход, для уменьшения их количества можно ввести булевскую переменную в котором указывает нам, есть ли необходимость в продолжении сортировки.
Оптимизированный код, включающий в себе булевскую переменную. Как описано выше, это делается для уменьшения количества итераций:
bool b=false;
j=0;
while (!b && j<n) {
b=true;
for (int i=o;i<n-1;i++)
{
if (mas [i-1]>mas[i])
{ t=mas[i-1];
mas[i-1]=mas[i];
mas[i]=t;
b=false;}
}
j++;}
метод поиска локальных экстремумов
Шаги алгоритма:
1)находим номер минимального значения в текущем списке
2)производим обмен этого значения со значением первой неотсортированной позиции (обмен не нужен, если минимальный элемент уже находится на данной позиции)
3)теперь сортируем хвост списка, исключив из рассмотрения уже отсортированные элементы
Max:
for (i=n-1;i>0;i--)
{ max=x[0];
t=0;
for (j=1;j<I;j++)
{if (x[j]>max)
{ max=x[j];
t=j;
}
}
if(i!=t)
{ b=x[i];
x[i]=x[t];
x[t]=b;}
}
Сортировка вставкой
Алгоритм: На каждом шаге алгоритма размер упорядоченного подмассива увеличивается с 1 до N. Подмассив длины 1, состоящий из элемента a[0] упорядочен по определению. На каждом шаге j (j = 1,..., N — 1) элемент a[j] вставляется в уже упорядоченную последовательность a[0],... a[j — 1] следующим образом. Элемент a[j] копируется во вспомогательную переменную с, тем самым освобождая j-ую ячейку массива. Упорядоченный подмассив a[0],...a[j — 1] просматривается с конца. Все его элементы, большие элемента с = a[j] (и которые, следовательно, должны стоять правее его), сдвигаются на разряд вправо. На освободившееся место записывается элемент с.