Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методы программирования.docx
Скачиваний:
17
Добавлен:
20.09.2019
Размер:
2.14 Mб
Скачать
  1. Массивы. Операции, способы предсавления, сложность операций.

Объявление:

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

На Паскале – <имя>: array [Tindex] of Titem;

На Си – Titem <имя> [Tindex].

Типом индекса может быть любой простой тип, для которого существуют операции инкремента и декремента (все, кроме float), например:

A: array [(x, y, z)] of Integer – индексный тип состоит из перечислимого типа (м. б. координаты)

A: array[1..10] of Integer – индексный тип является перечислимым.

Характеристики:

  1. Мощность (#)= произведению мощностей компонент

.

  1. Размер – сумма размеров составляющих типов.

Sieof (array) = sizeof(Titem)*#Tindex.

Операции:

  1. Индексация А[i];

  2. Присваивание A=B

В Си и Паскале ее нет, но можем использовать цикл и присваивать покомпонентно или скопировав один участок памяти в другой memcopy(A, B, sizeof B) – копирует из B в А столько, сколько занимает В, но можем скопировать столько, сколько влезет в А.

  1. Выделение подмассива

A[5:9] – выделяем подмассив с 5го по 9й элемент

A[5:9]=B[1:5] – типы должны бить эквивалентны.

  1. Сравнение A==B

Можем сделать циклом или memcmp(A, B, sizeof B)

  1. Инициализация A[]={1,2,3}.

Представление в памяти :

Массив следует отображать таким способом, чтобы можно было максимально просто и эффективно вычислять адреса его компонент.

  1. Одномерные:

В Си операции с индексами напрямую связаны с указателями: A[i]=*(addr+i*sizeof(элемента)) – реальный адрес элемента массива в памяти можно вычислить, зная тип элемента и № нужного элемента.

  1. Для двумерной матрицы:

- 4 элемента в строке

A[i][j] = *(A + (i-1)*N* sizeof(эл-та) + (j-1)*sizeof(эл-та)

В терминах Си: *(A[i]+j)=*(*(A+i)+j)

Int **A – двойной указатель, элемент A[i] должен быть уже указателем

Получаем массив указателей:

Упакованный/неупакованный способ хранения:

Е сли sizeof(эл)>sizeof(word)

Массив упакованный – память занимается максимально плотно, нет пустых мест => экономия памяти

Неупакованный – используется адрес, кратный машинному слову => быстрый доступ

  1. Записи. Операции над ними, способы представления, сложность операций.

Запись (структура) - это набор из одной или более переменных, возможно различных типов, сгруппированных под одним именем для удобства обработки.

Определяется следующим образом:

Паскаль – record

S1 of T1

S2 of T2

Sn of Tn

End

В си – struct {

T1 S1;

T2 S2;

Tn Sn;

}

T1…Tn – типы данных; S1…Sn – поля записи.

Все поля могут иметь разный тип.

Имена полей – идентификаторы полей.

Структура случайного доступа к компонентам.

Все элементы начинаются каждый со своего места в памяти.

Применяют для БД и анкет.

Характеристики:

1)Мощность #record = #T1 * #T2 *… * #Tn;

2)Размер записи – сумма размеров всех ее типов .

Операции:

1)Можем обратиться к элементу записи, но не по индексу, а по имени A.name;

2)Присваивание А=В с помощью memcpy(A, B, sizeof B);

3)Сравнение А==В с помощью memcmp(A, B, sizeof B);

4)Инициализация

A = {“Андрей”, “Иванович”, 1990, m}.

Хранение записей в памяти:

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

Если:

  • sizeof(эл) кратен sizeof(word) – одновременно упакованный и неупкованный способ хранения

  • – выбираем между упакованным и неупак.

  • – элемент умещается в длину машинного слова