Консультация № 180474
28.10.2010, 06:46
0.00 руб.
0 19 1
Добрый день дорогие эксперты!
Требуется написать на Паскале ABC решение вот этой лабораторной, в которой я 19 вариант.
Лабораторная работа # 5

В ней необходимо реализовать модуль работы с линейным списком(в моем случае он располагается в динамической памати.
И в конце модуля нужно решить задачу данного варианта... смотрите по таблице номер задачи соответствующего варианта...

Ответ оформить тут как задача на ABC в которой находятся все процедуры из модуля и приведено решение задачи.

Заранее благодарен!

Обсуждение

Неизвестный
28.10.2010, 10:22
общий
Юдин Евгений Сергеевич:
Юдин Евгений Сергеевич! А насколько в рублях Вы заранее благодарны?
Неизвестный
28.10.2010, 11:20
общий
Цитата: 422
Стоимость консультации: бесплатная консультация

помоему бесплатный вопрос. было бы больше денег задал бы платный.....
Неизвестный
28.10.2010, 11:53
общий
Я написал потому, что честнее бесплатно получать констультацию: "вот мой вариант. Не работает (плохо работает). Помогите найти ошибку (исправить)". Сразу видно, что ХОТИТЕ НАУЧИТЬСЯ! ПОЖАЛУЙСТА, ПОМОЖЕМ СО ВСЕМ НАШИМ РАСПОЛОЖЕНИЕМ!
А тут ... на халяву получить решение. МОЕ МНЕНИЕ - НЕ ХОЧЕШЬ УЧИТЬСЯ - ПЛАТИ

Обидно просто: уже два года одни только просьбы написать за лентяев программы
Неизвестный
28.10.2010, 14:34
общий
Уважаемый Boriss!

По мимо того что я прошу вас сделать задание - я делаю его парралельно сам...у меня не всегда удачно....я плохо ориентируюсь в динамической памяти и структурах....но чтото я пытаюсь сделать....я учусь в основном по готовым примерам и перенимаю опыт, потому как чтение книг в которых порой "воды больше чем надо" не доставляет нужного эффекта учебы. Я до сих пор еще с 1 курса своей специальности так и не понял динамику....поэтому я и задал вам вопрос этот....

Извиняюсь если что не так.....

Вон на сегодняшний день то что я смог реализовать и сам добиться.....


Код:
Unit List3;
Interface
Const ListOk = 0;
ListNotMem = 1;
ListUnder = 2;
ListEnd = 3;
Type BaseType = Pointer;
PtrEl = ^Element;
Element = Record
Data : BaseType;
Next : PtrEl;
end;
List = Record
Start, Ptr : PtrEl;
N : Word; { длина списка }
Size : Word { размер информационной}
End; { части элемента }
bytearr = array[1..100] of integer;
Var ListError : 0..3;

Procedure InitList(var L:List; Size:Word);
Procedure PutList(var L:List; var E);
Procedure GetList(var L:List; var E:integer);
Procedure ReadList(var L:List; var E);
Function FullList(var L:List):boolean;
Function EndList(var L:List):boolean;
Function Count(var L:List):Word;
Procedure BeginPtr(var L:List);
Procedure EndPtr(var L:List);
Procedure MovePtr(var L:List);
Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);

implementation

Procedure InitList;
begin
getmem(L.start,sizeof(element));
if L.start=nil then
ListError:=ListNotMem
else
begin
L.start^.next:=nil;
L.ptr:=L.start;
L.N:=0;
L.size:=size;
end;
end;

Procedure EndPtr;
begin
L.ptr:=L.start;
while (L.ptr^.next)<>nil do
L.ptr:=L.ptr^.next;
end;

Procedure PutList;
var u:PtrEL;
i:word;
begin
u := L.ptr^.next;
getmem(L.ptr^.next, sizeof(element));
L.ptr := L.ptr^.next;
getmem(L.ptr^.data, L.size);
L.ptr^.next := u;
for i:=1 to L.size do
bytearr (L.ptr^.data^)[i]:=bytearr(E)[i];
inc(L.N)
end;

