КАТЕГОРИИ: Архитектура-(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) |
Лекция 10: Структурный тип - Массив
End end {colors}. Эта программа иллюстрирует также так называемое приведение типа. Для любого типа можно использовать функцию с именем этого типа для преобразования переменной (или выражения) к заданному типу. Например, для описанного выше типа color допустим, оператор присваивания сol:= color(3); в результате такого присваивания переменная col типа color получит значение blue.
Приводимая ниже программа week_day иллюстрирует использование диапазонов типа и оператора case-of для определения дня недели по вводимой дате: program week_day; {Вычисление дня недели по введённой дате} uses CRT; var d:1..31; m:1..12; year:1600..2000;{день, месяц, год} wd:integer; {день недели} z:1..100; {год в столетии} t: string [1]; begin TextBackground(cyan);TextColor(white);ClrScr; window(10,10,50,20); TextBackground(blue);ClrScr; repeat writeln(' введите дату:'); write(' Год:'); readln(year); write(' месяц:'); readln(m); write(' день:'); readln(d); writeln(' день недели: '); {вычисление по формуле Зеллера} if m<3 then begin m:=m+10;year:=year-1 end else m:=m-2; z:=year div 100; year:=year mod 100; wd:=abs(trunc(2.6*m-0.2)+d+year div 4+year+z div 4-2*z); wd:=wd mod 7; {конец вычисления} case wd of 0: writeln(' воскресенье'); 1: writeln(' понедельник'); 2: writeln(' вторник'); 3: writeln(' среда'); 4: writeln(' четверг'); 5: writeln(' пятница'); 6: writeln(' суббота'); end; readln(t) until (t=' ') end {week_day}. 1. Понятие массива в Паскале. 2. Описание массивов и доступ к элементам массива.. 3. Обработка массивов. 4. Пример работы с массивом. 1. Понятие массива в Паскале. Массив является одним из основных структурных типов Паскаля, широко применяемым в практике программирования. Идея массива состоит в том, чтобы объединить в одно целое фиксированное количество элементов одного и того же типа. Например, массив результатов измерений, массив данных о ежедневном расписании и др. Без использования массива в этих и многих других случаях пришлось бы описывать большое число переменных для представления данных, что делает нереальной обработку таких данных. Массив дает удобный способ представления и обработки массовых однородных данных. Суть концепции массива в Паскале заключается в том, чтобы объединить элементы в такую структуру, в которой эти элементы были бы линейно упорядочены (пронумерованы) так, чтобы к ним был прямой доступ через их номер. Номер элемента в массиве принято называть индексом элемента. В Паскале допустимы только статические массивы. Это означает, что число элементов массива должно оставаться постоянным при обработке массива и быть указано при описании массива. Размер массива в Паскале не может быть представлен переменной, а только константой. Другими словами, размер массива должен быть известен в период компиляции программы, так как под него статически распределяется память. Это, конечно, является существенным ограничением, однако позволяет сохранить в более чётком виде концепцию типов в Паскале. Для работы с переменным числом компонентов в Турбо Паскале следует использовать динамические структуры данных - указатели или файлы, с которыми мы познакомимся во второй части курса. 2. Описание массивов и доступ к элементам массива. Прежде чем использовать массив, его следует описать в разделе описаний программы. Общая форма описания массива имеет вид: type < имя типа-массива > = array [ < тип индекса > ] of < тип элементов >; где: < имя типа-массива > - имя, выбираемое программистом. < тип индекса > - любой порядковый тип (кроме longint) или тип-диапазон. < тип элементов > - любой тип Турбо Паскаля. В качестве типа индекса часто используют тип-диапазон, указывающий границы индекса. Например: type measure = array [ 1..16] of real; {тип -массив измерений} var m1,m2: measure; {переменные-массивы измерений} Кроме переменных допускается также описание типизированных констант-массивов, в котором элементы-константы перечисляются через запятую. Например: сonst vect: array [1..8] of 0..9 = (0,0,0,0,1,2,3,4); Если тип элементов - простой тип, то массив - одномерный (вектор). Однако тип элементов может быть в свою очередь тип-массив. В этом случае мы имеет дело с массивом более высокой размерности. Если тип элементов - одномерный массив, то описываемый массив - двумерный (матрица). Аналогичным образом можно получить трехмерные, четырехмерные массивы и т.д. Двумерный массив (матрица) может быть описан в виде: type < имя типа-массива > = array [ < тип индекса1 > ] of array [ < тип индекса2 > ] of < тип >; Однако в Паскале допускается более компактная форма таких описаний, в которой вместо одного типа индекса используется список из нескольких типов индексов. Для матрицы такое описание будет иметь вид: type < имя типа-массива > = array [ < тип индекса1,тип индекса2 > ] of < тип компонент >; Например: type matr= array [ 1..16,1..8] of real; {тип - матрица 16х8} var mt1,mt2: matr; {переменные типа matr} Доступ к элементам массива осуществляется посредством так называемых индексированных имен, имеющих вид: < имя переменной-массива > [ < индексное выражение > ]; где: < индексное выражение > - выражение типа индекса (в частности, индексным выражением может быть переменная). В случае, когда массив многомерный (имеет несколько индексов), доступ к элементу массива осуществляется по списку индексных выражений в виде: < имя переменной-массива > [ < индексное выражение1 >,< индексное выражение2 >,...]; Например: m1[ j ] {значение j- элемента массива m1} mt2[j+3, k] {значение элемента (j+3)-строки, k-столбца матрицы mt2} Индексы, таким образом, предоставляют новый способ именования элементов, существенно отличный от имён простых переменных. По сути, индексированное имя (имя компонента массива) - вычислимое имя, т.е. такое, которое может изменяться при выполнении программы за счёт изменения значения индексного выражения. Это придает доступу по индексам весьма большую гибкость и удобство при обработке массивов. 3. Обработка массивов. Для массивов допустим оператор присваивания в форме: < переменная1-массив >:= < переменная2 -массив >; где: левая и правая части содержат переменные массивов только одного типа. Такие операторы присваивания могут использоваться для копирования одного массива в другой. Однако над массивами не определены отношения <,>,<=,>=,=.<>. Кроме того, в Турбо Паскале нельзя использовать выражения над массивами. За исключением приведенного выше оператора присваивания, обработка массивов осуществляется путем обработки его элементов. Для этого следует использовать доступ к элементам через индексы. Например, для индексных переменных допустим оператор присваивания вида: < переменная-массив > [ < индексная переменная > ]:= < выражение >; где: < выражение > должно быть согласовано по типу с типом элементов массива. Важным средством обработки массивов являются циклы. Хотя для обработки массивов можно использовать описанные ранее итерационные циклы, обычно более удобными являются циклы с параметром. В Турбо Паскале имеются две разновидности циклов с параметром (циклов for): for < параметр >:= < нач.зн. > to < кон.зн. > do < оператор тела цикла >; for < параметр >:= < кон.зн. > downto < нач.зн. > do < оператор тела цикла >; Параметром цикла for может быть переменная любого порядкового типа. < нач.зн. > и < кон.зн. > - выражения того же типа, что и параметр, определяющие границы изменения параметра в данном цикле. < оператор тела цикла > - любой оператор Турбо Паскаля. Цикл с параметром (первая его разновидность) выполняется следующим образом: вначале вычисляются < нач.зн. > и < кон.зн. > и осуществляется присваивание параметру цикла < нач.зн. >. Проверяется, не превышает ли параметр значения < кон.зн. > (т.е. выполняется сравнение < параметр > < < кон.зн. >), и если не превышает, то выполняется тело цикла, после чего параметру присваивается следующее по порядку значение (т.е. succ(< нач.зн. >)) и цикл повторяется. Если параметр превысил < кон.зн. >, цикл завершается (осуществляется переход к следующему за циклом оператору программы). Таким образом, цикл for повторяет выполнение оператора тела цикла несколько раз с разными значениями параметра от начального значения до конечного значения. Вторая разновидность цикла с параметром отличается при выполнении лишь тем, что параметр изменяется в обратном направлении - от конечного значения к начальному. Выход из этого цикла осуществляется, если значение параметра меньше начального значения. При использовании цикла for желательно, чтобы параметр цикла, выражения < нач.зн. > и < кон.зн. > не изменяли свои значения при выполнении тела цикла (а также < нач.зн. > и < кон.зн. > не имели зависимости от параметра цикла). Это гарантирует завершение цикла за конечное число шагов и ясную для понимания структуру цикла. Хотя часто цикл for используют с целочисленным параметром, полезно помнить, что он может быть использован с параметром любого порядкового типа, что придает ему значительно большую гибкость, чем имеют циклы с параметром в других языках (например, в Фортране). Проиллюстрируем использование цикла for на примерах.
4. Примеры работы с массивом. Приведём вначале простую программу на Турбо Паскале, иллюстрирующую обе разновидности цикла for, а также описание массива и создание массива. program Lat_alphabet; {Создание массива латинских букв и вывод лат. алфавита} type m_let = array [1..26] of 'a'..'z'; var letters:m_let; let:char;j:byte; begin writeln('Латинский алфавит:'); j:=1; for let:='a' to 'z' do begin letters[j]:=let; inc(j) end; for j:=1 to 26 do write(letters[j], upcase(letters[j]),' ');writeln; for j:=26 downto 1 do write(letters[j], upcase(letters[j]),' ');writeln; end. Следующая программа на Турбо Паскале иллюстрирует работу с одномерным и двумерным массивом, а также с функцией random (генератором псевдослучайных чисел): program test_random;{Тест распределения псевдослучайных чисел} uses CRT; type dec=0..9; {тип - десятичная цифра} var ms: array [dec] of integer; {измерительный массив} i,j:integer; matr: array [1..20,1..30] of dec;{генерируемая матрица цифр} begin TextBackground(cyan);TextColor(white);ClrScr; writeln(' Матрица пс цифр:');randomize; for j:=0 to 9 do {инициация измерительного массива нулями} ms[j]:=0; {заполнение матрицы пс цифрами} for i:=1 to 20 do for j:=1 to 30 do begin matr[i,j]:=random(10); write(matr[i,j],' '); if j=30 then writeln; {коррекция элемента массива ms} ms[matr[i,j]]:=ms[matr[i,j]]+1; end; writeln(' Количество пс цифр по значениям:'); writeln(' 0 1 2 3 4 5 6 7 8 9 '); { вывод массива ms} for i:=0 to 9 do write(ms[i]:4);writeln; end { test_random}.
Дата добавления: 2014-01-06; Просмотров: 370; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |