Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Статические структуры данных 1 страница




………..

Формат: BEGIN

<оператор 1>;

<оператор 2>;

<оператор N>;

END;

5.3.1. Управляющие конструкции разветвляющихся структур

Условный оператор IF. Условные операторы обеспечивают выполнение или невыполнение некоторого оператора, группы операторов или блока в зависимости от заданных условий.

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

 

1) IF <условие> THEN <оператор 1> ELSE <оператор 2>;

2) IF <условие> THEN <оператор>;

 

Здесь ключевые слова IF, THEN, ELSE обозначают соответственно - если то иначе.

 

1) 2)

Нет IF Да Нет IF Да

ELSE условие THEN условие THEN

Эти операторы Эти операторы Эти операторы

выполняются выполняются выполняются

если условие если условие при истинном

ложно истинно условии

 

Рис. 5.1 Блок-схемы оператора IF

 

В первом случае, если значение выражения истинно, выполняет­ся <оператор 1>, если ложно <оператор 2>.

 

Пример: A:=2; B:=8;

If A>B then writeln('A больше B')

else writeln('A меньше или равно B');

 

В данном примере значение выражения A>B ложно, следовательно, появится сообщение 'A меньше или равно B'.

Основная идея конструкции if-then-else состоит в том, чтобы выполнять только один из пунктов then (если условие истинно) или else (если оно ложно), но никогда не выполнять оба.

Во втором варианте, если значение выражения истинно, выполняется <оператор>, если ложно - оператор, следующий сразу за оператором IF.

 

Пример: A:=2; B:=8; C:=0;

IF A>B THEN C:=A+B;

C:=C+12;

WRITELN('C=',C);

 

В результате появится сообщение С=12, так как выражение A>B ложно и наращивания C:=A+B не произойдет.

Количество операторов, входящих в оператор IF и выполняемых в зависимости от значения логического выражения, не ограничено. В этом случае мы имеем дело с составным оператором.

Пример

If A<B then begin

writeln('A меньше B');

d:=a*b;

end

else begin

writeln ('A больше или равно b');

d:=a/b

end;

d:=d+1;

Оператор выбора CASE. Оператор выбора является обобщением оператора IF и поз­воляет сделать выбор из произвольного числа имеющихся вариантов. Он состоит из выражения, называемого селектором, и списка параметров, каждому из которых предшествует список констант выбора (список может состоять и из одной константы). Как и в операторе IF, здесь может присутствовать слово ELSE, имеющее тот же смысл.

 

 

Формат: CASE <выражение-селектор> OF

<список 1>: <оператор 1;>

<список 2>: <оператор 2;>

.....

<список n>: <оператор n> ELSE <оператор n+1>

END;

 

Оператор CASE работает следующим образом. Сначала вычисляется значение выражения селектора, затем обеспечивается реализация того оператора, константа выбора которого равна текущему значению селектора. Если ни одна из констант не равна текущему значению селектора, выполняется оператор, стоящий за словом ELSE. Если слово ELSE отсутствует, активизируется оператор, находящийся за словом END, то есть первый оператор за границей CASE. Выражение-селектор может иметь любой скалярный тип, как правило, это integer или char и ни в коем случае не real. Выражение и константы должны принадлежать одному типу. Список констант выбора состоит из произвольного количества значений или диапазонов, отделенных друг от друга запятыми. Границы диапазона записываются двумя константами через разграничитель.

Селектор интервального типа:

Пример

CASE i OF

1..9: y:=x;

10..99: y:=x/10;

100..999:y:=x/100

ELSE writeln ('Число вне пределов контроля')

END;

 

Селектор целочисленного типа:

Пример

CASE i OF

0: writeln('нуль');

1,3,5: writeln('нечет');

2,4,6: writeln('чет')

END;

CASE i OF

1: x:=sin(x);

2: x:=cos(x);

3: x:=exp(x);

4: x:=ln(x);

END;

 

5.3.2. Составление программ с ветвлением

Пример: Дано 3 вещественных числа. Найти наибольшее.

Program Ex3;

Var a,b,c,max:real;

Begin

Write('Задайте три числа '); Readln(a,b,c);

If a>b then max:=a else max:=b;

If c>max then max:=c;

Writeln ('Максимальное ', max)

End.

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

Например,