Procedure GetList;
var i:byte;
g:pointer;
begin
if L.N=1 then
ListError:=ListUnder
else
begin
L.ptr:=L.start;
i:=1;
while (L.ptr^.next<>nil)and(i<>E) do
begin
L.ptr:=L.ptr^.next;
inc(i)
end;
if i>E then
ListError:=ListEnd
else
begin
g:=L.ptr;
L.ptr:=L.ptr^.next;
freemem(g,sizeof(element))
end;
end;
end;

Procedure ReadList;
var i:word;
begin
for i:=1 to L.size do
bytearr(E)[i] := bytearr(L.ptr^.data^)[i];

end;


Function FullList(var L:List):boolean;
begin
FullList:=L.start=nil
end;

Function EndList;
begin
EndList:=L.ptr^.next=nil
end;

Function Count;
begin
Count:=L.N-1
end;

Procedure BeginPtr;
begin
L.ptr:=L.start
end;

Procedure MovePtr;
begin
if L.ptr^.next=nil then
ListError:=ListEnd
else
L.ptr:=L.ptr^.next
end;

Procedure MoveTo;
var i:byte;
begin
L.ptr:=L.start;
i:=1;
while (L.ptr^.next<>nil)and(i<>N) do
begin
L.ptr:=L.ptr^.next;
inc(i)
end;
end;

Procedure DoneList;
var g:pointer;
begin
L.ptr:=L.start;
while L.N<>0 do
begin
g:=L.ptr^.next;
freemem(L.ptr, sizeof(element));
L.ptr:=g
end;
freemem(L.start,sizeof(element));
end;

Procedure CopyList;
begin
L1.ptr:=L1.start;
while (L1.ptr^.next<>nil) do
begin
PutList(L2, L1.ptr^.data^);
L1.ptr:=L1.ptr^.next
end;
end;

end.


на даный момент борюсь с задачей №8

Код:
8. Многочлен  P(x)=anxn+an-1xn-1+...+a1x+a0 с целыми коэффициента-ми можно представить в виде списка, причем если ai=0, то соответствующее звено не включать в список. Определить процедуру ВЫВОД(p,y), которая печатает многочлен р как многочлен от переменной, однобуквенное имя которой является значением литерного параметра y.


Буду рад если это рассмотрите и поможете додумать!
Пока по задумке решения данной задачи нет! пусть теперь она будет ответом!!!
Неизвестный
28.10.2010, 14:52
общий
P.s. Сразу я никогда не выкладываю наработку свою. Потому как она в тот момент сырая. Данный модуль писал консультируясь у учителя.
давно
Академик
320937
2216
28.10.2010, 15:13
общий
Юдин Евгений Сергеевич:
Добрый день!
В модуле List3 есть ошибки. Часть устранил, остальные закомментировал ///. Попробуйте сами, получится - выкладывайте исправленную версию, нет - сообщите.
Тестирующий модуль
Код:
program p180474;
// 8. Многочлен P(x)=anxn+an-1xn-1+...+a1x+a0 с целыми коэффициента-ми
// можно представить в виде списка, причем если ai=0, то соответствующее
// звено не включать в список. Определить процедуру ВЫВОД(p,y), которая
// печатает многочлен р как многочлен от переменной, однобуквенное имя
// которой является значением литерного параметра
uses
List3;
begin
writeln('hello, world!');
end.

Модуль List3
Код:
Unit List3;
Interface
Const ListOk = 0;
ListNotMem = 1;
ListUnder = 2;
ListEnd = 3;
Type BaseType = Pointer;
PtrEl = ^Element;
Element = Record
Data : BaseType;
Next : PtrEl;
end;
List = Record
Start, Ptr : PtrEl;
N : Word; { длина списка }
Size : Word { размер информационной}
End; { части элемента }
bytearr = array[1..100] of integer;
Var ListError : 0..3;

