nixp.ru v3.0

28 мая 2017,
воскресенье,
02:17:34 MSK

DevOps с компанией «Флант»
t3st3r написал 6 июня 2007 года в 23:38 (418 просмотров) Ведет себя неопределенно; открыл 11 тем в форуме, оставил 14 комментариев на сайте.

program var4;

Const N=5;

Type vec = array [1..N] of integer;

sp = ^spisok;

spisok = record

ind: integer; {индекс}

zn: integer; {коэффициент}

next: sp;

end;

TList = object

ur: sp; {переменная для использования списка}

otv: integer; {свободный член уравнения}

constructor Init; {инициализация списка}

destructor Done; {деструктор объекта}

procedure Add(x: integer); {процедура добавления элемента в список}

procedure Delete(i: integer); {процедура удаления элемента}

function GetKol: integer; {получение количества элементов}

function GetFirst: sp; {получение ссылки на первый элемент}

function Neviazka(var a: vec): integer;

private {ограничение доступа к полям}

first: sp; {первый элемент}

kol: integer; {количество элементов}

end;

sp1 = ^TEq;

TEq = object {список уравнений}

eq: TList;

next: sp1;

constructor Init;

destructor Done;

end;

Var eqs, first: sp1;

a: vec;

m1, m2: integer;

constructor TEq.Init;

begin

next:= nil;

end;

destructor TEq.Done;

begin

eq.Done;

end;

constructor TList.Init;

begin

ur:= nil;

first:= nil;

first^.ind:=1;

kol:= 0;

{writeln(’first=nil’);}

end;

destructor TList.Done;

var t, s:sp;

begin

t:=first;

while t<>nil do begin

s:=t;

t:=t^.next;

dispose (s); end;

end;

procedure TList.Add(x: integer);

var r: sp;

begin

if first=nil then

begin

new (first);

first^.ind:= 1;

first^.zn:= x;

first^.next:= nil;

kol:= 1;

end else

begin

new(r);

r^.ind:= 1;

r^.zn:= x;

r^.next:= nil;

ur:= first;

while ur^.next <> nil do ur:= ur^.next;

ur^.next:= r;

inc (kol);

end;

end;

procedure TList.Delete(i: integer);

var p: sp; h: integer;

begin

if (kol<>0) and (i<=kol) then

begin

if i<>1 then

begin

ur:= first;

while ur^.ind<>i do ur:= ur^.next;

p:= ur^.next;

ur^.next:= p^.next;

dispose (p);

end else

begin

p:= first;

first:= first^.next;

dispose (p);

end;

end;

end;

function TList.GetKol: integer;

begin

GetKol:= kol;

end;

function TList.GetFirst: sp;

begin

GetFirst:= first;

end;

function TList.Neviazka (var a: vec): integer;

var i: integer;

s: integer;

begin

ur:= first;

s:=0;

for i:=1 to N do

begin

s:= s+ a*ur^.zn;

ur:= ur^.next;

end;

Neviazka:= abs (otv-s);

end;

begin {пример использования}

new (first, Init); {выделяется память под первый элемент — первое уравнение системы}

first^.eq.Add(1); {добавяются коэффициенты}

first^.eq.Add(2);

first^.eq.otv:=7;

new (eqs, Init); {выделяется память под следующий элемент, для большого числа уравнений это надо делать в цикле}

eqs^.eq.Add (3);

eqs^.eq.Add (4);

eqs^.eq.otv:=9;

first^.next:= eqs; {ссылка предыдущего элемента указываеи на текущий}

eqs^.next:=nil;

a[1]:=3; {задаём массив корней уранений}

a[2]:=5;

m1:=first^.eq.Neviazka (a); {считаем невязку для первого}

m2:=eqs^.eq.Neviazka(a); {делаем то же для второго}

writeln (m1, ' ', m2); {я просто вывожу на экран, Вам же надо искать максимум}

end.

вылетает с ошибкой на процедуре TList.Add, в чем ошибка?

Code Monkey

ты бы хоть сказал, что за ошибка.

могу предположить, что не объявлена переменная ur. больше там особых огрехов вроде не вижу.

З.Ы. ненавижу паскаль.

Heavy

ur: sp; {переменная для использования списка} — с этим всё ок.

Но таки придётся сказать, что за ошибка и что за программа