- •1. Языки программирования. Структурная технология программирования. Реализация основных алгоритмических структур на процедурном языке программирования.
- •2.Базовые алгоритмические структуры: процедуры и функции, рекурсивные функции и процедуры.
- •3.Составные структуры данных: определение новых типов данных, одномерные и двухмерные массивы, строки, множества, записи, файлы.
- •1. Массивы
- •3. Множества
- •4. Записи
- •5. Файлы
- •4. Динамические структуры данных: списки, стеки, очереди.
- •5. Понятие о логическом программировании. Структура программы в Прологе. Предикаты, правила, факты.
- •10) Информация, ее виды и свойства. Измерение информации.
- •11) Кодирование информации. Условие Фано. Коды Шеннона-Фано и Хаффмана.
- •12) Достоверность передачи информации. Коды Хемминга.
- •Кодирование с выявлением ошибок (коды с проверкой на четность).
- •3. Кодирование с исправлением ошибок (самокорректирующиеся коды).
- •13) Понятие о конечных автоматах. Эквивалентность и произведение конечных автоматов.
- •Алгоритмы и их свойства. Существование алгоритмически неразрешимых проблем. Машина Поста.
- •Формализация понятия алгоритма . Машина Тьюринга.
- •Формализация понятия алгоритма. Нормальные алгоритмы Маркова.
- •Формализация понятия алгоритма. Рекурсивные функции.
- •18. Формальная грамматика. Метаязыки. Форма Бэкуса-Наура. Синтаксические диаграммы.
- •Инструментальное программное обеспечение
- •Системы программирования
- •Виды инструментального по
- •Определение
2.Базовые алгоритмические структуры: процедуры и функции, рекурсивные функции и процедуры.
Вспомогательные алгоритмы (подпрограммы).
Основным технологическим приемом структурного программирования является декомпозиция задачи на подзадачи (подпрограммы).
В Паскале различаются два вида подпрограмм: процедуры и функции. Функции применяются для описания подпрпограмм, вычисляющих одно числовое, строковое или логическое значение, процедуры можно использовать для описания произвольных подпрограмм.
Каждая процедура имеет свое имя, с помощью которого к ней можно обратиться из программы или из другой подпрограммы, и список формальных параметров − список имен аргументов и имен результатов ее решения.
Пример: procedure kvur( a, b, c: real; var d, x1, x2: real);
begin d:=b*b-4*a*c; if d ≥0 then
begin x1:=(-b+sqrt(d))/2; x2:= (-b-sqrt(d))/2;
end;
end;
Обращение к процедуре - оператор: kvur( 2, 3, -5, d1, x1,x2);
Список фактических параметров соответствует списку формальных параметров по числу и типам.
Функции в Паскале. Функция, всегда возвращает единственное значение. Имя результата функции в Паскале совпадает с именем функции, и его тип указан в заголовке функции после списка аргументов.
В теле функции хотя бы один раз встречается присваивание переменной с именем функции соответствующего значения.
Пример: при вычислении корня уравнения методом деления отрезка [0,1] пополам, используeтся функция:
function y(x: real):real;
begin y:=x*x*x-7*x+4; end;
Вызов функции не является отдельной командой.
if y(a)*y(c) <0 then b:=c else a:=c;
Рекурсивные подпрограммы - процедуры и функции, которые используют сами себя в качестве подпрограммы.
Пример. Используя алгоритм Евклида, рекурсивная функция
вычисления наибольшего общего делителя двух натуральных
чисел a и b имеет вид:
function nod( a,b:integer):integer;
begin if b=0 then nod: = a else
if a < b then nod:= nod(b,a) else
nod:= nod(a mod b, b)
end;
3.Составные структуры данных: определение новых типов данных, одномерные и двухмерные массивы, строки, множества, записи, файлы.
1. Массивы
1.
часто приходится встречаться с
информацией, представленной в табличной
форме. Таблица может представлять собой
последовательность чисел. Для хранения
их вводят индексную символику. Например,
− первый элемент таблицы.
Для
элементов прямоугольной таблицы удобно
использовать двухиндексные обозначения:
(
−
элемент таблицы из второй строки и
четвертого столбца). Для хранения в
оперативной памяти таблиц применяются
одномерные, двухмерные и многомерные
массивы.
В Паскале массив − это последовательность из фиксированного числа однотипных данных, хранящихся в ОЗУ, имеющих общее имя и различающихся индексами. Тип элементов массива называется его базовым типом.
2. Описание массива и действия над элементами и массивом, как единым целым.
3. Покомпонентная обработка и сортировка массива. Поиск элемента (например, минимального). Сортировка массива. Идея быстрой сортировки.
Этот метод (и его название Quicksort) был опубликован Ч. Хоаром в 1962 году. В среднем время выполнения алгоритма – O(nlogn). Идея метода такова:
1. Выбирается один из элементов массива в качестве разделителя x, относительно которого переставляются элементы массива. В качестве x можно взять элемент со средним номером в массиве.
2. Располагаем элементы массива, меньшие разделителя x до него, а элементы, большие или равные x, - после него. После этого разделитель встанет на “свое” место.
3. Сортируем аналогично массив до разделителя. Массив длины 1 считаем упорядоченным.
4. Сортируем аналогично массив после разделителя.
Правило 2 можно выполнить, просматривая массив от краев к разделителю и меняя местами элементы, нарушающие это правило.
Пример выполнения метода быстрой сортировки по шагам для массива из 7 элементов: 35, 70, 50, 45, 50, 65, 20.
1) 35, 70, 50, 45, 50, 65, 20. Выбираем разделитель x = 45.
2) 35, 20, 50, 45, 50, 65, 70. Поменяли местами элементы 70 (70 > x) и 20 (x > 20) .
3) 35, 20, 45, 50, 50, 65, 70 Поменяли местами элементы 50 и 45 (50 > x).
4). 20, 35, 45, 50, 50, 65, 70. Сортируем массив слева от x. Для него разделитель = 25.
На этом сортировка закончилась, так как правая часть массива от x=45 упорядочена.
Из описания метода следует, что он рекурсивен. Параметрами рекурсии будут границы индексов L и R сортируемой части массива. Вначале L = 1, R = n. Как и в предыдущей программе, массив a[1..n] из 100 элементов генерируется случайным образом c помощью функции random(3*n), и процедура print - та же самая:
program quicksort;
uses crt;
const n=100;
var a:array[1..n] of integer;
i,j,l,r:integer;
procedure print;
begin for i:=1 to n do write(a[i]:4);
writeln
end;
procedure sort(l,r:integer);
var i,j,b,x:integer;
begin i:=l; j:=r;
x:=a[(l+r) div 2];
repeat while a[i]<x do i:=i+1;
while x<a[j] do j:=j-1;
if i<=j then
begin b:=a[i]; a[i]:=a[j];
a[j]:=b; i:=i+1; j:=j-1
end
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r)
end;
begin clrscr; randomize;
for i:=1 to n do a[i]:=random(3*n);
print; writeln;
sort(1,n);
print; readkey
end.
2. Использование строкового типа в программе. {Слова в строке a разделены пробелом, и в конце текста-пробел.
Образуется массив слов mas, он упорядочивается по алфавиту методом простого обмена, затем его элементы снова собираются в одну строку b }
program sortwords;
uses crt;
const mn=20;
type stroka=string;
var a,b,c:stroka; n,i,j,k:integer;
mas:array[1..mn] of stroka;
function kol(x:stroka):integer;
var k,t:integer;
begin t:=0;
for k:=1 to length(x) do
if x[k]=' ' then t:=t+1;
kol:=t
end;
procedure sortword;
begin for i:=1 to n-1 do
for k:=1 to n-i do
if mas[k]>mas[k+1] then
begin b:=mas[k]; mas[k]:=mas[k+1];
mas[k+1]:=b;
end;
end;
begin clrscr; write('введите текст, между словами и в конце-пробел: ');
readln(a); n:=kol(a); c:=a;
for i:=1 to n do
begin j:=pos(' ',c); b:=copy(c,1,j-1);
mas[i]:=b; delete(c,1,j)
end;
sortword; b:='';
for i:=1 to n do b:=b+mas[i]+' ';
writeln(b);readkey
end.
