Данному образовательному сайту пришлось несколько раз менять свое имя. С 2022 года доступ к нему обеспечивается по URL
emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-2021) ==> emc.orgfree.com (2022-...)
Более подробно об истории сайта можно прочитать здесь.
|
Процедуры и функции модуля Level3 – доступ к файлам (и к диску в целом)
|
Содержание задачи |
извлечь элемент массива по номеру |
Уровень сложности |
низкий |
Модуль |
Level3 |
Входные параметры |
n: INTEGER – номер файла (file ID) |
Выходные параметры |
нет (только результат функции) |
Тип результата |
mySector |
Вызываемые процедуры (функции) |
нет |
Глобальные переменные и константы |
массив sectors |
Действия |
по номеру файла прочитать запись каталога для него |
Проверки |
нет |
Комментарии |
по номеру файла формирует из массива sectors запись каталогапротивоположна процедуре putCatRec |
Примечание
. В авторской версии имитатора одна запись каталога занимает ровно один сектор. Поэтому file ID просто совпадает с номером сектора и функция тривиальна. Но это не обязательное требование, так что в более сложных системах могут потребоваться более сложные действия, а значит, выделение специальной функции оправдано.Функция
GETCATNAME
Содержание задачи |
извлечь подстроку из элемента текстового массива |
Уровень сложности |
низкий |
Модуль |
Level3 |
Входные параметры |
n: INTEGER – номер файла (file ID) |
Выходные параметры |
нет (только результат функции) |
Тип результата |
sName ( в авторском варианте фактически STRING[8]) |
Вызываемые процедуры (функции) |
getCatRec |
Глобальные переменные и константы |
нет |
Действия |
по номеру файла из записи каталога для него извлечь имя файла |
Проверки |
нет |
Комментарии |
по номеру файла из полной записи каталога вырезает только имя |
Функция
GETCATLEN
Содержание задачи |
извлечь подстроку из элемента текстового массива и преобразовать в число |
Уровень сложности |
средний |
Модуль |
Level3 |
Входные параметры |
n: INTEGER – номер файла (file ID) |
Выходные параметры |
нет (только результат функции) |
Тип результата |
INTEGER |
Вызываемые процедуры (функции) |
getCatRec |
Глобальные переменные и константы |
нет |
Действия |
по номеру файла из записи каталога для него извлечь длину файла и преобразовать в число |
Проверки |
выделенные символы должны образовывать число |
Комментарии |
по номеру файла из полной записи каталога вырезает только два символа, соответствующих длине файла; с помощью VAL они преобразуются в число, причем в случае ошибки выдается результат –1 и выводится сообщение |
Функция
GETCATCLUSTER
Содержание задачи |
извлечь подстроку из элемента текстового массива и преобразовать в число |
Уровень сложности |
средний |
Модуль |
Level3 |
Входные параметры |
n: INTEGER – номер файла (file ID); k: INTEGER – номер кластера в файле (от 1 до fs_ml) |
Выходные параметры |
нет (только результат функции) |
Тип результата |
INTEGER |
Вызываемые процедуры (функции) |
getCatRec |
Глобальные переменные и константы |
константа cat_cl0 |
Действия |
по номеру файла из записи каталога для него извлечь номер нужного кластера и преобразовать в число |
Проверки |
выделенные символы должны образовывать число |
Комментарии |
по номеру файла из полной записи каталога вырезает только два символа, соответствующих номеру кластера; с помощью VAL они преобразуются в число, причем в случае ошибки выдается результат –1 |
Примечание
. Очень важно учитывать возможность ошибки, поскольку в файле может быть неполное количество кластеров – тогда GETCATCLUSTER выдаст –1. Процедуры более высокого уровня должны производить сравнение с –1.Процедура PUTC
ATREC
Содержание задачи |
сохранить запись каталога в нужный сектор |
Уровень сложности |
средний |
Модуль |
Level3 |
Входные параметры |
n: integer – номер файла (file ID); s:mySector – содержимое записи каталога |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
нет |
Глобальные переменные и константы |
массив sectors |
Действия |
сохраняет указанное содержимое в область каталога виртуального диска |
Проверки |
нет |
Комментарии |
по номеру файла запись заносится в нужный сектор каталога противоположна функции getCatRec |
Функция
FILEID
Содержание задачи |
найти в массиве заданный элемент; предусмотреть вариант его отсутствия |
Уровень сложности |
средний |
Модуль |
Level3 |
Входные параметры |
fn: STRING – имя файла; print: BOOLEAN – выводить ли сообщение об отсутствии файла |
Выходные параметры |
нет (только результат функции) |
Тип результата |
INTEGER |
Вызываемые процедуры (функции) |
getCatName |
Глобальные переменные и константы |
константа fs_mnf |
Действия |
найти в каталоге файл с заданным именем и выдать его номер – fileID; при отсутствии файла результат –1 |
Проверки |
нет |
Комментарии |
просматриваются все записи каталога: с помощью функции getCatName из них выделяется имя файла и сравнивается с заданным; при совпадении в качестве ответа выдается номер записи в каталоге, а в случае отсутствия требуемого имени –1 (при print = true дополнительно выводится текст File <имя> not found) |
Примечание
. Данная функция полезна еще и тем, что позволяет проверить, есть ли указанное имя в каталоге (если нет, то результат равен –1). Например, при переименовании файла его “старое” имя должно быть найдено в каталоге, а “новое”, напротив, должно отсутствовать.Работа с картой кластеров
Карта кластеров – это массив их занятости: каждому кластеру соответствует элемент массива, равный 0, если кластер свободен, и 1 – если он распределен в файл. Карта требуется при записи на диск нового файла (для чтения достаточно каталога).
Процедура
FORMCLUSTERMAP
Содержание задачи |
сформировать числовой массив по определенным правилам |
Уровень сложности |
высокий |
Модуль |
Level3 |
Входные параметры |
нет |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
getCatName, getCatCluster |
Глобальные переменные и константы |
массив clusterMap; константы dsk_ns, fs_spc, fs_mnf, fs_ml, pusto |
Действия |
карта кластеров очищается; считываются записи каталога, для всех существующих файлов извлекаются номера кластеров и в карте делаются отметки о занятости |
Проверки |
стертые файлы при составлении карты игнорируются |
Комментарии |
для проверки стерт ли файл первый символ имени сравнивается с pusto; перебираются все файлы и в каждом из них все кластеры |
Примечание
. Данная функция вызывается не только при инициализации виртуального диска, но и после удаления файлов, что автоматически “освобождает” удаленные кластеры.Функция
NEXTCLUSTER
Содержание задачи |
найти в массиве первое нулевое значение |
Уровень сложности |
средний |
Модуль |
Level3 |
Входные параметры |
нет |
Выходные параметры |
нет (только результат функции) |
Тип результата |
INTEGER |
Вызываемые процедуры (функции) |
нет |
Глобальные переменные и константы |
массив clusterMap; константы dsk_ns, fs_spc |
Действия |
находит в карте кластеров первый не занятый элемент и возвращает его номер (–1 при отсутствии) |
Проверки |
если массив пройден, а элемента нет – диск заполнен |
Комментарии |
ищется первый нулевой элемент в карте кластеров; если индекс выходит за пределы, значит такого элемента нет; в найденный элемент заносится 1, т.е. выбранный кластер “занимается”; количество кластеров определяется как число секторов деленное на количество секторов в кластере |
Примечание
. Анализ на переполнение диска в авторском проекте может быть без всяких последствий опущен, поскольку число файлов и максимальное количество кластеров в каждом есть константы и, следовательно, максимальное число занятых кластеров никогда не может превысить произведение этих констант.Работа с файлами
Функция
READMYFILE
Содержание задачи |
пользуясь описанными выше процедурами, организовать считывание всех кластеров файла |
Уровень сложности |
средний |
Модуль |
Level3 |
Входные параметры |
fn: STRING – имя файла |
Выходные параметры |
нет (только результат функции) |
Тип результата |
myFile |
Вызываемые процедуры (функции) |
fileID, getCatCluster, getCatLen, getCluster (Level2) |
Глобальные переменные и константы |
массив clusterMap; константы dsk_ns, fs_spc |
Действия |
если файл существует, циклически читает все входящие в него кластеры, “суммируя” их содержимое в общую строку; отбрасывает лишние символы последнего кластера, используя сведения о длине |
Проверки |
существование файла на виртуальном диске с помощью fileID |
Комментарии |
если файл найден, из каталога извлекаются сведения о его кластерах ( getCatCluster) и они читаются; полученная в результате строка укорачивается в соответствии с длиной файла в каталогепротивоположна процедуре writeMyFile |
Процедура
WRITEMYFILE
Содержание задачи |
пользуясь описанными выше процедурами, организовать запись всех кластеров файла и формирование соответствующей записи в каталоге |
Уровень сложности |
высокий |
Модуль |
Level3 |
Входные параметры |
fn: STRING – имя файла; mf: myFile – его содержимое |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
nextCluster, putCatRec, putCluster (Level2), addToCat ( локальная, добавляет к записи для каталога 2 цифры) |
Глобальные переменные и константы |
константы dsk_ bps, fs_spc, pusto |
Действия |
имя файла, если необходимо, дополняется пробелами или “урезается”; к имени добавляется длина файла в виде двух цифр; затем файл mf разбивается на кластеры, которые сохраняются на диск по номерам, находимым nextCluster, причем номера фиксируются в записи для каталога; находится неиспользуемое место в каталоге и, если удается, сохраняется сформированная запись |
Проверки |
длина имя не должна превышать максимального; количество файлов не может превысить заданного |
Комментарии |
fn приводится к стандартной длине; по мере записи формируется строка с записью для каталога, которая в конце сохраняется (при этом используется addToCat, которая переводит число в 2 символа, причем для значений меньше 10 добавляет слева 0); для разбивки на кластеры от mf “отрезается” слева количество байт в кластере, причем последний (неполный) дополняется символами pusto; при поиске свободного места в каталоге анализируется первый символ имени (< >pusto)противоположна функции readMyFile |
Работа с диском
Процедура
READVIRTUALDISK
Содержание задачи |
пользуясь имеющимися процедурами, организовать считывание файла виртуального диска с винчестера |
Уровень сложности |
низкий |
Модуль |
Level3 |
Входные параметры |
fn: STRING – имя файла MS-DOS |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
formClusterMap, fromDisk (Level1) |
Глобальные переменные и константы |
нет |
Действия |
вызвать процедуры считывания содержимого виртуального диска и формирования по нему карты кластеров |
Проверки |
для простоты нет, хотя корректность имени fn можно было бы проанализировать |
Комментарии |
противоположна процедуре writeVirtualDisk |
Процедура
WRITEVIRTUALDISK
Содержание задачи |
используя имеющуюся в Level1 процедуру, организовать запись содержимого виртуального диска на винчестер |
Уровень сложности |
низкий |
Модуль |
Level3 |
Входные параметры |
fn: STRING – имя файла MS-DOS |
Выходные параметры |
нет |
Вызываемые процедуры (функции) |
toDisk (Level1) |
Глобальные переменные и константы |
нет |
Действия |
вызвать процедуру записи содержимого виртуального диска |
Проверки |
для простоты нет, хотя корректность имени fn можно было бы проанализировать |
Комментарии |
фактически процедура служит “переходником” с Level3 на Level1 (в противном случае с Level4 потребовалось бы обращение на Level1!)противоположна процедуре readVirtualDisk |
Текст программы