ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 07.04.2025

Просмотров: 1473

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Федеральное агенство по образованию российской федерации

1. Основные категории и понятия информатики

1.2. Информация: структура, форма, измерение

2. Техническое и программное обеспечение пэвм

2.1. Структура аппаратных средств пэвм

2.2. Программное обеспечение пэвм

3. Основы алгоритмизации

3.2.Формы представления алгоритмов

3.2.1. Алгоритм линейной структуры.

3.2.2. Алгоритм разветвляющейся структуры.

Да нет да да Рис 3.11

3.2.3. Алгоритмы циклической структуры.

4.2. Структура программы на языке Паскаль

4.3. Скалярные стандартные типы данных

4.4. Скалярные, пользовательские типы данных

5. Структурные типы данных

5.3. Записи

5.4. Записи с вариантами

5.6.Файлы

6. Операции над данными скалярных типов. Выражения

7. Операторы языка Паскаль

7.1. Простые операторы

7.2. Структурные операторы

8. Примеры программ на языке Паскаль

8.1. Пример 1. Арифметические выражения. Оператор присваивания

8.3. Пример 3. Программа обработки одномерного массива

8.4. Пример 4. Программа обработки двумерного массива

True False True False False

8.5. Пример 5. Программа обработки символьных строк

8.6. Пример 6. Программа обработки двумерного массива с вводом элементов матрицы из текстового файла

9.Разработка программ сложной структуры

9.1. Процедуры и функции

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

9.3. Передача данных в подпрограмму с помощью параметров. Формальные и фактические параметры

9.4. Использование процедур и функций

True False Рис. 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

True False Рис. 9.12

9.7. Модули

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!=1;

  2. для любого n>0,n!=n*(n-1)!

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

Рекурсивное определение значительно проще приведенной выше формулы и имеет следующий вид:

  1. F(1)=1;

  2. F(2)=1;

  3. Для любого 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!=1;

  2. для любого 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

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

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

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