Procedure InitList(var L:List; Size:Word);
Procedure PutList(var L:List; var E);
Procedure GetList(var L:List; var E:integer);
Procedure ReadList(var L:List; var E);
Function FullList(var L:List):boolean;
Function EndList(var L:List):boolean;
Function Count(var L:List):Word;
Procedure BeginPtr(var L:List);
Procedure EndPtr(var L:List);
Procedure MovePtr(var L:List);
Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);

implementation

Procedure InitList(var L:List; Size:Word);
begin
getmem(L.start,sizeof(element));
if L.start=nil then
ListError:=ListNotMem
else
begin
L.start^.next:=nil;
L.ptr:=L.start;
L.N:=0;
L.size:=size;
end;
end; { InitList }

Procedure EndPtr(var L:List);
begin
L.ptr:=L.start;
while (L.ptr^.next)<>nil do
L.ptr:=L.ptr^.next;
end; { EndPtr }

Procedure PutList(var L:List; var E);
var u:PtrEL;
i:word;
begin
u := L.ptr^.next;
getmem(L.ptr^.next, sizeof(element));
L.ptr := L.ptr^.next;
getmem(L.ptr^.data, L.size);
L.ptr^.next := u;
i:= 1;
while i<=L.size do
begin
/// bytearr (L.ptr^.data^)[i]:=bytearr(E)[i];
inc(i);
end;
inc(L.N)
end; { PutList }

Procedure GetList(var L:List; var E:integer);
var i:byte;
g:pointer;
begin
if L.N=1 then
ListError:=ListUnder
else
begin
L.ptr:=L.start;
i:=1;
while (L.ptr^.next<>nil)and(i<>E) do
begin
L.ptr:=L.ptr^.next;
inc(i)
end;
if i>E then
ListError:=ListEnd
else
begin
g:=L.ptr;
L.ptr:=L.ptr^.next;
/// freemem(g,sizeof(element))
end;
end;
end; { GetList }

Procedure ReadList(var L:List; var E);
var i:word;
begin
i:= 1;
while i<= L.size do
begin
/// bytearr(E)[i] := bytearr(L.ptr^.data^)[i];
inc(i);
end;
end; { ReadList }

Function FullList(var L:List):boolean;
begin
FullList:=L.start=nil
end; { FullList }

Function EndList(var L:List):boolean;
begin
EndList:=L.ptr^.next=nil
end; { EndList }

Function Count(var L:List):Word;
begin
Count:=L.N-1
end; { Count }

Procedure BeginPtr(var L:List);
begin
L.ptr:=L.start
end; { BeginPtr }

Procedure MovePtr(var L:List);
begin
if L.ptr^.next=nil then
ListError:=ListEnd
else
L.ptr:=L.ptr^.next
end; { MovePtr }

Procedure MoveTo(var L:List; N:word);
var i:byte;
begin
L.ptr:=L.start;
i:=1;
while (L.ptr^.next<>nil)and(i<>N) do
begin
L.ptr:=L.ptr^.next;
inc(i)
end;
end; { MoveTo }

Procedure DoneList(var L:List);
var g:pointer;
begin
L.ptr:=L.start;
while L.N<>0 do
begin
g:=L.ptr^.next;
/// freemem(L.ptr, sizeof(element));
/// L.ptr:=g
end;
/// freemem(L.start,sizeof(element));
end; { DoneList }

Procedure CopyList(var L1,L2:List);
begin
L1.ptr:=L1.start;
while (L1.ptr^.next<>nil) do
begin
/// PutList(L2, L1.ptr^.data^);
L1.ptr:=L1.ptr^.next
end;
end; { CopyList }

end.


