1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Var A:array [1..n] of listPtr; {massiv uravneniy} Aravno:array[1..n] of integer; {Massiv ravno} i,nomer:word;
constructor list.init (nom,g:word); {nom-nomer koeff-ta; g- kol-vo nenulevih koeff-tov} Var exists:integer; begin if (nom<=n) and (g<=k) then begin exists:=random(2); {est' ili net} if exists<>0 then begin barier:=false; barier:=false; nomer:=nom; koeff:=random(50)+1; new(Next); next^.init(nom+1,g+1); end else init(nom+1,g); end else begin barier:=true; Aravno[i]:=random(51); end; end;
procedure list.print (first:boolean); begin if not barier then begin if first then write(koeff,'x',nomer) else write(' + ',koeff,'x',nomer); first:=false; next^.print(first); end else writeln(' = ',Aravno[i]); end;
begin clrscr; randomize; for i:=1 to n do begin new(a[i]); a[i]^.Init(1,1); end; for i:=1 to n do begin write(i,') '); a[i]^.print(true); end; readln; end.
теперь необходимо написать 2 разных метода, первый из которых должен оставлять исходный объект без изменений, а второй - применять информационные элементы исходного объекта при формировании двусвязного списка. Каждый из этих двух методов должен иметь в качестве параметра указатель на формируемый двусвязный список. Второй метод (освобождающий память) должен быть деструктором. Прочитал FAQ, пробовал наследованием. Получается так :
Var A:array[1..n] of listPtr; {massiv uravneniy} Aravno,Bravno:array[1..n] of integer; {Massiv ravno} B:array[1..n] of list2Ptr; i,nomer:word;
constructor list.init (nom,g:word); {nom-nomer koeff-ta; g- kol-vo nenulevih koeff-tov} Var exists:integer; begin if (nom<=n) and (g<=k) then begin exists:=random(2); {est' ili net} if exists<>0 then begin barier:=false; barier:=false; nomer:=nom; koeff:=random(50)+1; new(Next); next^.init(nom+1,g+1); end else init(nom+1,g); end else begin barier:=true; Aravno[i]:=random(51); end; end;
procedure list.print (first:boolean); begin if not barier then begin if first then write(koeff,'x',nomer) else write(' + ',koeff,'x',nomer); first:=false; next^.print(first); end else writeln(' = ',Aravno[i]); end;
constructor list2.Init2; begin init(1,1); new(next2); next2^.barier:=next^.barier; next2^.nomer:=next^.nomer; next2^.koeff:=next^.koeff; next2^.prev:=prev^.next2; end; procedure list2.print2(first2:boolean); begin if not barier then begin if first2 then write(koeff,'x',nomer) else write(' + ',koeff,'x',nomer); first2:=false; next2^.print(first2); end else writeln(' = ',bravno[i]); end;
begin clrscr; randomize; for i:=1 to n do begin new(b[i]); b[i]^.Init2; bravno[i]:=aravno[i]; end; for i:=1 to n do begin write(i,') '); b[i]^.print2(true); end; readln; end.
правда еще не используется prev, но проблема в другом Сначала второй инит был таким:
constructor list2.Init2; begin init(1,1); new(next2); next2^.barier:=next^.barier; next2^.nomer:=next^.nomer; next2^.koeff:=next^.koeff; next2^.prev:=prev^.next2; end;
При этом из первого коэф-нта просто навсего по Next создавался односвязный список, а параллельно в next2 оставался nil, теперь, как я понял, еще копируется последний коэф-нт Судя по всему осталась задача раскрыть init и сразу пересохранять информацию из next в next2, а заодно указать prev. Помогите, люди, плз. Я уже в конец запутался в этой задаче, буду очень признателен