Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Билет 17. Кольцевые списки.
Кольцевые списки, т.е. списки, у которых первый и последний элементы связаны непосредственной связью. Такие списки позволяют осуществлять просмотр (доступ к любому элементу) не только от головы списка, но и от любого элемента списка. При создании кольцевого списка обычно сначала создается "пустой кольцевой список", у которого имеется один элемент, указывающий сам на себя (замкнутый в кольцо). Остальные элементы включаются в этот список друг за другом. Проиллюстрируем работу с кольцевым двунаправленным списком на примере программы, вычисляющей кратчайший путь между станциями кольцевой линии метро.
program RING_METRO; {Кольцевая линия Московского метро}
type link=^nest;nest=record forw,back:link;inf:string end;
var r,r1,start:link;f:text;c,c1,c2:string;dir:Boolean;L:byte;
procedure insert(el1,el2:link);{вставка el2 после el1}
begin el2^.forw:=el1^.forw;el2^.back:=el1;el1^.forw^.back:=el2;el1^.forw:=el2;
end{insert};
procedure dir_path(var d:Boolean;s1,s2:string);{направление}
var g:link;j1,j2:byte;er1,er2:Boolean;
begin j1:=0;j2:=0;g:=start;er1:=false;er2:=false;
repeat g:=g^.forw; if g^.inf=s1 then
repeat g:=g^.forw;j1:=j1+1;er1:=(g^.inf=s1);d:=(2*j1<L);
until (g^.inf=s2) or (g^.inf=s1) else if g^.inf=s2 then
repeat g:=g^.forw;j2:=j2+1;er2:=(g^.inf=s2);d:=(2*j2>L);
until (g^.inf=s1) or (g^.inf=s2);
until (g=start) or (g^.inf=s1) or (g^.inf=s2);if er1 or er2 then
begin write('Ошибка в названии ');
if er1 then write('конечной') else write('начальной');writeln(' станции');halt
end; if j1+j2=0 then begin writeln('Ошибка в названиях станций');halt end
end {dir_path};
procedure write_path(d:Boolean;s1,s2:string);{кратчайший путь}
var p:link;
begin p:=start; while not(p^.inf=s1) do p:=p^.forw;
repeat writeln(p^.inf);if d then p:=p^.forw else p:=p^.back;
until (p^.inf=s2) ; writeln(p^.inf);
end {write_path};
BEGIN writeln('КОЛЬЦЕВАЯ ЛИНИЯ МОСКОВСКОГО МЕТРО');
new(start);r:=start;r^.forw:=r;r^.back:=r;assign(f,'names_st');{$I-}reset(f);{$I+};
if IOResult<>0 then begin writeln('Не найден файл names_st');halt end;
L:=1;readln(f,r^.inf);while not eof(f) do{создание кольца }
begin readln(f,c);new(r1);insert(r,r1);r1^.inf:=c;r:=r1;L:=L+1 end;
writeln('Задайте начальную и конечную станции:'); readln(c1);readln(c2); dir_path(dir,c1,c2); writeln('Кратчайший путь:');write_path(dir,c1,c2);
END{ring_metro}.
Найти максимальный среди отрицательных и минимальный среди положительных элементов прямоугольной матрицы. если они отличаются по модолю меньше чем на заданную величину, заменить все отриц элементы их модулями.
program z_433_17;
program Z433_17;
uses Z433_17;
Var a:matr;
max,min,eps:real;
i,j:integer;
Begin
for i:=1 to n do
for j:=1 to t do
readln(a[i,j]);
readln(eps);
max(a,max);
min(a,min);
if abs(max-min)<eps then Begin
for i:=1 to n do
for j:=1 to t do
if a[i,j]<0
then a[i,j]:=abs(a[i,j]); end;
for i:=1 to n do
for j:=1 to t do
writeln(a[i,j]);
end.
unit Z433_17;
interface
Const n=5;
Const m=6;
Type matr=array[1..n,1..m]of real;
procedure max(a:matr;Var max:real);
procedure min(a:matr;Var min:real);
implementation
procedure max(a:matr;Var max:real);
Var i,j:integer;
Begin
for i:=1 to n do
for j:=1 to m do
if a[i,j]<0 then max:=abs(a[i,j]);
for i:=1 to n do
for j:=1 to m do
if a[i,j]<0 and abs(a[i,j])<max
then max:=abs(a[i,j]);
end;
procedure min(a:matr;Var min:real);
Var i,j:integer;
Begin
for i:=1 to n do
for j:=1 to m do
if a[i,j]>0 then min:=a[i,j];
for i:=1 to n do
for j:=1 to t do
if a[i,j]>0 and abs(a[i,j])<min
then min:=abs(a[i,j]);
end;
end.