давно
Академик
320937
2216
28.10.2010, 15:15
общий
Юдин Евгений Сергеевич:
Цитата: 324791
Сразу я никогда не выкладываю наработку свою. Потому как она в тот момент сырая.
И напрасно. Здесь оценок не ставят, а то, что "сырая" - помогает понять Ваш стиль работы над задачей.
Неизвестный
28.10.2010, 15:25
общий
через пару часов сообщу результат!...пока работаю!
Неизвестный
28.10.2010, 15:46
общий
Уважаемы Lamed!
Программа с использованием модуля на freepascal транслируется нормально....без ошибок....при раскоментированных местах даже...может на АВС этот алгоритм не работает но я на freepascal все прекрасно прогнал! ошибок 0.
Неизвестный
28.10.2010, 15:50
общий
Думаю есть смысл писать на freepascal....ABC транслирует с ошибками.....но с модулем он работать вовсе нехочет....может ошибки вызваны в реализации.....я полностью не знаю все прелести и минусы ABC но мой ABC не дружит с модулем!
давно
Академик
320937
2216
28.10.2010, 16:14
общий
Юдин Евгений Сергеевич:
У меня с модулем работает. Я выложил текст двух файлов: главного 180474.pas и модуля List3.pas. Какую ошибку выдает у Вас при подключении модуля?
Хотя Free - так Free.
Неизвестный
28.10.2010, 16:41
общий
Цитата: lamed
У меня с модулем работает. Я выложил текст двух файлов: главного 180474.pas и модуля List3.pas. Какую ошибку выдает у Вас при подключении модуля?


он подвисает...минуты 2.... и после "проснувшись" пишет, что ему не хватает памяти! пишит что приложение будет аварийно закрыто и окно с ABC тухнет.....
давно
Академик
320937
2216
28.10.2010, 17:24
общий
Юдин Евгений Сергеевич:
убедили, работаем с free
Неизвестный
01.11.2010, 12:47
общий
есть какие то результаты?
Неизвестный
01.11.2010, 17:34
общий
Юдин Евгений Сергеевич:
Пишут, что день-два поработать надо. Потому и продлил
давно
Академик
320937
2216
03.11.2010, 10:50
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич!
Цитата: 324791
на даный момент борюсь с задачей №8. Пока по задумке решения данной задачи нет! пусть теперь она будет ответом!!!

Так как работающий модуль не был выложен, а других возможностей, кроме ABC, у меня нет {зрение не позволяет}, для решения задачи 8 воспользовался своим же ответом на один из вопросов.

Код:
program p180474b;

const
ERROR = -MaxInt - 1; // Возвращаемая ошибка, если не найден элемент списка
// только для целых чисел
name_a = 'a.dat'; // файл данных
type
TElem = integer;
TBaseElem = ^TElem; // Тип информационной части
TList = ^TNode; // Представление списка
TNode = record // Звено списка
info: TBaseElem; // Информационная часть
next: TList; // Следующий элемент
end;
TElemFile = file of TElem; // Тип файла для хранения информационных частей

procedure File_Create(name_a: string);
// Создание файла
var
i, n: integer;
file_a : TElemFile;
begin
assign(file_a, name_a);
Randomize;

// Количество элементов задается случайным образом
rewrite(file_a);
for i:= 1 to Random(20)+1 do
if i mod 4 = 0 then
write(file_a, 0)
else
write(file_a, Random(50)-25);
close(file_a);

end;

procedure ZList_Init(var L: TList);
// Инициализация списка с заглавным звеном
var
n: TList;
begin
new(n);
n^.next := nil;
l:= n;
end;

procedure ZList_AddLast(L:TList; e: TElem);
// Добавление элемента в конец списка с заглавным звеном
begin
while L^.next <> nil do
L:= L^.next;
new(L^.next);
L:=L^.next;
new(L^.info);
L^.info^ := e;
L^.next := nil;
end;

