Похожие презентации:
Лабароторная №12 подпрограммы и функции в PascalABC.NET [Автосохраненный]
1. PascalABC.NET ПРОЦЕДУРЫ И ФУНКЦИИ
Лабораторнаяработа № 12
PASCALABC.NET
ПРОЦЕДУРЫ И ФУНКЦИИ
Дисциплина:
«Основы алгоритмизации и программирования.»
Преподаватель: Шадрин Валерий Георгиевич
2.
Порядок выполнения лабораторной работы.1. Открыть рабочею папку Ваших работ на рабочем столе :
Sol_Pascal
группа
Фамилия
2. Скачать из папки преподавателя работу:
«лабораторная работа №12»
с методическим материалом, с заданием и примерами для
выполнения лабораторной работы.
3. Изучить методический материал и задание для
выполнения Лабораторной работы
4. Выполнить вначале Контрольные задания, затем задание
для лабораторной и ответить на контрольные вопросы
Сохранить все результаты в созданной Вами папке :
Sol_Pascal
группа
Фамилия
2
3.
ОРГАНИЗАЦИЯ ПОДПРОГРАММ. ПРОЦЕДУРЫ И ФУНКЦИИЦель работы: Изучить принципы модульного программирования в PascalABC.NET:
научиться создавать и использовать собственные процедуры и функции, понимать
различия между ними, освоить механизм передачи параметров и основы рекурсии.
При решении сложных объемных задач часто целесообразно разбивать их
на более простые. Метод последовательной детализации позволяет составить
алгоритм из действий, которые, не являясь простыми, сами представляют собой
достаточно самостоятельные алгоритмы. В этом случае говорят о
вспомогательных алгоритмах или подпрограммах. Подпрограмме дается имя, по
которому можно обращаться к ней (вызывать подпрограмму).
Определение:
Подпрограмма - специальным образом оформленный блок программы, для
дальнейшего его многократного использования.
Подпрограммы решают очень важные задачи, значительно облегчая
программирование:
1) избавляют от необходимости многократно повторять в тексте программы
аналогичные фрагменты;
2) улучшают структуру программы, облегчая ее понимание при разборе;
3) повышают устойчивость к ошибкам программирования и непредвиденным
последствиям при модификациях.
3
4.
СТРУКТУРА ТЕКСТА ПОДПРОГРАММЫсоответствует структуре текста основной программы:
<заголовок подпрограммы>;
<раздел описаний>;
begin
<тело подпрограммы>
end;
Следует обратить внимание на два отличия в описании основной
программы и подпрограммы:
подпрограмма начинается с заголовка, содержащего имя
подпрограммы, передаваемые в нее и возвращаемые от нее параметры. Заголовок подпрограммы отличается от заголовка основной
программы;
подпрограмма заканчивается точкой с запятой, а не точкой.
4
5.
СТРУКТУРАСТРУКТУРА ТЕКСТА
ТЕКСТА ПОДПРОГРАММЫ
ПОДПРОГРАММЫ
Подпрограммы бывают двух видов:
1) Функции
2) Процедуры
Функция - это подпрограмма, которая возвращает какое-либо
значение.
Процедура - это подпрограмма, которая сразу изменяет значения и
выполняет операции с числами, операторами и т.д.
Заголовки процедуры и функции имеют вид:
function <имя_функции> (<список формальных параметров>): <тип
результата>;
procedure <имя_процедуры> (<список формальных параметров>);
Список формальных параметров – это имена переменных с указанием
их типов, над которыми подпрограмма осуществляет действия.
5
6.
Пример заголовков процедуры и функции:procedure primer1 (x, y: real; z: integer);
function primer2 (n, m: byte): integer;
У функций и процедур существуют параметры (переменные, которые передают какое либо значение). Они тоже бывают двух видов:
1) Формальные - те, которые находятся в описании подпрограммы
2) Фактические - те, которые передаются из основной программы в функцию или
процедуру
Также у подпрограммы существуют переменные, с которыми она в дальнейшем
работает. Они делятся опять же на два типа:
1) Глобальные переменные, то есть действующие во всей программе.
2) Локальные - те, которые действуют только в процедуре или функции.
Переменные, объявленные в основной программе (глобальные), доступны всем
инструкциям программы, в том числе и инструкциям процедур и функций.
Переменные, объявленные в подпрограммах (локальные), доступны только
инструкциям той подпрограммы, в которой они объявлены.
6
7.
ОРГАНИЗАЦИЯ ПОДПРОГРАММ. ПРОЦЕДУРЫ И ФУНКЦИИИмена локальных переменных могут совпадать с именами глобальных
переменных. Если в подпрограмме описана (локализована) переменная с тем же
именем, что и глобальная, то в этом случае на время действия подпрограммы
локальная переменная «закрывает» глобальную и делает ее недоступной, т.е.
значение глобальной переменной на время действия подпрограммы
«замораживается».
Память для локальных, т.е. описанных в подпрограмме, переменных выделяется
на время действия подпрограммы в специальной области, называемой стеком.
При завершении подпрограммы память освобождается, поэтому все внутренние
результаты работы подпрограммы не сохраняются от одного обращения к
другому.
Вызов подпрограммы происходит при каждом употреблении ее имени в
основной программе. При вызове подпрограммы начинают выполняться ее
операторы до завершающего слова end или специального выхода из
подпрограммы – exit. После выхода из подпрограммы управление передается
команде, следующей за обращением к подпрограмме.
7
8.
Практическая работаварианты заданий на использование процедур
Создайте процедуры для решения следующих задач
(ввод/вывод организуйте в основной программе):
1. Вычисления среднего арифметического двух чисел.
2. Определения максимального из трех чисел.
3. Рисования равнобедренного треугольника из звездочек заданной высоты.
4. Сортировки трех чисел по возрастанию.
5. Нахождения корней квадратного уравнения (вывод в основной программе).
6. Перевода времени из секунд в часы, минуты и секунды.
7. Проверки, является ли год високосным.
8. Вычисления суммы цифр переданного числа.
9. Перевода целого числа в двоичную систему счисления
10. Рисования шахматной доски 8x8 символами # и пробел.
11. Нахождения НОК (наименьшего общего кратного) двух чисел.
12. Разложения числа на простые множители (процедура вывода).
13. Реверса (переворачивания) массива из 10 целых чисел.
14. Поиска индекса минимального элемента в целочисленном массиве.
15. Удаления всех отрицательных элементов из массива (с изменением его
длины).
8
9.
Практическая работаварианты заданий на использование процедур
Создайте процедуры для решения следующих задач
(ввод/вывод организуйте в основной программе):
16. Умножения двух матриц 3x3.
17. Вычисления площади треугольника по координатам вершин.
18. Определения, лежат ли три точки на одной прямой.
19. Вычисления даты следующего дня (с учетом високосных годов).
20. Форматированного вывода денежной суммы (рубли, копейки).
21. Округления вещественного числа до заданного количества знаков.
22. Замены в строке всех пробелов на символ подчеркивания.
23. Подсчета количества вхождений символа в строку.
24. Проверки, является ли строка палиндромом (без учета регистра).
25. Шифра строки сдвигом букв (шифр Цезаря).
26. Вычисления суммы элементов матрицы.
27. Транспонирования квадратной матрицы 4x4.
28. Заполнения массива случайными числами в заданном диапазоне.
29. Поиска в массиве строки с максимальной суммой элементов.
30. Вычисления скалярного произведения двух векторов.
9
10.
ФУНКЦИИФункции - подпрограммы, которые возвращают значение, то есть не
изменяют переменные в основной программе, а выполняет действие,
которое в дальнейшем можно использовать многократно.
Рассмотрим структуру функции на примере:
function Prim(a, b, c: integer): integer; //Задание переменных в функцию из программы
var
M: integer; //Описание локальной/ных переменных
begin
A := B + C;
M := A / B; //Присваивание локальной переменной значение А/В
A := A * C * B * M;
Prim := A; //Возвращение значения
end; //Конец функции
Данная функция выполняет простые операции с числами, в предпоследней
строчке мы видим, как происходит возвращение значения.
10
11.
Практическая работаварианты заданий на использование функций
Создайте функции для решения следующих задач:
1. Вычисления гипотенузы по двум катетам.
2. Проверки, является ли число четным.
3. Вычисления площади круга по радиусу.
4. Вычисления n-го числа Фибоначчи (итеративно).
5. Определения, является ли пятизначное число палиндромом.
6. Вычисления степени числа (a^n).
7. Нахождения НОД (наибольшего общего делителя) двух чисел (алгоритм
Евклида).
8. Подсчета количества делителей натурального числа.
9. Преобразования температуры из градусов Цельсия в Фаренгейты.
10. Вычисления длины вектора по его координатам.
11. Проверки, принадлежит ли точка (x, y) кругу с центром (0,0) и радиусом R.
12. Определения знака числа (возвращает строку '+', '-' или '0').
13. Подсчета факториала числа (итеративно).
14. Подсчета факториала числа (итеративно).
15. Преобразования целого числа в строку шестнадцатеричного
представления.
11
12.
Практическая работаварианты заданий на использование функций
Создайте функции для решения следующих задач:
16. Проверки, является ли строка правильным идентификатором в Паскале.
17. Вычисления среднего геометрического элементов массива.
18. Поиска максимального элемента в вещественном массиве.
19. Проверки, отсортирован ли массив по возрастанию.
20. Подсчета количества положительных элементов в матрице.
21. Вычисления определителя матрицы 2x2.
22. Конкатенации (соединения) двух массивов в один.
23. Подсчета слов в строке (слова разделены пробелами).
24. Удаления всех гласных букв из строки.
25. Проверки, начинается ли строка с заданной подстроки.
26. Вычисления суммы бесконечного ряда 1 + 1/2 + 1/4 + 1/8 + ... с заданной
точностью.
27. Преобразования арабского числа (1-10) в римское (строку).
28. Проверки, является ли число совершенным (сумма делителей равна числу).
29. Вычисления даты Пасхи по году (возвращает строку).
30. Генерации случайного пароля заданной длины из букв и цифр.
12
13.
Пример: Расположить в порядке неубывания три целыхчисла.
Решение:
Program Primer;
Var S1,S2,S3 :Integer;
Procedure Swap(Var A,B: Integer);{Процедура Swap с параметрамипеременными}
Var C : Integer; {C - независимая локальная переменная}
Begin
C:=A; A:=B; B:=C {Меняем местами содержимое A и B}
End;
Begin
Writeln ('Введите три числа');
Readln (S1,S2,S3);
If S1>S2 Then Swap(S1,S2);
If S2>S3 Then Swap(S2,S3);
If S1>S2 Then Swap(S1,S2);
Writeln ('Числа в порядке неубывания: ',S1,S2,S3);
End.
13
14.
Пример: Найти максимальное из трех введенныхчисел.
Для решения воспользуемся описанием функции, принимающей
значение
максимального из двух чисел, которые передаются в нее в виде
параметров.
Program Primer;
Var A,B,C :Real;
Function Max(A,B:Real):Real; {Описываем функцию Max с
формальными}
Begin {параметрами A и B, которая принимает }
If A>B Then Max:=A {значение максимального из них }
Else Max:=B {Здесь A и B - локальные переменные }
End;
Begin
Writeln('Введите три числа');
Readln(A,B,C);
Writeln('Максимальным из всех является ', Max(Max(A,B),C))
End.
14
15.
Пример задачи: Создать процедуру DrawRect, котораярисует на экране прямоугольник заданной ширины и высоты
символом *.
```pascal
procedure DrawRect(width, height: integer);
var i, j: integer;
begin
for i := 1 to height do
begin
for j := 1 to width do
write('*');
writeln;
end;
end;
begin
DrawRect(7, 4);
end.
15
16.
Пример: Функция для нахождения факториала.```pascal
function Factorial(n: integer): integer;
var i, f: integer;
begin
f := 1;
for i := 2 to n do
f := f * i;
Factorial := f; // Присвоение результата имени функции
end;
var num: integer;
begin
write('Введите число: ');
readln(num);
writeln('Факториал ', num, '! = ', Factorial(num)); // Вызов
функции в выражении
end.
16
17.
Пример 4: Функция, проверяющая, является ли число простым.```pascal
function IsPrime(n: integer): boolean;
var
i: integer;
begin
Result := true; // В PascalABC.NET можно использовать
ключевое слово Result
if n < 2 then Result := false;
for i := 2 to round(sqrt(n)) do
if n mod i = 0 then
begin
Result := false;
break;
end;
end;
```
17
18.
РекурсияРекурсия — способ организации вычислительного процесса, при
котором подпрограмма в ходе выполнения составляющих ее операторов
обращается сама к себе.
Пример 3. Вычислить сумму элементов одномерного массива, используя
рекурсивную функцию. Массив заполнить случайными числами.
• program ex94;
const m = 50; // количество элементов в массиве
type
mass = array[1..m] of integer; // определение типа массива
function summa(n: byte; r: mass): integer;
begin
if n = 0 then summa:= 0
else summa := r[n] + summa(n — 1, r) // использование
// рекурсии
end;
begin
randomize;
var a: mass;
// заполнение массива случайными числами
for var i := 1 to m do a[i]:= random(200);
println('s =', summa(m, a))
end.
18
19.
ПрактическаяПрактическая
Практическаяработа
работа
работа
варианты
варианты
варианты заданий
заданий
заданийна
на
наиспользование
использование
использованиерекурсии
рекурсии
рекурсии
Создайте рекурсивные подпрограммы (процедуры или функции):
1. Вычисления суммы цифр числа.
2. Возведения числа a в натуральную степень n.
3. Вычисления n-го числа Фибоначчи.
4. Вывода числа "задом наперед" (например, 123 -> 321).
5. Проверки, является ли строка палиндромом.
6. Подсчета количества элементов в списке (если используется свой тип) или массиве
(с передачей индекса).
7. Нахождения максимального элемента в массиве.
8. Быстрой сортировки (QuickSort) массива.
9. Решения задачи "Ханойские башни" с выводом шагов.
10. Обхода шахматной доски конем (задача о ходе коня).
11. Генерации всех перестановок чисел от 1 до N.
12. Поиска пути в лабиринте (матрице).
13. Вычисления суммы элементов массива.
14. Разворота строки.
15. Перевода числа из десятичной в двоичную систему.
19
20.
Практическая работаварианты заданий на использование рекурсии
16. Вычисления НОД (алгоритм Евклида).
17. Подсчета вхождений символа в строку.
18. Вычисления значения многочлена по схеме Горнера.
19. Генерации всех сочетаний из N по K.
20. Определения, является ли число простым (рекурсивная проверка
делителей).
21. Вычисления количества способов разменять сумму монетами.
22. Поиска бинарным (двоичным) поиском в отсортированном
массиве.
23. Слияния двух отсортированных массивов в один.
24. Вычисления длины строки (без использования Length).
25. Удаления из строки всех заданных символов.
26. Проверки, является ли массив отсортированным.
27. Вычисления определителя матрицы NxN (разложение по строке).
28. Вычисления суммы гармонического ряда до N-го члена.
29. Построения всех правильных скобочных последовательностей
длины 2N.
30. Алгоритма "Разделяй и властвуй" для поиска максимального
разности между двумя элементами массива (max(a[j] - a[i]), i<j).
20
21.
Пример : Использование рекурсииЗадача: Написать рекурсивную процедуру для вывода чисел от 1 до N.
```pascal
procedure PrintNumbers(n: integer);
begin
if n > 1 then
// Рекурсивный шаг
PrintNumbers(n - 1);
write(n, ' ');
// Действие (вывод) после рекурсивного
вызова
end;
// приводит к прямому порядку вывода
begin
PrintNumbers(10);
end.
21
22.
Пример1. Составить программу для вычисления площади кольца.Вычисление площади круга оформить в виде функции.
Решение
• program ex92;
function krug(r: real): real; // описание функции
begin
krug:= pi*r*r
end;
begin
var (r1, r2) := ReadlnReal2('Введите
значения внутреннего и внешнего радиусов');
if r1 > r2 then swap(r1, r2); { r1 — внутренний радиус,
должно выполняться условие r1 < r2 }
var s := krug(r2) — krug(r1); // вычисление площади кольца
writeln('s = ', s:6:2)
end.
22
23.
Пример 2 Решим задачу из примера 1, заменив функцию krug на процедуру с темже именем.
• program ex93
var a: real;
procedure krug(r: real);
begin
a := pi*r*r
end;
begin
var (r1, r2) := ReadlnReal2('Введите значения внутреннего и внешнего
радиусов’);
krug(r1);
var s1 := a; // вычисление площади внутреннего круга
krug(r2);
var s2 := a; // вычисление площади внешнего круга
writeln('s = ', (s2 — s1):6:2)
end.
23
24.
Пример 4.Вычислить сумму элементов одномерного массива, используя рекурсивную функцию. Массив заполнить случайными
числами.
• program ex94;
const m = 50; // количество элементов в массиве
type
mass = array[1..m] of integer; // определение типа
массива
function summa(n: byte; r: mass): integer;
begin
if n = 0 then summa:= 0
else summa := r[n] + summa(n — 1, r) // использование
// рекурсии
end;
begin
randomize;
var a: mass;
// заполнение массива случайными числами
for var i := 1 to m do a[i]:= random(200);
println('s =', summa(m, a))
end.
24
25.
Варианты заданий для лабораторной работы:1. Вычислить значение выражения
Определить и использовать при решении функцию sign:
2. Вычислить значение выражения
где sh(x) и ch(x) задаются формулами
Вычисление sh(x) и ch(x) оформить в виде функций.
3. Разработать функцию, которая вычисляет значение
наибольшего
элемента одномерного массива действительных чисел с
количеством элементов
Программирование