Главная |
страница 1 ... страница 16страница 17страница 18страница 19страница 20
Порядок выполнения работы
Контрольные вопросы
Лабораторная работа № 30Разработка программы для работы с нетипизированным файломЦель работы: формирование знаний и умений по работе с нетипизированными файлами. Краткие теоретические сведенияНетипизированные файлыФайлами, поддержка которых осуществляется с максимально возможной скоростью являются нетипизированные файлы. Введение таких файлов в систему Турбо Паскаль было вызвано стремлением повысить эффективность программ, участвующих в интенсивном обмене с внешними наборами данных. Эти файлы в отличие от текстовых и типизированных не имеют строго определенного типа. Нетипизированный файл рассматривается в Паскале как совокупность символов или байтов. Представление Char или Byte не играет никакой роли, а важно лишь относительно объема занимаемых данных. Для определения в программе нетипизированного файла служит зарезервированное слово File: Var UntypedFile : File; Внутренняя поддержка таких файлов выглядит наиболее близкой к аппаратной поддержке работы с внешними носителями. За счет этого достигается максимально возможная скорость доступа к наборам данных. Для нетипизированных файлов не нужно терять время на преобразование типов и поиск управляющих последовательностей, достаточно считать содержимое файла в определенную область памяти. Нетипизированный файл является файлом прямого доступа, что говорит о возможности одновременного использования операций чтения и записи. Для таких файлов самым важным параметром служит длина записи в байтах. Открытие нетипизированного файла с длиной записи в 1 байт можно выполнить следующим образом: Rewrite(UntypedFile, 1) ; или Reset(UntypedFile, 1) ; Второй параметр, предназначенный только для использования с нетипизированными файлами, задает длину записи файла на сеанс работы. Особенность аппаратной поддержки заключается в том, что при обращении к внешнему устройству минимально возможным объемом для считывания являются 128 байт. В стремлении добиться наибольшей эффективности файловых операций в Турбо Паскале принято соглашение, по которому длина записи нетипизированного файла по умолчанию составляет 128 байт. Поэтому после открытия файла с помощью вызовов: все процедуры и функции, обслуживающие файлы прямого доступа, работают с записями длиной 128 байт. Каждый пользователь для своих программ может выбрать наиболее подходящий размер записи. Используя для базовых операций ввода-вывода с нетипизированными файлами стандартные процедуры Read и Write, нельзя добиться большой эффективности в скорости передачи данных. Поэтому только для данного типа файлов в Турбо Паскаль введены две новые процедуры, поддерживающие операции ввода-вывода с более высокой скоростью. Средства работы с нетипизированными файламиBlockRead(var F : file ; var Buf; Count : word {;Result:word}); Процедура считывает из файла F определенное число блоков в память, начиная с первого байта переменной Buf. Параметр Buf представляет любую переменную, используемую для накопления информации из файла F. Параметр Count задает число считываемых блоков. Параметр Result является необязательным и содержит после вызова процедуры число действительно считанных записей. Использование параметра Result подсказывает, что число считанных блоков может быть меньше, чем задано параметром Count. Если Result указан при вызове, то ошибки ввода-вывода в такой ситуации не произойдет. Для отслеживания этой и других ошибок чтения можно использовать опции {$I-}, {$I+} и функцию IOresult. Процедура предназначена для быстрой передачи в файл F определенного числа записей из переменной Buf. Все параметры процедуры BlockWrite аналогичны параметрам процедуры BlockRead. Обе процедуры выполняют операции ввода-вывода блоками. Объем блока в байтах определяется по формуле: 06ъем = Count * RecSize, где RecSize - размер записи файла, заданный при его открытии. Суммарный объем разового обмена не должен превышать 64 Кбайт. Помимо скорости передачи данных преимущество этих процедур заключается в возможности пользователя самостоятельно определять размер буфера для файловых операций. Эта возможность играет значительную роль в тех задачах, где необходимо жесткое планирование ресурсов. Пример программы для работы с типизированными файламиПусть требуется составить программу, которая создает нетипизированный файл из 100 вещественных чисел и выводит на экран k-й элемент файла. Проиллюстрируем обработку созданного файла двумя разными способами: поиск элемента в файле данных прямого доступа по его номеру и поиск элемента в файле данных с последовательным доступом. В разделе описания переменных опишем файловую переменную F, представляющую в программе нетипизированный файл вещественных чисел; вещественную переменную Р, которой будет присваиваться значение очередного элемента файла при заполнении файла случайными вещественными числами и искомого элемента файла; целую переменную типа byte К, значения которой будут указывать на номер элемента в файле. Program UnTyped_File; Uses Crt; Var F : File of real; P : real; К : byte; procedure Mak_file; {Создание файла вещественных чисел} begin Assign(F,'a.dat') ; Rewrite(F) ; {Открыть файл для записи} Randomize; for K:=l to 100 do begin P:=Random(100) ; Write(F,P) ; {Записать в файл значение К-го элемента} end; Writeln('Создание файла вещественных чисел завершено'); Close(F); {закрыть файл} end; {конец процедуры Mak_file} procedure Find_Elem; {Поиск элемента в файле прямого доступа по его номеру} begin Assign(F,'a.dat'); Write('Введите номер нужного элемента '); Readln(К) ; Reset(F) ; Seek(F,K-l); {Переместить указатель обработки на К-1-й элемент} Read(F,P); {Присвоить значение элемента, на который указывает указатель обработки переменной Р} Writeln(K,'-й элемент файла ',Р:6:2) ; Close(F) ; end; {процедура Find_Elem} procedure Find_Fil_P; {Поиск элемента в файле последовательного доступа} var N : byte; begin Assign(F,'a.dat'); Write('Введите номер нужного элемента '); Readln(К) ; Reset(F) ; N:=0; {Поместить указатель обработки в начало файла} While not Eof(F) do {Повторять, пока не будет просмотрен весь файл} begin Read(F,P); {Чтение элемента и смещение указателя обработки вправо на один элемент} if N=K-1 then {Найден элемент с искомым номером} begin Writeln(K,'-й элемент файла равен ',Р:6:2); Exit; {Прервать поиск, так как элемент найден} end; N:=N+1; (Увеличить числа элементов файла на 1} end; Close(F); end ; {конец процедуры Find_Fil_P} Begin {Основная программа} Mak_file; {Вызов процедуры создания файла вещественных чисел} Find_Е1еm; {Вызов процедуры поиска элемента в файле прямого доступа} Find_Fil_P; {Вызов процедуры поиска элемента в файле с последовательным доступом} end. При обработке файла a.dat как файла прямого доступа для чтения определенного элемента выполняется позиционирование указателя обработки на указанный элемент, а при обработке файла a.dat как файла последовательного доступа перемещение указателя на нужный элемент осуществляется последовательным чтением элементов, начиная с первого, до тех пор, пока указатель обработки не будет установлен на искомый элемент. Порядок выполнения работы
Контрольные вопросы
Лабораторная работа № 31Изучение карты памяти. Разработка программы доступа к полям PSPЦель работы: формирование знаний и умений по работе со схемой распределения памяти, адресацией и работой с Heap-областью. Приобретение навыков разработки программ для доступа к полям префикса программного сегмента. Краткие теоретические сведенияЧтобы более полно представить все процессы, протекающие внутри любой программы на Паскале, необходимо знать расположение ее внутренних областей в памяти. Для каждой отдельной программы при ее запуске (загрузке в память) MS-DOS организует в памяти что-то вроде анкеты (длинной в 256 байт). Это файл, называемый префиксом программного сегмента (Program Segment Prefix (PSP)). Система адресации MS-DOS.
16 блоков по 64 кб каждый
Блок или сегмент обозначается 16-ричной цифрой, обозначающей старшую цифру адреса. 0-блок – это адреса: от 00000 до 0FFFF. Абсолютный адрес – это адрес без учета сегментов, он не может быть > FFFFF. Физический адрес = Абсолютный адрес + Смещение. Абсолютный адрес - адрес самого сегмента (16 бит = 2 б). Смещение – адрес внутри сегмента (4 бита). Это содержимое сегментного регистра. Таким образом, адрес любой ячейки памяти определяется парой чисел: Знак $ - предшествует 16-ой записи числа. Распределение памяти при выполнении программыВерхняя граница памяти
После PSP (ProgramSegmentPrefix) располагаются коды EXE-файла – это может быть один сегмент = 64 кбайтам. Если программа разбита на модули, то каждому модулю соответствует свой сегмент кода программы. За СЕГМЕНТОМ КОДА ОСНОВНОЙ ПРОГРАММЫ располагаются сегменты в порядке, обратном тому, который указан при вызове в разделе USES. Затем располагается СЕГМЕНТ КОДА МОДУЛЯ System. После следует СЕГМЕНТ ДАННЫХ – все константы, переменные (глобальные). За СЕГМЕНТОМ ДАННЫХ следует СЕГМЕНТ СТЕКА. Назначение сегмента стека: 1.при вызове процедур и функций он служит для передачи параметров; 2. здесь размещаются все локальные переменные на уровне процедур и функций; 3.здесь сохраняются все критические значения программы. Чтобы узнать количество стековой памяти, требуемой программе, можно после компиляции, посмотреть это режиме Info. Пример программы распределения памяти и получения доступа к полям PSP.{Программа, демонстрирующая распределение памяти} program Demo_Size; uses Crt; var P : pointer; I : word; procedure ProgSize; var SysemTotalSize : word {Общий размер кучи} PrefixSize : word {Размер PSP} CodeSize : word {Размер сегмента кода} DataSize : word {Размер сегмента данных} HeapSIze : word {Размер динамической памяти} AllocHeapSize: word {Размер занятой части динамической памяти} Factor : real ; S : string[80] ; LI : byte absolute S; 1,1 : byte; function Lin_Adr (P : pointer) : longint; {Вычисление абсолютного (линейного) адреса объекта по обычному сегментному адресу} begin Lin_Adr:=longint(Seg(P^)*16+0fs(Р^); end; begin {Начало процедуры} SystemTotalSize := 640*1024 div 16; PrefixSize := 256 div 16; CodeSize := Dseg — PrefixSeg — PrefixSize; DataSize := SegtHeapOrg^ — SSeg; HeapSize ;= Mem[PrefixSeg:2] - Seg (HeapOrg^); AllocHeapSize := (Lin_Adr(HeapPtr)-Lin_Adr(HeapOrg)+1) div 16; Writein (' Распределение памяти: '); Factor := 67 / SystemTotalSize; L:= Round(Factor*PrefixSize) ; FillChar(S[l],L,#176) ; Writeln ('PSP ',PrefixSize:5,' ',S); L := Round(Factor*CodeSize) ; FillChar(S[l],L,#176) ; Writeln('Код ',CodeSize:5,' ',8); L := Round(Factor*DataSize) ; FillChar(S[l],L,#176) ; Writeln ('Данные ',DataSize:5,' ',S); L := Round(Factor*HeapSize) ; LI := Round(Factor*AllocHeapSize) ; FillChar(S[l],LI,#176) ; FillChar(S[LI+l],L-LI,#219) ; Writein ('Куча:', HeapSize: 5,' ',S); Writein end; begin {Основная программа} Randomize; for I:=l to 100 do {Попробуйте поменять конечное значение параметра I (от 1 до 1000)} GetMam(P,Random(1000)); {Занимаем часть динамической.памяти блоками случайных размеров} ProgSize; {Выводим на экран карту памяти} end. << предыдущая страница следующая страница >> Смотрите также:
Указания по выполнения практических и лабораторных работ
2155.22kb.
Методические указания по выполнению практических работ по курсу "Экология"
189kb.
Программа используется без изменений. Цели изучения
303.85kb.
Календарно-тематическое планирование по геометрии в 10 классе 2011-2012 уч год I полугодие 1 ч в нед.*17 нед. = 17 ч. II полугодие 1 ч в нед.* 19 нед. = 19 ч
175.19kb.
Выполнения работ, оказания услуг
70.43kb.
Общие сведения
75.27kb.
Методические указания по их выполнению для студентов, обучающихся по специальности
239.17kb.
Методические указания Часть I для выполнения самостоятельной работы студентами специальностей
646.03kb.
Темы контрольных работ Методические указания к выполнению контрольных работ по дисциплине «История и культура региона» для студентов заочной формы обучения
62.21kb.
К выполнению лабораторных работ по дисциплине «Моделирование физических систем» для студентов направления 230100. 62 «Информатика и вычислительная техника» испециальности 230105
32.72kb.
Учебно-методический комплекс по дисциплине «история отечественного государства и права»
5377.6kb.
Общие термины
650.19kb.
|