If(initial>='E')and(initial<'L') THEN write('Смотри в каталоге между 'Е' и 'L');

где initial - переменная типа CHAR, в которой записана начальная буква фамилии. Результат TRUE будет означать, что в телефонной книге фамилия находится между 'Е' и 'L'.

Значение логического выражения можно присвоить логической переменной и лишь затем проанализировать:

keen:= (x=y) OR (z>=3);

If not keen then...

Один оператор IF может входить в состав другого оператора IF. В таком случае говорят о вложенности операторов.

 

Пример: Вычислить значение функции

x, если x<-5

Y = x*x, если –5>=x<=0

2*x, если 0<x<5

 

Program Ex4;

Var x,y:real;

Begin

Write ('Задайте x'); Readln(x);

If x<-5 then y:=x else

if x<=0 then y:=sqr(x) else

if x<5 then y:=2*x else y:=5;

Writeln ('x= ',x,'y= ',y)

End.

 

Будьте внимательны при использовании вложенных операторов IF. Предпочтительнее пользоваться схемой ELSE-IF, нежели THEN-IF, заставляющей хранить в уме соответствующее ELSE. Общее правило таково: каждый ELSE относится к ближайшему предшествующему THEN, еще не имеющему парного ELSE.

Пример: Тест. Деловой ли Вы человек?

program Ex5;

Uses crt;

var d:integer; var g:char;

begin

Clrscr; d:=20;

writeln (' ТЕСТ: Деловой ли вы человек?');

writeln (' 1.Вы собиpаетесь закончить давно начатое дело. ');

writeln ('И вдpуг вам звонит милый человек пpотивоположного пола, ');

writeln ('котоpый вам симпатичен, и пpосит о встpече; ');

writeln;

writeln (' а)Вы говоpите:"Попозже солнышко" и, сжав зубы, быстpенько пpиканчиваете свою pаботу. ');

writeln (' b)Пpоизнося:"Иду, любовь моя!",вы, послав к чеpту все свои дела, мчитесь на свидание. ');

writeln (' c)Вы посылаете к чеpту свою симпатию и с легким сеpдцем занимаетесь делами. ');

writeln (' Hажмите клавишу a,b или с');

readln(g);Clrscr;

case g of

'a':d:=d+10;

'b':d:=d+30;

'c':d:=d+50;

end;

case d of

60..80: begin

writeln ('У Вас просто талант! ');

writeln('Человека подобных деловых качеств надо поискать. Всю жизнь');

writeln('вы отдаете работе и видите в ней смысл жизни. Но не пора ли');

writeln('остановиться? Может наступить страшная минута, когда Вы');

writeln('совсем одиноки! Это неудивительно, ведь о своих близких Вы');

writeln('думаете, а друзей цените только как деловых партнеров.'); end;

35..59: begin

writeln ('Вам удается быть самим собой и при этом не оставаться за');

writeln('кормой жизни. Вашим близким с Вами хорошо. Вы заботливы и');

writeln('внимательны, но также и не пускаете на самотек свои дела,');

writeln('предпочитая за всем следить лично. Очень хорошо, что Ваша');

writeln('работа не поглотила Вас целиком и не стала самоцелью.');

writeln('Продолжайте ей заниматься, но не забывайте и о тех, ');

writeln('кто Вас любит, и все будет в порядке');

end;

4..34: begin

writeln ('Вы слишком легкомысленны. Нельзя же доверяться случаю и');

writeln('так безудержно предаваться развлечениям. Нет слов, Вы');

writeln('приятный человек, но о работе забывать нельзя.');

writeln('Надо стать немного серьезнее.');

end;

end; end.

 

5.3.3. Управляющие конструкции циклических структур

В жизни мы часто сталкиваемся с необходимостью выполнять много раз одни и те же действия. Пусть, например, нам требуется получить значение функции y=sin (ax)/x в точке x=53 при a=const. Нет ничего проще. Мы уже умеем программировать на Паскале вычисления по различным математическим формулам. Теперь несколько усложним задачу: вычислить и напечатать таблицу значений функции y=sin(ax)/x для всех целых значений x от 1 до 100. Нам придется 100 раз задать различные исходные данные и 100 раз произвести вычисления по одной и той же формуле. Предложенный способ решения задачи крайне неэффективен. Люди ненавидят такую работу. Компьютер же ненависти к повторяющимся операциям не испытывает. В некотором смысле он ничего так не любит, как делать одно и то же снова и снова.

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

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

 

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

Оператор FOR может быть представлен в двух форматах:

FOR <параметр цикла>:=<S1> to <S2> do <оператор>;

FOR <параметр цикла>:=<S1> downto <S2> do <оператор>;

S1 - начальное значение; S2 - конечное значение;

<оператор> - тело цикла.

Параметр цикла (переменная цикла), его начальное и конечное значение могут быть любого упорядоченного типа (обычно - типа integer и ни в коем случае не real), обязательно все одного и того же. При каждом повторе значение параметра цикла увеличивается на 1 (при FOR... TO) или уменьшается на 1 (при FOR... DOWNTO).

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

For i:=1 to 20 do write('*');

For i:=14 downto 10 do write(i:3); {14 13 12 11 10}

Выражения S1 и S2 вычисляются перед выполнением операторов цикла; впоследствии они не перевычисляются. Если эти выражения отвечают невозможной последовательности, то цикл вообще не выполняется.

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

Начало

 
 

 

 


Проверка

условия

Да окончания цикла Нет

x<=100

 

Конец

Рис. 5.2 Блок-схема циклического процесса

 

Всякое изменение переменной цикла является ошибкой. Среди таких некорректных изменений - присваивание переменной цикла и чтение в нее значений:

Пример

for i:=1 to 3 do

begin

i:=i-1;

read(i);

end;

Будет неверно делать какие-либо предположения о значении переменной цикла For после выхода из цикла.

Пример

For i:=1 to 3 do write (i:4); { 1 2 3 }

writeln(i); {тут может быть, что угодно}

 

Вы уже отметили, что в операторе For после do может находиться составной оператор, ограниченный операторными скобками begin.. end.

Для выхода из цикла до момента достижения параметром цикла конечного значения можно воспользоваться оператором goto

Пример

For i:=1 to 45 do

begin

f:=f+i; if f>100 then goto m1

end;

m1:...

Пример

Составим теперь программу для вычисления и печати таблицы значений функции:

 

program Ex6;

{Вычисление значений функции y=sin(ax)/x для всех х от 1 до 100}

var x:integer; a,y:real;

begin

read(a);

writeln (' ТАБЛИЦА ЗHАЧЕHИЙ ФУHКЦИИ F(x)=sin(ax)/x');

writeln (' a=',a:8:3);

writeln (' x y');

for x:=1 to 100 do

begin

y:=sin(a*x)/x;

writeln (x:3, y:15:5);

end

end.

 

Параметром цикла может служить переменная типа CHAR

Пример

For ch:='a' to 'e' do write (ch:2); { a b c d e}

For ch:='e' downto 'a' do write (ch:2); { e d c b a }

 

или переменная перечисляемого типа

var sort:(s1,s2,s3);

..............

for sort:=s1 to s3 do...

или for sort:=s3 downto s1 do...

В операторе For Паскаль не допускает изменения параметра цикла на величину, отличную от 1.

 

Оператор цикла с постусловием REPEAT. В практических задачах, как правило, число повторений заранее неизвестно, а определяется по ходу реализации этого циклического процесса. (Если условием окончания вычислений достижение заданной точности, то такие циклы называют итерационными.)

Такие циклы можно построить при помощи оператора повтора с предусловием Repeat.

Формат: repeat {повторить}

<оператор 1>;

........

<оператор N>

until <условие>; { пока}

 

Условие - выражение булевского типа. При наличии условия допустимы булевские операции и операции отношения. Операторы, заключенные между словами repeat и until, являются телом цикла. Вначале выполняется тело цикла, затем проверяется условие выхода из цикла. Если результат булевского выражения FALSE, тело цикла активизируется еще раз, если результат TRUE - происходит выход из цикла.

Оператор REPEAT имеет три характерные особенности:

- выполняется по крайней мере один раз, т.к. условие повторяется после выполнения тела цикла;

- тело цикла выполняется, пока условие равно FALSE;

- в теле может находиться произвольное число операторов без операторных скобок begin...end, т.к. два зарезервированных слова Repeat и Until уже играют роль скобок.

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

D:=1; S:=0; ¦ D:=1; S:=0; { Бесконечный цикл,так}

Repeat {Изменение } ¦ Repeat { как нет изменения D}

S:=S+D; {переменной,} ¦ S:=S+D;

D:=D+1; {влияющей } ¦ Until d<100;

Until d<100;{на условие } ¦

 

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

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

 

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

 

Формат: WHILE <условие> DO <тело цикла>;

 

Условие - булевское выражение, а тело цикла - простой или составной оператор. Перед каждым выполнением тела цикла вычисляется значение выражения условия. Если результат равен TRUE, тело цикла выполняется и снова вычисляется выражение условия. Если результат равен FALSE, происходит выход из цикла и переход к первому после WHILE оператору. Если перед первым выполнением цикла значение выражения было FALSE, тело цикла вообще не выполняется и происходит переход на следующий оператор.

Пример: i:=30;

while i<0 do i:=i+1;

write (i);

В данном случае наращивания i не произойдет, т.к. условие с самого начала имеет значение false.

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

Пример

While i<100 do

begin

...

i:=i+1; { Изменение переменной управления циклом}

...

read (k,t);

if t>1000 then i:=100+1 { Установка признака выхода}

end;

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

while true do write ('Бесконечный цикл');

 

Пример: Рассчитать траекторию полета снаряда, заданного параметрическими уравнениями:

D = Vo T cos(a); H = Ho + Vo T sin (a) - g T 2 /2

при a =45, Vo= 650 м/с, Ho = 10м, Dt=2c

 

Таблица 5.1 Идентификаторы программы

Название и математическое описание Идентификатор Значение
Входные
Vo - начальная скорость V0 650 м/с
Ho - высота установки орудия H0 10 м
a - угол ствола A  
T - текущее время T  
Dt - приращение (шаг) TD  
Выходные
H - высота H  
D - дальность D  

 

program Ex7;

{Рассчитать траекторию полета снаряда, заданного параметрическими уравнениями D=V0*T*cos(a); H=H0+V0*T*sin(a)-g*sqr(T)/2}

const pi=3.1415; g=9.81;

var v0,h0,a,t,td,h,d:real;

begin

writeln(' Задайте исходные данные');

write ('Hачальная скоpость='); readln(v0);

write ('Высота установки оpудия='); readln(h0);

write ('Угол ствола='); readln(a); a:=a*pi/180;

write ('Шаг пpиpащения по вpемени='); readln(td);

writeln (' ТАБЛИЦА ТРАЕКТОРИИ СHАРЯДА');

writeln (' ВРЕМЯ ДАЛЬHОСТЬ ВЫСОТА');

writeln (' c м м');

t:=0; h:=h0; d:=0;

while h>=0 do

begin

writeln(t:7:2, d:10:2,h:10:2);

t:=t+td; d:=v0*t*cos(a);

h:=h0+v0*t*sin(a)-g*sqr(t)/2;

end; writeln;

end.

 

Из рассмотренных операторов цикла, оператор цикла с предусловием (WHILE) является наиболее универсальным, им можно заменить операторы цикла с параметром и постусловием.

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

Оператор присоединения подробно будет рассматриваться в главе 7.

Вопросы для самоконтроля:

1. Какой оператор называется составным?

2. Какие операторы в Паскале реализуют ветвящийся процесс?

3. Какие виды условного оператора вы знаете?

4..В каких случаях используется оператор выбора?

5. Какой тип может иметь выражение - селектор?

6. Понятие цикла в языке PASCAL.

7. Формат оператора цикла с параметром FOR.

8. Форматы операторов цикла с предусловием WHILE.

9. Форматы операторов цикла с постусловием REPEAT.

10. Особенности применения оператора цикла REPEAT при составлении программ циклической структуры.

 


ГЛАВА 6

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

Мы переходим к рассмотрению сложных структурированных типов данных массивов, множеств, записей, файлов, строк.

 

6.1. Регулярный тип (Массив)

В математике, экономике, информатике, а также в других областях знаний часть приходится сталкиваться ситуацией, когда необходимо обработать большое количество переменных одного и того же типа. Например, подсчитать среднее количество осадков, выпавших в Крыму за последние 20 лет, если известно ежегодное количество осадков. В принципе мы можем обойтись понятием обычной переменной и объявить количество осадков за каждый год как VAR G1,G2,G3…..G20: REAL; и посчитать среднее значение, но остается ощущение неудобства, особенно, если задача сопрежена с огромным количеством переменных. Для таких случаев Паскаль предоставляет введение большого числа переменных одного и того типа, используя понятие «массив» (ARRAY англ.).

 

6.1.1. Описание типа Массив

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

Так совокупность действительных чисел 1.6, 14.9, -5.0, 8.5, 0.46, 2.37, 0.53 можно считать массивом и обозначить именем, например А. Число элементов фиксируется и не может изменяться в процессе выполнения программы. В нашем примере количество элементов 7. Доступ к каждому элементу массива осуществляется путем индексирования элементов массива. Индекс – это величина, характеризующая положение объекта в массиве. Каждый элемент массива обозначается именем и индексом.

В математике, как правило, индекс либо заключается в скобки, либо указывается несколько ниже имени, например: А(1), А(2),…А(5) или в общем виде A{I}, где I=1,2…5.

В языке Паскаль индекс заключается в квадратные скобки. В нашем примере элементами массива являются: А[1] = 1.6, A[2] = 14.9, A[3] =-5.0, A[4]=8.5, A[5]=0.46.

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

 

В разделе типов

TYPE <имя типа>=array[тип индекса] of <тип компонента>;

 

TYPE M: array[1..5] of real;

VAR A: M;

 

В разделе переменных

VAR A: array[тип индекса] of <тип компонента>;

 

VAR A: array[1..5] of real;

Здесь А – имя массива, элементы которого имеют базовый тип REAL, Тип индекса ограниченный от 1 до 5.

Итак, VAR <имя массива>: array[t1] of [t2];

t1 – тип индекса, в качестве которого может быть любой простой тип, кроме REAL, INTEGER;

t2 – любой тип допустимый в Паскале.

Примеры:

1. TYPE Color = (red, blue, black);

mas1 = array[-5..15] of real;

mas2 = array[1..10,1..10] of integer;

mas3 = array[‘A’..’C’] of array[1..5] of boolean;

mas4 = array[boolean] of char;

VAR A:mas3; B:mas2; C:mas4; D:mas1; E:array[color] of real;

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

Следует отметить, что поскольку тип индекса не может быть стандартным целым или действительным типом, то нельзя делать следующее описание массива (часто встречающаяся ошибка)

VAR A: array[5] of real; или

VAR A: array[integer] of real;

Если несколько массивов имеют одинаковый тип индексов и одинаковый базовый тип, то допускается объединить массивы в список, например:

VAR A,B,C: array[1..50] of real;

Здесь объявлено списком три массива А,В,С действительных чисел каждый из которых содержит по 50 элементов (от 1 до 50):

A[1], A[2],…,A[50], B[1], B[2],…,B[50], C[1], C[2],…,C[50].

Нельзя путать понятие «индекс» и «тип индекса». Тип индекса используется только в разделе описаний массива, а индекс указывается в разделе операторов для обозначения конкретных элементов массива. При этом индекс должен быть того же типа, что и описание типа индекса. Пример. B[5]:=B[3]+1; C[1]=3.4; Индекс может быть выражением, частным случаем которого является константа или переменная. Элемент массива иначе называется переменной с индексом. N[I+J]; MAS[2*I]; Некоторое неудобство состоит в том, что приходится сразу же жестко фиксировать число элементов массива.

Нельзя рассматривать массивы, число элементов которых равно N, где N одно из исходных данных программы.

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

Например.

TYPE Vector = array[1..4] of integer;

Massiv = array[1..4] of vector;

VAR Matr: Massiv;

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

VAR Matr: array[1..4,1..4] of integer;

Если в такой форме записи массива задан один индекс, массив назначается одномерным, если два индекса – двумерным, если N индексов, N – мерным.

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

Например, если имеется массив A:array[1..5,1..5] of integer;, то в памяти элементы будут размещены по возрастанию адресов. A[1,1]; A[1,2]; … A[1..5]; … A[2,1]; A[2,2]; … A[5,5]; т.о. матрицы размещаются по строкам.

Задав конкретные значения индексов можно выбрать определенную компоненту массива.Например. N:=A[1,2] занимает в N значение, стоящее в 1-й строке, 2-м столбце. Вместо записи A[1,2]; можно использовать эквивалентную запись A[1][2].

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

CONST N = 24;

TYPE Dauweek=(sun,mon,tue,wed,thn,fri,sat);

Workdau = mon..fr;

MAN = array[1..N,workdau] of integer;

VAR A:array[boolean] of array[1..N] of char;

B: MAN;

C: array[1..315] of man;

 

6.1.2. Действия над элементами массивов

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

Например, если массивы А и В описаны, как VAR A,B: array[1..20] of real; то применение к ним допустимых операций даст следующий результат.

А = В TRUE, если значение каждого элемента массива А равно соответствующему значению элемента массива В.

A <> B TRUE, если хотя бы одно значение элемента массива А не равно значению соответствующего элемента массива В.

А: = В; Все значения элементов массива В присваиваются соответствующим элементам массива А. Значения элементов массива В остаются неизменны.

Для этих операций тип, имеющий ту же спецификацию, но другое имя, не подходит.

Пример:

TYPE AT=array[1..3] of real;

VAR A,B: AT; C:array[1..3] of real;

…………………………………………

A:= B; - возможно,

A:= C; - невозможно.

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

Например.

VAR V: real;

Y: array[1..1] of real;




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 458; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.223 сек.