3) Ссылочный тип данных.
Представим, что вы грузчик. У вас есть мешок, и вам нужно его передать другому грузчику. А тот третьему. Представим, что мешок очень тяжелый, а его переноска занимает очень много времени. Посему нам проще сказать второму грузчику, где этот мешок лежит, а тот скажет третьему. Таким образом мы сэкономим время и ресурсы.
Также происходит и с указателями. Указатель – ссылочный тип данных, который хранит адрес в памяти непосредственно на сами данные.
Для указателей определены операторы присваивания (приравнять две ссылки), разыменования (дать имя ссылкам соответственно), отношение равенства. Т.е. можно их сравнивать (t == NULL)
4) Файл. Функциональная спецификация.
Немного о самом файле для общего развития (пропустите этот абзац, если вы ленивый и бессовестный). Итак, файл должен иметь имя и расширение (в большинстве случаев), чтобы его можно было найти на устройстве. Все характеристики файла должны быть известны операционной системе до начала выполнения работы программы. Операции, исполняемые над файлом, определяются принципами, а последние определяются расширением файла. (Например, .exe и .dat файлы). В отношении программы файлы могут быть внутренними и внешними. Внутренние описаны в виде статических переменных/констант и недоступны после выполнения работы программы. Файлы сгенерированные ДО использования программы и оставленные для долговременного хранения называются внешними.
Итак, функциональная спецификация. «Файл Ft с компонентами типа Т. У него указано множество значений, изображений этого типа» (как в .txt у нас чары, а в png int-ы для обозначения цвета пикселя (или что там)). «Значениями типа Ft являются сколь угодно длинные, но конечные последовательности компонента типа Т». Т.е. размер файла не ограничен, но имеет конец. «Такое бесконечное множество значений можно определить формально с помощью операции конкатенации (слияния, склеивания, сцепления) двух файлов, состоящих из компонентов одного и того же типа: еслиf1 = {x1,...,xm} и f2 = {y1,...,yn}, то f1||f2 = {x1, . . . , xm, y1, . . . , yn}, где — знак операции конкатенации. Тогда множество значений файлового типа строго определяется следующими порождающими правилами 1. { } есть файл типа FT (пустая последовательность, пустой файл); 2. если f есть файл типа FT и t есть объект типа T, то f{t} есть файл типа FT; 3. никакие другие значения не являются файлами типа FT .
(Я этого не понимаю. Честно. Время копипасты!)
Базовое множество атрибутов файлового типа: 1. операция конкатенации, определенная выше; ее свойство — несимметричность; 2. операция присваивания определяется как покомпонентное копирование одного файла в другой с сохранением порядка и количества компонент. 3. отношение равенства: два файла, состоящие из компонент одного и того же типа, равны тогда и только тогда, когда они имеют одинаковую длину, а их соответствующие компоненты — равные значения; отношение равенства симметрично; 4. функции: создание (порождение пустого файла), доступ (последовательный доступ к каждой компоненте, причем только для чтения значения: чтобы прочитать значение k-той компоненты файла, надо прочитать предварительно k − 1 компоненту иот начала файла), модификация (дозапись компоненты того же типа в конец файла — фактически это конкатенация файла и новой компоненты типа T ), уничтожение (стирание) файла.
5) Файл. Логическое описание и физическое представление.
(Повторяю для золотых рыбок. Логическое описание – отображение чего-то на конкретном языке программирование, а физическое представление – отображение того, как это происходит на памяти)
1) Паскаль. Если файл именованный, то мы должны описать его в начале программы. type T = …; {type of element of file} {file type} = file of T; При использовании неименованного файлового типа, описание такого же объекта выглядит следующим образом var {file variable} : file of T; При обработке описание объекта-файла f транслятор должен выделить память в генерируемой программе под буфер файла, достаточную для размещения значения одного элемента файла. Т.е. мы всегда будем считывать файл поэлементно.
2)Си. Нужно объявить переменную FILE*, который будет являться указателем на сам файл. FILE* <name of file>; Чтение/запись происходит с помощью read(f,x) и write(f,x). Reset готовит файл к чтению, занося первый элемент файла в буфер. Второй элемент функции – полный путь до файла. reset(f, ../../data/file1.txt); rewrite – устанавливает файл в режим записи, стирая возможные данные. На вход те же данные, что и в reset. Предикат eof означает конец файла, если принимает значение true. Также в Си есть библиотека для работы с файлами, <stdio.h>.
6) Вектор. Функциональная спецификация, логическое описание и физическое представление.
Кратко, вектор – динамический массив, у которого память равна кол-ву его элементов*тип данных. Если элементов больше – добавляем память, меньше – убираем.
А)
Функциональная спецификация. Вектор
является последовательностью переменной
длины, и время доступа к элементам этой
последовательности постоянно и не
зависит от длины последовательности.
Количество элементов вектора не
фиксировано и всегда может быть изменено.
Вектор с 0 компонентов называется пустым.
Б) Логическое описание и физическое
представление.
Опишем вектор
typedef
struct {
T*
data;
int
size;
}
В процессе
создания вектора определится его длина.
(При добавлении элемента, size++).
Функции
для создания: проверка на пустоту (если
v (вектор) == 0)
Size
(возвращает v->size),
операции загрузки и сохранения,
переопределение размера и сравнения
двух массивов.
Ну
и соответственно очистка массивов
На памяти представляется как цепные куски одного типа данных.
