Часть 1

Обсуждаем понятие "массив"


Начнем с азов!

Данные хранятся в памяти компьютера. Для доступа к ним нужно знать адрес. Адрес - это номер ячейки памяти. И с адресом напрямую уже никто не работает. Всё хранится в переменных.

А переменная -это что? В словарях и учебниках можно найти следующее определение:

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

Вроде всё понятно. Дали имя ячейке памяти и обращаемся через нее напрямую к данным.

А зачем нам знать тип данных? И как это связано с переменной (адресом памяти)?

Чтобы компьютер знал с чем ему работать, с числом или текстом, какой длины бит нужно для хранения этих данных - в программе предусмотрены разные типы данных. Например, переменная А дает нам доступ к памяти - там 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;




 
Проверьте свои знания:

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

2. Какой тип должен иметь каждый элемент массива, чтобы сохранить значение температуры?
целый
вещественный
символьный
строковый
логический

3. Если нужно найти среднюю температуру за каждый месяц в течение 10 лет, то какую структуру данных лучше использовать?
одномерный массив
двумерный массив
запись

4. Дан фрагмент программы на Паскале:
for i:=-5 to 5 do
begin
 A[i]:=i;
end;

Какое описание для переменной А будет верным?
var A:array [-5..5] of byte;
int A[10];
var A:array [-10..10] of integer;
var A:array [-5..5] of real;
int A[-5:5];

5. Какое минимальное количество байт может занимать переменная A из предыдущего вопроса?
Выберите ответ:

Комментариев нет:

Отправить комментарий