Нахождение максимального элемента массива

Задача 2.

Задан одномерный массив из N чисел. Найти максимальный элемент массива.

Решение:

Program Mass2;

Const X=100;

Var A:Array[1..10] of Integer;

I,N,Max:Integer;

Begin

Writeln(’Введите число элементов массива (N<=10)’);

Readln(N);

Randomize;

For I:=1 to N do A[I]:=Random(X);{заполнение массива случайными числами}

Max:=A[1];

For I:=1 to N do

If Max>A[I] Then A[I]:=Max;

For I:=1 to N do Writeln(’A[’,I,’]=’,A[I]);

Writeln(’Max=’,Max);

End.

Задачи:

1. Задан одномерный массив из N чисел. Найти минимальный элемент массива.

2. Задан одномерный массив из N чисел. Найти разницу между наибольшим и наименьшим элементами массива.

3. Задан одномерный массив из N чисел. Проверить, есть ли в массиве отрицательные элементы и если есть, то найти среди них наименьший.

 

Сортировка одномерного массива

Задача 3.

Задан одномерный массив из N чисел. Отсортировать все элементы массива по возрастанию.

Решение:

Program Mass3;

Var A:Array[1..10] of Integer;

I,P,N:Integer;

F:boolean;

Begin

Writeln(’Введите число элементов массива (N<=10)’);

Readln(N);

For I:=1 to N do Readln(A[I]);

F:=False;

While F=False do

Begin

F:=True;

For I:=1 to N-1 do

If A[I]>A[I+1] Then

Begin

P:=A[I];

A[I]:=A[I+1];

A[I+1]:=P;

F:=False;

End;

End;

For I:=1 to N do Writeln(’A[’,I,’]=’,A[I]);

End.

Задачи:

1. Задан одномерный массив из N строк, имеющих вид фамилий. Отсортировать все элементы массива по алфавиту.

2. В массиве каждый элемент равен 0, 1 или 2. Переставить элементы массива так, чтобы вначале массива расположились все нули, затем все единицы и, наконец все двойки.

3. Задан одномерный массив из N чисел. Переставить элементы массива так, чтобы отрицательные элементы предшествовали всем неотрицательным.

4. Задан одномерный массив из N чисел и число В. Упорядочить массив по возрастанию и поместить переменную В в соответствующее место массива.

Решение задач, используя одномерные массивы.

1. Задан одномерный массив из N чисел. Составить новый массив, состоящий из тех же чисел, но идущий в обратном порядке.

2. Задан одномерный массив из N чисел и число К. Напечатать «Да», если К совпадает хотя бы с одним из элементов массива и «Нет» в противном случае.

3. Задан одномерный массив из N чисел. Найти количество элементов массива, больших среднего арифметического всех его элементов.

4. Задан одномерный массив из N чисел Определить в массиве число соседств из двух чисел одного знака.

5. Задан одномерный массив из N чисел Найти сумму произведений всех троек соседних чисел.

6. Задан одномерный массив из N чисел. Подсчитать наибольшее число одинаковых элементов, идущих в массиве подряд.

7. Задан одномерный массив из N чисел. Заменить все элементы массива на сумму предыдущего и последующего их значений.

8. Задан одномерный массив из N чисел. Подсчитать количество неповторяющихся элементов массива.

9. Задан одномерный массив из N чисел. Составить массив У, где Y[I]:=Min(X[1],X[2],…,X[N]).

 

Двумерные массивы

Рассмотрим работу с двумерными массивами (в алгебре они называются матрицами):

Дадим таблице имя - Tab

 
-1

Каждое число в таблице имеет тип Integer. Это - тип злементов (M).

Индексы данной таблицы изменяются от 1 до 8 . У двумерных массивов два списка (B1,B2).

Таким образом, описание этого массива (в разделе Var) выглядит так : Tab:Array[1..3,1..4] of Integer;

Задав конкретные значения индексов, можно выбрать определенный элемент массива. Например оператор:

N:=A[1,3];

Присвоит переменной N значение элемента массива, имеющего индекс строки 1, индекс столбца 3, т.е. число 15.

Задача 4.

Задан массив из целых чисел, размерностьюN*M (N-строки, M-столбцы). Вывести на экран:

а) N-ю строку; б) M-й столбец; в) весь массив.

Решение:

Program Mass4;

Var Tab:Array[1..10,1..10] of Integer;

N,M,X,Y:Integer;

Begin

Writeln(’Введите количество строк массива (N<=10)’);

Readln(N);

Writeln(’Введите количество столбцов массива (M<=10)’);

Readln(M);

For X:=1 to N do

For Y:=1 to M do Readln(Tab[X,Y]);

Writeln(’Вывод ’,N,’ строки’);

For X:=1 to M do Write(’Tab[’,N,’,’,X,’]=’,Tab[N,X],’ ’:2);

Writeln;

Writeln(’Вывод ’,M,’ столбца’);

For X:=1 to N do Writeln(’Tab[’,X,’,’,M,’]=’,Tab[X,M]);