procedure Insert_List(L1:TList; var e: TElem; var code: integer);
// Вставка элемента в список с заглавным звеном
// после элемента с номером n
var
p1: TList;
tmp: TList;
begin
p1:= L1^.next;
if (p1 = nil) then
begin
code := -1;
exit;
end
else
begin
new(tmp);
new(tmp^.info);
tmp^.info^ := e;
tmp^.next := p1^.next;
p1^.next := tmp;
p1 := tmp^.next;
code := 0
end;
end;

function List_Length(L:TList): integer;
// Вычисление длины списка с заглавным звеном
var
i: integer;
begin
i:= 0;
L:= L^.next;
while (L <> nil) do
begin
L:= L^.next;
inc(i);
end;
List_Length := i;
end;

procedure ZList_Print(L: TList);
// Печать списка c заглавным звеном
begin
write('<');
L := L^.next;
while (L <> nil) do
begin
write(L^.info^);
if (L^.next <> nil) then write('.');
L:= L^.next;
end;
writeln('>');
end;

procedure List_Read(L: TList; n: integer; var e: TElem);
// Получение элемента №
var
i: integer;
begin
if (n<=0) or (n>List_Length(L)) then
begin
writeln('Вне диапазона');
exit;
end;
for i:= 1 to n do
L := L^.next;
e:= L^.info^;
end;

procedure List_Clear(var L:TList);
// Удаление списка
var
n, start: TList;
be: TBaseElem;
begin
start:= L;
L := L^.next;
while (L <> nil) do
begin
n:= L;
be := n^.info;
dispose(be);
L := L^.next;
dispose(n);
end;
dispose(start);
end;

procedure FileToList(fname: string; var L: TList);
// Чтение файла в список
var
e: TElem;
f: TElemFile;
begin
assign(f, fname);
if not FileExists(fname) then
exit;
reset(f);
while not eof(f) do
begin
read(f, e);
ZList_AddLast(L, e);
end;
close(f);
end;

var
a: TList; // список
c: char;
i: integer;
len : integer;
e: TElem;

begin // главная программа
write('имя переменной ');
readln(c);

File_Create(name_a);
ZList_Init(a);
FileToList(name_a, a);

writeln('Начальные значения');
write('a=>');
ZList_Print(a);

len := List_Length(a);
write('Многочлен = ');
for i:= 1 to len do
begin
List_Read(a, i, e);
if (e<>0) then
begin
if (e>0) and (i>1) then
write('+');
write(e);
if (i<len) then
begin
write('*', c);
if (i<len-1) then
write('^', len-i);
end;
end;
end;
writeln;

List_Clear(a);
readln;
end.

Пример работы
Код:
имя переменной X
Начальные значения
a=><-18.11.-8.0.16.11.18.0.22.16.-12.0.-15.1>
Многочлен = -18*X^13+11*X^12-8*X^11+16*X^9+11*X^8+18*X^7+22*X^5+16*X^4-12*X^3-15*X+1
Если нужны разъяснения по этому решению - задавайте вопросы.
Удачи!
давно
Академик
320937
2216
03.11.2010, 12:13
общий
Ответ изменен. Добавлена работа с указателями, список указателей на тип E.
Неизвестный
29.11.2010, 22:29
общий
Уважаемые Эксперты....
чуть переделал программу вот тег код....но она выдает ошибку 216...исправте меня кто может.....

Код:
program CD5;
uses List3;
a:List;
c:char;
I,e:integer;
len:integer;
begin
InitList(a,sizeof(e));
write('name peremennoy ');
readln(c);
writeln('Vvedite koef ai, i=n..0');
for i:=0 to N do
begin
read(c);
if c<>0 then
begin
PutList(a,c)
end;
end;
len:= Count(a);
write('mnogochlen= ');
for i:= 1 to len do
begin
ReadList(a,e);
if (e<>0) then
begin
if (e>0) and (i>1) then
write('+');
write(e);
if (i<len) then
begin
write('*', c);
if (i<len-1) then
write('^', len-i);
end;
end;
end;
writeln;
DoneList(a);
readln;
end.


