Лабораторная работа Л-1 списки
.DOCСанкт-Петербургский государственный
электротехнический университет «ЛЭТИ»
кафедра МОЭВМ
Лабораторная работа по программированию №5
«Л-1» списки»
ОТЧЕТ
Факультет КТИ
группа 3341
студент Марьяскин Е.
Санкт-Петербург
2004 г.
Постановка задачи:
1) Вставить элемент в список перед элементами с заданным значением.
2) Заменить значение элементов с заданным значением на новое значение (задаваемое пользователем).
Анализ решения:
Для решения задачи создан модуль, реализующий работу со списками. В нем несколько процедур процедуры: инициализирующая список, добавляющая элемент в список на позицию перед текущей (или в начало, если список пуст), выводящая список на экран и две, реализующие действия, описанное в разделе «Постановка задачи». Эти функции схожи и представляют собой по сути пролистывание всех элементов списка и выполнения в случае нахождения нужного значения заданных операций.
Для удобства использования программы и ее тестирования создано меню управляемое клавишами курсора и клавишей «Ввод».
Текст программы:
-
Модуль описания типа значения элементов списка:
Unit Info;
Interface
type
tInfo=Integer;
Implementation
begin
end.
2) Модуль работы со списками:
Unit List4;
interface
Uses Crt, Info;
type
pList = ^tList;
tList = record
Date:tInfo;
Next: pList
end;
UsedList = record
L,Cur,Pred:pList
end;
pUList = ^UsedList;
ppList = ^pList;
procedure Create(vList_:pUList);
procedure Add_before_cur_pos(var vList_:pUList;Newdate:tInfo);
procedure Add_before_chosen_date(var vList_:pUList;Newdate,ChDate:tInfo);
function PrintList(var vList_:pUList):Boolean;
procedure Change_by_chosen_date(var vList_:pUList;NewDate,OldDate:tInfo);
Implementation
procedure Create(vList_:pUList);
begin
vList_^.L:=Nil;
vList_^.Pred:=Nil;
vList_^.Cur:=Nil;
end;
procedure Add_before_cur_pos(var vList_:pUList;Newdate:tInfo);
var
NewEl:pList;
begin
New(NewEl);
NewEl^.Date:=Newdate;
NewEl^.Next:=vList_^.Cur;
If vList_^.Pred=Nil then
begin
vList_^.L:=NewEl;
vList_^.Cur:=NewEl
end
else
begin
vList_^.Pred^.Next:=NewEl;
vList_^.Cur:=NewEl
end
end;
procedure Add_before_chosen_date(var vList_:pUList;Newdate,ChDate:tInfo);
var
NewEl:pList;
begin
vList_^.Cur:=vList_^.L;
vList_^.Pred:=Nil;
while vList_^.Cur<>Nil do
begin
If vList_^.Cur^.Date=ChDate then
begin
Add_before_cur_pos(vList_,Newdate);
vList_^.Pred:=vList_^.Cur;
vList_^.Cur:=vList_^.Cur^.Next
end;
vList_^.Pred:=vList_^.Cur;
vList_^.Cur:=vList_^.Cur^.Next
end
end;
function PrintList(var vList_:pUList):Boolean;
begin
vList_^.Cur:=vList_^.L;
If vList_^.Cur = nil then
Printlist:=false
else
begin
Write('Список: ');
PrintList:=True;
while vList_^.Cur<>Nil do
begin
write(vList_^.Cur^.Date,' ');
vList_^.Pred:=vList_^.Cur;
vList_^.Cur:=vList_^.Cur^.Next
end;
end
end;
procedure Change_by_chosen_date(var vList_:pUList;NewDate,OldDate:tInfo);
begin
vList_^.Cur:=vList_^.L;
vList_^.Pred:=vList_^.L;
while vList_^.Cur<>Nil do
begin
If vList_^.Cur^.Date=OldDate then
begin
vList_^.Cur^.Date:=NewDate
end;
vList_^.Pred:=vList_^.Cur;
vList_^.Cur:=vList_^.Cur^.Next
end
end;
begin
end.
-
программа:
Uses Crt, List4, Info;
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:Integer;
Newdate,ChDate:tInfo;
pL:pUList;
Exit:Boolean;
begin
Exit:=false;
State:=1;
New(pL);
Create(pL);
While not(Exit) do
begin
clrscr;
For I:=1 to 5 do
begin
Y:=I*2;
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) Добавить элемент перед данным значением.');
If I=3 then
write('3) Заменить элемент по заданному значению.');
If I=4 then
write('4) Вывести список.');
If I=5 then
write('5) Выход.')
end
else
begin
Textbackground(black);
Textcolor(white);
If I=1 then
write('1) Добавить элемент перед текущим.');
If I=2 then
write('2) Добавить элемент перед данным значением.');
If I=3 then
write('3) Заменить элемент по заданному значению.');
If I=4 then
write('4) Вывести список.');
If I=5 then
write('5) Выход.')
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:=5
else State:=State-1
Else
If E=80 then
If State=5 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);
Add_before_Cur_pos(pL,Newdate);
Otstup(3);
writeLn('Элемент добавлен в список...');
readkey
end;
2: begin
clrscr;
writeLn('Выбран вариант 2...');
Otstup(3);
write('Введите новый элемент: ');
ReadLn(Newdate);
Otstup(2);
write('Введите нужное значение: ');
ReadLn(ChDate);
Otstup(3);
Add_before_chosen_date(pL,Newdate,ChDate);
writeLn('Элементы добавлены в список...');
readkey;
end;
3: begin
clrscr;
writeLn('Выбран вариант 3...');
Otstup(3);
write('Введите новое значение: ');
ReadLn(Newdate);
Otstup(2);
write('Введите изменяемое значение: ');
ReadLn(ChDate);
Otstup(3);
WriteLn('Элементы заменены...');
Change_by_chosen_date(pL,Newdate,ChDate);
readkey
end;
4: begin
clrscr;
WriteLn('Выбран вариант 4...');
Otstup(3);
If not(printList(pL)) then
writeLn('Список пуст');
readkey
end;
5: begin
Exit:=true
end;
end
end
end
end;
begin
Menu
end.
Тестирование работы программы:
В этом разделе приведены тесты, которых достаточно на взгляд разработчика программы для того, чтобы убедиться в корректности ее работы, так как позволяют изучить все возможные случаи. Они представлены в виде таблицы, где левая графа – последовательные действия, а правая - отображение списка, даваемое процедурой PrintList.
|
Список пуст! |
Добавить элемент 3 |
3 |
Добавить элемент 2 |
2 3 |
Добавить элемент 1 |
1 2 3 |
Добавить элемент 3 перед 2 |
1 3 2 3 |
Заменить элемент 1 на 3 |
3 3 2 3 |
Добавить элемент 2 перед 3 |
2 3 2 3 2 2 3 |
Заменить элемент 3 на 1 |
2 1 2 1 2 2 1 |
Добавить элемент 5 перед 2 |
5 2 1 5 2 1 5 2 5 2 1 |