Консультация № 184453
14.11.2011, 23:15
105.84 руб.
0 26 2
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Задание на списки(задание скопированы с методички),среда pascal abc
ТЕМА 1 ЛИНЕЙНЫЕ ОДНОСВЯЗНЫЕ СПИСКИ
Разработать и реализовать программу создания и обработки линейного односвязного списка с одним информационным полем, которое содержит целое число.
При реализации на языке Паскаль программа должна иметь модульную структуру [ 5 ].
Программа должна содержать меню с перечнем возможностей работы со списком и оператор выбора соответствующего пункта меню с обращением к подпрограмме ( процедуре или функции ), реализующей выбранное действие над списком.
Модуль ( unit ) должен содержать описание соответствующих типов и подпрограмм работы со списками:
а) создание списка добавлением нового элемента в начало списка (данные вводятся с клавиатуры или из текстового файла);
б) создание списка добавлением нового элемента в конец списка (данные вводятся с клавиатуры или из текстового файла);
в) просмотр списка (проход по списку с выдачей на экран значений ин-формационных полей списка );
г) уничтожение списка ( проход по списку с удалением элемента списка );
д) вставка одного или нескольких элементов в список ( Задание 1 );
е) удаление из списка одного или нескольких элементов ( Задание 2 );
ж) рекурсивная обработка элементов списка ( Задание 3 );
з) рекурсивный вариант вставки элементов в список ( Задание 4 );
и) рекурсивный вариант удаления из списка элементов ( Задание 5 ).
Задание 1
Описать подпрограмму вставки одного или нескольких элементов в спи-сок. Подпрограмма должна обеспечивать возможность после её вызова выдавать сообщение в случае невозможности вставки с указанием причины
1)(само условие задание №1) Вставить новый элемент после каждого нулевого элемента
Задание 2
Описать подпрограмму удаления одного или нескольких элементов спи-ска. Подпрограмма должна обеспечивать возможность после её вызова выдавать сообщение в случае невозможности удаления с указанием причины
2)Удалить из списка первый нёчетный элемент

Обсуждение

Неизвестный
15.11.2011, 14:42
общий
эт напоминает курсовой проет по СД...щас поищу чтото было такое
Неизвестный
15.11.2011, 14:51
общий
это ответ
Здравствуйте, angel.nero!
не берусь за полное выполнение вашего вопроса, ибо задано слишком много вопросов(и помоему не до конца)

Характеристика СД типа «линейный список»

1. Абстрактный уровень представления СД:
1.1 Конечная последовательность однотипных элементов (узлов). Количество элементов в последовательности называется длиной списка, причем длина в процессе работы программы может изменяться, поэтому ЛС – динамическая структура.
1.2 Набор допустимых операций:
1. Инициализация.
2. Включение элемента.
3. Исключение элемента.
4. Чтение текущего элемента.
5. Переход в начало списка.
6. Переход в конец списка.
7. Переход к следующему элементу.
8. Переход к i-му элементу.
9. Определение длины списка.
10. Уничтожение списка.
2. Физический уровень представления СД:
2.1 Последовательная или связная схема хранения.
2.2 Размер памяти зависит, прежде всего, от реализации линейного списка.
2.4 CAR(ЛС)= CAR(BaseType)0 +CAR(BaseType)1+… +CAR(BaseType)max
2.5 Тип доступа к элементам в зависимости от реализации.


модуль для работы с линейными списками в приложении...


Желаю удачного понимания! Спрашивайте что непонятно

Приложение:
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.
Неизвестный
15.11.2011, 14:56
общий
Если у вас поле с числом то в качесве базового типа выбираем integer например
Неизвестный
15.11.2011, 15:09
общий
Программа должна содержать меню с перечнем возможностей работы со списком и оператор выбора соответствующего пункта меню с обращением к подпрограмме ( процедуре или функции ), реализующей выбранное действие над списком.

отдельный модуль реализовывать на графе (меню)?

