9693

Понятие структуры. Индекс массива

Лекция

Информатика, кибернетика и программирование

Понятие структуры До сих пор мы работали с простыми типами данных - логический (boolean), целый (integer, word, byte, longint), вещественный (real), символьный (char). Для оптимизации обработки больших объемов информации требуются да...

Русский

2013-03-15

149.5 KB

0 чел.

Понятие структуры

До сих пор мы работали с простыми типами данных – логический ( boolean ), целый ( integer , word , byte , longint ), вещественный ( real ), символьный ( char ).

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

Самой распространенной статической структурой, реализованной практически во всех языках программирования, является массив.

Массив – совокупность однотипных данных объединенных общим именем различаемых по индексу.

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

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

Индекс массива

Номер элемента массива называется индексом. Индекс – это значение перечисляемого типа, определенного, как тип индекса данного массива. Например: целочисленный тип (integer , word или byte), логический или  символьный.

Описание массива 

В языке Паскаль тип массива задается с использованием специального слова array (англ. – массив), и его объявление в программе выглядит следующим образом:

Type < имя _ типа >= array [ I ] of T; где I – тип индекса массива, T – тип его элементов.

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

Var <имя массива>: array [ I ] of T; где I – тип индекса массива, T – тип его элементов.

Обычно тип индекса характеризуется некоторым диапазоном значений любого порядкового типа: I1 .. In . Например, индексы могут изменяться в диапазоне 1..20 или ‘ a ’..’ n ’.

При этом длину массива Паскаля характеризует выражение: ord(In)- ord(I1)+1.

Пример объявления целочисленных массивов из 10 элементов:

 Var 

 A: array [1..10] of integer;

 B: array [0..9] of integer;

 C: array [90..99] of integer;

 D: array [‘a’..’j’] of integer;

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

Прямая адресация.

При обращении к элементу массива индеек указывается в явном виде как константа (конкретное значение).

Пример:

Var 

A: array [1..6] of integer;

Begin

A[1]:=34;

A[2]:=17;

A[3]:=60;

A[4]:=40;

A[5]:=30;

A[6]:=4;

End.

Массив А

значения

34

17

60

40

30

4

индекс

1

2

3

4

5

6

Косвенная адресация

В качестве индекса массива можно использовать переменную или выражение, соответствующее индексному типу.

Пример:

Var 

A: array [1..6] of integer;

i:integer;

Begin

Значение переменной i

Имя элемента

массива

Значение

i:=1;

1

A[i]:=34;

A[1]

34

i:=i+1;

2

A[i]:=17;

A[2]

17

i:=i+1;

3

A[i]:=60;

A[3]

60

i:=i+1;

4

A[i]:=40;

A[4]

40

A[i+1]:=30;

A[5]

30

A[i+2]:=4;

A[6]

4

End.

Самая распространенная ошибка: результат вычислений оказаться за пределами интервала допустимых значений индекса, то есть будет произведена попытка обратиться к элементу, которого не существует. Эта ошибка называется «выход за пределы массива».

Пример:

Var 

A: array [1..6] of integer;

i: integer;

Begin

i:=4;

A[i+5]:=34;

End.

Данная программа полностью соответствует синтаксису языка, и транслятор не выдаст ошибку, но на стадии выполнения произойдет ошибка выхода за пределы массива Паскаля. При i =4 выражение i +5=9, компьютер сделает попытку обратиться к элементу массива A [9], но такого элемента нет, поскольку описан массив размерностью 6.

Двойная косвенная адресация

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

Пример:

Var 

A,B: array [1..6] of integer;

Имя элемента

массива

Значение

i:integer;

Begin

B[1]:=6;

B[2]:=4

B[3]:=1

B[4]:=5

B[5]:=3

B[6]:=2

значения

30

60

50

20

40

10

индекс

1

2

3

4

5

6

A[B[1]]:=10;

A[6]

10

A[B[2]]:=20;

A[4]

20

A[B[3]]:=30;

A[1]

30

A[B[4]]:=40;

A[5]

40

A[B[5]]:=50;

A[3]

50

A[B[6]]:=60;

A[2]

60

End.

Действия с массивами в языке программирования Pascal.

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

Если А и В массивы одного типа, то над ними возможна только одна операция – присваивание. Если B:=A, то каждому элементу массива B будет присвоено соответствующее значение из массива A.

Пример:

Var 

A, B: array [1..6] of integer;

Begin

A[1]:=34;

A[2]:=17;

A[3]:=60;

A[4]:=40;

A[5]:=30;

A[6]:=4;

B:=A

End.

Массив А

Значения

34

17

60

40

30

4

индекс

1

2

3

4

5

6

Массив B

Значения

34

17

60

40

30

4

индекс

1

2

3

4

5

6

Все остальные действия над массивами производятся поэлементно! 

Заполнение массива

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

Ввод массива от пользователя (с клавиатуры)

Var 

  A : array [1..10] of integer ;

  I : byte ; {параметр цикла I будет и индексом массива} 

