Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
otvety_IVT.doc
Скачиваний:
14
Добавлен:
01.03.2025
Размер:
12 Мб
Скачать
☆

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(nlogn). Идея метода такова:

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]