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

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

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

Автор: ruVdim 19.05.2008 16:26

Задание: Вводится последовательность целых чисел(по одному). Используя список, найти среднее двух соседних чисел. Организовать новый список в котором расположить средние по неубыванию. Распечатать списки.


uses crt;
type
plist = ^tlist;
tlist = record
info: integer;
link: plist;
end;
var
first1, posl1 : plist;

procedure print(p: plist);
begin
while p <> nil do begin
write(p^.info:5);
p := p^.link
end;
writeln;
end;

procedure vvod (var first, last: plist);
var
s: integer;
p: plist;
begin

last := first;
repeat
write('Vvedite sled element: '); readln(s);
if s <> 25 then begin
new(p);
p^.info := s;
p^.link := nil;

if first = nil then first := p
else last^.link := p;
last := p;
end;
until s = 25;

end;

var
ii, jj, nmin: plist;
T: integer;

begin
clrscr;
writeln('Perviy spisok:');
first1:=nil; vvod (first1, posl1);
print(first1);

{ Sortirovka }
ii := first1;
while ii^.link <> nil do begin
nmin := ii;

jj := ii^.link;
while jj <> nil do begin
if jj^.info < nmin^.info then nmin := jj;
jj := jj^.link;
end;

T := ii^.info;
ii^.info := nmin^.info;
nmin^.info := T;

ii := ii^.link;
end;
writeln('Otsort spisok:');
print(first1);

end.

.
Я создал список, затем нужно только вычислить средние ариф. соседних чисел unsure.gif (отсортировал полученный). Помогите пожалуйста.
Заранее спасибо..

Автор: volvo 19.05.2008 21:10

Ты зря сортировал ЭТОТ список...

Опиши процедуру Append, задачей которой будет добавлять переданное в нее значение типа Real в список... Потом проходи по исходному списку, и делай так:

...
p := firstl; { <--- начало твоего списка }
while (p <> nil) and (p^.link <> nil) do begin
append(new_list, (p^.info + p^.link^.info) / 2);
p := p^.link;
end;
...
После заполнения списка средних его надо будет отсортировать...

Справишься?

Автор: ruVdim 21.05.2008 2:53

Цитата(volvo @ 19.05.2008 17:10) *

Ты зря сортировал ЭТОТ список...

Опиши процедуру Append, задачей которой будет добавлять переданное в нее значение типа Real в список... Потом проходи по исходному списку, и делай так:

...
p := firstl; { <--- начало твоего списка }
while (p <> nil) and (p^.link <> nil) do begin
append(new_list, (p^.info + p^.link^.info) / 2);
p := p^.link;
end;
...
После заполнения списка средних его надо будет отсортировать...

Справишься?

Не знаю, попробую... wink.gif

Автор: ruVdim 21.05.2008 19:58

Цитата(ruVdim @ 20.05.2008 22:53) *

Не знаю, попробую... wink.gif

Я описал процедуру, которая добавляет в новый список вещ. числа

type
pt = ^k;
k = record
i: real;
l: pt
end;
var
px, pk : pt;
-----------
Procedure append(var pk: pt; var r: real);
var
px : pt;
begin
new(px);
px^.l:=nil;
pk^.l:=px;
pk:=px;
pk^.i:=r;
end;


Но при выполнении этой процедуры возникли сложности : "Фактический параметр должен быть переменной"
append(pk, (p^.info + p^.link^.info) / 2);

Автор: volvo 21.05.2008 20:06

Цитата
Procedure append(var pk: pt; var r: real);
Убери из описания параметра R слово Var, не будет этой ошибки... На самом деле, зачем тебе тут Var? Ты ж не хочешь менять значение R в процедуре, правда?

Автор: ruVdim 21.05.2008 20:34

Цитата(volvo @ 21.05.2008 16:06) *

Убери из описания параметра R слово Var, не будет этой ошибки... На самом деле, зачем тебе тут Var? Ты ж не хочешь менять значение R в процедуре, правда?

Да, это правда!

Автор: ruVdim 21.05.2008 21:14

Цитата(ruVdim @ 21.05.2008 16:34) *

Да, это правда!

я не пойму: почему со всего исходного списка n-целых чисел, после подсчета средних, получается вещ. список, содержащий только одно среднее(последняя пара 2-ух целых чисел)?
например: исходн -
1 2 3 4...6 7
получ -
6.5

Автор: volvo 22.05.2008 22:36

Цитата
почему со всего исходного списка n-целых чисел, после подсчета средних, получается вещ. список, содержащий только одно среднее(последняя пара 2-ух целых чисел)?
Значит, что-то неправильно вызываешь...

