ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 07.04.2025
Просмотров: 1471
Скачиваний: 1
СОДЕРЖАНИЕ
Федеральное агенство по образованию российской федерации
1. Основные категории и понятия информатики
1.2. Информация: структура, форма, измерение
2. Техническое и программное обеспечение пэвм
2.1. Структура аппаратных средств пэвм
2.2. Программное обеспечение пэвм
3.2.Формы представления алгоритмов
3.2.1. Алгоритм линейной структуры.
3.2.2. Алгоритм разветвляющейся структуры.
3.2.3. Алгоритмы циклической структуры.
4.2. Структура программы на языке Паскаль
4.3. Скалярные стандартные типы данных
4.4. Скалярные, пользовательские типы данных
6. Операции над данными скалярных типов. Выражения
8. Примеры программ на языке Паскаль
8.1. Пример 1. Арифметические выражения. Оператор присваивания
8.3. Пример 3. Программа обработки одномерного массива
8.4. Пример 4. Программа обработки двумерного массива
8.5. Пример 5. Программа обработки символьных строк
8.6. Пример 6. Программа обработки двумерного массива с вводом элементов матрицы из текстового файла
9.Разработка программ сложной структуры
9.3. Передача данных в подпрограмму с помощью параметров. Формальные и фактические параметры
9.4. Использование процедур и функций
9.5. Массивы – параметры процедур и функций
True False True False Рис. 9.7
True False True False True False Рис 9.9
9.6. Рекурсивные процедуры и функции
True False Рис. 9.10 True False
10. Динамические структуры данных
10.2. Объявление и создание динамических структур данных. Указатели
True False True False Рис. 9.7
Текст программы
на языке Паскаль.
Program Main;
Type Vect = array[1..20] of real;
Var A,B: Vect;
n1, n2, I: integer;
Proizv, MaxA, MaxB: real;
Function MaxEl(M: Vect; nm : integer): real;
Var I: integer;
Max: real;
Begin
Max:=M[1] ;
For I:=1 to n1 do
If (M[I]>Max) then
Max:=M[I];
MaxEl:=Max;
End;
Begin
Writeln('Input n1: ');
Readln(n1);
Writeln('Input ',n1, ' real numbers: ');
For I:=1 to n1 do readln(A[I]);
Writeln('Input n2: ');
Readln(n2);
Writeln('Input ',n2, ' real numbers: ');
For I:=1 to n2 do readln(B[I]);
MaxA:=MaxEl(A,n1);
MaxB:=MaxEl(B,n2);
Proizv:= MaxA*MaxB;
Writeln('MaxA = ', MaxA);
Writeln('MaxB = ', MaxB);
Writeln('MaxA*MaxB = ', Proizv);
Write('Press any key!!!');
Readln;
End.
Результаты тестирования.
Input n1:
5
Input 5 real numbers:
1.6
-5.8
2
7
1.45
Input n2:
3
Input 3 real numbers:
1.5
2
-8
MaxA = 7.00000000000000E+0000
MaxB = 2.00000000000000E+0000
MaxA*MaxB = 1.40000000000000E+0001
Press any key!!!
Аналогично можно передавать двумерные массивы в качестве параметра процедурам и функциям. Рассмотрим пример программы обработки матриц с использованием подпрограмм.
Задание. В двумерном массиве (матрице) определить номер строки, в которой находится максимальное количество положительных элементов. Для определения числа положительных элементов в строке использовать процедуру. Если положительных элементов нет в массиве, вывести сообщение об этом.
Постановка задачи.
Исходные данные:
число строк в матрице n<=10;
число столбцов в матрице m<=10;
двумерный массив (матрица) размером nxm, содержащий положительные и отрицательные значения.
Выходные данные:номер строки, в которой находится максимальное количество положительных элементов.
Метод решения:для определения числа положительных элементов в строке матрицы использовать функцию.
Аномалии:отсутствие положительных элементов в массиве.
Реакция на аномальную ситуацию – выдача сообщения.
Блок-схема основной программы представлена на рис. 9.8.


Рис.
9.8


