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

Програмирование. Структурное програмирование, подпрограммы, строки. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
if x > y then Exchange(x,y);//x = min(x,y) if x > z then Exchange(x,z);//x = min(x,y,z) if y > z then
Exchange(y,z);//x <= y <= z end; //-----------------------------------­var
x,y,z: Real; begin
write('x = ');readln(x);
write('y = ');readln(y);
write('z = ');readln(z);
//-----------вызов процедуры---------
Reorder3(x,y,z);
write('x = ',x:6:2,' y = ',y:6:2,' z = ',z:6:2);
readln; end.
Тестирование процедуры
Будем тестировать процедуру методом тестирования путей. Суще­ствуют восемь путей выполнения разработанной процедуры. Необхо­димо подобрать исходные данные для выполнения процедуры по каж­дому из возможных путей.
Набор тестов для тестирования разработанной процедуры пред­ставлен в таблице.
Номер
теста
Исходные данные
1 x = 1, y = 2, z = 3 x = 1, y = 2, z = 3
2 x = 3, y = 2, z = 1 x = 1, y = 2, z = 3
3 x = 2, y = 1, z = 3 x = 1, y = 2, z = 3
4 x = 3, y = 1, z = 2 x = 1, y = 2, z = 3
5 x = 2, y = 3, z = 1 x = 1, y = 2, z = 3
Ожидаемый
результат
81
Путь прохождения
Левая, левая, левая ветвь
IFTHEN
Правая, правая, правая ветвь IFTHEN
Правая, левая, левая ветвь
IFTHEN
Правая, правая, левая ветвь IFTHEN
Левая, правая, правая ветвь IFTHEN
Окончание таблицы
Номер
теста
Исходные данные
6 x = 1, y = 3, z = 2 x = 1, y = 2, z = 3
7 x = 1, y = 2, z = 1 x = 1, y = 2, z = 3
8 x = 4, y = 1, z = 3 x = 1, y = 2, z = 3
Ожидаемый
результат
Путь прохождения
Левая, правая, левая ветвь
IFTHEN Левая, левая, правая ветвь
IFTHEN
Правая, левая, правая ветвь IFTHEN
Тема. ПОДПРОГРАММЫ ДЛЯ РАБОТЫ
С ОДНОМЕРНЫМИ МАССИВАМИ
Задачи
1. Написать и протестировать функцию. Функция получает через параметр одномерный вещественный массив и возвращает сумму эле­ментов массива.
2. Написать и протестировать функцию. Функция получает через параметр одномерный массив целых переменных и возвращает сумму четных значений компонентов массива.
3. Написать и протестировать функцию
. Функция получает через
параметр одномерный вещественный массив и возвращает сумму ком­понентов массива с нечетными значениями индексов.
4. Написать и протестировать функцию. Функция получает через параметр одномерный массив вещественных переменных и возвращает компонент массива с максимальным значением среди всех компонен­тов массива.
5. Написать и протестировать функцию. Функция получает через параметр одномерный вещественный массив и возвращает минималь­ный по значению элемент этого массива и номер его индекса.
6. Написать и протестировать процедуру. Процедура получает че- рез параметр одномерный вещественный массив. В полученном масси­ве процедура переставляет значения компонентов массива в обратном порядке.
7. Написать и протестировать процедуру. Процедура получает че-
параметр одномерный вещественный массив. Процедура изменяет
рез массив путем циклического сдвига его элементов влево на одну пози­цию.
82
8. Написать и протестировать процедуру. Процедура получает че-
рез параметр одномерный вещественный массив и целое – параметр сдвига. Процедура изменяет массив путем циклического сдвига его элементов вправо на число позиций, равное параметру сдвига.
9. Написать и протестировать процедуру. Процедура получает че- рез параметр одномерный вещественный массив и целое – параметр сдвига. Процедура
изменяет массив путем циклического сдвига его эле­ментов на заданное число позиций, равное параметру сдвига в указан­ном направлении. Направление сдвига задается знаком параметра сдви­га: вправо, если параметр больше нуля, влево, если он отрицателен.
10. Написать и протестировать процедуру. Процедура получает че­рез параметр одномерный массив вещественных переменных. Проце­дура изменяет массив путем упорядочения его элементов по возраста­нию в сторону больших значений индексов компонентов.
11. Написать и протестировать функцию. Функция получает через па­раметр одномерный массив вещественных переменных (типа Vector). Вычисляет и возвращает максимальное значение среди элементов мас­сива с четными значениями индекса и значение индекса (через пара­метр).
Например:
Const
Columns = 5;//компонентов в массиве
Type
Index = 0.. Columns - 1; Vector = array [Index] of real;
Var
A: Vector = (1, 5, -3, 2, 7);// массив нициированный
// и начальными значениями
Исходный массив Компоненты A[0] A[1] A[2] A[3] A[4]
Значения 1 5 –3 2 7 Максимальное
значение Индекс компонента 4
7
12. Написать и протестировать функцию. Функция получает через
параметр одномерный массив вещественных переменных (типа Vector)
83
и возвращает минимальное значение среди элементов массива с нечет­ными значениями индекса и значение индекса (через параметр).
Например:
Const
Columns = 5; //компонентов в массиве
Type
Index = 0.. Columns - 1;
Vector = array [Index] of real;
Var
A: Vector = (1, 5, -3, 2, 7);// массив инициированный //начальными значениями
Исходный массив Элемент A[0] A[1] A[2] A[3] A[4] Значение 1 5 –3 2 7 Минимальное значение 2 Индекс элемента 3
Примеры решений задач
Задача 1
Условие
Написать и протестировать функцию. Функция получает через па­раметр одномерный вещественный массив и возвращает сумму эле­ментов массива.
Решение
Для вычисления суммы компонентов массива необходимо пере­брать все компоненты, добавляя их значения к счетчику. Перед нача­лом цикла значение счетчика необходимо установить в 0. Для органи­зации цикла воспользуемся управляющей структурой FORDO.
Блок-схема решения показана на рисунке.
Функция, реализующая вычисления суммы компонентов одномер­ного вещественного массива, представлена ниже.
//----------------------------------------------------­function Sum(const a: array of real): Real; //Возвращает сумму значений компонентов одномерного мас­сива. //------------------------------------------------------
84
var i: integer; begin result:= 0; for i:= Low(a) to high(a) do result:= result + a[i] end; //------------------------------------------------------
Sum:= 0
I:= 0,
N – 1, 1
Sum:= Sum + A[I]
I – индекс цикла; N – число компо- нентов массива A
Задача 3
Условие
Написать и протестировать функцию. Функция получает через па­раметр одномерный вещественный массив и возвращает сумму компо­нентов массива с нечетными значениями индексов.
Решение
Для нахождения суммы значений компонентов с нечетными значе­ниями индексов необходимо перебрать все компоненты массива, начи­ная с первого. Значение компонента добавляется к сумме, если
его ин­декс – нечетное значение. Перед началом цикла в значение суммы необходимо установить значение 0. Для просмотра значений компо­нентов массива следует организовать цикл. Для этой цели воспользу­емся управляющей структурой FORDO.
85
Блок схема-решения представлена на рисунке.
Sum:= 0
I – индекс цикла; N – число компонен- тов массива A
I:= 0,
N – 1, 1
I –
нечётно
И
Sum := Sum + A[I]
Функция, реализующая вычисления суммы значений компонентов одномерного вещественного массива с нечетными значениями индек­сов, показана ниже.
//--------------------------------------------------­function SumOdd(const a: array of real): Real; //Возвращает сумму значений компонентов с нечетными
//индексами.
var i: integer; begin result:= 0; for i:= Low(a) to high(a) do
if Odd(i) then result:= result + a[i] end; //------------------------------------------------------
86
Задача 6
Условие
Написать и протестировать процедуру. Процедура получает через параметр одномерный вещественный массив. В полученном массиве процедура переставляет значения компонентов массива в обратном порядке. Вспомогательный массив не использовать.
Исходный
массив
Элемент A[0] A[1] A[2] A[3] A[4]
Значение 1 5 –3 2 7
Элемент A[0] A[1] A[2] A[3] A[4]
Массив
результата
Значение 7 2 –3 5 1
Решение
Для перестановки значений компонентов массива в обратном по­рядке необходимо перебрать компоненты массива, начиная с первого и до среднего (от 0 до N div 2 – 1), исключая его, если он имеется, обме­нивая значениями компоненты массива с индексами I и (N – I – 1). Об­мениваются значениями компоненты слева и справа массива, отстоящие от центра на одинаковом расстоянии. В случае
четного числа компонен­тов в массиве обмениваются значениями все компоненты. В случае не­четного числа компонентов в массиве центральный компонент массива остается неизменным. Индексация компонентов массива начинается от 0. Для просмотра значений компонентов массива воспользуемся управляющей структурой FORDO. Рисунок, иллюстрирующий алго­ритм, представлен ниже.
Обмениваем значениями компоненты массива с индексами I и (N – I – 1), i изменяется от 0 до (N div 2 – 1)
2 7 9 3 5
0 1 2 3 4
87
компоненты индексы
Обмениваем значениями компоненты массива с индексами I и (N – I – 1), i изменяется от 0 до (N div 2 – 1)
2 7 9 3 1 5
0 1 2 3 4 5
компоненты индексы
Блок-схема решения показана на рисунке ниже.
N:= High(A) + 1
I – индекс цикла; N – число компонен- тов массива A
I:= 0, N
div 2 – 1,
1
Обменять зна­чениями A[I] и A[N – I – 1]
Функция, реализующая перестановку значений компонентов одно­мерного вещественного массива в обратном порядке, представлена ниже.
//----------------------------------------------------­procedure Reorder(var a: array of real); //Переставляет значения компонентов массива в обратном порядке. var i,n: integer; begin n:= high(a) + 1; for i:= 0 to n div 2 - 1 do swap(a[i],a[n - i -1]); end; //------------------------------------------------------
88
Тема. СТРОКИ
Задачи
1. Написать и протестировать функцию. Функция получает через параметр строку и возвращает строку, полученную из исходной, путем удаления из нее всех подряд идущих с левого края пробелов.
Например:
Исходная строка ‘ QWERTY’
Строка результата ‘QWERTY’
2. Написать и протестировать функцию. Функция получает через параметр строку и возвращает строку, полученную из исходной, путем удаления из нее всех подряд идущих с правого края пробелов.
Например:
Исходная строка ‘QWERTY ’
Строка результата ‘QWERTY’
3. Написать и протестировать функцию. Функция получает через параметр строку (Str) и подстроку (SubStr) и возвращает строку, полу­ченную из исходной, путем удаления из нее всех вхождений подстроки
(SubStr).
Например:
Исходная строка Str ‘QWERTYQWERQW’
Подстрока SubStr ‘QW’
Строка результата ‘ERTYER’
4. Написать и протестировать функцию. Функция получает через параметр строку (Str) и подстроку (SubStr) и возвращает число вхож­дений подстроки (SubStr) в строку (Str).
Например:
Исходная строка Str ‘QWERTYQWERQW’
Подстрока SubStr ‘QW’ Число вхождений 3
5. Написать и протестировать функцию. Функция получает через параметр строку (Str) и две подстроки (SubStr1, SubStr2) и возвращает строку, полученную из исходной, путем замены в ней всех вхождений подстроки (SubStr1) на строку (SubStr2).
89
Например:
Исходная строка Str ‘QWERTYQWERQW’
Подстрока SubStr1 ‘QW’ Подстрока SubStr2 ‘zx’
Строка результата ‘zxERTYzxERzx’
6. Написать и протестировать функцию. Функция получает через параметр строку и возвращает строку, полученную из исходной, путем перестановки в ней литер в обратном порядке.
Ограничение. Вспомогательную строку не использовать. Например:
Исходная строка QWERTY
Строка результата YTREWQ
7. Написать и протестировать подпрограмму. Подпрограмма осу- ществляет циклический сдвиг литер в строке Str вправо на одну пози­цию.
Например:
Исходная строка QWERTY
Строка результата YQWERT
8. Написать и протестировать подпрограмму. Подпрограмма осу- ществляет циклический сдвиг литер в строке Str влево на одну пози­цию.
Например:
Исходная строка QWERTY
Строка результата WERTQ
9. Написать и протестировать подпрограмму. Подпрограмма осу- ществляет циклический сдвиг литер в строке Str вправо на заданное число позиций.
Например:
Исходная строка QWERTY
Строка результата YQWERT
10. Написать и протестировать подпрограмму. Подпрограмма осу- ществляет циклический сдвиг литер в строке Str влево на заданное число позиций.
90
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]