Обсуждаем понятие "массив"
Начнем с азов!
Данные хранятся в памяти компьютера. Для доступа к ним нужно знать адрес. Адрес - это номер ячейки памяти. И с адресом напрямую уже никто не работает. Всё хранится в переменных.
А переменная -это что? В словарях и учебниках можно найти следующее определение:
Переменная - это именованная, либо адресуемая иным способом, область памяти, адрес которой можно использовать для осуществления доступа к данным.
Вроде всё понятно. Дали имя ячейке памяти и обращаемся через нее напрямую к данным.
А зачем нам знать тип данных? И как это связано с переменной (адресом памяти)?
Чтобы компьютер знал с чем ему работать, с числом или текстом, какой длины бит нужно для хранения этих данных - в программе предусмотрены разные типы данных. Например, переменная А дает нам доступ к памяти - там 0 и 1, т.е. биты.
Минимальная адресуемая ячейка памяти называется байтом, равный 8 битам.
И что, нам для данных хватит одного байта? Смотря что хранить. Если число больше 255, то скорее всего нужен еще один байт. А как это должен узнать компьютер? Вот и придумали определить по каждому типу данных определенное количество байт. Так на Паскале целое число типа INTEGER будет размещено в 2 байта, а LONGINT - в 4 байта.
А какой адрес будет храниться в переменной?
Скорее всего на первый байт. Но дело в том, что байты в памяти хранятся наоборот, так как помещаются в виде стека (стековая память). Тогда число 1 типа INTEGER будет храниться так:
000000001 00000000
Тогда что считать адресом начала числа? Скорее всего адрес младшего байта.
Все данные (переменные и их тип), которые вы перечислите в программе хранятся в памяти компьютера именно так, последовательно как в стеке. Обычно, при описании переменных следуют следующим правилам: вначале идут все стандартные переменные, размером от 1 байта и далее по увеличению размера.
А если значений несколько?
1) Даем каждой имя, например, А1, А2, и т.д.
2) Организуем массив или запись.
Так что же такое массив?
Массив - это набор однотипных данных, расположенных в памяти непосредственно друг за другом, доступ к которым осуществляется по индексу.
Массивы лучше всего рассматривать в электронных таблицах или на примере строк:
Из всего вышесказанного, получаем, что переменная типа массив - это адрес памяти (его "начало"), где все эти данные хранятся. А индекс - это смещение, т.е. на сколько байт, отведенных под данные одного типа, нужно переместиться, чтобы получить доступ к "элементу массива". Обычно индекс пишется в скобках (круглых или квадратных).
Массивы лучше всего рассматривать в электронных таблицах или на примере строк:
S | и | н | ф | о | р | м | а | т | и | к | а | строка, | ||
индексы | 1 | 2 | 3 | 4 | 8 | 6 | 7 | 8 | 9 | 10 | 11 | массив символов | ||
Р | 45 | 65 | 89 | 12 | 10 | 78 | 99 | 10 | 56 | 10 | 1 | вектор, | ||
индексы | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | одномерный | ||
массив | ||||||||||||||
T | ||||||||||||||
индексы | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | ||
1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | матрица, | |
2 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | двумерный | |
3 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | массив | |
4 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | ||
В Си нумерация массива начинается с 0 (и это правильно, ведь смещение на 0 однозначно определяет адрес первого элемента массива), поэтому, чтобы описать переменную массив, нужно знать тип элементов массива (иначе - на сколько байт смещаться), имя и количество элементов в массиве:
int A[100];
В Паскале может быть и от -100, и от 1, и от 'F' (если считать, что символ - это определенный код или число в кодировочной таблице). Поэтому, чтобы описать переменную массив, нужно задать имя, диапазон изменения индексов и тип данных:
var A:array[1..100] of integer;
В Кумире границы индекса задаются через двоеточие:
цел таб А[1:100]
Описание массива - это просто выделение памяти!
Чтобы заполнить ячейки памяти (ввести данные) - нужно указать "адрес начала ячейки памяти" на то количество байт, на которое рассчитаны элементы массива. Для этого и используют индекс, например, так (Паскаль):
А[1] := 2; А[2] := 15; А[3] := 16; А[4] := 27; А[5] := -132;
и т.д. до 100-го!
Ну что, устали копировать! Правильно, нужно все это объединить в цикл и вводить с клавиатуры или считывать из файла:
for i:=1 to 100 do read(A[i]);
А если это были просто переменные без индекса? Цикл уже использовать нельзя!
А чем отличается массив от записи?
В записи данные могут быть разного типа, но хранятся по такому же принципу, последовательно, байт за байтом, т. е. каждому типу свое количество байт. В Кумире такого типа нет. В Паскале запись можно описать так:
Var R: record
Fio:string[25];
Age: integer;
Klass: byte;
end;
Чтобы обратиться именно к той переменной, заданного типа, к которой нужно - в качестве разделителя имени записи от имени переменной используют символ "точка".
R.Fio := 'Иванов И.И.';
R.Age := 15;
R.Klass := 7;
Комментариев нет:
Отправить комментарий