
2. Теоретические сведения
Повторить теоретические сведения лабораторной работы №2-6.
Рассмотрим способ вставки и удаления элементов списка по ключу на примере.
Пример.
Составить программу, которая формирует список, добавляет в него произвольное количество компонент, выполняет вставку и удаление компоненты по ключу, а затем читает и выводит весь список на экран дисплея. В качестве данных взять строку символов. Ввод данных – с клавиатуры дисплея, признак конца ввода - строка символов END (Приложение 4).
Для чтения и вставки компоненты по ключу необходимо выполнить поиск компоненты с заданным ключом:
pCKey:=pBegin;
while (pCKey<>NIL) and (Key<>pCKey^.D) DO
pCKey:=pCKey^.pNext;
Здесь Key - ключ, тип которого совпадает с типом данных компоненты. После выполнения этих операторов указатель pСKey будет определять компоненту с заданным ключом или такая компонента не будет найдена.
Пусть pCKey определяет компоненту с заданным ключом. Вставка новой компоненты выполняется процедурой InsComp (Приложение 4).
Для удаления компоненты с заданным ключом необходимо при поиске нужной компоненты помнить адрес предшествующей:
pCKey:=pBegin;
while (pCKey<>NIL) and (Key<>pCKey^.D) do
begin
pPreComp:=pCKey;
pCKey:=pCKey^.pNext
end;
Здесь указатель pCKey определяет компоненту с заданным ключом, указатель pPreComp содержит адрес предыдущей компоненты.
Удаление компоненты с ключом Key выполняется процедурой DelComp (Приложение 4).
4.ОФОРМЛЕНИЕ ОТЧЕТА
Отчет о работе должен содержать номер, название и цель работы, ответы на контрольные вопросы, текст программы и результат выполнения программы.
5.КОНТРОЛЬНЫЕ ВОПРОСЫ
1. type ref:^integer;
var p,q:ref;
Что будет выдано на печать в результате выполнения операторов?
p^:=q^;
if p=q then p:=nil else if p^=q^ then q:=p;
if p=q then q^:=4;writeln(p^);
2. Почему объекты (переменные), создаваемые процедурой new и уничтожаемые процедурой dispose, называют динамическими? Почему им не дают имена?
3. Допустимы ли в языке Паскаль нижеприведенные конструкции? Ответ обосновать.
p^[2]
q^+2
r^^
6. ВАРИАНТЫ ЗАДАНИЙ
№ задания |
1 |
2 |
3 |
4 |
1 |
2 |
3 |
4 |
№ по журналу |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Создать однонаправленный список, элементы списка целые числа, признак окончания ввода элементов число 0.
1. Удалить из списка первый отрицательный элемент.
2. Продублировать в списке все числа, равные введенному с клавиатуры числу.
3. Удалить из списка все вхождения введенного с клавиатуры числа.
4. Добавить в список за каждым отрицательным числом его абсолютное значение.
{построение графика функции} Приложение 1.
program groffunc;
uses Graph,Crt;
var
x1,x2:real;{границы изменения аргумента функции}
y1,y2:real;{границы изменения значения функции }
x:real;{аргумент функции }
y:real;{значение функции в точке х}
dx:real;{приращение аргумента }
l,b: integer;{левый нижний угол области вывода графика}
w,h: integer; {ширина и высота области вывода графикa}
mx,my:real;{масштаб по осям Х и Y }
x0, y0: integer; { точка - начало координат }
st: string;{ изображение числа }
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
Function f(x:real):real;
begin
{f:=2*Sin(x)*exp(x/5) ;}
f:=sin(x);
end;
BEGIN
grDriver := Detect;
InitGraph(grDriver, grMode,'f:\bp\bgi') ;
ErrCode := GraphResult;
if ErrCode <> grOk then Halt(1);
l:=10;b:=450;h:=400;w:=400;
x1:=0;
x2:=25;
dx:=0.01;
{ найдем максимальное и минимальное значения
функции на отрезке [x1,x2] }
y1:=f(x1); { минимум }
y2:=f(x1); { максимум }
x:=x1;
repeat
y:=f(x);
if y<y1 then y1:=y;
if y>y2 then y2:=y;
x:=x+dx;
until (x>=x2) ;
my:=h/abs(y2-y1) ;
mx:=w/abs(x2-x1) ;
{ оси }
x0:=1;
y0:=b-Abs(Round(y1*my)) ;
Line(1,b,1,b-h) ;
Line(x0,y0,x0+w,y0) ;
Str(y2:5:1,st) ;
OutTextXY(1+5,b-h,st) ;
Str(y1:5:1,st) ;
OutTextXY(1+5,b,st) ;
{ построение графика }
x:=x1;
repeat
y:=f(x);
PutPixel(x0+Round(x*mx),y0-Round(y*my),red) ;
x:=x+dx;
delay(20);
until (x>=x2);
Readln;
CloseGraph;
END.
unit massiv;{объявление массива и его заполнение} Приложение 2.
interface{раздел объявлений}
type matric=array[1..50] of real; {библиотечные типы}
var a,b:array[1..50] of matric;{библиотечные переменные}
n,m,i,j:byte;
implementation {раздел реализации}
END.
Unit load;
interface {раздел объявлений}
uses massiv;{использованные при объявлениях модули}
procedure vvod;{библиотечная процедура}
implementation {раздел реализации}
uses crt;{использованные при реализации модули}
procedure vvod;
begin
writeln('Введите массив.');
writeln('Размерность массива:');
write('число строк n=');readln(n);
write('число столбцов m=');readln(m);
for i:=1 to n do
for j:=1 to m do
begin
write('a(',i,',',j,')=');readln(a[i,j]);
end;
writeln('Массив заполнен.');
end;
BEGIN {блок инициализации}
ClrScr; {очистка экрана}
END.
unit nahodka; {модуль, содержащий процедуры
нахождения наибольшего по модулю эл-та
исходной матрицы и формированию новой
матрицы путем деления эл-тов исходной
матрицы на этот элемент}
interface {раздел объявлений}
uses massiv,load;{использованные при объявлениях модули}
var t:real; {библиотечные переменные}
procedure max; {библиотечная процедура}
procedure delenie;{библиотечная процедура}
implementation {раздел реализации}
procedure max;
begin
for i:=1 to n do
for j:=1 to m do
if abs(a[i,j])>abs(t) then t:=a[i,j];
end;
procedure delenie;
begin
for i:=1 to n do
for j:=1 to m do
b[i,j]:=a[i,j]/t;
end;
END.
program realiz;
uses crt,massiv,load,nahodka;
label 1,2;
BEGIN
vvod;
max;
delenie;
j:=1;
1:for i:=1 to n do begin
write(a[i,j]:5:2,' ');writeln;end;
j:=j+1;
if (j<m) or (j=m) then goto 1;
writeln;
j:=1;
2:for i:=1 to n do begin
write(b[i,j]:5:2,' ');writeln;end;
j:=j+1;
if (j<m) or (j=m) then goto 2;
writeln;
repeat until keypressed;
END.
Приложение 3.
Program Primer;
uses Crt;
type
Alfa= integer;
PComp= ^Comp;
Comp= record
D:Alfa;
pNext:PComp
end;
var
pBegin, pEnd, pAux, pFlag: PComp;
n: Alfa;
{начальное формирование списка}
Procedure CreateLL(var pBegin,pEnd: PComp; var n: Alfa);
begin
New(pBegin);
pBegin^.pNext:=NIL;
pBegin^.D:=n;
pEnd:=pBegin
end;
{добавление компонент в конец списка}
Procedure AddLL(var pEnd: PComp; var n: Alfa);
var pAux: PComp;
begin
New(pAux);
pAux^.pNext:=NIL;
pEnd^.pNext:=pAux;
pEnd:=pAux;
pEnd^.D:=n
end;
BEGIN
ClrScr;
writeln(' ВВЕДИ ЧИСЛО ');
readln(n);
CreateLL(pBegin,pEnd,n);
repeat
writeln('ВВЕДИ ЧИСЛО ');
readln(n);
AddLL(pEnd,n)
until n=0;
ClrScr;
writeln(' ***** ВЫВОД ИСХОДНОГО СПИСКА *****');
pAux:=pBegin;
repeat
writeln(pAux^.D);
pAux:=pAux^.pNext;
until pAux=NIL;
END.
Приложение 4.
Program LISTLINKED;
uses Crt;
type
Alfa= String[10];
PComp= ^Comp;
Comp= record
sD:Alfa;
pNext:PComp
end;
var
pBegin, pEnd, pAux, pCKey, pPreComp: PComp;
sC, sKey: Alfa;
bCond: Boolean;
Procedure CreateLL(var pBegin,pEnd: PComp; var sC: Alfa);
begin
New(pBegin);
pBegin^.pNext:=NIL;
pBegin^.sD:=sC;
pEnd:=pBegin
end;
Procedure AddLL(var pEnd: PComp; var sC: Alfa);
var pAux: PComp;
begin
New(pAux);
pAux^.pNext:=NIL;
pEnd^.pNext:=pAux;
pEnd:=pAux;
pEnd^.sD:=sC
end;
Procedure Find(var sKey: Alfa; var pBegin,pCKey,pPreComp: PComp;
var bCond: Boolean);
begin
pCKey:=pBegin;
while (pCKey <> NIL) and (sKey <> pCKey^.D) do
begin
pPreComp:=pCKey;
pCKey:=pCKey^.pNext
end;
if (pCKey = NIL) and (sKey <> pCKey^.sD) then bCond:=FALSE
else bCond:=TRUE
end;
Procedure InsComp(var sKey,sC: Alfa);
var pAux:PComp;
begin
Find(sKey,pBegin,pCKey,pPreComp,bCond);
New(pAux);
pAux^.sD:=sC;
pAux^.pNext:=pCKey^.pNext;
pCKey^.pNext:=pAux
end;
Procedure DelComp(var sKey: Alfa; var pBegin: PComp);
begin
Find(sKey,pBegin,pCKey,pPreComp,bCond);
pPreComp^.pNext:=pCKey^.pNext
end;
begin
ClrScr;
writeln(' ВВЕДИ СТРОКУ ');
readln(sC);
CreateLL(pBegin,pEnd,sC);
repeat
writeln('ВВЕДИ СТРОКУ ');
readln(sC);
AddLL(pEnd,sC)
until sC='END';
writeln(' ***** ВЫВОД ИСХОДНОГО СПИСКА *****');
pAux:=pBegin;
repeat
writeln(pAux^.sD);
pAux:=pAux^.pNext;
until pAux=NIL;
writeln;
writeln('ВВЕДИ КЛЮЧ ДЛЯ ВСТАВКИ СТРОКИ');
readln(sKey);
writeln('ВВЕДИ ВСТАВЛЯЕМУЮ СТРОКУ');
readln(sC);
InsComp(sKey,sC);
writeln;
writeln('ВВЕДИ КЛЮЧ УДАЛЯЕМОЙ СТРОКИ');
readln(sKey);
DelComp(sKey,pBegin);
writeln;
writeln(' ***** ВЫВОД ИЗМЕНЕННОГО СПИСКА *****');
pAux:=pBegin;
repeat
writeln(pAux^.sD);
pAux:=pAux^.pNext;
until pAux=NIL
end.