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.  являющиеся трехзначными  числами на сумму  цифр числа.


 

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

84168. Антропологический принцип философии Фейербаха. Фейербах о религии как отчуждении родовой сущности человека 40.99 KB
  Фейербах о религии как отчуждении родовой сущности человека. Прежде всего духовное начало не может быть истинным бытием поскольку единственно истинным бесспорным и самоочевидным бытием является не я человека а то что ему дано в ощущениях. Кроме того органом познания является не логическое мышление а непосредственно чувства человека. Потому что не логическое мышление а именно физические чувства человека являются поставщиками бесспорных ощущений.
84169. Характеристика философии позитивизма. Основные этапы ее развития, виднейшие представители 48.8 KB
  Суть этого метода состояла в том чтобы отказаться от традиционной философии как средства познания и создать новую философию которую они называли позитивная синтетическая философия. Таким образом поскольку богословие и традиционная философия оказались практически бесполезными то от них следует отказаться а вместо них создать новую систему объединения научных знаний которая с одной стороны сохранила бы в себе всеобъемлющий характер теологии и философии но с другой стороны приобрела бы характер точной науки. Это есть её главное...
84170. Философия экзистенциализма. Понятие экзистенции. Светский (Хайдеггер, Сартр, Камю) и религиозный (Ясперс) экзистенциализм 37.5 KB
  Поскольку экзистенция есть осознание человеком своей конечности временности то основной характеристикой бытия является время. Но внутреннее переживание человеком будущего есть не что иное как страх смерти осознание человеком своей конечности. Следовательно в дорефлексионном состоянии человеческое сознание было неспособно осознавать себя и воспринимать своё индивидуальное существование и таким образом не способно было осознавать мир ибо не было индивидуальным сознанием то есть сознанием способным вмещать в себя нечто что не есть оно...
84171. Аналитическая философия ХХ столетия. Философская программа неопозитивизма и ее кризис. «Постпозитивизм» и философия науки 46.26 KB
  Постпозитивизм и философия науки. Аналитическая философия пыталась выяснить законы возникновения научного знания корни его противоречий а также причины постоянного опровержения достижений науки развитием самой же науки. Таким образом предмет философии неопозитивизма это язык который и только который является по мнению неопозитивистов виновником несовершенства и постоянной изменчивости основ науки Мур. Это позволит формировать весь язык науки только из логически обоснованных единиц так называемых атомов научных понятий.
84172. Русская философия XIX века: западничество и славянофильство 30-50 гг. Оценка исторического прошлого России и разработка славянофильской идеологии 39.27 KB
  Оценка исторического прошлого России и разработка славянофильской идеологии. Западники стремились к европеизации России к переходу русской жизни на западноевропейские образцы а славянофилы отстаивали традиционные формы национальной жизни России и боролись за ограждение их от иностранного влияния. Западники считали что Россия должна повторить исторический путь стран Западной Европы а славянофилы наоборот полагали что исторический путь России самобытен и неповторим. Проблему национальной самобытности России поставил в 2030х годах XIX...
84173. Философия русской радикальной демократии 50-60 гг. (Н.Г. Чернышевский, Д. Писарев). Народничество в России, его социально-философские позиции 35.41 KB
  Народничество в России его социальнофилософские позиции. В 5060 годах XIX века в России сложился революционный демократизм направление общественнополитической мысли которое соединяло в себе идею крестьянской революции с утопическим социализмом. Революционный демократизм в России проистекал из убеждения его сторонников что в России невозможно придти к общенациональному согласию в отношении крестьянского вопроса. Другой революционный демократ Дмитрий ПИСАРЕВ не верил в способность крестьянства самостоятельно освободить себя и построить...
84174. ИММУНОДЕФИЦИТЫ 24.57 KB
  Синдром Вискотта Олдрича наследственное рецессивное заболевание связанное с X хромосомой которое характеризуется экземой тромбоцитопенией и иммунодефицитом. Дефицит Тлимфоцитов может развиваться в ходе болезни при этом уровень IgM в сыворотке снижен. Атаксиятелеангиоэктазия наследственное заболевание передающееся аутосомно рецессивно характеризуемое мозжечковой атаксией телеангйоэктазией кожи и дефицитами Тлимфоцитов Ig и IgE.
84175. ХИМИЧЕСКИЙ ОНКОГЕНЕЗ 25.72 KB
  Канцерогенные вещества это вещества которые достоверно вызывают образование опухоли или по крайней мере вызывают увеличение частоты заболеваемости раком. Большинство канцерогенных химических веществ вызывают изменения в ДНК включающее повреждение пуриновых и пиримидиновых оснований делецию хромосом разрывы цепей и образование перекрестных связей. Небольшое количество канцерогенных химических веществ действуют эпигенетически т.
84176. ОНКОГЕНЕЗ 24.74 KB
  Ультрафиолетовое излучение играет роль в возникновении различных видов рака кожи включая плоскоклеточный рак базальноклеточный рак и злокачественную меланому. Поэтому грудные дети с респираторным дистресссиндромом подвергались лучевой терапии шеи для уменьшения размеров тимуса что привело к возникновению у большого количества этих детей папиллярного рака щитовидной железы через 15 25 лет. Торотраст радиоактивный препарат накапливается в печени и увеличивает риск возникновения нескольких типов рака печени включая ангиосаркому...