Код:
Unit List3;
Interface
Const ListOk = 0;
ListNotMem = 1;
ListUnder = 2;
ListEnd = 3;
Type BaseType = Pointer;
PtrEl = ^Element;
Element = Record
Data : BaseType;
Next : PtrEl;
end;
List = Record
Start, Ptr : PtrEl;
N : Word; { длина списка }
Size : Word { размер информационной}
End; { части элемента }
bytearr = array[1..100] of integer;
Var ListError : 0..3;
Procedure InitList(var L:List; Size:Word);
Procedure PutList(var L:List; var E);
Procedure GetList(var L:List; var E:integer);
Procedure ReadList(var L:List; var E);
Function FullList(var L:List):boolean;
Function EndList(var L:List):boolean;
Function Count(var L:List):Word;
Procedure BeginPtr(var L:List);
Procedure EndPtr(var L:List);
Procedure MovePtr(var L:List);
Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);
implementation
Procedure InitList(var L:List; Size:Word);
begin
getmem(L.start,sizeof(element));
if L.start=nil then
ListError:=ListNotMem
else
begin
L.start^.next:=nil;
L.ptr:=L.start;
L.N:=0;
L.size:=size;
end;
end;
Procedure EndPtr(var L:List);
begin
L.ptr:=L.start;
while (L.ptr^.next)<>nil do
L.ptr:=L.ptr^.next;
end;
Procedure PutList(var L:List; var E);
var u:PtrEL;
i:word;
begin
u := L.ptr^.next;
getmem(L.ptr^.next, sizeof(element));
L.ptr := L.ptr^.next;
getmem(L.ptr^.data, L.size);
L.ptr^.next := u;
for i:=1 to L.size do
bytearr (L.ptr^.data^)[i]:=bytearr(E)[i];
inc(L.N)
end;
Procedure GetList(var L:List; var E:integer);
var i:byte;
g:pointer;
begin
if L.N=1 then
ListError:=ListUnder
else
begin
L.ptr:=L.start;
i:=1;
while (L.ptr^.next<>nil)and(i<>E) do
begin
L.ptr:=L.ptr^.next;
inc(i)
end;
if i>E then
ListError:=ListEnd
else
begin
g:=L.ptr;
L.ptr:=L.ptr^.next;
freemem(g,sizeof(element))
end;
end;
end;
Procedure ReadList(var L:List; var E);
var i:word;
begin
for i:=1 to L.size do
bytearr(E)[i] := bytearr(L.ptr^.data^)[i];

end;
Function FullList(var L:List):boolean;
begin
FullList:=L.start=nil
end;
Function EndList(var L:List):boolean;
begin
EndList:=L.ptr^.next=nil
end;
Function Count(var L:List):Word;
begin
Count:=L.N-1
end;
Procedure BeginPtr(var L:List);
begin
L.ptr:=L.start
end;
Procedure MovePtr(var L:List);
begin
if L.ptr^.next=nil then
ListError:=ListEnd
else
L.ptr:=L.ptr^.next
end;
Procedure MoveTo(var L:List; N:word);
var i:byte;
begin
L.ptr:=L.start;
i:=1;
while (L.ptr^.next<>nil)and(i<>N) do
begin
L.ptr:=L.ptr^.next;
inc(i)
end;
end;
Procedure DoneList(var L:List);
var g:pointer;
begin
L.ptr:=L.start;
while L.N<>0 do
begin
g:=L.ptr^.next;
freemem(L.ptr, sizeof(element));
L.ptr:=g
end;
freemem(L.start,sizeof(element));
end;
Procedure CopyList(var L1,L2:List);
begin
L1.ptr:=L1.start;
while (L1.ptr^.next<>nil) do
begin
PutList(L2, L1.ptr^.data^);
L1.ptr:=L1.ptr^.next
end;
end;

end.
Неизвестный
29.11.2010, 22:37
общий
при прогонке программа ругается на процедуру DoneList
Форма ответа