Writeln(’Вывод массива’);

For X:=1 to N do

Begin

For Y:=1 to M do Write(’Tab[’,X,’,’,Y,’]=’,Tab[X,Y],’ ’:2);

Writeln;

End;

Задача 5.

Задан массив из строк, размерностьюN*M (N-строки, M-столбцы). Отсортировать все элементы массива по возрастанию.

Решение:

Program Mass5;

Var A:Array[1..10,1..10] of String;

I,N,M,X,Y:Integer;

P:String;

F:boolean;

Begin

{Ввести двумерный массив}

F:=False;

While F=False do

Begin

F:=True;

For X:=1 to N do

For Y:=1 to M-1 do

Begin

If A[X,Y]>A[X,Y+1] Then

Begin

{Поменять местами 2 соседних элемента строки}

End;

If (X<N)and(Y=(M-1))and(A[X,Y+1]>A[X+1,1])Then

Begin

P:=A[X,Y+1];

A[X,Y+1]:=A[X+1,1];

A[X+1,1]:=P;

F:=False;

End;

End;

End;

{Вывести отсортированный массив}

End.

 

Подпрограммы.

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

1. T1 2.

       
   
 


РР РР

Т2

Т1

РР Т2

Т3 Т3

Т4

РР

Т4

 

При составлении программы по первому алгоритму приходится задавать одну и ту же группу операторов (РР) для каждого из повторяющихся фрагментов.

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

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

В Паскале подпрограммы реализуются 2-х видов - процедуры и функции. И те, и другие вводятся в программу с помощью описания. Для этого существует специальный раздел программы

Описание процедур

Структура описания процедур аналогична самой программе. Она состоит из заголовка процедуры и блока процедуры. Блок процедуры включает в себя те же 6 разделов, что и блок программы.

Заголовок процедуры:

Procedure Xxx[(P1:T1;P2:T2;…Pn:Tm)];

Xxx - имя процедуры (любой идентификатор);

P1,P2,…,Pn - формальные параметры;

T1,T2,…,Tm – типы формальных параметров

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

Формальные параметры могут отсутствовать и, в этом случае, процедура описывается без параметров.

Обращение к процедуре:

Чтобы исполнить процедуру, в нужном месте программы записывается оператор обращения к ней, который имеет вид:

Xxx[(B1,B2,…,Bn)];

B1,B2,…,Bn – список фактических параметров. Он отсутствует, если процедура описывалась без параметров.

При вызове процедуры устанавливается взаимное однозначное соответствие между фактическими и формальными параметрами, а затем управление передается процедуре.

Соответствие между фактическими и формальными параметрами:

1. Число фактических параметров должно быть равно числу формальных параметров;

2. Соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.

9.3.Формальные параметры – переменные

Перед ними ставится слово Var.

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

Пример 1:

:

Procedure Xxx(Var A,B,C:Integer; Var D:Real);{A,B,C,D – формальные параметры – переменные; }

:

Xxx(M,N,X,Y);{M,N,X,Y – переменные}

Рассмотрим на примере принцип работы параметров-переменных:

Пример 2:

Program Pr1;

Var A,B:Integer;

Procedure Zamena(Var Y,X:Integer);

Begin

X:=X+1;Y:=Y+10;

End;

Begin

A:=0;B:=0;

Zamena(A,B);

Writeln(A,B);

End.

Результат: 1,10 {Результат работы процедуры передается в программу – переменные А и В изменили свое значение}

Задача.

Составить программу вычисления максимального из 4-х чисел, используя процедуру вычисления максимального из 2-х чисел.

Решение:

Program Pr3;

Var A,B,C,D,M1,M2,M3:Integer;

Procedure Max(Var X,Y,M:Integer);

Begin

If X>Y Then M:=X Else M:=Y;

End;

Begin

Readln(A,B,C,D);

Max(A,B,M1);

Max(C,D,M2);

Max(M1,M2,M3);

Writeln(’Max=’,M3);

End.

Задачи:

1. Правильно ли описана процедура и обращение к ней (если есть ошибки, то исправить):

Procedure Str(Var (A,B,C): Real;)

C:=A+B+C;

:

Str(X,Y,Z,S);

:

2. В чем отличие процедур:

а)Procedure Str1;

Begin

P:=(A+B+C)/2;

S:=sqrt(P*(P-A)*(P-B)*(P-C));

End;

в)Procedure Str1(Var A,B,C,S:Real);

Begin

P:=(A+B+C)/2;

S:=sqrt(P*(P-A)*(P-B)*(P-C));

End;

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

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

а)Procedure M(Var X,Y,M:Real);

Begin M:=X+Y; End;

б)Procedure M1(Var X,Y,Z,T:Real);

Begin Z:=X+Y; T:=X*Y; End;

в)Procedure M2(Var X,Y,R:Real; Var P:Integer);

Begin If sqr(X)+sqr(Y)<=sqr(R) Then P:=1 Else P:=0; End;