Begin 

  For i:=1 to 10 do 

     Readln (a[i]); { ввод i- го элемента производится с клавиатуры } 

Заполнения массива случайными целыми числами из диапазона от L до R

Var 

  A: array [1..10] of integer;

  I,L,R : integer ;

Begin 

  For i :=1 to 10 do 

     A [ i ]:= random (R-L+1)+L; { i -му элементу массива присваивается «случайное» целое число в диапазоне от L до R} 

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

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

Var 

  A: array [1..10] of integer;

  I: byte;

Begin 

  For i :=1 to 10 do 

     Write ( a [ i ],’ ‘); {вывод массива осуществляется в строку, после каждого элемента печатается пробел} 

Задачи:

  1.  Заполнить массив из n (n<=15, вводиться от пользователя) элементов случайным образом числами, лежащими в диапазоне от 1 до 100. Вывести значения массива через запятую в строчку.
  2.  Заполнить массив из n (n<=15, вводиться от пользователя) элементов случайным образом числами, лежащими в диапазоне от -20 до 20. Вывести значения массива через «;» (точку с запятой) в столбик.
  3.  Заполнить массив из n (n<=15, вводиться от пользователя) элементов случайным образом трехзначными числами. Вывести значения массива через пробел в строчку.
  4.  Используя датчик случайных чисел, заполнить массив из n (n<=15, вводиться от пользователя) элементов четными двузначными положительными числами. Вывести значения массива через запятую в строчку.
  5.  Используя датчик случайных чисел, заполнить массив из n (n<=15, вводиться от пользователя) элементов положительными числами, кратными 5и не превышающими 1000. Вывести значения массива через запятую в строчку.
  6.  Заполнить массив из 10 элементов следующим образом:

 

1

2

3

4

5

6

7

8

9

10

  1.  Заполнить массив из 10 элементов следующим образом:

10

9

8

7

6

5

4

3

2

1

  1.  Заполнить массив подряд идущими целыми числами от L до R, где L и R вводятся от пользователя.
  2.  Заполнить массив из 7 элементов следующим образом:

 

1!

2!

3!

4!

5!

6!

7!

  1.  Заполнить массив из 10 элементов следующим образом:

 

20

21

22

23

210

  1.  Заполнить массив первыми n (n<=15, вводиться от пользователя) членами арифметической прогрессии (an = a1 + d (n - 1), первый член прогрессии  a1 и ее разность d вводятся от пользователя).
  2.  Заполнить массив первыми n (n<=15, вводиться от пользователя) членами геометрической прогрессии (an = a1*d (n - 1), первый член прогрессии a1 и ее знаменатель d вводятся от пользователя).
  3.  Заполнить массив первыми n (n<=15, вводиться от пользователя) членами последовательности Фибоначчи.
  4.  *Дано натуральное число n (n<=1000000). Заполнить массив цифрами данного числа.
  5.  *Заполнить массив первыми n (n<=15, вводиться от пользователя) натуральными числами, делящимися нацело на 3 и на 5.
  6.  *Заполнить массив первыми n (n<=15, вводиться от пользователя) простыми числами.


Обработка элементов массива

Линейный поиск

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

Пример:

В массиве n (n<=15, вводиться от пользователя) элементов, заданных случайным образом числами, лежащими в диапазоне от 1 до 100. Вывести индексы четных элементов массива.

Var 

A: array [1..15] of integer;

i:integer;

Begin

Randomize;

Writeln(‘Vvod n’);

Readln(n);

n

5

For i:=1 to n do

i

1

2

3

4

5

A[i]:=random(100)+1;

a

10

21

5

2

37

For i:=1 to n do

i

1

2

3

4

5

If a[i] mod 2=0 then

условие

+

-

-

+

-

Writeln(i);

1

4

End.

Задачи

В массиве n элементов, заданных случайным образом числами, лежащими в диапазоне от L до R (n (n<=20), L, R вводятся от пользователя).

1. Найти количество элементов:

  1.  являющихся нечетными числами;
  2.  равных 3 или 5;
  3.  являющихся двузначными числами;
  4.  модуль которых равен квадрату индекса;

2. Найти сумму элементов:

  1.  являющихся положительными числами;
  2.  являющихся одноразрядными числами;
  3.  кратных 3 и не кратных 5;

3. Заменить элементы:

  1.  значение которых равно нулю на 100;
  2.  являющиеся отрицательными числами на модуль их значения;
  3.  являющиеся трехзначными  числами на сумму  цифр числа.


 

А также другие работы, которые могут Вас заинтересовать

34455. Северное Возрождение в Германии. Живопись, рисунок, гравюра. Альбрехт Дюрер (1471—1528), М. Грюневальд, Л. Кранах, Г. Гольбейн Младший 18.63 KB
  Альбрехт Дюрер 1471 1528 М. С этим временем совпадает творчество самого крупного художника немецкого Возрождения Альбрехта Дюрера 1471 1528. В творчестве Дюрера как бы слились искания многих немецких мастеров: наблюдения над природой человеком проблемы соотношения предметов в пространстве существования человеческой фигуры в пейзаже в пространственной среде. По разносторонности по масштабу дарования по широте восприятия действительности Дюрер типичный художник Высокого.
