Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Бабалова Алгоритмизация задач и структурирование программ 2013

.pdf
Скачиваний:
2
Добавлен:
12.11.2022
Размер:
1.29 Mб
Скачать

которым предстоит работать в соответствующей подпрограмме. Отсутствие спецификатора в имени результата действия процедуры не позволяет передать результат в основную программу.

Тело функции и процедуры:

<Раздел объявления локальных типов и переменных >

Begin

<Реализация алгоритма процедуры или функции>

End;

Здесь будут рассмотрены задачи для освоения правил работы с процедурами и функциями. В качестве структуры данных используем в основном статические или динамические массивы.

Обработка данных типа массива зачастую требует выполнения многократно повторяющихся операций, для описания которых целесообразно использовать процедуры и функции.

Type aa = array [1..100] of real; – массив или последовательность данных статического типа с размерностью <=100.

Type am=array [1..10,1..10] of integer; – двумерный статический массив (таблица, матрица).

Type aс = array of real; – динамический массив, размерность которого изменяется в процессе работы программы.

Переменные для работы с объявленными массивами: Var a:aa;

c:ac; m: am;

Стандартная процедура setlength(c,n) устанавливает размерность динамического массива в количестве n значений.

Пример 3.1. В последовательности слов найти вводимое слово и удалить его из последовательности.

Используем динамический массив для хранения слов. Создаем функцию для поиска требуемого слова, а процедуру – для удаления найденного слова.

Алгоритм для решения задачи с использованием функций и процедур показан на рис. 20. В алгоритме основной программы мы только указываем место, где будет вызываться требуемая ПП. Две ПП в структурированном тексте обеспечивают выполнение подзадач: поиск требуемого значения и удаление из массива найденного

41

значения по его номеру в последовательности слов. На рисунке приводится алгоритм решения всей задачи и алгоритм поиска слова в последовательности слов. Программа написана для консольного приложения среды Delphi.

Рис. 20. Алгоритм поиска слова и его удаления из последовательности слов

program projdyn; {$APPTYPE CONSOLE} uses

SysUtils; type str=string[20];

mas=array of str; //Объявляем динамический // массив для исходных слов.

var a:mas; s:str; n,i,t:integer; ch:char;

42

function search(var :mas;k:integer;ss:str):integer;

//В строке формальных параметров передаем

//в функцию адрес текущего массива mas,

//количество элементов массива слов k и

//искомое слово ss.

var i:integer; begin

search:=0;// Это уже результат i:=0;

while i<= k-1 do begin

if b[i]=ss then begin

search:=i;// запоминаем номер // найденного слова exit; // Выход при обнаружении

//слова

end;

i:=i+1;

end;

end;

procedure del(var b:mas;m:integer);

//В процедуру надо передать исходный массив, с которым вы

//работаете, и номер удаляемого элемента из исходного массива var

j:integer; begin

for j:=m to n-2 do b[j]:=b[j+1]; n:=n-1;

setlength(a,n); // Определяем новую длину массива end;

//Длина массива n в этой программе является

//глобальной переменной,

//поэтому она будет действительна во всех

//структурах программы.

43

begin // Основная программа repeat

writeln(' Begin of program - enter n'); readln(n);

setlength(a,n); writeln('enter words'); for i:=0 to n-1 do readln(a[i]);

writeln(' words in column'); for i:=0 to n-1 do writeln(a[i]:10);

// Найти и удалить слово writeln(' enter search words');

readln(s);

t:=search(a,n,s); // Вызов функции поиска номера слова if t<>0 then

begin

writeln(' word found=',a[t]:10); del(a,t); // Вызов процедуры удаления

// слова из массива слов writeln('Massiv new');

for i:=0 to n-1 do //Количество

// значений n writeln(a[i]:20);

end else

writeln(' word not found'); writeln(' Continue? -Y or N'); readln(ch);

until ch='n';

{ TODO -oUser -cConsole Main : Insert code here } end.

