Действия над элементами массивов
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

После объявления массива к каждому его элементу можно обратиться, указав имя (идентификатор) массива и индекс (индексы) в квадратных скобках. Например, X[3] означает третий элемент массива Х.

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

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

var i,j,k,m,n :integer;

X,Y       :array[1..10] of real;

z    :array[1..5,1..10] of integer;

Ввод массива

Чаще всего массив вводится с клавиатуры с помощью оператора for:

read(n);                                                 {чтение числа элементов массива}

for i:=1 to n do read(x[i]); {ввод элементов массива}

Аналогично двумерный массив вводится с помощью вложенного for:

read (k,m);                                    {чтение числа строк и столбцов массива}

for i:=1 to k do

for j:=1 to m do read (z[i,j]);

В этом примере элементы массива вводятся построчно, т.к. быстрее меняется индекс j, соответствующий номеру столбца.



Вывод массива

Вывод значений массива осуществляется аналогичным образом:

for i:=1 to n do write(x[i]);

for i:=1 to k do

for j:=1 to m do writeln(z[i,j]);

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

for i:=1 to k do begin

for j:=1 to m do write (z[i,j]);

writeln

end;

 

Инициализация

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

for i:=1 to n do x[i]:=0;

for i:=1 to k do

for j:=1 to m do z[i,j]:=1;

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

for i:=1 to n do y[i]:=x[i];

Поиск элементов массива, удовлетворяющих заданным условиям, выполняется с помощью оператора for и if. Пусть, например, нужно определить, сколько элементов массива х отрицательны:

k:=0;                               {счетчик числа отрицательных элементов}

for i:=1 to N do

if x[i]<0 then k:=k+1;

Перестановка заданных элементов массива выполняется с помощью дополнительной переменной. Фрагмент программы, выполняющей перестановку второго и седьмого элементов массива  х:

DP:=x[2];

x[2]:=x[7];

x[7]:=DP;

 

Задача: Найти минимальный элемент массива х и его номер.

Алгоритм решения задачи представлен на рисунке 6.1, программа – на
 рисунке 6.2.

Обозначения: n      – число элементов массива;

Min  - минимальный элемент;

Nomer - номер минимального элемента.

 

Рисунок 6.1 – Блок-схема алгоритма

 

Program Example_10;

Var i,n,nomer : integer;

x : array[1..20] of real;

min : real;

Begin

Writeln;

Write('Введите число членов массива '); Read(n);

For i:=1 to n do begin

     Write('x[',i,']=');

     Read(x[i])

end;

min:=x[1];

nomer:=1;

for i:=2 to n do

if x[i] < min then begin

                      min:=x[i];

                      nomer:=i

end;

Writeln('Минимальный член массива ',min);

Writeln('Его номер ',nomer)

End.

Рисунок 6.2 – Программа Example_10


 




ПОДПРОГРАММЫ

 

 

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

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

Подпрограммы, в свою очередь, могут разбиваться на менее крупные подпрограммы, такие, что их можно легко программировать и отлаживать. Именно за наличие подпрограмм, как средства конструирования программ, язык ТУРБО ПАСКАЛЬ называется процедурно-ориентированным.

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

В языке ТУРБО ПАСКАЛЯ имеются две разновидности подпрограмм – процедуры и функции.

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

Все переменные, которые используются в программе и в подпрограммах, можно разбить на две категории: локальные переменные, объявленные внутри подпрограммы и доступные только ей самой, и глобальные – объявленные в основной программе и доступные как самой программе, так и всем её подпрограммам.

 

 

Процедуры

 

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

procedure <имя процедуры>(<список формальных параметров>);

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

Пример программы сложения двух чисел с использованием процедуры приведен на рисунке 7.1.

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

 

Рисунок 7.1 – Программа Example_11

 

При вызове процедуры значения фактических параметров x, y, z будут переданы формальным параметрам процедуры a, b, c, после чего начнется выполнение самой процедуры. После завершения работы процедуры значения тех формальных параметров, перед которыми стоит слово var (в приведенном примере это параметр с), передаются в основную программу соответствующим фактическим параметрам (переменной z ).

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

Список формальных параметров может включать в себя:

²параметры-значения:

²параметры-переменные;

²параметры-константы;

²параметры-функции.

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

Параметры, которые указываются в операторе обращения к процедуре в основной программе, называются фактическими.

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

²количеству;

²порядку следования;

²типу.

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

Для типа формального параметра нельзя указывать тип вида Array[1..20] of Real. Если параметром процедуры должен быть массив, то в основной программе следует описать тип-массив, а затем использовать его в заголовке, например:

type Arr=array[1..20] of real;

. . .

Procedure Max(X:arr; n:integer; var xmax:real);

Параметр-значение – это формальный параметр процедуры, перед которым не стоит слово var. Параметры-значения используются только для передачи исходных данных в подпрограмму.

Если формальный параметр объявлен как параметр-значение, то соответствующим ему фактическим значением может быть произвольное выражение соответствующего типа. При вызове подпрограммы фактические параметры вычисляются и используются как начальные значения формальных параметров.

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

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

