Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
13
Добавлен:
02.01.2020
Размер:
31.03 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИИ

Новосибирский государственный технический университет

ЛАБОРАТОРНАЯ РАБОТА № 8

по курсу «Информатика и программирование»

«Типизированные файлы»

Факультет бизнеса

Группа: ФБИ-11

Студенты: Рыбаченко А.А.

Преподаватель: Зайцев М.Г.

Новосибирск

2012г.

Практическая работа. Типизированный файл

Цель: Сформировать практические навыки обработки данных хранящихся в файлах на внешних запоминающих устройствах с помощью средств Object Pascal.

Задание

  1. Посчитать количество вхождений заданного значения в файл.

  2. Отыскать "минимальный" или "максимальный" элемент в файле и вывести на экран его значение и номер его позиции в файле.

  3. Выполните задание для следующих типов констант:

word;

real;

r = record

x: real;

y: real;

z: real;

end;

char;

r1 = set of 0...47.

"Минимальный" и "максимальный" элемент для типа r следует понимать как точку в трехмерном пространстве с координатами X,Y,Z минимально и максимально удаленную от начала координат. Под размером константы множественного типа следует понимать мощность изображаемого ею множества.

  1. Удалить все вхождения заданного значения в файл.

  2. Найти номера позиций заданного значения в файле и сохранить их во вновь созданном файле.

  3. Отсортировать типизированный файл, используя динамический массив. Сортировку выполнить метод пузырька, выбором.

  4. Отсортировать типизированный файл. Сортировку выполнить метод пузырька, выбором.

Текст программы:

unit UList;

interface

uses SysUtils;

type

//---------------------Исключительные ситуации----------------------------------

EListEmpty = class(Exception)

end;

//---------------------Тип элементов списка-------------------------------------

T = integer;

//---------------------Узел списка----------------------------------------------

PNode = ^Node;

Node = record

key : T;

next : PNode;

end;

// --------------------Дескриптор списка----------------------------------------

PList = ^List;

List = record

first: PNode;//указатель на первый элемент списка

last : PNode;//указатель на последний элемент списка

size : integer;//число элементов в списке

end;

// --Операции на списке---------------------------------------------------------

// --------------------Создать пустой список------------------------------------

function CreateL: PList;

// --------------------Число элементов списка-----------------------------------

function Size(L: PList): integer;

// --------------------Список пуст----------------------------------------------

function IsEmpty(L: PList): Boolean;

// --------------------Взять голову списка (слева)------------------------------

function Head(L: PList): T;

//---------------------Просмотреть голову списка--------------------------------

function WatchHead(L: PList): T;

// --------------------Взять голову списка (справа)-----------------------------

function Head_(L: PList): T;

// --------------------Выделить хвост списка (слева)----------------------------

function Tail(var L: PList): PList;

// --------------------Выделить хвост списка (справа)---------------------------

function Tail_(var L: PList): PList;

// --------------------Добавить элемент к списку (справа)-----------------------

procedure AddRight(L: PList; E: T);

// --------------------Добавить элемент к списку (слева)------------------------

procedure AddLeft(L: PList; E: T);

// --------------------Опустошить список----------------------------------------

procedure EmptyList(L: PList);

// --------------------Объединить два списка в один-----------------------------

procedure Merge(L,T: PList);

//---------------------Освобождает выделенную под список память-----------------

procedure DelList(var L: PList);

// --------------------Выводит значения элементов списка в строку-------------

function ListToStr(L: PList): String;

procedure AddInPos(var L:plist; a:t; p:pnode);

implementation

procedure AddInPos(var L:plist; a:t; p:pnode);

var z:plist; k:pnode;

begin

z:=createl;

k:=l.first;

while k.next<>p do

k:=k.next;

z.first:=k.next;

z.last:=l.last;

k.next:=nil;

l.last:=k;

addright(l,a);

merge(l,z);

end;

//------------------------------------------------------------------------------

function ListToStr(L: PList): String;

//Распечатывает поле key всех элементов списка,

//начиная с головы списка

var p: PNode;

begin

if L <> nil

then

begin

{if Size(L) = 0 then begin Result:= Result + 'no elements'; exit end; }

Result:= 'Size = ' + IntToStr(Size(L)) + '| Elements: ';

p:= L^.first;

while p <> nil do

begin

Result:=Result+IntToStr(p^.key)+',';

p:= p^.next

end;

delete(result,length(result),1);

end

else

Result:= 'List not exist';

end;

//------------------------------------------------------------------------------

