Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача с использованием списка
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
ruVdim
Задание: Вводится последовательность целых чисел(по одному). Используя список, найти среднее двух соседних чисел. Организовать новый список в котором расположить средние по неубыванию. Распечатать списки.

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
Ты зря сортировал ЭТОТ список...

Опиши процедуру 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
Цитата(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
Цитата(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
Цитата
Procedure append(var pk: pt; var r: real);
Убери из описания параметра R слово Var, не будет этой ошибки... На самом деле, зачем тебе тут Var? Ты ж не хочешь менять значение R в процедуре, правда?
ruVdim
Цитата(volvo @ 21.05.2008 16:06) *

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

Да, это правда!
ruVdim
Цитата(ruVdim @ 21.05.2008 16:34) *

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

я не пойму: почему со всего исходного списка n-целых чисел, после подсчета средних, получается вещ. список, содержащий только одно среднее(последняя пара 2-ух целых чисел)?
например: исходн -
1 2 3 4...6 7
получ -
6.5
volvo
Цитата
почему со всего исходного списка 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
Спасибо тебе огромное ! good.gif
ruVdim
Цитата(ruVdim @ 25.05.2008 20:43) *

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


Мдааа.. Задача была все-таки незачтена. wacko.gif
volvo
Цитата
Задача была все-таки незачтена.
Причина? Нежелание преподавателя признать ее правильной (или ты не смог объяснить ее работу), или она сбоит где-то? С первым ничего поделать нельзя, со вторым - можно и даже нужно. Говори на каких данных сбоит, будем разбираться...
ruVdim
Цитата(volvo @ 2.06.2008 13:26) *

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

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

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

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

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

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

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