Каждому параметру-переменной должен соответствовать фактический параметр только в виде переменной.

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

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

Параметр-константа указывается в заголовке подпрограммы аналогично параметру-значению, но перед именем параметра записывается служебное слово const.

Использование параметров-функций будет рассмотрено в разделе 12.


Задача. Поменять местами минимальные элементы массивов X и Y, содержащих n и m элементов, соответственно.

Алгоритм решения задачи представлен на рисунке 7.2, а программа – на рисунке 7.3.

 

 

Основная программа                                  Подпрограмма MinMas.

Рисунок  7.2 – Блок-схема алгоритма задачи

Program Example_12;

Type mas = array[1..20] of real;

Var n,m,i : integer;

  x,y : mas;

  n_min,m_min:integer; {Номера min элементов в массивах X и Y}

x_min,y_min : real; {Минимальные элементы в массивах X и Y}

Procedure MinMas(k:integer;z:mas;var numer:integer;var min:real);

var i : integer;

begin

  min:=z[1];

  numer:=1;

  for i:=2 to k do

     if z[i]<min then begin min:=z[i]; numer:=i end

end;

begin

writeln; write('Введите n,m '); Read(n,m);

writeln('Введите массив Х');

for i:=1 to n do begin

write('x[',i,']='); read(x[i])

end;

writeln('Введите массив Y');

for i:=1 to m do begin

write('y[',i,']='); read(y[i])

end;

MinMas(n,x,n_min,x_min); {Поиск min элементов и их номеров }

MinMas(m,y,m_min,y_min); {в массивах X и Y, соответственно }

x[n_min]:=y_min;   {Обмен}

y[m_min]:=x_min;   {Обмен}

write('Массив Х ');

for i:=1 to n do write(x[i]:4:1);

writeln;

write('Массив Y ');

for i:=1 to m do write(y[i]:4:1)

end.

Рисунок  7.3 – Программа Example_12





Функции

 

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

Первое отличие состоит в том, что функция возвращает всегда одно единственное значение.

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

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

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

Задача: Вычислить число сочетаний из n элементов по m по формуле:

Алгоритм решения задачи представлен на рисунке 7.4, программа решения – на рисунке 7.5.

 

Рисунок  7.4 – Блок-схема алгоритма задачи

 

Program Example_13;

Var n,m : integer;

c : real;

Function Fact(k:integer):integer;

var f,i : integer;

begin

  f:=1;

  for i:=1 to k do f:=f*i;

  Fact:=f

end;

Begin

writeln; write('Введите n,m '); Read(n,m);

c:=Fact(n)/Fact(m)/Fact(n-m);

writeln('C=',c:3:0)

End.

Рисунок  7.5 – Программа Example_13




СТРОКИ

 

 

Строковый тип данных

 

Для обработки последовательности символов в ТУРБО ПАСКАЛЕ введено понятие строки символов и, соответственно, строкового типа данных.

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

При описании строковых переменных используется тип string, после которого в квадратных скобках можно указать максимальную длину соответствующей строки в диапазоне от 1 до 255, например:

var

fio : string [20];

group : string;

zver : string [255];

Если длина в описании явно не указана, то она по умолчанию принимается равной 255, т.е. последние две строковые переменные эквивалентны.

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

’пример строки’

’’

’TURBO PASCAL’

Длина этих строк 13, 0, 12 символов, соответственно.

Переменные строкового типа могут быть введены только при помощи слова Readln, одним оператором можно ввести значение только одной строки.

Вывести строку можно при помощи операторов Write и Writeln.

В операторе присваивания могут использоваться выражения строкового типа, например:

hours := ’12 часов’;

min :=’13 минут’;

time  :=’ сейчас’+’ ’+hours+’ ’+min;

Знак “+” в последнем выражении для строковых переменных определяет операцию сцепления. При выполнении данной операции к первой строке добавляется вторая. Ограничение общей длины – 255 или заданное число символов остается, поэтому если при присваивании превышается максимальная длина строки, то лишние символы справа отсекаются.

Кроме операции “+” к строковым переменным могут применяться операции отношения ( =, <>, >, >=, <, <=). Строки сравниваются посимвольно слева направо, при сравнении используются коды соответствующих символов из таблицы ASCII (Приложение). Строки считаются равными только при одинаковых символах и одинаковой длине. Результат выполнения сравнения строк имеет булевский тип и принимает значения True и False. Например:

’Z’ < ’z’

’3’ > ’23’

’then’ > ’tHen’

’pause’ <> ’pauSe’

’alpha’ = ’alpha’

Строки обладают очень важным свойством – к ним можно обращаться как к простой переменной и как к массиву, элементами которого являются отдельные символы, нумерующиеся с 1. Например, если Stroka – переменная строкового типа и в ней 40 символов, то узнать, сколько в ней содержится знаков *, можно с помощью следующего фрагмента программы:

S:=0;              {инициализация счетчика}

For i:=1 to 40 do

if Stroka[i]=’*’ then S:=S+1;

 

 

Дата: 2019-03-05, просмотров: 184.