function PredLast(L: PList; var Pred: PNode): PNode;

//Возвращает укзатель на предпоследний и последний элементы списка

//В случае отсутствия последнего и/или предпоследнего узла - возвращается nil.

begin

Pred:= nil;

if (L <> nil) then

with L^ do

case size of

0: begin Result:= nil end;

1: begin Result:= first; Pred:= nil end;

else

Result:= first;

while Result^.next <> nil do

begin

pred:= Result;

Result:= Result^.next

end

end

else

Result:= nil

end;

//------------------------------------------------------------------------------

function CreateE(key: T): PNode;

//Создаёт элемент списка

begin

try

new(Result);

Result^.key:= key;

Result^.next:= nil

except

on EOutOfMemory do begin

raise;

end;

end;

end;

//------------------------------------------------------------------------------

function CreateL: PList;

//Создаёт пустой список

begin

try

new(Result);

Result^.first:= nil;

Result^.last:= nil;

Result^.size:= 0

except

on EOutOfMemory do begin

raise;

end;

end;

end;

//------------------------------------------------------------------------------

function Size(L: PList): integer;

//Возвращет число элементов списка L

begin

if L <> nil

then

Result:= L^.size

else//Список не существует

raise EListEmpty.Create('List is empty');//Result:= -1

end;

//------------------------------------------------------------------------------

function IsEmpty(L: PList): Boolean;

//Определяет пуст ли список L

begin

Result:= False;

if L <> nil

then

if L^.first = nil

then

Result:= True;

end;

//------------------------------------------------------------------------------

procedure AddRight(L: PList; E: T);

//Добавляет элемент к списку справа

begin

if (L <> nil)

then

with L^ do

case size of

0: begin

first:= CreateE(E);

last:= first;

inc(size)

end;

else

Last^.next:= CreateE(E);

Last:= Last^.next;

inc(size)

end

end;

//------------------------------------------------------------------------------

procedure AddLeft(L: PList; E: T);

//Добавляет элемент к списку слева

var p: PNode;

begin

if (L <> nil)

then

with L^ do

case size of

0: begin

first:= CreateE(E);

last:= first;

inc(size)

end;

else

p:= CreateE(E);

p^.next:= First;

First:= p;

inc(size)

end

end;

//------------------------------------------------------------------------------

function Tail(var L: PList): PList;

//Создает список, полученный выделением элементов хвоста списка L

//и возвращает указатель на него. В L остается голова исходного списка

begin

Result:= CreateL;

if Size(L) > 1

then

with Result^ do

begin

first:= L^.first^.next;

last:= L^.last;

size:= L^.size - 1;

L^.last:= L^.first;

L^.size:= 1;

L^.first^.next:= nil;

end;

end;

//------------------------------------------------------------------------------

function Tail_(var L: PList): PList;

//Создает список, полученный выделением элементов хвоста списка L (справа)

//и возвращает указатель на него. В L остается голова исходного списка

var

p: PNode;

begin

Result:= CreateL;

if Size(L) > 1

then

with Result^ do

begin

Result^:= L^;

last:= PredLast(L,p);

last:= p;

Last^.next:= nil;

size:= L^.size - 1;

L^.first:= L^.last;

L^.size:= 1;

end;

end;

//------------------------------------------------------------------------------

function Head(L: PList): T;

//Выделяет из списка L элемент списка, который является его головой,

//и возвращает указатель на него

var p: PNode;

begin

if L = nil

then//Список не существует

exit;

with L^ do begin

if size = 0

then // Список пуст

begin raise EListEmpty.Create('Список пуст'); exit end;

Result:= first^.key;

p:= first;

first:= first^.next;

dispose(p);

dec(size);

if size = 0

then

begin last:= nil; first:= nil end

end

end;

//------------------------------------------------------------------------------

function WatchHead(L: PList): T;

//Выделяет из списка ссылку на элемент, являющийся головой списка

begin

if L = nil

then//Список не существует

exit;

with L^ do begin

if size = 0

then // Список пуст

begin raise EListEmpty.Create('Список пуст'); exit end;

Result:= first^.key;

if size = 0

then

begin last:= nil; first:= nil end

end

end;

//------------------------------------------------------------------------------

function Head_(L: PList): T;

//Выделяет из списка L и удаляет узел, который является его головой (справа),

//и возвращает элемент списка, который находился в этом узле.

var

p,lst: PNode;//Указатели на предпоследний и последний узлы списка

begin

if L = nil then //Список не существует

exit;

if Size(L) > 0