4. Процедура описана следующим образом: Procedure M2(Var X,Y:Integer); Допустимо ли обращение к процедуре, имеющее вид М2(A,B-1);

5. Даны числа X,Y,Z. Используя процедуру нахождения максимального из двух чисел, вычислить U=(Max(X,Y)+Max(X,Z))/(Max(Y,Z));

6. Одинаковы ли последствия обращения к процедурам:

а) Procedure P;

Begin X:=X+Y; Y:=X-Y; End;

б) Procedure P;

Begin Y:=X-Y; X:=X+Y; End;

9.4.Формальные параметры – значения

Слово Var не ставится.

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

Пример:

:

Procedure Xxx(A,B,C:Integer; Var D:Real);{A,B,C – формальные параметры – значения; D – формальный параметр – переменная; }

:

Xxx(M,N,X,Y);{M,N,X – могут быть выражениями; Y – только переменная}

Рассмотрим на примерах различия при использовании параметров-значений и параметров-переменных :

Пример1.

Program A1;

Var X:Integer;

Procedure Zamena(Y:Integer);

Begin

Y:=1;

End;

Begin

X:=0; Zamena(X);

Writeln(’X=’,X);

End.

Результат: X=0

 

Пример2.

Program Pr2;

Var X:Integer;

Procedure Zamena(Var Y:Integer);

Begin

Y:=1;

End;

Begin

X:=0; Zamena(X);

Writeln(’X=’,X);

End.

Результат: X=1

Задача:

Составить программу обращения к процедуре вычисления натуральной степени числа A (Z=Ak)

Program Proc2;

Var A,K,Z:Integer;

Procedure Nstep(X:Real;N:Integer;Var Y:Real);{Y=Xn}

Var I:Integer;

Begin

Y:=1;

For I:=1 to N do

Y:=Y*X;

End;

Begin

Readln(A,K);

Nstep(A,K,Z);

Writeln(’Z=’,Z);

End.

Переменная I, описанная в процедуре, называется локальной по отношению к процедуре. Локальная – местная, имеющая местное значение. Как только процедура выполнится, значение локальной переменной I забудется.

Задачи

1. В программе описана процедура Р с формальными параметрами X,Y и процедура Q с формальными параметрами S,T. Среди операторов программы встречаются операторы процедуры P(1,A) и Q(B,D+F). Какие из формальных параметров процедур P и Q заведомо являются параметрами-значениями?

2. Даны числа A, B, C, D. Найти значение выражения K=M*N+K, где M=Max(A,B); N=Max(B,C,D); K=Max(A,B,C,D);. Использовать процедуру нахождения максимального из 2-х чисел.

3. Даны натуральные числа A, B, C, D, X. Найти значение выражения M=(X*A)A+BC*(D*X)C. Использовать процедуру вычисления натуральной степени числа.

4. Составить программу обращения к процедуре вычисления целой степени числа А (Z=Ak) (К-целое число)

5. Даны натуральные числа K, M. Требуется вывести на экран рамку из звездочек высота которой – K строк, ширина – M знаковых позиций. Описать процедуру Zvezda(S,N), обращение к которой дает вывод данной рамки.

 

Описание функций

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

Функция состоит из заголовка и блока:

Заголовок функции:

Function Xxx(P1:T1;P2:T2;…Pn:Tm):Q;

Xxx - имя функции (любой идентификатор);

P1,P2,…,Pn - формальные параметры;

T1,T2,…,Tm – типы формальных параметров;

Q – тип значений, которые способна принимать функция в результате ее выполнения;

Особенности раздела операторов функции:

Раздел операторов функции должен содержать оператор присваивания, в котором слева помещено имя функции.

Обращение к функции:

Обращение к функции не является оператором, оно входит в состав выражения (например, в правой части оператора присваивания).

Z:=Xxx[(B1,B2,…,Bn)];

 

Задача.

Составить программу вычисления максимального из 4-х чисел, используя функцию вычисления максимального из 2-х чисел.

Program func1;

Var A,B,C,D,M1,M2,M3:Integer;

Function Max(X,Y:Integer):Integer;

Begin

If X>Y Then Max:=X Else Max:=Y;

End;

Begin

Readln(A,B,C,B);

m1:=Max(A,B);

m2:=Max(C,D);

m3:=Max(M1,M2);

Writeln(’Max=’,M3);

End.

Задачи:

Из параграфа 9.4 решить задачи №№ 2,3,4,5, используя обращение к функции.

Стандартные модули

Модули можно использовать для создания библиотек стандартных подпрограмм и данных. В Турбо Паскале в настоящее время имеется большое количество стандартных подпрограмм и данных, объединенных в несколько стандартных модулей:

Модуль System

Модуль автоматически подключается к любой программе

В модуль System входят следующие подпрограммы:

- арифметические функции; {рассмотрены в параграфе 3.3}

- функции для величин порядкового типа;

- функции преобразования типов;

- процедуры и функции работы со строками;

- процедуры и функции работы с файлами;