Зайцев М. Г. / 7
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИИ
Новосибирский государственный технический университет
ЛАБОРАТОРНАЯ РАБОТА № 8
по курсу «Информатика и программирование»
«Типизированные файлы»
Факультет бизнеса
Группа: ФБИ-11
Студенты: Рыбаченко А.А.
Преподаватель: Зайцев М.Г.
Новосибирск
2012г.
Практическая работа. Типизированный файл
Цель: Сформировать практические навыки обработки данных хранящихся в файлах на внешних запоминающих устройствах с помощью средств Object Pascal.
Задание
-
Посчитать количество вхождений заданного значения в файл.
-
Отыскать "минимальный" или "максимальный" элемент в файле и вывести на экран его значение и номер его позиции в файле.
-
Выполните задание для следующих типов констант:
word;
real;
r = record
x: real;
y: real;
z: real;
end;
char;
r1 = set of 0...47.
"Минимальный" и "максимальный" элемент для типа r следует понимать как точку в трехмерном пространстве с координатами X,Y,Z минимально и максимально удаленную от начала координат. Под размером константы множественного типа следует понимать мощность изображаемого ею множества.
-
Удалить все вхождения заданного значения в файл.
-
Найти номера позиций заданного значения в файле и сохранить их во вновь созданном файле.
-
Отсортировать типизированный файл, используя динамический массив. Сортировку выполнить метод пузырька, выбором.
-
Отсортировать типизированный файл. Сортировку выполнить метод пузырька, выбором.
Текст программы:
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.