Задание 1 Описать подпрограмму вставки одного или нескольких элементов в спи-сок. Подпрограмма должна обеспечивать возможность после её вызова выдавать сообщение в случае невозможности вставки с указанием причины


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

1)(само условие задание №1) Вставить новый элемент после каждого нулевого элемента

Это если встречаем в списке 0 то вставляем за ним?

Задание 2 Описать подпрограмму удаления одного или нескольких элементов спи-ска. Подпрограмма должна обеспечивать возможность после её вызова выдавать сообщение в случае невозможности удаления с указанием причины 2)Удалить из списка первый нёчетный элемент

первый нечетный...значит проверяем поля каждого элемента списка и смотрим если нечетный то удаляем его?
Неизвестный
15.11.2011, 15:31
общий
К сожалению не курсовой проект...
Цитата: 324791
отдельный модуль реализовывать на графе (меню)?

Если я правильно вас понял,тогда да в отдельном,по идее должен инициализироваться модуль с меню при запуске,пользователь должен выбрать определенный пункт итд

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

1)(само условие задание №1) Вставить новый элемент после каждого нулевого элемента

Это если встречаем в списке 0 то вставляем за ним?

да после каждого 0 вставляем, если нет 0 , то должно выдать сообщение,что нет 0 в списке итд


Цитата: 324791
первый нечетный...значит проверяем поля каждого элемента списка и смотрим если нечетный то удаляем его?

получается так, и если идут например 2 подряд нечетных,то нужно удалить первый из них
Неизвестный
15.11.2011, 16:35
общий
Если я правильно вас понял,тогда да в отдельном,по идее должен инициализироваться модуль с меню при запуске,пользователь должен выбрать определенный пункт итд

с графом в абс не встречался - но если без него то наверное выводить чтото типа меню каждый раз.....из символов.....например:

##############################
####Работа с линейным списком########
##############################
#Выберите действие:################
#1).....##########################
#2)......##########################
-//-//-//-//.-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-
#Ваш выбор:######################
###############################

вводим допустим число и с помощью оператора переключателя case выполняем той или иной алгоритм над списком...
Неизвестный
15.11.2011, 16:36
общий
попробую чтото набросать(программу на ABC) тестовое меню....
позже сегодня выложу сюда
Неизвестный
15.11.2011, 16:59
общий
Код:
procedure menu_case;
var ch:integer;
begin
writeln('Программа для работы с линейным списком');
writeln('');
writeln('Выберите действие');
writeln('1)включение элемента в ЛС');
writeln('2)исключение элемента из ЛС');
writeln('3)Чтение текущего элемента');
writeln('4)перейти в начало списка');
writeln('5)Перейти в конец списка');
writeln('6)Перейти к i-му элементу ЛС');
writeln('7)Длинна списка');
writeln('8)Список пуст?');
writeln('9)Список полон?');
writeln('');
write('Ваш выбор: ');
readln(ch);
case ch of
1:
2:
3:
4:
5:
6:
7:
8:
9:
end;
clrscr;
writeln('Действие ',ch,'Совершено');
delay(300); //подключить модуль CRT надо
end;


Там где цифры столбиком это переключатели между действиями......наподобие такого меню можно....уточните что именно требуется
Неизвестный
15.11.2011, 17:00
общий
Да кстати функцию menu_case можно сделать рекурсивной, добавим в конце выполнения её же вызов
Неизвестный
15.11.2011, 17:56
общий
это обязательные подпрограаммы,соответственно необходимы пункты в меню
1) создание списка добавлением нового элемента в начало списка (данные вводятся с клавиатуры или из текстового файла);
2) создание списка добавлением нового элемента в конец списка (данные вводятся с клавиатуры или из текстового файла);
3) просмотр списка (проход по списку с выдачей на экран значений ин-формационных полей списка );
4) уничтожение списка ( проход по списку с удалением элемента списка );
также 1 и 2 задание