Кстати, я посмотрел на твои изменения в программе. Ты очень много лишнего делаешь, тебе не кажется? Можно же обойтись одной структурой tlist для хранения обоих списков. Ведь Real совместим с Integer по присваиванию, то есть значение типа Integer можно без проблем занести в поле типа Real. И еще. Когда я говорил о написании процедуры Append, я имел в виду, что при заполнении первого списка тоже может использоваться эта процедура. Смотри:

uses crt;
type
plist = ^tlist;
tlist = record
info: real; { <--- !!! }
link: plist;
end;

procedure append(var first, last: plist; value: real);
var p: plist;
begin
new(p);
p^.info := value; p^.link := nil;
if first = nil then first := p
else last^.link := p;

last := p;
end;

procedure print(p: plist; len: integer);
begin
while p <> nil do begin
write(p^.info:7:len);
p := p^.link
end;
writeln;
end;

procedure vvod(var first: plist);
var
s: integer;
p, last: plist;
begin
first := nil; last := nil;
repeat

write('Vvedite sled element: '); readln(s);
if s <> 25 then append(first, last, s);

until s = 25;
end;


var
first: plist;
p, first_2, last_2: plist;
ii, jj, nmin: plist;
T: real;

begin
clrscr;
writeln('Perviy spisok:');
vvod(first);
print(first, 0); { Печатаем целые числа, 0 знаков после запятой }

first_2 := nil; last_2 := nil;
p := first; { <--- íà÷àëî òâîåãî ñïèñêà }
while (p <> nil) and (p^.link <> nil) do begin
append(first_2, last_2, (p^.info + p^.link^.info) / 2);
p := p^.link;
end;

print(first_2, 2); { это - проверка, как средние заносятся в список }

{ Sortirovka }
ii := first_2;
while ii^.link <> nil do begin
nmin := ii;

jj := ii^.link;
while jj <> nil do begin
if jj^.info < nmin^.info then nmin := jj;
jj := jj^.link;
end;

T := ii^.info;
ii^.info := nmin^.info;
nmin^.info := T;

ii := ii^.link;
end;
writeln('Otsort spisok:');
print(first_2, 2); { Ну, и результат }
end.
Не забудь удалить списки...

Автор: ruVdim 26.05.2008 0:43

Спасибо тебе огромное ! good.gif

Автор: ruVdim 2.06.2008 17:21

Цитата(ruVdim @ 25.05.2008 20:43) *

Спасибо тебе огромное ! good.gif


Мдааа.. Задача была все-таки незачтена. wacko.gif

Автор: volvo 2.06.2008 17:26

Цитата
Задача была все-таки незачтена.
Причина? Нежелание преподавателя признать ее правильной (или ты не смог объяснить ее работу), или она сбоит где-то? С первым ничего поделать нельзя, со вторым - можно и даже нужно. Говори на каких данных сбоит, будем разбираться...

Автор: ruVdim 2.06.2008 17:29

Цитата(volvo @ 2.06.2008 13:26) *

Причина? Нежелание преподавателя признать ее правильной (или ты не смог объяснить ее работу), или она сбоит где-то? С первым ничего поделать нельзя, со вторым - можно и даже нужно. Говори на каких данных сбоит, будем разбираться...

Препод сказал, что надо работать со СПИСКОМ: чтение и запись производить с головы в хвост и обратно.
А мы зануляли положение указателя.

Автор: volvo 2.06.2008 17:34

Сорри, можно у меня в коде показать, ГДЕ я что там "занулял"?

Или твой преподаватель хочет сказать, что надо работать с неинициализированными переменными-указателями на "голову"/"хвост" списка (это единственное место, где у меня в коде присутствует присвоение NIL)? Тогда пусть идет учит матчасть...

Автор: ruVdim 2.06.2008 17:40

Просмотрев программу, он, позже, отметил:"Ошибка в процедуре append"

Добавлено через 7 мин.
Вообщем надо сделать просто так, чтобы чтение первого списка и запись его в другой проходило с хвоста (в текущем положении указателя) к голове.

Автор: ruVdim 2.06.2008 21:36

Цитата(ruVdim @ 2.06.2008 13:40) *

Просмотрев программу, он, позже, отметил:"Ошибка в процедуре append"

Добавлено через 7 мин.
Вообщем надо сделать просто так, чтобы чтение первого списка и запись его в другой проходило с хвоста (в текущем положении указателя) к голове.

Помогите пожалуйста mega_chok.gif

Автор: volvo 2.06.2008 22:30

Цитата
Просмотрев программу, он, позже, отметил:"Ошибка в процедуре append"
Ошибка на самом деле глубже - у него в ДНК... Это не лечится. Append не содержит никакой ошибки, и работает ровно так, как от него требуется... А насчет
Цитата
надо сделать просто так, чтобы чтение первого списка и запись его в другой проходило с хвоста
- бери и делай... Изначально в задании этого не было, а переделывать программу под каждое изменение задания преподавателем у меня нет никакого желания.