1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Задание: Вводится последовательность целых чисел(по одному). Используя список, найти среднее двух соседних чисел. Организовать новый список в котором расположить средние по неубыванию. Распечатать списки.
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.
. Я создал список, затем нужно только вычислить средние ариф. соседних чисел (отсортировал полученный). Помогите пожалуйста. Заранее спасибо..
Опиши процедуру 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; ...
После заполнения списка средних его надо будет отсортировать...
Опиши процедуру 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; ...
После заполнения списка средних его надо будет отсортировать...
Убери из описания параметра R слово Var, не будет этой ошибки... На самом деле, зачем тебе тут Var? Ты ж не хочешь менять значение R в процедуре, правда?
Убери из описания параметра R слово Var, не будет этой ошибки... На самом деле, зачем тебе тут Var? Ты ж не хочешь менять значение R в процедуре, правда?
я не пойму: почему со всего исходного списка n-целых чисел, после подсчета средних, получается вещ. список, содержащий только одно среднее(последняя пара 2-ух целых чисел)? например: исходн - 1 2 3 4...6 7 получ - 6.5
почему со всего исходного списка 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.
Причина? Нежелание преподавателя признать ее правильной (или ты не смог объяснить ее работу), или она сбоит где-то? С первым ничего поделать нельзя, со вторым - можно и даже нужно. Говори на каких данных сбоит, будем разбираться...
Причина? Нежелание преподавателя признать ее правильной (или ты не смог объяснить ее работу), или она сбоит где-то? С первым ничего поделать нельзя, со вторым - можно и даже нужно. Говори на каких данных сбоит, будем разбираться...
Препод сказал, что надо работать со СПИСКОМ: чтение и запись производить с головы в хвост и обратно. А мы зануляли положение указателя.
Сорри, можно у меня в коде показать, ГДЕ я что там "занулял"?
Или твой преподаватель хочет сказать, что надо работать с неинициализированными переменными-указателями на "голову"/"хвост" списка (это единственное место, где у меня в коде присутствует присвоение NIL)? Тогда пусть идет учит матчасть...
Просмотрев программу, он, позже, отметил:"Ошибка в процедуре append"
Добавлено через 7 мин. Вообщем надо сделать просто так, чтобы чтение первого списка и запись его в другой проходило с хвоста (в текущем положении указателя) к голове.
Просмотрев программу, он, позже, отметил:"Ошибка в процедуре append"
Добавлено через 7 мин. Вообщем надо сделать просто так, чтобы чтение первого списка и запись его в другой проходило с хвоста (в текущем положении указателя) к голове.
Просмотрев программу, он, позже, отметил:"Ошибка в процедуре append"
Ошибка на самом деле глубже - у него в ДНК... Это не лечится. Append не содержит никакой ошибки, и работает ровно так, как от него требуется... А насчет
Цитата
надо сделать просто так, чтобы чтение первого списка и запись его в другой проходило с хвоста
- бери и делай... Изначально в задании этого не было, а переделывать программу под каждое изменение задания преподавателем у меня нет никакого желания.