then //Список не пуст

with L^ do

begin

Result:= last^.key;//возвратили элемент списка, находящийся в голове

lst:= PredLast(L,p);

dispose(lst);//освободили память из под последнего узла

size:= size - 1;

last:= p;

if size = 0

then first:= nil

else last^.next:= nil

end

else

raise EListEmpty.Create('Список пуст. Операция не определена.');

end;

//------------------------------------------------------------------------------

procedure EmptyList(L: PList);

//Опустошает список

begin

if L <> nil then

while L^.size <> 0 do Head(L)

end;

//------------------------------------------------------------------------------

procedure Merge(L,T: PList);

//Объединяет два списка

begin

if (T = nil) and (L = nil)

then exit;

if (IsEmpty(L) and IsEmpty(T)) or IsEmpty(T) then exit;

if IsEmpty(L) and not IsEmpty(T) then

begin

L^.first:= T^.first;

L^.size := T^.size;

L^.last := T^.last;

T^.size:= 0;

T^.first:= nil;

T^.Last:= nil;

exit;

end;

with L^ do

begin

Last^.next:= T^.First;

Last:= T^.Last;

size:= T^.size + size

end;

T^.size:= 0;

T^.first:= nil;

T^.Last:= nil;

end;

//------------------------------------------------------------------------------

procedure DelList(var L: PList);

//Удаляет список из памяти

begin

if L <> nil then begin

EmptyList(L);

Dispose(L);

L:= nil;

end

end;

end.

unit UStack;

interface

uses UList;

type

Stack = PList;

OrdStack = OrdList;

// --Операции на стеке----------------------------------------------------------

// --------------------Создать пустой стек--------------------------------------

function CreateStack: Stack;

// --------------------Выводит значения элементов стека в строку--------------

function StackToString(S:stack):string;

// --------------------Число элементов стека------------------------------------

function Size(S:stack):t;

// --------------------Голова стека --------------------------------------------

function Peek(S:stack):t;

// --------------------Стек пуст------------------------------------------------

function IsEmpty(var s:stack):boolean;

// --------------------Взять элемент стека------------------------------

function Pop(var s:stack):t;

// --------------------Добавить элемент в стек------------------------

procedure Push(var S:stack; a:t);

// --------------------Опустошить стек----------------------------------------

procedure EmptyStack(var s:stack);

//---------------------Освобождает выделенную под стек память-----------------

procedure DelStack(Var s:stack);

//---------------------Вставляет элемент в упорядоченный список-----------------

procedure InsertS(var o:ordstack; a:t);

implementation

procedure InsertS(var o:ordstack; a:t);

begin

inserto(o,a);

end;

//------------------------------------------------------------------------------

function CreateStack: Stack;

//Создаёт пустой стек

begin

Result:= CreateL;

end;

//------------------------------------------------------------------------------

function StackToString(S:stack):string;

//Значения стека в строку

begin

result:=ListToStr(s);

end;

//------------------------------------------------------------------------------

function Size(S:stack):t;

//Количество элементов в списке

begin

result:=size(s);

end;

//------------------------------------------------------------------------------

function Peek(S:stack):t;

//Выделение головы стека

begin

result:=WatchHead(s);

end;

//------------------------------------------------------------------------------

function IsEmpty(var s:stack):boolean;

//Если список пут, то возвращает True и наоборот

begin

result:=isempty(s);

end;

//------------------------------------------------------------------------------

function Pop(var s:stack):t;

begin

result:=head(s);

end;

//------------------------------------------------------------------------------

procedure Push(var S:stack; a:t);

begin

AddLeft(s,a);

end;

//------------------------------------------------------------------------------

procedure EmptyStack(var s:stack);

begin

EmptyList(s);

end;

//------------------------------------------------------------------------------

procedure DelStack(Var s:stack);

begin

DelList(s);

end;

//------------------------------------------------------------------------------

end.

program PStack;

{$APPTYPE CONSOLE}

uses

SysUtils,

windows,

UStack in 'UStack.pas',

UList in '..\..\..\..\..\Анастасия\Desktop\7 practics\7 practics\UList.pas';

var O: ordstack;

begin

SetConsoleCp(1251);

SetConsoleOutputCp(1251);

o:= CreateStack;

Push(o,1);

Push(o,3);

Push(o,2);

Push(o,5);

Push(o,4);

writeln(StackToString(o));

writeln('Head = ',peek(o));

DelStack(o);

readln;

end.

Соседние файлы в папке Зайцев М. Г.