Лабораторная работа Линейные списки
.DOCСанкт-Петербургский государственный
электротехнический университет «ЛЭТИ»
кафедра МОЭВМ
Лабораторная работа по программированию №4
«Линейные списки»
ОТЧЕТ
Факультет КТИ
группа 3341
студент Марьяскин Е.
Санкт-Петербург
2004 г.
Постановка задачи:
Удалить из линейного списка n элементов начиная с к-го.
Анализ решения:
Для решения задачи создан модуль, реализующий работу со списком. В нем три процедуры: добавляющая элемент в список, выводящая список на экран и реализующая действие, описанное в разделе «Постановка задачи». Эта функция представляет собой по сути два последовательных цикла: пролистывание всех элементов до n-ного и удаление последующих к элементов.
Для удобства использования программы и ее тестирования создано меню управляемое клавишами курсора и клавишей «Ввод»
Текст программы:
-
Модуль работы со списками:
Unit List2;
interface
Uses Crt;
procedure AddEl(Newdate:Integer);
function PrintList:Boolean;
function Clean(var First,Col:Integer):Integer;
implementation
type
pList = ^tList;
tList = record
Date:Integer;
Next: pList
end;
ppList = ^pList;
var
List_:pList;
procedure Create;
begin
List_:=nil
end;
procedure AddEl(Newdate:Integer);
var
NewEl:pList;
begin
New(NewEl);
NewEl^.Date:=Newdate;
NewEl^.Next:=List_;
List_:=NewEl;
end;
function PrintList:Boolean;
var
Counter:pList;
begin
Counter:=List_;
If Counter = nil then
Printlist:=false
else
begin
Write('Список: ');
PrintList:=True;
while Counter<>Nil do
begin
write(Counter^.Date,' ');
Counter:=Counter^.Next
end;
end
end;
function Clean(var First,Col:Integer):Integer;
var
I,AllCol:Integer;
Cur:ppList;
Old:pList;
begin
AllCol:=Col;
clrscr;
Cur:=@List_;
while (Cur^ <> nil) and (First > 1) do
begin
Cur:=@(Cur^^.Next);
First:=First-1
end;
if Cur^ = nil then
begin
Clean:=1;
exit
end;
while (Col > 0) and (Cur^ <> nil) do
begin
Old:=Cur^;
Cur^:=Cur^^.Next;
Dispose(Old);
Col:=Col-1
end;
If Col>0 then
begin
Clean:=2+ AllCol-Col;
exit
end
else
Clean:=0
end;
begin
Create
end.
-
программа:
Uses Crt, List2;
procedure Otstup(X:Integer); var I:Integer;
begin
For I:=1 to X do
WriteLn
end;
procedure Menu;
var
X,Y,E,I,D,State,First,Col,Newdate:Integer;
Exit:Boolean;
begin
Exit:=false;
State:=1;
While not(Exit) do
begin
clrscr;
For I:=1 to 4 do
begin
Y:=I*3;
X:=10;
gotoXY(X,Y);
If I=State then
begin
Textbackground(blue);
Textcolor(white);
If I=1 then
write('1) Добавление элемента.');
If I=2 then
write('2) Удаление K элементов, начиная с N-ного.');
If I=3 then
write('3) Вывести список на экран.');
If I=4 then
write('4) Выход.')
end
else
begin
Textbackground(black);
Textcolor(white);
If I=1 then
write('1) Добавление элемента.');
If I=2 then
write('2) Удаление K элементов, начиная с N-ного.');
If I=3 then
write('3) Вывести список на экран.');
If I=4 then
write('4) Выход.')
end
end;
Textbackground(black);
Textcolor(white);
E:=ord(readkey);
If E=0 then
begin
E:=ord(readkey);
If E=72 then
If State=1 then
State:=4
else State:=State-1
Else
If E=80 then
If State=4 then
State:=1
else State:=State+1
end
else
If E=13 then
begin
case State of
1: begin
clrscr;
writeLn('Выбран вариант 1...');
Otstup(3);
write('Введите новый элемент: ');
read(Newdate);
AddEl(Newdate);
Otstup(3);
writeLn('Элемент был успешно добавлен в список...');
readkey
end;
2: begin
clrscr;
writeLn('Выбран вариант 2...');
Otstup(3);
write('Введите номер первого из удаляемых элементов');
ReadLn(First);
Otstup(2);
write('Введите количество удаляемых элементов: ');
ReadLn(Col);
D:=Clean(First,Col);
otstup(10);
If D=1 then
begin
WriteLn('Ошибка! В списке нет удаляемых элементов...');
WriteLn;
WriteLn('Невозможно завершить удаление.')
end
else
If D=0 then
begin
WriteLn('Элементы успешно удалены...')
end
else
begin
WriteLn('Ошибка! Невозможно удалить все элементы...');
WriteLn;
Write(D-2,' элемент(ов) было удалено.')
end;
readkey
end;
3: begin
clrscr;
WriteLn('Выбран вариант 3...');
Otstup(3);
If not(printList) then
writeLn('Лист пуст!');
readkey
end;
4: begin
Exit:=true
end;
end
end
end
end;
begin
Menu
end.
Тестирование работы программы:
В этом разделе приведены тесты, которых достаточно на взгляд разработчика программы для того, чтобы убедиться в корректности ее работы, так как позволяют изучить все возможные случаи. Они представлены в виде последовательных действий (заключенных в знак «»), и отображения списка, даваемое процедурой PrintList
«Добавить элемент 5»
5
«Добавить элемент 4»
4 5
«Добавить элемент 3»
3 4 5
«Добавить элемент 2»
2 3 4 5
«Добавить элемент 2»
1 2 3 4 5
«удалить 3 элемента, начиная с 6-го»
Ошибка! В списке нет элементов, которые необходимо удалить!
Невозможно завершить удаление.
1 2 3 4 5
«удалить 3 элемента, начиная с 5-го»
Ошибка! Невозможно удалить заданное количество элементов.
1 элемент(ов) было удалено
1 2 3 4
«удалить 2 элемента, начиная с 1-го»
Элементы успешно удалены.
3 4