Блок-схема подпрограммы - процедуры для подсчета количества положительных элементов в каждой строке матрицы и записи счетчиков в массив Kизnэлементов представлена на рис. 9.9.
K[I]= количествоA[I,J], для которых справедливо неравенствоA[I,J]>0.
True False True False True False Рис 9.9
Текст программы на языке Паскаль.
Program Main;
Type Tmatrix = array[1..10,1..10] of integer;
Vect = array[1..10] of integer;
Var
A: Tmatrix;
K: Vect;
i, j, n, m, kmax, imax: integer;
Procedure PositiveEl(M:Tmatrix; n, m: integer; VAR K: Vect);
Var i, j: integer;
begin
for i:=1 to n do
begin
K[i]:=0;
for j:=1 to m do
if (Mt[i,j]>0) then
K[i]:= K[i]+1;
end;
end;
begin
write('input n<10 ');
readln(n);
write('input m<10 ');
readln(m);
for i:=1 to n do
for j:=1 to n do
read(A[i,j]);
PositiveEl(A, n, m, K);
kmax:=K[1];
imax:=1;
for i:=1 to n do
if (K[i]>kmax) then
begin
kmax:=K[i];
imax:=i;
end;
if kmax=0 then
writeln('Not A[i][j]>0 !')
else
writeln('imax= ',imax);
write('PRESS ANY KEY!');
readln;
end.
Результаты тестирования.
1. Исходные данные:
n=3
m=3
A=((-1,-2,-3), (-1,0,-3), (-5,-2,-8)
Результат- сообщение «notA[i,j]>0».
Результаты, выданные программой.
input n<10 3
input m<10 3
-1 -2 -3
-1 0 -3
-5 -2 -8
Not A[i][j]>0 !
PRESS ANY KEY!
2. Исходные данные:
n=3
m=3
A=((1,2,3), (1,0,-3), (-5,-2,-8)
Результат- сообщение «imax=1».
Результаты, выданные программой.
input n<10 3
input m<10 3
1 2 3
1 0 -3
-5 -2 -8
imax= 1
PRESS ANY KEY!
9.6. Рекурсивные процедуры и функции
Рекурсивным называется объект, который частично определяется через самого себя. Рекурсивные определения используются во многих областях науки и, особенно, в математике.
Рассмотрим функцию определения факториала (n!); факториал – это произведение первыхnнатуральных чисел. Такое произведение можно вычислить с помощью программы, использующей оператор циклаfor. Однако, существует другое определение факториала, в котором используется рекуррентные формулы:
1!=1;
для любого n>0,n!=n*(n-1)!
Определения, использующие рекуррентные формулы, называют рекурсивными определениями. Рекурсивные определения упрощают процесс вычислений. Например, в случае определения членов ряда Фибоначчи:
Рекурсивное определение значительно проще приведенной выше формулы и имеет следующий вид:
F(1)=1;
F(2)=1;
Для любого n>2,F(n)=F(n-1)+F(n-2).
Рассмотрим рекурсивный алгоритм на примере накопления произведений. Пусть требуется написать программу, которая определяет произведение натуральных чисел от 1 до n:
P=n!=1*2*…*n.
Постановка задачи.
Входные данные:
n>0 – целое число.
Выходные данные:
P=n! – целое число.
Аномалии. n<0, в программе не рассматриваются.
Метод решения: для определения произведения использовать рекуррентные формулы:
1!=1;
для любого n>0,n!=n*(n-1)!
Блок-схема рекурсивной функции factдля определения факториала представлена на рис 9.10, а блок-схема основной программы – на рис. 9.11.
True False Рис. 9.10 True False
Текст программы на языке Паскаль.
Program Exam10;
Var
Ch, Proiz: integer;
Function Fact(n: integer): integer;
Var R: integer;
Begin
If n>0 then Fact:=n*Fact(n-1)
Else Fact:=1;
End;
Begin
Writeln('Input Ch>0 :');
Readln(Ch);
If Ch>0 then
begin
Proiz := Fact(Ch);
Writeln('Ch','!=',Proiz)
end
Else Writeln('Error! Ch<0');
Write('PRESS ANY KEY!!!');
Readln;
End.
Результаты тестирования.
1. Исходные данные:
Ch=3
Ch!=1*2*3=6
Результаты, выданные программой.
Input Ch>0 :
3
Ch!=6
PRESS ANY KEY!
2. Исходные данные:
Ch=-3
Результат- сообщение «Error!Ch<0».
Результаты, выданные программой.
Input Ch>0 :
-3
Error! Ch<0
PRESS ANY KEY!!!
Рекурсивный процесс предполагает прямой ход или рекурсивный спуск и обратный ход или рекурсивный возврат.
Прямой ход.
При каждом рекурсивном обращении к функции создается новый экземпляр памяти всех локальных переменных и параметров этой функции, который запоминается в некоторой области памяти. Глубина рекурсии определяется количеством выполненных рекурсивных вызовов. Цепочка вызовов рекурсивных подпрограмм создает в памяти связанную последовательность областей памяти, организованных по принципу стека: доступной является область, размещенная последней. Прямой ход завершается тем вызовом подпрограммы, в котором истинно условие выполнения ее нерекурсивной части.
Рекурсивный процесс выполнения функции FactдляCh=3 имеет глубину рекурсии, равную 3, как показано в таблице ниже.
|
Текущий уровень рекурсии |
Рекурсивный спуск (прямой ход) |
Рекурсивный возврат (обратный ход) |
||
|
1 |
Ch=3 Fact:=3*Fact(2-1) |
Fact:=3*2(=6) |
||
|
2 |
Ch=2 Fact:=2*Fact(2-1) |
Fact:=2*1(=2) |
||
|
3 |
Ch=1 Fact:=1 |
Ch=1Fact:=1 |
||
Обратный ход начинается с выполнения нерекурсивной части подпрограммы; после этого область стека, относящаяся к данному вызову удаляется и выполняется возврат к предыдущему вызову и т. д. Обратный ход завершается возвратом значения в программу, вызывавшую рекурсивную функцию.
В рекурсивной процедуре или функции должно быть условие выполнения нерекурсивных операторов для обеспечения завершения рекурсии, иначе возможны бесконечные рекурсивные вызовы и аварийное завершение программы из-за переполнения доступной памяти для стека.
В языке Паскаль допускается использование рекурсивных процедур. Рассмотрим пример рекурсивной процедуры на примере процедуры определения наибольшего общего делителя двух целых чисел.