34456. Искусство Западной Европы ХVII века. Барокко в Италии. Архитектура (Борромини, Бернини). Скульптура. Д.Л. Бернини. Творчество Караваджо – реформатора европейской живописи, основоположника реализма ХVII в 20.58 KB
  Барокко в Италии. Центром развития нового искусства барокко на рубеже XVI XVII столетий был Рим. представляется типичной для эпохи барокко. Мастера барокко порывают со многими художественными традициями Возрождения с его гармоничными уравновешенными объемами.
34457. Искусство Западной Европы ХVII века. Историческая ситуация во Фландрии. Особенности фламандского барокко. Творчество П.П. Рубенса. Современники Рубенса 19.92 KB
  Рубенса. Современники Рубенса. был Питер Пауль Рубенс 1577 1640. Рубенс был внесен в списки свободных мастеров гильдии св.
34458. Искусство Западной Европы ХVII века. Специфика голландской живописи. Творчество Ф. Хальса, В.Дельфтского, Рембрандта 19.83 KB
  Отсюда широкий диапазон живописи этого столетия узкая специализация по отдельным видам тематики: портрет и пейзаж натюрморт и анималистический жанр. прекрасно демонстрирует эволюция творчества одного из крупнейших портретистов Голландии Франса Халса около 1580 1666. В 10 30х годах Халс много работает в жанре группового портрета. Индивидуальные портреты Халса исследователи иногда называют жанровым в силу особой специфичности изображения.
34459. Искусство Западной Европы ХVII века. Своеобразие испанской культуры ХVII в. Творчество Д.С. Веласкеса 18.46 KB
  Веласкеса Со второй половины XV в. Самый замечательный художник золотого испанского века Диего Родригес де Сильва Веласкес 1599 1660. Веласкес севильянец учился у Пачеко. Интересно что у Веласкеса типичнейшего испанца почти отсутствуют произведения на религиозные сюжеты а те которые он избирает трактуются им близко к бодегонес как жанровые сцены Христос в гостях у Марии и Марфы.
34460. Искусство Западной Европы ХVII века. Своеобразие исторического пути Франции ХVII в. Н. Пуссен – основоположник классицизма в живописи 19.64 KB
  Творчество замечательного рисовальщика и гравера Жака Калло 1593 1635 завершавшего свое образование в Италии явно испытало заметное влияние итальянского искусства. На творчестве Луи Ленена 1593 1648 отчетливо прослеживается влияние голландского искусства художник изображает крестьян без пасторальности без сельской экзотики не впадая в слащавость и умиление. Основой теории классицизма был рационализм опирающийся на философскую систему Декарта предметом искусства классицизма провозглашалось только прекрасное и возвышенное этическим и...
34461. Развитие бытового жанра в Англии ХVIII в. У. Хогарт. Влияние идей просветителей на портрет и пейзаж середины и второй половины ХVIII в. Английская школа портрета Дж. Рейнольдс. Т. Гейнсборо 18.89 KB
  Гейнсборо. Томас Гейнсборо 1727 1788 второй великий портретист XVIII столетия. В английской живописи эпохи Просвещения Рейнолдс и Гейнсборо выражают как бы две стороны просветительской эстетики: рационалистическую и эмоциональную. Для формирования Гейнсборо проведшего свою юность и молодость в провинции и сохранившего глубокую любовь к природе своего края старые мастера за исключением разве ван Дейка не имели такого значения как для Рейнолдса.
34462. Развитие искусства Италии в ХVIII в. Италия. Творчество Д.Б.Тьеполо. Развитие пейзажа (А. Каналетто, Т. Гварди) 17.04 KB
  был Джованни Баттиста Тьеполо 1696 1770 последний представитель барокко в европейском искусстве. Тьеполо автор гигантских росписей как церковных так и светских в которых архитектура природа люди звери сливаются в одно декоративное целое в единый декоративный поток. У Тьеполо был огромный декоративный дар и высокая колористическая культура как правило вообще присущая венецианским художникам. В одном из полотен для палаццо Дольфино в Венеции Триумф Сципиона особенно наглядно видно как умел и любил Тьеполо писать триумфальные...
34463. Творчество Ж.Л. Давида. Ж.Д. Энгр и формирование принципов неоклассицизма 18.99 KB
  В преддверии Великой французской революции в живописи Франции появляется Жак Луи Давид 1748 1825. Познакомившись с памятниками античности испытав влияние трудов Винкельмана и живописи немецкого классицистического художника Рафаэля Менгса Давид находит свой путь. Так выкристаллизовывался новый стиль и Давид в своей картине Клятва Горациев 1784 1785 выступил его глашатаем.