Пример 3.2. Получить все перестановки из целых чисел от 1 до n. Решение задачи наиболее коротко представляется процедурой для перестановки чисел, которая вызывается рекурсивно. Алгоритм

решения задачи представлен на рис. 21.

44

Рис. 21. Структура программы и алгоритм определения всех перестановок из n чисел

Вся программа разбита на три простейших алгоритма.

1.Алгоритм Vivod, который будет отвечать только за представление результата каждой перестановки.

2.Алгоритм Swap, описывающий стандартную перестановку двух рядом стоящих чисел. Вместо того, чтобы писать три оператора присваивания в программе, вам можно записать только обращение к процедуре, написанной для этого алгоритма.

3.Алгоритм Perest, который рекурсивно вызывает себя же, пока значение параметра m не станет равным 1.В этом алгоритме мы используем алгоритмы ранее названные алгоритмы Vivod и Swap.

Программа решения задачи представлена в консольном исполнении.

Программа состоит из трех процедур: Vivod, Swap и рекурсивной процедуры Perest(m).

program Project_perest; {$APPTYPE CONSOLE} uses

45

SysUtils;

type mas=array [1..5] of integer; var a:mas;

n,i: integer;

ch:char; //Это глобальные переменные procedure vivod ;

var i:integer; begin

for i:=1 to n do write(a[i]:4); writeln;

end; // Вывод всех вариантов новых // последовательностей целых чисел

procedure swap(var x,y:integer); // Процедура перестановки двух чисел

var c:integer; begin c:=x; x:=y; y:=c; end;

procedure perest(m:integer); var i:integer;

begin

if m=1 then vivod else begin

perest(m-1);

for i:=m-1 downto 1 do begin

swap(a[m],a[i]); perest(m-1) ; swap(a[m],a[i]); end;

end;

end;

begin

writeln(' count of perestan');

46

repeat

writeln(' enter n'); readln(n);

for i:=1 to n do

// здесь я формирую простые числа от 1 до N a[i]:=i;

perest( n);

// Вызов рекурсивной процедуры writeln(' continue'); readln(ch);

until ch='n';

{ TODO -oUser -cConsole Main : Insert code here } end.

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

Рис. 22. Результат выполнения программы перестановки четырех чисел

47

Задачи для самостоятельной работы

3.1.Одним из способов идентификации автора литературного произведения является подсчет частоты вхождения отдельных слов.

Взаданном тексте найти с помощью процедуры 20 наиболее часто встречающихся слов в тексте.

3.2.В заданном тексте места пропущенных слов или словосочетаний отмечены знаком $. В некотором массиве заданы эти слова и сочетания в том порядке, в котором они должны быть вставлены в текст. Поиск пропусков и вставку пропущенных слов или словосочетаний оформить функциями или процедурами.

3.3.Дана последовательность из букв латинского алфавита размерности N. Сортировать последовательность по алфавиту с помощью метода вставки. Сортировку последовательности описать процедурой. Вывести результат обработки последовательности.

3.4.Вводится произвольный текст, содержащий не более 50 слов. С помощью функции выбрать из текста те слова, в которых первая буква слова встречается еще хотя бы один раз. Вывести исходный текст и результат его обработки.

3.5.Ввести произвольную последовательность чисел. Упорядочить с помощью процедуры последовательность в порядке возрастания методом Шейкер-сортировки. Вывести результат упорядочивания и номера чисел в исходной последовательности.

3.6.Задана последовательность слов из некоторого словаря. С помощью функции найти в последовательности слов слова-ана- граммы (Бар – Раб).

3.7.Ввести последовательность слов, в каждом из которых от 2 до 6 латинских букв. Написать процедуру, определяющую одинаковых “соседей” (слова справа и слева совпадают). Напечатать всех “соседей” и исходную последовательность слов.

3.8.Ввести последовательность из N элементов. Подсчитать количество элементов, равных 0. С помощью процедуры обеспечить удаление всех нулевых элементов последовательности и сжатие последовательности. Вывести исходную последовательность, количество нулей, результат сжатия последовательности и количество элементов в преобразованной последовательности.

48

