IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача с использованием списка
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Дима

Репутация: -  0  +


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

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 (отсортировал полученный). Помогите пожалуйста.
Заранее спасибо..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

Опиши процедуру 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;
...
После заполнения списка средних его надо будет отсортировать...

Справишься?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Дима

Репутация: -  0  +


Цитата(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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Дима

Репутация: -  0  +


Цитата(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);
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Дима

Репутация: -  0  +


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

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

Да, это правда!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Дима

Репутация: -  0  +


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

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

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


Гость






Цитата
почему со всего исходного списка 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.
Не забудь удалить списки...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Дима

Репутация: -  0  +


Спасибо тебе огромное ! good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Дима

Репутация: -  0  +


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

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


Мдааа.. Задача была все-таки незачтена. wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






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


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Дима

Репутация: -  0  +


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

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

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


Гость






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

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


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Дима

Репутация: -  0  +


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

Добавлено через 7 мин.
Вообщем надо сделать просто так, чтобы чтение первого списка и запись его в другой проходило с хвоста (в текущем положении указателя) к голове.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской
Реальное имя: Дима

Репутация: -  0  +


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

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

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

Помогите пожалуйста mega_chok.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 17.01.2021 1:43
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name