Если вам нужно могу подкрепить нашу методичку по спискам,по которой нам сказали делать
Неизвестный
15.11.2011, 18:04
общий
подскажите правильная ли процедура(1 задание)
Код:
procedure Insert(start:link; y:integer);
var p, {текущий указатель}
q:link; {указатель на новый элемент}
begin
p:=start;
while p<>nil do
begin
if p^.inf=0 then
begin {создание и вставка нового элемента}
new(q);
q^.inf:= y;
q^.next:=p^.next;
p^.next:=q;
p:=p^.next^.next
end
else p:=p^.next
end
end;
Неизвестный
15.11.2011, 19:33
общий
15.11.2011, 19:35
Цитата: 309917
это обязательные подпрограаммы,соответственно необходимы пункты в меню
1) создание списка добавлением нового элемента в начало списка (данные вводятся с клавиатуры или из текстового файла);
2) создание списка добавлением нового элемента в конец списка (данные вводятся с клавиатуры или из текстового файла);
3) просмотр списка (проход по списку с выдачей на экран значений ин-формационных полей списка );
4) уничтожение списка ( проход по списку с удалением элемента списка );
также 1 и 2 задание

я в своем модуле все это описал....

Цитата: 309917
procedure Insert(start:link; y:integer);
begin
p:=start;
while p<>nil do
begin
if p^.inf=0 then
begin {создание и вставка нового элемента}
new(q);
q^.inf:= y;
q^.next:=p^.next;
p^.next:=q;
p:=p^.next^.next
end
else p:=p^.next
end
end;


тут как то туманно...много переменных, которые мне мало о чем говорят....
вот щас поправлю ваще как сам думаю
Общий алгоритм для задания 1 выглядит так:
1)Инициализируем список
2)Читаем Элемент
3)Если нулевой то создаем новый за ним перемещаем указатель и возвращаемся к пункту 2
4)Если не нулевой - идем далее по списку пока не конец.
Неизвестный
15.11.2011, 19:37
общий
Процедура, которая выполняет задание 1, помоему должна получать в попечение только лист и с ним работать....все делается при инициализации.
Неизвестный
15.11.2011, 19:40
общий
У меня есть задача на примере ЛС....могу прикрепить.....там значит надовывести на экран многочлен с соответствующими степенями, при этом пропуская нулевые элементы
Неизвестный
15.11.2011, 21:14
общий
хорошо буду ждать
Неизвестный
16.11.2011, 06:55
общий
Код:
program CD5;
uses List3;
type K_St=record
K:integer;
St:byte;
end;

var P,q:List;
r:K_St;
N:word;
i,c:integer;
begin
InitList(P,sizeof(K_St));
InitList(q,sizeof(K_St));
writeln('Vvedite N - stepen mnogochlena Q');
read(N);
writeln('Vvedite mnogochlen Q sled.obr. - koef ai, i=n..0');

for i:=0 to N do
begin
read(c);
if c<>0 then
begin
r.K:=c;
r.St:=N-i;
PutList(Q, r)
end;
end;

{BeginPtr(Q);
writeln;
repeat
MovePtr(Q);
ReadList(Q, r);
write(r.K,' ')
until EndList(Q)=true; }


BeginPtr(Q);
repeat
Moveptr(Q);
if K_St(Q.ptr^.data^).St=1 then
begin
r.K:=K_St(Q.ptr^.data^).K;
r.ST:=0;
PutList(P,r)
end
else
if K_St(Q.ptr^.data^).ST<>0 then
begin
r.K:=(K_St(Q.ptr^.data^).K)*(K_St(Q.ptr^.data^).St);
r.St:=K_St(Q.ptr^.data^).St-1;
PutList(P, r);
end;
Until EndList(Q)=true;
write('P(x)=');
BeginPtr(P);
repeat
MovePtr(P);
ReadList(P, r);
if K_St(P.ptr^.data^).K>0 then
write('+');
if K_St(P.ptr^.data^).St=1 then
write(r.K,'x')
else
if K_St(P.ptr^.data^).St<>0 then
write(r.K,'x^',r.St)
else
write(r.K);
until EndList(P)=true;
readln;
readln;
end.
Неизвестный
19.11.2011, 12:15
общий
Добрый день!
А вы 1 или 2 задание сделали?
Неизвестный
19.11.2011, 22:57
общий
это ответ
Здравствуйте, angel.nero!
Я только что приехал домой, времени на обдумывание ответа мало, но в общих чертах напишу алгоритмы добавления и удаления ячеек в список, если захотите более точный ответ то пишите в личку!

