Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Динамические списки

Автор: feiqin 28.05.2007 20:52

я создал туже тему в разделе delphi blink.gif но решил что это задание под консоль delphi можно написать и в этом разделе(т к сдесь больше народу). Здесь я более обширно опишу свою задачу:

Даны два списка L1 и L2 вещественных чисел. Написать подпрограммы,
возвращающие новый список L, включающий по
одному разу числа
, которые:
а) входят одновременно в оба списка;
б) входят хотя бы в один из списков;
в) входят в один из списков L1 и L2, но в то же время не входят
в другой из них;
г) входят в список L1 но не входят в список L2.
Но главное что я хочу понять это как сравнивать элементы в каждом из списков друг с другом и чтобы этот принцип можно было применить в моей задаче? и вопрос 2: что в моей задаче означает выделенная синим цветом строка?


program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
pe=^spisok;
spisok=record
t:real;
p:pe;
end;
var
elem, beg,elem2,beg2,elem3,beg3:pe;
ch:char; n, a,b:integer;
begin
//------------заполняем первый список--------
new(elem); beg:=elem;
elem^.p:=elem;
while true do
begin
Write('Vvedite_choslo.: ');
Readln(Elem^.t);
write('Povtorit_vvod y/n');
readln(ch);
if (ch='n') then begin
elem^.p:=nil;
break;
end else
begin
new(elem^.p);
elem:=elem^.p;
end;
end;
//------------заполняем второй список--------
new(elem2); beg2:=elem2;
elem2^.p:=elem2;
while true do
begin
Write('Vvedite_choslo_vo_vtoroi.: ');
Readln(Elem2^.t);
write('Povtorit_vvod y/n');
readln(ch);
if (ch='n') then begin
elem2^.p:=nil;
break;
end else
begin
new(elem2^.p);
elem2:=elem2^.p;
end;

//вот сдесь должно быть сравнение списков и занесение их в третий???

end;
Writeln('-------------------------');
writeln('Vivod_1-go');
elem:=beg;
n:=0;
repeat
inc(n);
writeln(N,':',elem^.t:3:2);
elem:=elem^.p;
until elem=nil;
Writeln('--------------------------');
writeln('Vivod_2-go');
elem2:=beg2;
n:=0;
repeat
inc(n);
writeln(N,':',elem2^.t:3:2);
elem2:=elem2^.p;
until elem2=nil;
readln;
end.


Автор: мисс_граффити 28.05.2007 21:27

1. видимо, нужна функция, проверяющая, входит ли число в список.
ей передается число, она проходит по элементам, пока не дойдет до конца или не найдет нужный элемент.

2. Синим... {$APPTYPE CONSOLE} и комментарии. Что из этого интересует?

3. Из делфи тему удалить?


Автор: volvo 28.05.2007 21:48

Юля, синим - это здесь:

Цитата(feiqin @ 28.05.2007 16:52)
Написать подпрограммы,
возвращающие новый список L, включающий по
одному разу числа
, которые:

smile.gif

feiqin, это значит, что если число уже было включено в список-результат однажды, то второе его включение производить не надо...

Цитата
как сравнивать элементы в каждом из списков друг с другом и чтобы этот принцип можно было применить в моей задаче?
2 вложенных цикла... В первом пробегаешь по всему списку L1, и для каждого его элемента запускаешь внутренний цикл - по всем элементам списка L2... Так ты сможешь сравнить "каждый с каждым"...

Поиск, кстати, может тебе в этом помочь - подобная задача уже выкладывалась...

Автор: feiqin 29.05.2007 15:53

1)Вот с помощью этого кода я нахожу элементы которые входят в оба списка:


BEGIN
elem:=beg;
n:=0;
elem2:=beg2;
repeat
c1:=0;
c1:=elem^.t;
elem:=elem^.p;
elem2:=beg2;
repeat
c2:=0;
c2:=elem2^.t;
elem2:=elem2^.p;
if c2=c1 then BEGIN
INC©;
new(elem3);
beg3:=elem3;
elem3^.p:=elem3;
while c=1 do
begin
Elem3^.t:=c2;
elem3:=elem3^.p;
c:=0;
end;
new(elem3^.p);

END;
until elem2=nil;
until elem=nil;
END;


Я надеюсь что это правильно.

А вот насчет того чтобы записать элементы которые Входят ХОТЯБЫ в один из списков(Задание под б), я догадаться не могу, я думал конечно чтобы записать все списки во множества и потом работать с ними, или есть другие способы? если не трудно то отпишитесь.

Поиском пользовался но того что надо не нашел.