3.9.Ввести неупорядоченную последовательность из N элементов. Написать процедуру упорядочивания последовательности методом простого выбора. Вставить K новых элементов на правильное место в упорядоченную последовательность. Вывести результаты всех обработок последовательности.

3.10.Ввести последовательность из N целых чисел. Упорядочить по возрастанию методом вставки четные (по значению, а не по номеру) элементы последовательности. Нечетные элементы должны остаться на своих местах. Упорядочивание описывается процедурой.

3.11.В словаре по некоторой теме с помощью процедуры найти слова, которые состоят из одинаковых букв, но отличаются их порядком в записи слова Поиск таких пар слов описать процедурой. Например: КОМАР – КОРМА.

3.12.Ввести последовательность из N целых чисел. Выбрать из последовательности нулевые значения и составить последовательность из их номеров. Выбор элементов последовательности описывается процедурой. Вывести исходную последовательность и результат обработки последовательности.

3.13.Задана последовательность целых чисел, каждое из которых <=1000. С помощью процедуры обеспечить запись этой последовательности чисел словами: 100 – «сто», 235 – «двести тридцать пять».

3.14.Вводится последовательность из чисел, определяющих координаты вершин треугольников (по три пары значений для каждого треугольника). Выбрать из этих значений тот треугольник, который будет иметь наибольшую площадь. Вычисление площади выполнить функцией. Вывести исходную последовательность и результат поиска.

3.15.Вводится последовательность из N элементов. С помощью функции подсчитать количества положительных, отрицательных и нулевых элементов последовательности. Вывести исходную последовательность и результаты ее обработки.

3.16.Дана матрица действительных чисел размерности M*N. С помощью процедуры обеспечить получение сумм Элементов матрицы по столбцам, строкам и диагоналям, параллельным главной диагонали. Вывести исходную матрицу и результаты вычислений в соответствующих строках и столбцах.

3.17.Задана квадратная матрица из n*n целых чисел. Отыскать в матрице с помощью функции максимальный элемент. С помощью

49

процедуры обеспечить удаление строки и столбца, на пересечении которых был найден этот элемент. Вывести исходную матрицу и результат преобразования.

3.18.Задана последовательность из слов. С помощью одной процедуры обеспечить сортировку слов в алфавитном порядке, а второй процедуры перестановку слов в обратном порядке. Вывести исходную последовательность и результат преобразования.

3.19.Задана последовательность из N слов. С помощью функции обеспечить выбор из последовательности всех одинаковых слов. Оставить в исходной последовательности одинаковые слова по одному разу. Вывести исходную последовательность, последовательность одинаковых слов и результат преобразования последовательности.

3.20.Задана двухмерная таблица. Процедура вычисляет количество нулей в каждой строке таблицы. Вывести результат вычислений вместе с номером той строки, для которой выводится найденное в строке количество нулей.

3.21.Определить с помощью функции симметричность матрицы размерности M*M относительно главной диагонали. Вывести исходную матрицу и сообщение о проверке.

3.22.Задана таблица размерности N*N. С помощью процедуры выполнить перестановку K-го столбца таблицы на место L-го столбца, а также перестановку K-й и L-й строк в соответствии с запросом на обработку таблицы. Вывести исходную таблицу и результат ее преобразования вместе с номерами соответствующих строк и столбцов таблицы.

3.23.Задана таблица из нулей и единиц размерности N*N. С помощью функции определить количество единиц в каждой строке и в каждом столбце матрицы. Результаты обработки вывести на экран.

3.24.Дана матрица действительных чисел размерности M*N. С помощью процедуры перестановки строк матрицы обеспечить преобразование матрицы: 1-ю строку поменять с N-й строкой, 2-ю с N– 1-й строкой и т.д. Вывести исходную матрицу и результат ее преобразования.

3.25.Даны две последовательности действительных чисел произвольной длины. Упорядочить обе последовательности по возрастанию методом быстрой сортировки. Объединить обе последовательности в одну упорядоченную последовательность. Вывести все варианты последовательностей.

50