Описание списка:

Type powl:^owl;
info: integer;
owl=record
inf: integer;
next: powl;
end;

Создание первой ячейки:

procedure NewHead (var Head: powl; x:info);
var p:powl;

begin
new(p);
p^.info:=x;
p^.next:=head;
head:=p;
end;

Добавление ячейки в конец списка:

procedure NewCell (var Head: powl; x:info);
var c, p:powl;

begin

if head=nil then begin
new(head);
head^.inf:=x;
head^.next:=nil;
end

else begin
c:=head;
while c^.next<>nil do
c:=c^.next;
new(p);
c^.next:=p;
p^.inf:=x;
p^.next:=nil;
end;

end;

А теперь полное уничтожение списка:

procedure disposeowl(var head:powl);
var p:powl;

begin

while head<>nil do begin
p:=head;
head:=p^.next;
dispose(p);
end;

end;

В общем всё! В заключение скажу что любая процедура без описания типа не будет работать, поэтому сначала прописываете тип, а потом процедуры и кстати функция dispose(n) это удаление ячейки n, а n:=nil; это её обнуление(nil это ноль). Если что-нибудь не понятно пишите, буду рад помочь!
Неизвестный
19.11.2011, 23:02
общий
19.11.2011, 23:03
Я Вам написал ответ, посмотрите пожалуйста там очень легко для восприятия всё написано, если что, то могу прокомментировать!
давно
Старший Модератор
31795
6196
19.11.2011, 23:42
общий
19.11.2011, 23:51
Код:
Type powl:^owl;
info: integer;
owl=record
inf: integer;
next: powl;
end;

Внимательно посмотрите, все ли тут правильно написано?
Раздел TYPE двоеточия?
типы поля в RECORD?
Вы определитесь либо
Код:
 x:info

либо
Код:
p^.info:=x;

И это если учесть, что только общие принципы, а не работающя программа на платный вопрос.


(это вместо предупреждения, читайте правила, там есть всё)


ах, да ещё, читаем вопрос:
Цитата: 309917
Задание на списки(задание скопированы с методички),среда pascal abc

Какую ошибку даст строка?
Код:
while head<>nil do
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
20.11.2011, 11:24
общий
Привет. В рабочие дни занят сильно (на завод пошел), сегодня увидел, что есть проблемы
Сколько времени есть у меня, чтобы написать программу? Не исправить, а написать?
Неизвестный
20.11.2011, 12:09
общий
Добрый день!
Сказали в среду надо здать....
Неизвестный
20.11.2011, 12:28
общий
Понятно. Постараюсь
Неизвестный
20.11.2011, 18:22
общий
Type powl:^owl;
info: integer;
owl=record {это сама ячейка, ниже в рекорд описание части, которая отвечает за информацию и части, которая указывает куда идти дальше!}
inf: integer;
next: powl;
end;



x:info {если Вам угодно, то спокойно можно вместо info поставить inf смысл не изменится они оба integer}

либо

p^.info:=x;
давно
Старший Модератор
31795
6196
21.11.2011, 11:52
общий
Код :
Type powl:^owl;
info: integer;
owl=record
inf: integer;
next: powl;
end;
Внимательно посмотрите, все ли тут правильно написано?
Раздел TYPE двоеточия?
типы поля в RECORD?
Вы определитесь либо
Код :
x:info
либо
Код :
p^.info:=x;

Вы так и не поняли, смотрите сами:
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
24.11.2011, 20:21
общий
А вы смотрели задание?
Форма ответа