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

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

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

 
 Ответить  Открыть новую тему 
> Задача с использованием списка
ruVdim
сообщение 19.05.2008 12:26
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 19.05.2008 17:10
Сообщение #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;
...
После заполнения списка средних его надо будет отсортировать...

Справишься?
 К началу страницы 
+ Ответить 
ruVdim
сообщение 20.05.2008 22:53
Сообщение #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 
 К началу страницы 
+ Ответить 
ruVdim
сообщение 21.05.2008 15:58
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 21.05.2008 16:06
Сообщение #5


Гость






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


Новичок
*

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

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


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

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

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


Новичок
*

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

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


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

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

я не пойму: почему со всего исходного списка n-целых чисел, после подсчета средних, получается вещ. список, содержащий только одно среднее(последняя пара 2-ух целых чисел)?
например: исходн -
1 2 3 4...6 7
получ -
6.5
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.05.2008 18:36
Сообщение #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.
Не забудь удалить списки...
 К началу страницы 
+ Ответить 
ruVdim
сообщение 25.05.2008 20:43
Сообщение #9


Новичок
*

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

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


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


Новичок
*

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

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


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

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


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


Гость






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


Новичок
*

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

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


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

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

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


Гость






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

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


Новичок
*

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

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


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

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


Новичок
*

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

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


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

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

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

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


Гость






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

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

 



- Текстовая версия 18.07.2025 14:13
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"