Задание: Вводится последовательность целых чисел(по одному). Используя список, найти среднее двух соседних чисел. Организовать новый список в котором расположить средние по неубыванию. Распечатать списки.
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.
. Я создал список, затем нужно только вычислить средние ариф. соседних чисел (отсортировал полученный). Помогите пожалуйста. Заранее спасибо..
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; ...
После заполнения списка средних его надо будет отсортировать...
Справишься?
ruVdim
20.05.2008 22: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; ...
После заполнения списка средних его надо будет отсортировать...
Справишься?
Не знаю, попробую...
ruVdim
21.05.2008 15:58
Цитата(ruVdim @ 20.05.2008 22:53)
Не знаю, попробую...
Я описал процедуру, которая добавляет в новый список вещ. числа
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 16:06
Цитата
Procedure append(var pk: pt; var r: real);
Убери из описания параметра R слово Var, не будет этой ошибки... На самом деле, зачем тебе тут Var? Ты ж не хочешь менять значение R в процедуре, правда?
ruVdim
21.05.2008 16:34
Цитата(volvo @ 21.05.2008 16:06)
Убери из описания параметра R слово Var, не будет этой ошибки... На самом деле, зачем тебе тут Var? Ты ж не хочешь менять значение R в процедуре, правда?
Да, это правда!
ruVdim
21.05.2008 17:14
Цитата(ruVdim @ 21.05.2008 16:34)
Да, это правда!
я не пойму: почему со всего исходного списка n-целых чисел, после подсчета средних, получается вещ. список, содержащий только одно среднее(последняя пара 2-ух целых чисел)? например: исходн - 1 2 3 4...6 7 получ - 6.5
volvo
22.05.2008 18: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
25.05.2008 20:43
Спасибо тебе огромное !
ruVdim
2.06.2008 13:21
Цитата(ruVdim @ 25.05.2008 20:43)
Спасибо тебе огромное !
Мдааа.. Задача была все-таки незачтена.
volvo
2.06.2008 13:26
Цитата
Задача была все-таки незачтена.
Причина? Нежелание преподавателя признать ее правильной (или ты не смог объяснить ее работу), или она сбоит где-то? С первым ничего поделать нельзя, со вторым - можно и даже нужно. Говори на каких данных сбоит, будем разбираться...
ruVdim
2.06.2008 13:29
Цитата(volvo @ 2.06.2008 13:26)
Причина? Нежелание преподавателя признать ее правильной (или ты не смог объяснить ее работу), или она сбоит где-то? С первым ничего поделать нельзя, со вторым - можно и даже нужно. Говори на каких данных сбоит, будем разбираться...
Препод сказал, что надо работать со СПИСКОМ: чтение и запись производить с головы в хвост и обратно. А мы зануляли положение указателя.
volvo
2.06.2008 13:34
Сорри, можно у меня в коде показать, ГДЕ я что там "занулял"?
Или твой преподаватель хочет сказать, что надо работать с неинициализированными переменными-указателями на "голову"/"хвост" списка (это единственное место, где у меня в коде присутствует присвоение NIL)? Тогда пусть идет учит матчасть...
ruVdim
2.06.2008 13:40
Просмотрев программу, он, позже, отметил:"Ошибка в процедуре append"
Добавлено через 7 мин. Вообщем надо сделать просто так, чтобы чтение первого списка и запись его в другой проходило с хвоста (в текущем положении указателя) к голове.
ruVdim
2.06.2008 17:36
Цитата(ruVdim @ 2.06.2008 13:40)
Просмотрев программу, он, позже, отметил:"Ошибка в процедуре append"
Добавлено через 7 мин. Вообщем надо сделать просто так, чтобы чтение первого списка и запись его в другой проходило с хвоста (в текущем положении указателя) к голове.
Помогите пожалуйста
volvo
2.06.2008 18:30
Цитата
Просмотрев программу, он, позже, отметил:"Ошибка в процедуре append"
Ошибка на самом деле глубже - у него в ДНК... Это не лечится. Append не содержит никакой ошибки, и работает ровно так, как от него требуется... А насчет
Цитата
надо сделать просто так, чтобы чтение первого списка и запись его в другой проходило с хвоста
- бери и делай... Изначально в задании этого не было, а переделывать программу под каждое изменение задания преподавателем у меня нет никакого желания.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.